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]); }
//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; } }
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"); } }