private void Scramble(MahjongBoard board) { List <MahjongPair> reversed = new List <MahjongPair>(); while (board.Tiles.Count > 0) { List <MahjongTile> removable = new List <MahjongTile>(); removable.AddRange(ExtractRemovableTiles(board)); while (removable.Count > 1) { reversed.Add(MahjongPair.GetPair(removable)); } foreach (MahjongTile tile in removable) { board.Add(tile); } } for (int i = reversed.Count - 1; i >= 0; i--) { int typeIndex = random.Next() % types.Count; reversed[i].TileOne.Type = board.types[typeIndex]; reversed[i].TileTwo.Type = board.types[typeIndex]; board.Add(reversed[i].TileOne); board.Add(reversed[i].TileTwo); } }
private void Structure(MahjongBoard board) { for (int index = 0; index < Indexes; index++) { for (int column = 0; column < Columns; column++) { for (int row = 0; row < Rows; row++) { MahjongTile tile = AddTile(null, column, row, index); if (tile != null) { board.Tiles.Add(tile); } } } } }
private List <MahjongTile> ExtractRemovableTiles(MahjongBoard board) { List <MahjongTile> removable = new List <MahjongTile>(); MahjongTile[] tiles = new MahjongTile[board.Tiles.Count]; board.Tiles.CopyTo(tiles, 0); foreach (MahjongTile tile in tiles) { if (board.CanMove(tile)) { removable.Add(tile); } } foreach (MahjongTile tile in removable) { board.Remove(tile); } return(removable); }
private void Generate(MahjongBoard board) { board.Tiles = new ObservableCollection <MahjongTile>(); Structure(board); Scramble(board); }