B. Tic-Tac-Toe Source Code Listing

LISTING B.1: Tic-Tac-Toe


  #define CSHARP2

  using System;

  #pragma warning disable 1030 // Disable user-defined warnings

  // The TicTacToe class enables two players to
  // play tic-tac-toe.
  class TicTacToeGame      // Declares the TicTacToeGame class.
  {
    static void Main()  // Declares the entry point to the program.
    {

        // Stores locations each player has moved.
        int[ ] playerPositions = { 0, 0 };

        // Initially set the currentPlayer to Player 1.
        int currentPlayer = 1;

        // Winning player.
        int winner = 0;

        string input = null;


        // Display the board and prompt the current player
        // for his next move.
        for (int turn = 1; turn <= 10; ++turn)
        {

            DisplayBoard(playerPositions);

          #region Check for End Game
          if (EndGame(winner, turn, input))
          {
              break;
          }
          #endregion Check for End Game

          input = NextMove(playerPositions, currentPlayer);

          winner = DetermineWinner(playerPositions);

          // Switch players.
          currentPlayer = (currentPlayer == 2) ? 1 : 2;
      }
  }

  private static string NextMove(int[] playerPositions,
                 int currentPlayer)
  {

      string input;

      // Repeatedly prompt the player for a move
      // until a valid move is entered.
      bool validMove;
      do
      {

          // Request a move from the current player.
          System.Console.Write($" Player {currentPlayer} - Enter move:");
          input = System.Console.ReadLine();
          validMove = ValidateAndMove(playerPositions,
                        currentPlayer, input);
      } while (!validMove);

      return input;
  }

  static bool EndGame(int winner, int turn, string input)
  {
      bool endGame = false;
      if (winner > 0)
      {

          System.Console.WriteLine($" Player {winner} has won!!!!");
          endGame = true;
      }
      else if (turn == 10)
      {
          // After completing the 10th display of the
          // board, exit rather than prompting the
          // user again.
          System.Console.WriteLine(" The game was a tie!");
          endGame = true;
      }
      else if (input == "" || input == "quit")
      {
          // Check if user quit by hitting Enter without
          // any characters or by typing "quit".
          System.Console.WriteLine("The last player quit");
          endGame = true;
      }
      return endGame;
  }

  static int DetermineWinner(int[] playerPositions)
  {
      int winner = 0;

      // Determine if there is a winner.
      int[] winningMasks = {
          7, 56, 448, 73, 146, 292, 84, 273};

      foreach (int mask in winningMasks)
      {
          if ((mask & playerPositions[0]) == mask)
          {
              winner = 1;
              break;
          }
          else if ((mask & playerPositions[1]) == mask)
          {
              winner = 2;
              break;
          }
      }
      return winner;
  }

  static bool ValidateAndMove(
    int[] playerPositions, int currentPlayer, string input)
  {
      bool valid = false;

      // Check the current player's input.
      switch (input)
      {
          case "1":
          case "2":
          case "3":
          case "4":
          case "5":
          case "6":
          case "7":
          case "8":
          case "9":
#warning  "Same move allowed multiple times."
              int shifter;  // The number of places to shift
              // over to set a bit.

              int position;  // The bit which is to be set.

              // int.Parse() converts "input" to an integer.
              // "int.Parse(input) – 1" because arrays
              // are zero-based.
              shifter = int.Parse(input) - 1;

              // Shift mask of 00000000000000000000000000000001
              // over by cellLocations.
              position = 1 << shifter;

              // Take the current player cells and OR them
              // to set the new position as well.
              // Since currentPlayer is either 1 or 2, you
              // subtract 1 to use currentPlayer as an
              // index in a zero-based array.
              playerPositions[currentPlayer - 1] |= position;

              valid = true;
              break;

          case "":
          case "quit":
              valid = true;
              break;

          default:
              // If none of the other case statements
              // is encountered, then the text is invalid.
              System.Console.WriteLine(
                  " ERROR:  Enter a value from 1-9. "
                  + "Push ENTER to quit");
              break;
      }

      return valid;
   }

   static void DisplayBoard(int[] playerPositions)
   {
       // This represents the borders between each cell
       // for one row.
       string[] borders = {
   "|", "|", " ---+---+--- ", "|", "|",
   " ---+---+--- ", "|", "|", ""
   };

       // Display the current board;
       int border = 0;  // set the first border (border[0] = "|").

#if CSHARP2
      System.Console.Clear();
#endif

      for (int position = 1;
           position <= 256;
           position <<= 1, border++)
      {
          char token = CalculateToken(
              playerPositions, position);

          // Write out a cell value and the border that
          // comes after it.
          System.Console.Write($" {token} {borders[border]}");
      }
   }

   static char CalculateToken(
      int[] playerPositions, int position)
   {
      // Initialize the players to  'X' and 'O'
      char[] players = {'X', 'O'};

      char token;
      // If player has the position set,
      // then set the token to that player.
      if ((position & playerPositions[0]) == position)
      {
          // Player 1 has that position marked.
          token = players[0];
      }
      else if ((position & playerPositions[1]) == position)
      {
          // Player 2 has that position marked.
          token = players[1];
      }
      else
      {
          // The position is empty.
          token = ' ';
      }
      return token;
  }

  #line 113 "TicTacToe.cs"
  // Generated code goes here.
  #line default
}


..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset