I'm saving a monster

Started by
2 comments, last by Josip Mati? 10 years, 1 month ago

Ok. I honestly though I got out of this phase.


        private void saveFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            List<int> wallX = new List<int>();
            List<int> wallY = new List<int>();
            List<Color> wallColor = new List<Color>();

            List<int> spikeX = new List<int>();
            List<int> spikeY = new List<int>();

            List<int> switchX = new List<int>();
            List<int> switchY = new List<int>();
            List<Color> switchColor = new List<Color>();

            List<int> laserWallX = new List<int>();
            List<int> laserWallY = new List<int>();
            List<Color> laserWallColor = new List<Color>();

            List<int> laserX = new List<int>();
            List<int> laserY = new List<int>();
            List<Color> laserColor = new List<Color>();
            List<bool> isHorizontal = new List<bool>();

            int ballX = -1;
            int ballY = -1;
            Color ballColor = Color.Transparent;

            int exitX = -1;
            int exitY = -1;

            for (int x = 0; x < tiles.GetLength(0); x++)
                for (int y = 0; y < tiles.GetLength(1); y++)
                {
                    switch (tiles[x, y])
                    {
                        case Tiles.GrayWall:
                            wallX.Add(x);
                            wallY.Add(y);
                            wallColor.Add(Color.Gray);
                            break;

                        case Tiles.CyanWall:
                            wallX.Add(x);
                            wallY.Add(y);
                            wallColor.Add(Color.Cyan);
                            break;

                        case Tiles.YellowWall:
                            wallX.Add(x);
                            wallY.Add(y);
                            wallColor.Add(Color.Yellow);
                            break;

                        case Tiles.MagentaWall:
                            wallX.Add(x);
                            wallY.Add(y);
                            wallColor.Add(Color.Magenta);
                            break;

                        case Tiles.GrayLaserWall:
                            laserWallX.Add(x);
                            laserWallY.Add(y);
                            laserWallColor.Add(Color.Gray);
                            break;

                        case Tiles.CyanLaserWall:
                            laserWallX.Add(x);
                            laserWallY.Add(y);
                            laserWallColor.Add(Color.Cyan);
                            break;

                        case Tiles.YellowLaserWall:
                            laserWallX.Add(x);
                            laserWallY.Add(y);
                            laserWallColor.Add(Color.Yellow);
                            break;

                        case Tiles.MagentaLaserWall:
                            laserWallX.Add(x);
                            laserWallY.Add(y);
                            laserWallColor.Add(Color.Magenta);
                            break;

                        case Tiles.GraySwitch:
                            switchX.Add(x);
                            switchY.Add(y);
                            switchColor.Add(Color.Gray);
                            break;

                        case Tiles.RedSwitch:
                            switchX.Add(x);
                            switchY.Add(y);
                            switchColor.Add(Color.Red);
                            break;

                        case Tiles.BlueSwitch:
                            switchX.Add(x);
                            switchY.Add(y);
                            switchColor.Add(Color.Blue);
                            break;

                        case Tiles.GreenSwitch:
                            switchX.Add(x);
                            switchY.Add(y);
                            switchColor.Add(Color.Green);
                            break;

                        case Tiles.Spikes:
                            spikeX.Add(x);
                            spikeY.Add(y);
                            break;

                        case Tiles.Exit:
                            exitX = x;
                            exitY = y;
                            break;

                        case Tiles.GrayBall:
                            ballX = x;
                            ballY = y;
                            ballColor = Color.Gray;
                            break;

                        case Tiles.RedBall:
                            ballX = x;
                            ballY = y;
                            ballColor = Color.Red;
                            break;

                        case Tiles.BlueBall:
                            ballX = x;
                            ballY = y;
                            ballColor = Color.Blue;
                            break;

                        case Tiles.GreenBall:
                            ballX = x;
                            ballY = y;
                            ballColor = Color.Green;
                            break;

                        case Tiles.HorizontalGrayLaser:
                            laserX.Add(x);
                            laserY.Add(y);
                            laserColor.Add(Color.Gray);
                            isHorizontal.Add(true);
                            break;

                        case Tiles.HorizontalRedLaser:
                            laserX.Add(x);
                            laserY.Add(y);
                            laserColor.Add(Color.Red);
                            isHorizontal.Add(true);
                            break;

                        case Tiles.HorizontalBlueLaser:
                            laserX.Add(x);
                            laserY.Add(y);
                            laserColor.Add(Color.Blue);
                            isHorizontal.Add(true);
                            break;

                        case Tiles.HorizontalGreenLaser:
                            laserX.Add(x);
                            laserY.Add(y);
                            laserColor.Add(Color.Green);
                            isHorizontal.Add(true);
                            break;

                        case Tiles.VerticalGrayLaser:
                            laserX.Add(x);
                            laserY.Add(y);
                            laserColor.Add(Color.Gray);
                            isHorizontal.Add(false);
                            break;

                        case Tiles.VerticalRedLaser:
                            laserX.Add(x);
                            laserY.Add(y);
                            laserColor.Add(Color.Red);
                            isHorizontal.Add(false);
                            break;

                        case Tiles.VerticalBlueLaser:
                            laserX.Add(x);
                            laserY.Add(y);
                            laserColor.Add(Color.Blue);
                            isHorizontal.Add(false);
                            break;

                        case Tiles.VerticalGreenLaser:
                            laserX.Add(x);
                            laserY.Add(y);
                            laserColor.Add(Color.Green);
                            isHorizontal.Add(false);
                            break;
                    }
                }

            using (BinaryWriter writer = new BinaryWriter(File.Create(saveFileDialog1.FileName)))
            {
                writer.Write(tiles.GetLength(0));
                writer.Write(tiles.GetLength(1));
                writer.Write("#");

                writer.Write(ballX);
                writer.Write(ballY);
                writer.Write(ballColor.ToArgb());
                writer.Write("#");

                writer.Write(exitX);
                writer.Write(exitY);
                writer.Write("#");

                writer.Write(spikeX.Count);
                for (int i = 0; i < spikeX.Count; i++)
                {
                    writer.Write(spikeX[i]);
                    writer.Write(spikeY[i]);
                }
                writer.Write("#");

                writer.Write(wallX.Count);
                for (int i = 0; i < wallColor.Count; i++)
                {
                    writer.Write(wallX[i]);
                    writer.Write(wallY[i]);
                    writer.Write(wallColor[i].ToArgb());
                }
                writer.Write("#");

                writer.Write(laserWallX.Count);
                for (int i = 0; i < laserWallColor.Count; i++)
                {
                    writer.Write(laserWallX[i]);
                    writer.Write(laserWallY[i]);
                    writer.Write(laserWallColor[i].ToArgb());
                }
                writer.Write("#");

                writer.Write(switchX.Count);
                for (int i = 0; i < switchColor.Count; i++)
                {
                    writer.Write(switchX[i]);
                    writer.Write(switchY[i]);
                    writer.Write(switchColor[i].ToArgb());
                }
                writer.Write("#");

                writer.Write(laserX.Count);
                for (int i = 0; i < laserX.Count; i++)
                {
                    writer.Write(laserX[i]);
                    writer.Write(laserY[i]);
                    writer.Write(laserColor[i].ToArgb());
                    writer.Write(isHorizontal[i]);
                }
                writer.Write("#");
            }
        }

Code is pretty much self explanatory (I hope). And no, I have no idea in which state my mind was when I wrote that.

Now, if I don't get that under 30 lines of maintainable code...

EDIT: I did it. 18 lines of code. Slap me.

Advertisement

Each item could be a separate object, so you could use one arraylist instead of 3 or 4 ... makes it much easier to handle multiple "like" items

Pseudo code for a laser class:


public class Laser{
         int locX;
         int locY;
         Color color;
         boolean horizontal;
         
              public Laser(int x, int y, Color c, boolean b){
                   locX = x;
                   locY = y;
                   color = c;
                   horizontal = b;
              }
              
              public int getLaserX(){return locX;}
              public int getLaserY(){return locY;}
              public Color getLaserColor(){return color;}
              public boolean getIsHorizontal(){return horizontal;}
              
              public void setLaserX(int n){locX = n;};
              public void setLaserY(int n){locY = n;};
              public void setLaserColor(int r,int g, int b){color = new Color(r,g,b);};
              public void setHorizontal(boolean b){horizontal = b;}
              
              }

I cannot remember the books I've read any more than the meals I have eaten; even so, they have made me.

~ Ralph Waldo Emerson


EDIT: I did it. 18 lines of code. Slap me.

You can't say that and then not post the result...

Tristam MacDonald. Ex-BigTech Software Engineer. Future farmer. [https://trist.am]

Sorry, was sleepy XD


        private void saveFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            using (BinaryWriter writer = new BinaryWriter(File.Create(saveFileDialog1.FileName)))
            {
                int a = tiles.GetLength(0);
                int b = tiles.GetLength(1);

                writer.Write(a);
                writer.Write(b);

                for (int x = 0; x < a; x++)
                    for (int y = 0; y < b; y++)
                    {
                        if (tiles[x, y] == Tiles.None) continue;

                        writer.Write(x);
                        writer.Write(y);
                        writer.Write((int)tiles[x, y]);
                    }

                writer.Close();
            }
        }

Ok, 25 lines of code (whitespace and bracket-only included) as 18 was incomplete method...

And yes, it perfectly works. Game properly loads and plays through levels ^^

This topic is closed to new replies.

Advertisement