Esempio n. 1
0
        /// <summary>
        /// Initialize a new game session with the given startup arguments.
        /// </summary>
        /// <param name="args">The startup arguments.</param>
        /// <returns>a new game session</returns>
        private static ChessGameSession initChessGame(StartupArgs args)
        {
            IChessPlayer whitePlayer;
            IChessPlayer blackPlayer;

            // init players
            if (args.GameMode == ChessGameMode.PvC)
            {
                var humanPlayerSide = new Random().Next(0, 2) == 0 ? ChessColor.White : ChessColor.Black;

                whitePlayer = humanPlayerSide == ChessColor.White
                    ? (IChessPlayer) new HumanChessPlayer(ChessColor.White)
                    : new ArtificialChessPlayer(ChessColor.White, (ChessDifficultyLevel)args.ComputerLevel);

                blackPlayer = humanPlayerSide != ChessColor.White
                    ? (IChessPlayer) new HumanChessPlayer(ChessColor.Black)
                    : new ArtificialChessPlayer(ChessColor.Black, (ChessDifficultyLevel)args.ComputerLevel);
            }
            else if (args.GameMode == ChessGameMode.CvC)
            {
                whitePlayer = new ArtificialChessPlayer(ChessColor.White, (ChessDifficultyLevel)args.ComputerLevel);
                blackPlayer = new ArtificialChessPlayer(ChessColor.Black, (ChessDifficultyLevel)args.ComputerLevel);
            }
            else
            {
                whitePlayer = new HumanChessPlayer(ChessColor.White);
                blackPlayer = new HumanChessPlayer(ChessColor.Black);
            }

            return(new ChessGameSession(whitePlayer, blackPlayer));
        }
Esempio n. 2
0
        public void NewGame()
        {
            // delete cache of last game
            if (File.Exists(SESSION_CACHE_FILE))
            {
                File.Delete(SESSION_CACHE_FILE);
            }

            // show new game dialog
            var dlg        = new NewGameView();
            var dlgContext = new NewGameViewModel(dlg);

            dlg.DataContext = dlgContext;
            var result = dlg.ShowDialog();

            if (result == true)
            {
                // init new game session with user inputs from dialog
                var humanPlayer      = new UIChessPlayer(dlgContext.DrawingSide);
                var artificialPlayer = new ArtificialChessPlayer(dlgContext.DrawingSide.Opponent(), dlgContext.Difficulty);

                _session = dlgContext.DrawingSide == ChessColor.White ? new ChessGameSession(humanPlayer, artificialPlayer) : new ChessGameSession(artificialPlayer, humanPlayer);
                _player  = humanPlayer;
                _session.BoardChanged += boardChanged;
                Board.UpdatePieces(ChessBitboard.StartFormation);

                // tell the player which side he draws if he choose random side
                if (dlgContext.SelectedDrawingSideMode == DrawingSideMode.Random)
                {
                    MessageBox.Show($"You draw the { dlgContext.DrawingSide.ToString() } pieces!", "Random Side Selection", MessageBoxButton.OK, MessageBoxImage.Information);
                }

                // update status bar
                Status.InitNewGame();

                // start the game session in a background thread (async)
                Task.Run(() => {
                    // play game (until one player loses)
                    var final = _session.ExecuteGame();

                    // update status bar
                    var finalStatus = ChessDrawSimulator.Instance.GetCheckGameStatus(_session.Board, _session.Game.LastDraw);
                    Status.FinishGame(finalStatus);

                    // reset game session
                    Board.UpdateIsEnabled(false);
                });
            }

            // make the chess board inactive unless a game session is active
            updateIsBoardActive();
        }