示例#1
0
        public static char ToChar(MazeItem c)
        {
            var conv = GetConversion();

            if (!conv.ContainsKey(c))
            {
                throw new ArgumentOutOfRangeException($"{c} is not a valid MazeItem");
            }
            return(conv[c]);
        }
示例#2
0
        //presses a button
        public void PressButton(int r, int c)
        {
            //we will change it!
            StringRepresentation2 = null;

            {
                MazeItem mi    = data[r][c];
                bool     valid = false;
                if (mi == MazeItem.push_down ||
                    mi == MazeItem.push_left ||
                    mi == MazeItem.push_right ||
                    mi == MazeItem.push_up ||
                    mi == MazeItem.pushpressed_down ||
                    mi == MazeItem.pushpressed_left ||
                    mi == MazeItem.pushpressed_right ||
                    mi == MazeItem.pushpressed_up)
                {
                    valid = true;
                }
                if (!valid)
                {
                    throw new InvalidOperationException("item in maze cannot be pressed");
                }
            }

            /*
             * r,c = index of pusher
             * rdir, cdir = -1 or +1 or 0, direction in which to move
             * rmax, cmax = maximmum
             * movefill = what to place on empty space
             */
            int      rdir        = 0;
            int      cdir        = 0;
            int      rmax        = data.Count();
            int      cmax        = data[0].Count();
            MazeItem movefill    = MazeItem.empty;
            MazeItem moveclosing = MazeItem.empty;

            {
                MazeItem mi = data[r][c];
                if (mi == MazeItem.push_down)
                {
                    rdir       = 1;
                    movefill   = MazeItem.open_push_down;
                    data[r][c] = MazeItem.pushpressed_down;
                }
                if (mi == MazeItem.push_left)
                {
                    cdir       = -1;
                    movefill   = MazeItem.open_push_left;
                    data[r][c] = MazeItem.pushpressed_left;
                }
                if (mi == MazeItem.push_right)
                {
                    cdir       = 1;
                    movefill   = MazeItem.open_push_right;
                    data[r][c] = MazeItem.pushpressed_right;
                }
                if (mi == MazeItem.push_up)
                {
                    rdir       = -1;
                    movefill   = MazeItem.open_push_up;
                    data[r][c] = MazeItem.pushpressed_up;
                }
                if (mi == MazeItem.pushpressed_down)
                {
                    rdir        = 1;
                    moveclosing = MazeItem.open_push_down;
                    data[r][c]  = MazeItem.push_down;
                }
                if (mi == MazeItem.pushpressed_left)
                {
                    cdir        = -1;
                    moveclosing = MazeItem.open_push_left;
                    data[r][c]  = MazeItem.push_left;
                }
                if (mi == MazeItem.pushpressed_right)
                {
                    cdir        = 1;
                    moveclosing = MazeItem.open_push_right;
                    data[r][c]  = MazeItem.push_right;
                }
                if (mi == MazeItem.pushpressed_up)
                {
                    rdir        = -1;
                    moveclosing = MazeItem.open_push_up;
                    data[r][c]  = MazeItem.push_up;
                }

                if (rdir == 0 && cdir == 0)
                {
                    throw new InvalidOperationException("PressButton logic error");
                }
            }

            /*
             * after a lot of setup...
             * */

            //have to make the first move
            r += rdir;
            c += cdir;
            while (r >= 0 && r < rmax && c >= 0 && c < cmax)
            {
                //if filling wiht empty, then we are closing, rules are different
                if (movefill == MazeItem.empty)
                {
                    //a stop point?
                    MazeItem mi   = data[r][c];
                    bool     stop = true;
                    if (mi == moveclosing)
                    {
                        stop = false;
                    }
                    if (stop)
                    {
                        break;
                    }

                    data[r][c] = movefill;
                }
                {
                    //opening a push button

                    //a stop point?
                    MazeItem mi   = data[r][c];
                    bool     stop = true;
                    if (mi == MazeItem.empty ||
                        mi == MazeItem.crate ||
                        mi == MazeItem.push_down ||
                        mi == MazeItem.push_left ||
                        mi == MazeItem.push_right ||
                        mi == MazeItem.push_up ||
                        mi == MazeItem.target)
                    {
                        stop = false;
                    }
                    if (stop)
                    {
                        break;
                    }

                    //if it is a crate, must move it
                    //also move closed buttons
                    if (mi == MazeItem.crate ||
                        mi == MazeItem.push_down ||
                        mi == MazeItem.push_left ||
                        mi == MazeItem.push_right ||
                        mi == MazeItem.push_up)
                    {
                        int rnew = r;
                        int cnew = c;
                        rnew += rdir;
                        cnew += cdir;
                        if (rnew >= 0 && rnew < rmax && cnew >= 0 && cnew < cmax)
                        {
                            bool     stop2 = true;
                            MazeItem mi2   = data[rnew][cnew];
                            if (mi2 == MazeItem.empty ||
                                //a crate also stops on crate
                                //and on buttons
                                //mi == MazeItem.crate ||
                                mi2 == MazeItem.target)
                            {
                                stop2 = false;
                            }
                            if (stop2)
                            {
                                break;
                            }

                            data[rnew][cnew] = mi;
                            //not needed because done below...
                            //data[r][c]=movefill;
                        }
                        else
                        {
                            //stop moving, no further space for the crate
                            break;
                        }
                    }

                    data[r][c] = movefill;
                }

                //next
                r += rdir;
                c += cdir;
            }
        }
示例#3
0
        public void Load(IRace selectedPlayerRace)
        {
            //TODO implement diff levels //-> pass as parameter in methed the level create sweatch for levels and set for mapPath diff map resourse

            var mapPath = AppSettings.MapLevel1;
            var frientFactory = new FriendFactory();
            var enemyFactory = new EnemyFactory();

            this.PlayerRace = selectedPlayerRace;
            var width = AppSettings.MapElementSize.Width;
            var height = AppSettings.MapElementSize.Height;

            try
            {
                using (var reader = new StreamReader(mapPath))
                {
                    for (var row = 0; row < AppSettings.MapElementsCountY; row++)
                    {
                        var top = (row*height)+AppSettings.MapPosition.Top;

                        var line = reader.ReadLine();
                        for (var col = 0; col < AppSettings.MapElementsCountX; col++)
                        {
                            var left = col*width;

                            var currentsymbol = line[col];
                            switch (currentsymbol)
                            {
                                case 'p':
                                    this.Player = new Player(this.PlayerRace)
                                    {
                                        Position = new Position (left, top),
                                        Size = new Size(width, height)
                                    };
                                    break;

                                case 'f':
                                    this.Friend = (Friend)frientFactory.Create(_friendRace);
                                    this.Friend.Position = new Position(left, top);
                                    this.Friend.Size = new Size(width, height);
                                    break;

                                case 'e':
                                    var enemy = (Enemy)enemyFactory.Create(_enemyRace);
                                    enemy.Position = new Position (left, top);
                                    enemy.Size = new Size(width, height);
                                    this.Enemies.Add(enemy);
                                    break;

                                case 'w':
                                    var mazeElement = new MazeItem()
                                    {
                                        Position = new Position(left, top),
                                        Size = new Size(width, height)
                                    };
                                    this.Maze.Add(mazeElement);
                                    break;

                                case 'b':
                                    var beer = new BeerItem()
                                    {
                                        Position = new Position(left, top),
                                        Size = new Size(width, height)
                                    };
                                    this.ItemToCollect.Add(beer);
                                    break;

                                case 'l':
                                    var itemLife = new LifeItem()
                                    {
                                        Position = new Position(left, top),
                                        Size = new Size(width, height)
                                    };
                                    this.ItemToCollect.Add(itemLife);
                                    break;

                                case 'h':
                                    var itemHealth = new LargeHealthItem()
                                    {
                                        Position = new Position(left, top),
                                        Size = new Size(width, height)
                                    };
                                    this.ItemToCollect.Add(itemHealth);
                                    break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "BB Game MapLoader");
            }
        }