コード例 #1
0
        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();
        }
コード例 #2
0
        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}");
                }
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 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));
 }
コード例 #5
0
 /// <summary>
 /// 此函数被回调, 当游戏结束时被回调
 /// </summary>
 /// <param name="reversiGame">游戏结束时的棋局</param>
 private void GameOver(ReversiGame reversiGame)
 {
     DoEvents();
     MessageBox.Show("游戏结束! 黑白比分: " + reversiGame.BlackPieceNumber + ":" + reversiGame.WhitePieceNumber + Environment.NewLine + "点击\"确定\"按钮重新开始...", "游戏结束");
     reversiGame = null;
     EndGame();
 }
コード例 #6
0
        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();
        }
コード例 #7
0
        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)));
        }
コード例 #8
0
 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());
     }
 }
コード例 #10
0
        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)));
        }
コード例 #11
0
        private static void GetOpponentsMove(ReversiGame game)
        {
            string nextMove = null;

            while (nextMove == null)
            {
                nextMove = Console.ReadLine();
            }
            game.MakeMove(nextMove);
        }
コード例 #12
0
 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);
         }
     }
 }
コード例 #13
0
        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);
        }
コード例 #14
0
 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);
     }
 }
コード例 #15
0
        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);
        }
コード例 #16
0
ファイル: Board.cs プロジェクト: walterlv/reversi-game
        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();
        }
コード例 #17
0
        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);
        }
コード例 #18
0
ファイル: Program.cs プロジェクト: ddhyxm/MCTS
        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();
        }
コード例 #19
0
ファイル: Player.cs プロジェクト: walterlv/reversi-game
        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;
        }
コード例 #20
0
ファイル: MainCameraScript.cs プロジェクト: emdye/coms437
    // 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);
    }
コード例 #21
0
 /// <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;
 }
コード例 #22
0
        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);
            }
        }
コード例 #23
0
        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);
            }
        }
コード例 #24
0
 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));
 }
コード例 #25
0
 public void SendRefresh(ReversiGame newGame)
 {
     this.ReversiGame = newGame;
     Board.Refresh();
     GameSettings.Refresh();
 }
コード例 #26
0
 public void SendRefresh(ReversiGame newGame)
 {
     Parent.SendRefresh(newGame);
 }
コード例 #27
0
        static void Main(string[] args)
        {
            ReversiGame game = new ReversiGame();

            game.play();
        }
コード例 #28
0
 public BoardRowViewModel(ReversiGame Game)
 {
     this.Game    = Game;
     this.Squares = new List <BoardSquareViewModel>();
 }
コード例 #29
0
 public BoardRowViewModel(ReversiGame game)
 {
     this.game    = game;
     this.Squares = setSquares;
 }
コード例 #30
0
 public BoardSquareViewModel(ReversiGame game)
 {
     this.game = game;
 }