public void GeneratesRandomPiecesWithSimilarProbability() { var sampleSize = 1000; var provider = new BalancedRandomPieceProvider(); var pieceCount = new Dictionary <PieceType, int>(); for (int i = 0; i < sampleSize; i++) { var pieceType = provider.GetPiece().Type; if (pieceCount.ContainsKey(pieceType)) { pieceCount[pieceType] += 1; } else { pieceCount[pieceType] = 1; } } var averageCount = (float)sampleSize / (float)AvailablePieces.All().Length; foreach (float count in pieceCount.Values) { var difference = (count - averageCount) / averageCount; Assert.True(Math.Abs(difference) < 0.05f); } }
//Tell the player to randomly play a piece on the board static void RandomPlayPiece(ref Player player, ref Board board, ref AvailablePieces available) { int[] location = player.ai.RandomPlayPiece(board, player.selectedPiece, available); board.SetPiece(player.selectedPiece, location[0], location[1]); player.Turns += 1; player.selectedPiece = null; }
//Pit to AI models against eachother with search depth 0 static void QuickPlay(ref DNA p1, ref DNA p2) { AvailablePieces available = new AvailablePieces(); Board board = new Board(); Player player1 = new Player("Player 1", ref p1); Player player2 = new Player("Player 2", ref p2); int player1First = rnd.Next(0, 2); if (player1First == 0) { player1.active = true; player2.active = false; QuickGivePiece(ref player1, ref player2, ref board, ref available); } else { player1.active = false; player2.active = true; QuickGivePiece(ref player2, ref player1, ref board, ref available); } while (true) { if (player1.active) { QuickPlayPiece(ref player1, ref board, ref available); if (board.CheckWin()) { GameWon(ref player1, ref player2); break; } if (available.GetRemainingCount() == 0) { GameTie(ref player1, ref player2); break; } QuickGivePiece(ref player1, ref player2, ref board, ref available); } else { QuickPlayPiece(ref player2, ref board, ref available); if (board.CheckWin()) { GameWon(ref player2, ref player1); break; } if (available.GetRemainingCount() == 0) { GameTie(ref player1, ref player2); break; } QuickGivePiece(ref player2, ref player1, ref board, ref available); } } }
//Tell player to play a piece on the board (MinMax) static Piece PlayPiece(ref Player player, ref Board board, ref AvailablePieces available) { object[] play = player.ai.MinMaxPlay(board, player.selectedPiece, available, 2, 0, false); int[] location = (int[])play[0]; Piece piece_play = (Piece)play[1]; board.SetPiece(player.selectedPiece, location[0], location[1]); player.Turns += 1; player.selectedPiece = null; if (piece_play != null) { available.RemovePiece(piece_play); } return(piece_play); }
//Play AI against another AI with standard search depth (calls MinMax function) static void PlayAgainstSmartAI(ref Player player1, ref Player player2) { AvailablePieces available = new AvailablePieces(); Board board = new Board(); int player1First = rnd.Next(0, 2); if (player1First == 0) { player1.active = true; player2.active = false; RandomGivePiece(ref player1, ref player2, ref board, ref available); } else { player1.active = false; player2.active = true; RandomGivePiece(ref player2, ref player1, ref board, ref available); } while (true) { if (player1.active) { Piece give = PlayPiece(ref player1, ref board, ref available); if (board.CheckWin()) { GameWon(ref player1, ref player2); break; } if (available.GetRemainingCount() == 0) { GameTie(ref player1, ref player2); break; } GivePiece(ref player1, ref player2, ref give); } else { Piece give = PlayPiece(ref player2, ref board, ref available); if (board.CheckWin()) { GameWon(ref player2, ref player1); break; } if (available.GetRemainingCount() == 0) { GameTie(ref player1, ref player2); break; } GivePiece(ref player2, ref player1, ref give); } } }
//Tell the player to randomly give the opposing player a piece static void RandomGivePiece(ref Player picker, ref Player receiver, ref Board board, ref AvailablePieces available) { Piece p = picker.ai.RandomPickPiece(board, available); receiver.selectedPiece = p; picker.Turns += 1; available.RemovePiece(p); ChangeTurns(ref picker, ref receiver); }