home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / qc_prog / chap07 / ttt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-04-05  |  3.5 KB  |  138 lines

  1. /* ttt.c    --  a tic-tac-toe game demonstrates  */
  2. /*              passing two-dimensional arrays   */
  3. /*              to functions                     */
  4.  
  5. main()
  6. {
  7.     static char board[3][3] = {
  8.         { '-', '-', '-' },
  9.         { '-', '-', '-' },
  10.         { '-', '-', '-' },
  11.     };
  12.     int row, col, ch;
  13.     extern char Check_winner();
  14.     extern void Make_move(), Draw_field();
  15.  
  16.     printf("You are X and make the first move.\n");
  17.     while (1)
  18.         {
  19.         printf("Specify coordinate for your X.\n");
  20.         printf("(eg, as a2, or Q to quit)\n");
  21.  
  22.         /* Print the square. */
  23.         Draw_field(board);
  24.  
  25.         /* Input the user's coordinates. */
  26.         if ((row = getch()) == 'Q')
  27.             exit(0);
  28.         row -= 'a';
  29.         col = getch() - '1';
  30.  
  31.         /* Check for a legal move. */
  32.         if (row < 0 || row > 2 || col < 0 || col > 2)
  33.             {
  34.             printf("Bad Square Specification\n\n");
  35.             continue;
  36.             }
  37.         if (board[row][col] != '-')
  38.             {
  39.             printf("Sorry, Square Occupied\n\n");
  40.             continue;
  41.             }
  42.  
  43.         /* Make the move. */
  44.         board[row][col] = 'X';
  45.         if ((ch = Check_winner(board)) != '-' || ch == 't')
  46.             break;
  47.         Make_move(board);
  48.         if ((ch = Check_winner(board)) != '-' || ch == 't')
  49.             break;
  50.         }
  51.     Draw_field(board);
  52.     if (ch == 't')
  53.         printf("It's a tie!\n");
  54.     else if (ch == 'X')
  55.         printf("You win!\n");
  56.     else
  57.         printf("I win!\n");
  58. }
  59.  
  60. char Check_winner(char field[][3])
  61. {
  62.     int row, col;
  63.  
  64.     for (row = col = 0; row < 3; ++row, ++col)
  65.         {
  66.         if (field[row][0] != '-'             /* horizontal */
  67.                 && field[row][0] == field[row][1]
  68.                 && field[row][1] == field[row][2] )
  69.             {
  70.             return(field[row][0]);
  71.             }
  72.         if (field[0][col] != '-'             /* vertical */
  73.                 && field[0][col] == field[1][col]
  74.                 && field[1][col] == field[2][col] )
  75.             {
  76.             return(field[0][col]);
  77.             }
  78.         }
  79.     if (field[0][0] != '-'         /* right diagonal */
  80.             && field[0][0] == field[1][1]
  81.             && field[1][1] == field[2][2] )
  82.         {
  83.         return(field[0][0]);
  84.         }
  85.     if (field[0][2] != '-'         /* left diagonal */
  86.             && field[0][2] == field[1][1]
  87.             && field[1][1] == field[2][0] )
  88.         {
  89.         return(field[0][2]);
  90.         }
  91.  
  92.     for (row = 0; row < 3; ++row)        /* any moves left */
  93.         {
  94.         for (col = 0; col < 3; ++col)
  95.             {
  96.             if (field[row][col] == '-')
  97.                 {
  98.                 return('-');
  99.                 }
  100.             }
  101.         }
  102.     return ('t');
  103. }
  104.  
  105. void Make_move(char field[3][3])
  106. {
  107.     int row, col;
  108.  
  109.     for (row = 2; row >= 0; --row)
  110.         {
  111.         for (col = 2; col >= 0; --col)
  112.             {
  113.             if (field[row][col] == '-')
  114.                 {
  115.                 field[row][col] = 'O';
  116.                 return;
  117.                 }
  118.             }
  119.         }
  120. }
  121.  
  122. void Draw_field(char field[][3])
  123. {
  124.     int row, col;
  125.  
  126.     printf("\n   1  2  3\n\n");
  127.     for (row = 0; row < 3; ++row)
  128.         {
  129.         printf("%c ", 'a'+row);
  130.         for (col = 0; col < 3; ++col)
  131.             {
  132.             printf(" %c ", field[row][col] );
  133.             }
  134.         printf("\n");
  135.         }
  136.     printf("\n");
  137. }
  138.