public BoardViewModel(MainWindowViewModel parentViewModel, ReversiGame game, string playername1, string playername2) { mainWindowViewModel = parentViewModel; gameCell = Cell.Create <ReversiGame>(game); reversiGame = game; rows = new List <BoardRowViewModel>(); foreach (var i in Enumerable.Range(0, game.Board.Height)) { rows.Add(new BoardRowViewModel(gameCell, i)); } // Setup first player data, always Player.BLACK for the model scorePlayer1 = gameCell.Derive(g => g.Board.CountStones(Player.BLACK)); FirstPlayersTurn = gameCell.Derive(g => g.CurrentPlayer == Player.BLACK); PlayerName1 = playername1; // Setup second player data, always Player.WHITE for the model scorePlayer2 = gameCell.Derive(g => g.Board.CountStones(Player.WHITE)); SecondPlayersTurn = gameCell.Derive(g => g.CurrentPlayer == Player.WHITE); PlayerName2 = playername2; // Setup gameOver listener _gameOver = gameCell.Derive(g => g.IsGameOver); _gameOver.ValueChanged += () => GameOver(); }
static void Main(string[] args) { var game = new ReversiGame(new GameFieldFactory().PrepareField()); var movesFinder = new PossibleMovesFinder(); DrawField(game.Field, game.CurrentColor, movesFinder.GetPossibleMoves(game.Field).ToList()); while (!game.IsOver) { var move = ReadMove(); ValueOrError <bool> result; if (move == "rnd" || move == "r") { result = game.MakeMove(movesFinder.GetPossibleMoves(game.Field) .First(possibleMove => possibleMove.Color == game.CurrentColor).Position.ToCode()); } else { result = game.MakeMove(move); } if (result.HasValue) { DrawField(game.Field, game.CurrentColor, movesFinder.GetPossibleMoves(game.Field).ToList()); } else { Console.WriteLine($"Error occured during move: {result.Error}"); } } }
public static string[] GetGameRepresentation(ReversiGame game) { var board = game.CurrentState.Board; var representation = new string[board.GetLength(0)]; for (var row = 0; row < board.GetLength(0); ++row) { representation[row] = ""; for (var column = 0; column < board.GetLength(1); ++column) { switch (board[row, column]) { case Cell.Black: representation[row] += 'B'; break; case Cell.White: representation[row] += 'W'; break; case Cell.Empty: representation[row] += '.'; break; default: throw new ArgumentOutOfRangeException(); } } } return(representation); }
public void IsValidMoveTrueTest() { Disc[,] board = "----\n-OX-\n-XO-\n----".BoardFromString(); Assert.IsTrue(ReversiGame.IsValidMove(board, new Point(0, 1), Disc.White)); Assert.IsTrue(ReversiGame.IsValidMove(board, new Point(1, 3), Disc.Black)); Assert.IsTrue(ReversiGame.IsValidMove(board, new Point(3, 1), Disc.Black)); }
/// <summary> /// 此函数被回调, 当游戏结束时被回调 /// </summary> /// <param name="reversiGame">游戏结束时的棋局</param> private void GameOver(ReversiGame reversiGame) { DoEvents(); MessageBox.Show("游戏结束! 黑白比分: " + reversiGame.BlackPieceNumber + ":" + reversiGame.WhitePieceNumber + Environment.NewLine + "点击\"确定\"按钮重新开始...", "游戏结束"); reversiGame = null; EndGame(); }
public override void Initialize() { currentMouseState = Mouse.GetState(); lastMouseState = Mouse.GetState(); currentKeyboardState = Keyboard.GetState(Keys.Escape); lastKeyboardState = Keyboard.GetState(Keys.Escape); reversiGame = ReversiGame.CurrentGame; boardRectangle = boardRect; aiTypePieces = new Piece[2, AIMaxCount]; AICount = ReversiAIType.GetAINames().Length; AIIndex[0] = GameSettings.DefaultAIIndex; AIIndex[1] = GameSettings.DefaultAIIndex; board = curGame.LoadContent <Texture2D>(@"Images\Board"); settingBoard = curGame.LoadContent <Texture2D>(@"Images\SettingBoard"); int pieceSize = boardRect.Width / ReversiGame.BoardSize; startButton = CreateChild <StartButton, Rectangle>(new Rectangle(boardRect.X + pieceSize * 3, boardRect.Y + pieceSize * 6, pieceSize * 2, pieceSize)); startButton.Initialize(settingType); showPieces[0] = CreateChild <Piece, Rectangle>(new Rectangle(boardRect.X + pieceSize * 3, boardRect.Y + pieceSize * 2, pieceSize, pieceSize)); showPieces[0].PieceState = PieceState.Black; showPieces[1] = CreateChild <Piece, Rectangle>(new Rectangle(boardRect.X + pieceSize * 4, boardRect.Y + pieceSize * 2, pieceSize, pieceSize)); showPieces[1].PieceState = PieceState.White; playerTypePieces[0] = CreateChild <Piece, Rectangle>(new Rectangle(boardRect.X + pieceSize * 1, boardRect.Y + pieceSize * 3, pieceSize, pieceSize)); playerTypePieces[0].CurrentDisplay = DisplayState.CanMove; chooseIndex[0] = 0; PlayerType[0] = PlayerTypes.Human; playerTypePieces[1] = CreateChild <Piece, Rectangle>(new Rectangle(boardRect.X + pieceSize * 2, boardRect.Y + pieceSize * 3, pieceSize, pieceSize)); playerTypePieces[1].CurrentDisplay = DisplayState.Normal; playerTypePieces[2] = CreateChild <Piece, Rectangle>(new Rectangle(boardRect.X + pieceSize * 5, boardRect.Y + pieceSize * 3, pieceSize, pieceSize)); playerTypePieces[2].CurrentDisplay = DisplayState.CanMove; chooseIndex[1] = 2; PlayerType[1] = PlayerTypes.AI; playerTypePieces[3] = CreateChild <Piece, Rectangle>(new Rectangle(boardRect.X + pieceSize * 6, boardRect.Y + pieceSize * 3, pieceSize, pieceSize)); playerTypePieces[3].CurrentDisplay = DisplayState.Normal; for (int i = 0; i < AIMaxCount; i++) { aiTypePieces[0, i] = CreateChild <Piece, Rectangle>(new Rectangle(boardRect.X, boardRect.Y + pieceSize * (i + 3), pieceSize, pieceSize)); } for (int i = 0; i < AIMaxCount; i++) { aiTypePieces[1, i] = CreateChild <Piece, Rectangle>(new Rectangle(boardRect.X + pieceSize * 7, boardRect.Y + pieceSize * (i + 3), pieceSize, pieceSize)); } foreach (Piece piece in showPieces) { piece.ForceShow = true; } foreach (Piece piece in playerTypePieces) { piece.ForceShow = true; } foreach (Piece piece in aiTypePieces) { piece.ForceShow = true; } base.Initialize(); }
public void PointsToReverseTest() { Disc[,] board = "----\n-OX-\n-XO-\n----".BoardFromString(); var pointSet = ReversiGame.PointsToReverse(board, new Point(0, 2), Disc.Black); Assert.AreEqual(1, pointSet.Count); Assert.IsTrue(pointSet.Contains(new Point(1, 2))); }
public void SendRefresh(ReversiGame newGame) { if (!Undoing) { OldGames.Add(this.ReversiGame); } Parent.SendRefresh(newGame); }
public BoardRowViewModel(ReversiGame spel) { this.Squares = new List <BoardSquareViewModel>(); for (var i = 0; i < spel.Board.Width; i++) { Squares.Add(new BoardSquareViewModel()); } }
public void PointsToReverseTest2() { Disc[,] board = "------\n--XO--\n---O--\n--XX--\n------\n------".BoardFromString(); var pointSet = ReversiGame.PointsToReverse(board, new Point(1, 4), Disc.White); Assert.AreEqual(2, pointSet.Count); Assert.IsTrue(pointSet.Contains(new Point(1, 3))); Assert.IsTrue(pointSet.Contains(new Point(2, 3))); }
private static void GetOpponentsMove(ReversiGame game) { string nextMove = null; while (nextMove == null) { nextMove = Console.ReadLine(); } game.MakeMove(nextMove); }
public void AllPlayerTest() { foreach (Type t in Assembly.GetCallingAssembly().GetTypes()) { if (t.GetInterface("IReversiPlayer") != null) { IReversiPlayer player = Activator.CreateInstance(t) as IReversiPlayer; ReversiGame rg = new ReversiGame(); rg.PlaySingleTurn(player); } } }
private Player GetWinner(ReversiGame game) { int scoreCurrentPlayer = game.Board.CountStones(ReversiGame.Value.CurrentPlayer); int scoreOtherPlayer = game.Board.CountStones(ReversiGame.Value.CurrentPlayer.OtherPlayer); if (scoreCurrentPlayer > scoreOtherPlayer) { return(game.CurrentPlayer); } else if (scoreCurrentPlayer < scoreOtherPlayer) { return(game.CurrentPlayer.OtherPlayer); } return(null); }
private Player SetOwnerOrCandidate(ReversiGame game) { if (game.Board[position] != null) { return(game.Board[position]); } else if (game.IsValidMove(position)) { return(game.CurrentPlayer); } else { return(null); } }
private String CreateGameOverMessage(ReversiGame game) { string message = ""; if (GetWinner(game) == null) { int tieScore = game.Board.CountStones(ReversiGame.Value.CurrentPlayer); message += "Tie score of " + tieScore + " - " + tieScore + "."; } else { message += Winner.Value.Name + " won with " + game.Board.CountStones(GetWinner(game)) + " - " + game.Board.CountStones(GetWinner(game).OtherPlayer) + "."; } return(message); }
public override void Initialize() { BoardRectangle = boardRectangle = boardRect; boardTexture = curGame.LoadContent <Texture2D>(@"Images\Board"); debugFont = curGame.LoadContent <SpriteFont>(@"Fonts\TitleFont"); int pieceSize = boardRect.Width / ReversiGame.BoardSize; for (int i = 0; i < ReversiGame.BoardSize; i++) { for (int j = 0; j < ReversiGame.BoardSize; j++) { pieces[i, j] = CreateChild <Piece, Rectangle>( new Rectangle( boardRect.X + pieceSize * i, boardRect.Y + pieceSize * j, pieceSize, pieceSize)); } } IsInitializing = true; // 如果有上一局棋, 则清除上一局棋盘 if (reversiGame != null) { pieces[reversiGame.LastPosition.X, reversiGame.LastPosition.Y].IsLastPiece = false; } // 创建一个新游戏 reversiGame = ReversiGame.CreateANewGame(); // 创建玩家 for (int i = 0; i < 2; i++) { if (PlayerSettings.Player[i].Type == PlayerTypes.Human) { player[i] = CreateChild <Human, Rectangle, Piece[, ], ReversiPiece>(boardRectangle, pieces, i == 0 ? ReversiPiece.Black : ReversiPiece.White); } else if (PlayerSettings.Player[i].Type == PlayerTypes.AI) { player[i] = CreateChild <AI, Rectangle, Piece[, ], ReversiPiece>(boardRectangle, pieces, i == 0 ? ReversiPiece.Black : ReversiPiece.White); ((AI)(player[i])).SetAIType(PlayerSettings.Player[i].AIIndex); } } // 请求刷新棋盘 DebugText = ""; boardState = BoardState.FreshGame; IsInitializing = false; base.Initialize(); }
private static void MakeMove(ReversiGame reversiGame, Color myColor) { var moves = new PossibleMovesFinder().GetPossibleMoves(reversiGame.Field).Where(move => move.Color == myColor).ToList(); // Console.WriteLine($"//{string.Join(",", moves)}, {reversiGame.Field.GetCell("B4").Piece?.Color}"); if (!moves.Any()) { Console.WriteLine("pass"); reversiGame.MakeMove("pass"); return; } var move = moves[random.Next(moves.Count)]; var code = move.Position.ToCode(); reversiGame.MakeMove(code); Console.WriteLine(code); }
private static void Main(string[] args) { var game = new ReversiGame(ReversiGameStateParser.Parse(new[] { "........", "........", "........", "...BW...", "...WB...", "........", "........", "........" }, Utils.BlackPlayerId)); //var player1 = new ConsoleReversiPlayer(game); //var player2 = new ConsoleReversiPlayer(game); var player1 = new MCTSPlayer <ReversiGameState>(game, 1, new TimeSpan(0, 0, 10)); var player2 = new MCTSPlayer <ReversiGameState>(game, 2, new TimeSpan(0, 0, 10)); var view = new ReversiView(game, new IPlayer <ReversiGameState>[] { player1, player2 }); view.RunGame(); }
public Player(Rectangle boardRec, Piece[,] allPieces, ReversiPiece myColor) { reversiGame = ReversiGame.CurrentGame; boardRectangle = boardRec; pieces = allPieces; myPieceColor = myColor; if (myColor == ReversiPiece.Black) { Players[0] = this; } else { Players[1] = this; } CurrentPlayer = Players[0]; message = CreateChild <Message>(); isMyTurn = false; isMovePieceCompleted = true; isMovingPiece = false; }
// Use this for initialization void Start() { board = new GameObject[DIM, DIM]; this.transform.position = new Vector3(0, 10, 0); this.transform.LookAt(new Vector3(0, 0, 0)); this.transform.localScale = new Vector3(8, 1, 4); basePlane = (GameObject)Instantiate(Resources.Load("Model_Board")); basePlane.transform.localPosition = new Vector3(0.0f, -1.1f, 0.0f); for (int i = 0; i < DIM; i++) { for (int j = 0; j < DIM; j++) { board[i, j] = GameObject.CreatePrimitive(PrimitiveType.Plane); board[i, j].transform.localPosition = new Vector3(convertIndexToCoordinate(i), 0, convertIndexToCoordinate(j)); board[i, j].GetComponent <Renderer>().enabled = false; } } // Initial Pieces board[3, 3] = (GameObject)Instantiate(Resources.Load("Model_Piece")); board[3, 3].transform.localPosition = new Vector3(-0.5f, 0.0f, -0.5f); board[4, 4] = (GameObject)Instantiate(Resources.Load("Model_Piece")); board[4, 4].transform.localPosition = new Vector3(0.5f, 0.0f, 0.5f); board[3, 4] = (GameObject)Instantiate(Resources.Load("Model_Piece")); board[3, 4].transform.localPosition = new Vector3(-0.5f, 0.0f, 0.5f); board[3, 4].transform.Rotate(180, 0, 0); board[4, 3] = (GameObject)Instantiate(Resources.Load("Model_Piece")); board[4, 3].transform.localPosition = new Vector3(0.5f, 0.0f, -0.5f); board[4, 3].transform.Rotate(180, 0, 0); game = new ReversiGame(DIM); }
/// <summary> /// 执行棋局初始化操作 (包括新建棋局实例, 新建人工智能实例. 必要时执行自动下棋操作.) /// </summary> public void InitializeGame(ReversiPiece userPiece, int AIIndex, WhenGameOver gameOver) { InitialControls(); whenGameOver = gameOver; reversiGame = ReversiGame.CreateANewGame(); HumanPieceType = userPiece; UpdateWindow(); reversiAI = ReversiAIType.GetAI(AIIndex); changeWaitingState(WaitingState.NotWaiting); if (HumanPieceType == ReversiPiece.White) { reversiAI.AIInitialize(ReversiPiece.Black); MovePiece(); DoEvents(); } else { reversiAI.AIInitialize(ReversiPiece.White); } ShowNextEnabledPieces(); isInitialized = true; IsUserTurn = true; }
static void Main(string[] args) { var blackHole = ReadCoordinates(); var myColor = ReadColor(); var game = new ReversiGame(new GameFieldFactory().PrepareField(blackHole)); if (myColor == Color.Black) { MakeMove(game, myColor); } while (!game.IsOver) { GetOpponentsMove(game); if (game.IsOver) { break; } MakeMove(game, myColor); } }
public BoardViewModel(ReversiBoard reversiBoard, OptionsViewModel options) { try { this.game = new ReversiGame(reversiBoard.Width, reversiBoard.Height); System.Diagnostics.Debug.WriteLine(reversiBoard.Width); } catch { this.game = new ReversiGame(6, 6); } this.Rows = new List <BoardRowViewModel>(); this.Command = new PutStoneCommand(this); this.restartCommand = new RestartCommand(this); this.optionsView = options; this.endGameCommand = new EndGameCommand(optionsView, this); _timer = new DispatcherTimer(DispatcherPriority.Render); _timer.Interval = TimeSpan.FromSeconds(1); _timer.Tick += (sender, args) => { CurrentTime = DateTime.Now.ToLongTimeString(); }; _timer.Start(); for (int i = 0; i < game.Board.Height; i++) { var boardRow = new BoardRowViewModel(game); for (int j = 0; j < game.Board.Width; j++) { boardRow.Squares[j].Owner = game.Board[new Vector2D(j, i)]; boardRow.Squares[j].SquarePosition = new Vector2D(j, i); } Rows.Add(boardRow); } }
public void ScoreTest() { Disc[,] board = "------\n--XO--\n---O--\n--XX--\n------\n------".BoardFromString(); Assert.AreEqual(1, ReversiGame.Score(board, Disc.White)); Assert.AreEqual(-1, ReversiGame.Score(board, Disc.Black)); }
public void SendRefresh(ReversiGame newGame) { this.ReversiGame = newGame; Board.Refresh(); GameSettings.Refresh(); }
public void SendRefresh(ReversiGame newGame) { Parent.SendRefresh(newGame); }
static void Main(string[] args) { ReversiGame game = new ReversiGame(); game.play(); }
public BoardRowViewModel(ReversiGame Game) { this.Game = Game; this.Squares = new List <BoardSquareViewModel>(); }
public BoardRowViewModel(ReversiGame game) { this.game = game; this.Squares = setSquares; }
public BoardSquareViewModel(ReversiGame game) { this.game = game; }