Ejemplo n.º 1
0
        // the bulk of the desired functionality should be refactored into a
        // method that will be invoked once the class has been initialized.
        public void Invoke()
        {
            // declare local variables
            // this will used to determine which DAL method I need to call
            DatabaseAccessLayer _dal = new DatabaseAccessLayer();
            List <Player>       _listOfPlayers;

            // Title of game
            Console.WriteLine("Welcome to Tic-Tac-Toe");

            // Creates a new GameBoard
            GameBoard _board = new GameBoard();
            bool      IsPlayersNotSelected = true;

            Player _firstPlayer  = new Player();
            Player _secondPlayer = new Player();

            while (IsPlayersNotSelected)
            {
                // print out the main menu
                Console.WriteLine("Menu (L) - List all players, (S) Select players for the game, " +
                                  "(A) - Add Player, " +
                                  "(D) - Delete Player, (U) - Update Player");

                string _menuItemPicked = Console.ReadLine();

                // what does the user want to do
                switch (_menuItemPicked.ToUpper())
                {
                case "A":         // add user
                    // collect all the information from the user
                    Console.WriteLine("Enter first name (required): ");
                    string _firstNameInput = Console.ReadLine();
                    Console.WriteLine("Enter last name (required): ");
                    string _lastNameInput = Console.ReadLine();
                    Console.WriteLine("Enter birthdate MM/DD/YYYY (optional): ");
                    string _birthdateInput = Console.ReadLine();
                    Console.WriteLine("Enter gender M or F (optional): ");
                    string _genderInput = Console.ReadLine();

                    // constructor
                    Player _newPlayer = new Player(_firstNameInput, _lastNameInput,
                                                   _birthdateInput, _genderInput, PlayerType.Human);

                    // pass all value thru the object reference
                    _userReader.AddUser(_newPlayer);

                    break;

                case "D":      // delete a player from the db
                    // print out the list for them of they player ids
                    Console.WriteLine("Please enter player id you want to delete for the game.");
                    int _getAllPlayers = 0;
                    _listOfPlayers = _dal.GetAllPlayers(_getAllPlayers);

                    // print out the board
                    _board.PrintPlayers(_listOfPlayers);

                    // the get the player id
                    int _playerId = Convert.ToInt32(Console.ReadLine());

                    //delete the player and their stats
                    _dal.DeletePlayer(_playerId);

                    break;

                case "L":     // list all the players in
                    int _playerIDToGet = 0;
                    _listOfPlayers = _dal.GetAllPlayers(_playerIDToGet);
                    // add the bot player
                    _listOfPlayers.Add(new Player {
                        PlayerFirstName = "Bot", PlayerID = 666, PlayerLastName = "Boy", PlayerType = PlayerType.Bot
                    });

                    // uses the list
                    _board.PrintPlayers(_listOfPlayers);
                    break;


                case "S":
                    // print out the list for them of they player ids
                    Console.WriteLine("Please look at the list of available players, enter two player ids for the game.");
                    _getAllPlayers = 0;
                    _listOfPlayers = _dal.GetAllPlayers(_getAllPlayers);
                    _listOfPlayers.Add(new Player {
                        PlayerFirstName = "Bot", PlayerID = 666, PlayerLastName = "Boy", PlayerType = PlayerType.Bot
                    });

                    // print out the board
                    _board.PrintPlayers(_listOfPlayers);

                    // get the two players
                    Console.WriteLine("Please enter PlayerID for first player.");
                    int firstPlayerId = Convert.ToInt32(Console.ReadLine());
                    Console.WriteLine("Please enter PlayerID for second player.");
                    int secondPlayerId = Convert.ToInt32(Console.ReadLine());

                    // write some LINQ to get player one and create object for that player
                    Player _firstPlayerDAL = _listOfPlayers.Where(x => x.PlayerID == firstPlayerId).FirstOrDefault();

                    // write some LINQ to get player two and create object for that player
                    Player _secondPlayerDAL = _listOfPlayers.Where(x => x.PlayerID == secondPlayerId).FirstOrDefault();

                    // map these to player objects because that's what game play takes
                    //_firstPlayer = Mapper.PlayerDALtoPlayer(_firstPlayerDAL, 1, 'X');
                    //_secondPlayer = Mapper.PlayerDALtoPlayer(_secondPlayerDAL, 2, '0');
                    _firstPlayer                    = _firstPlayerDAL;
                    _secondPlayer                   = _secondPlayerDAL;
                    _firstPlayer.PlayerToken        = 'X';
                    _firstPlayer.PlayerOrderByPlay  = 1;
                    _secondPlayer.PlayerToken       = 'O';
                    _secondPlayer.PlayerOrderByPlay = 2;

                    // drop out of loop
                    IsPlayersNotSelected = false;
                    break;

                default:
                    break;
                }
            } // while end


            // continuing to game play

            ////Creates a new GameBoard
            //GameBoard board = new GameBoard(first, second);
            _board.SetPlayers(_firstPlayer, _secondPlayer);

            // print instructions to where your choice will go 1- 9
            Console.WriteLine("Players will pick a number between 1 and 9 to determnine where they will play");

            // prints out the rule board
            _board.Print();

            // game play code starting here

            // need a loop to go back and forth between the players
            bool IsContinueGame = true; // will be switched to false on a draw or winner inside the loop
            //string currentPlayer = player1; // used to determine what will be stored in the array
            Player _currentPlayer;
            int    _currentPlayerIndex = 0;
            string _position           = "";

            while (IsContinueGame)
            {
                _currentPlayer = _board.TwoPlayers[_currentPlayerIndex];


                // TODO: only for the screen players
                // need player to pick a location

                if (_currentPlayer.PlayerType == PlayerType.Human)
                {
                    Console.WriteLine(_currentPlayer.PlayerFirstName + " " + _currentPlayer.PlayerLastName + ", please pick a location 1 to 9 that is not already occupied");
                    Console.Write("Location: ");
                    _position = Console.ReadLine();


                    // only humans to things wrong
                    // need validation to make sure is legal spot
                    // checks for valid player input
                    _position = _board.ValidateInput(_position, _currentPlayer.PlayerFirstName + " " + _currentPlayer.PlayerLastName);

                    bool validMove = false;

                    // checks if the player made a valid move
                    while (validMove == false)
                    {
                        validMove = _board.ValidateMove(Convert.ToInt32(_position));

                        if (validMove == false)
                        {
                            Console.WriteLine(_currentPlayer.PlayerFirstName + " " + _currentPlayer.PlayerLastName +
                                              ", please use only the numbers 1 to 9 and a space that is not already occupied");
                            _board.Print();
                            Console.Write("Location: ");
                            _position = Console.ReadLine();
                            _position = _board.ValidateInput(_position, _currentPlayer.PlayerFirstName + " " + _currentPlayer.PlayerLastName);
                        }
                    }
                }
                else  // BOT turn
                {
                    // no validation needed



                    // need the current board state to decide
                    _position = _currentPlayer.BotMove(_board.BoardState);


                    // print the location picked
                    Console.WriteLine(_currentPlayer.PlayerFirstName + " " + _currentPlayer.PlayerLastName +
                                      ", please use only the numbers 1 to 9 and a space that is not already occupied");
                }



                // place it
                // do we place a X or O?
                char charToPlace;
                charToPlace = _currentPlayer.PlayerToken;



                // this is simply placing the token, all the hard decisions have been made
                _board.Place(charToPlace, Convert.ToInt32(_position));


                // print it
                _board.Print();

                // check if it's a winner or draw, if not flip the player
                string result = _board.CheckForWinnerOrDraw();


                switch (result)
                {
                case "win":
                    IsContinueGame = false;
                    Console.WriteLine(_currentPlayer.PlayerFirstName + " " + _currentPlayer.PlayerLastName + " wins!!!!!");
                    Console.WriteLine();
                    break;

                case "draw":
                    IsContinueGame = false;
                    Console.WriteLine("Game is a draw !!!!");
                    Console.WriteLine();
                    break;

                default:
                    break;
                }

                // flip the player
                if (_currentPlayerIndex == 0)
                {
                    _currentPlayerIndex = 1;
                }
                else
                {
                    _currentPlayerIndex = 0;
                }

                // ENH: add win loss draw to the database


                // ENH: to they want another game ?
            }  // game loop

            //Stops the program
            Console.WriteLine("Game Over");
            Console.ReadLine();
        }