fork download
  1. # include "stdio.h"
  2. # include "limits.h"
  3.  
  4. int MAX (int x, int y) {
  5. if (x > y) {
  6. return x;
  7. }
  8. else {
  9. return y;
  10. }
  11. }
  12.  
  13. int MIN (int x, int y) {
  14. if (x < y) {
  15. return x;
  16. }
  17. else {
  18. return y;
  19. }
  20. }
  21.  
  22.  
  23. char gridChar(int i) {
  24. switch(i) {
  25. case -1:
  26. return 'X';
  27. case 0:
  28. return ' ';
  29. case 1:
  30. return 'O';
  31. }
  32. }
  33.  
  34. void draw(int* b) {
  35. printf(" %c | %c | %c\n",gridChar(b[0]),gridChar(b[1]),gridChar(b[2]));
  36. printf("---+---+---\n");
  37. printf(" %c | %c | %c\n",gridChar(b[3]),gridChar(b[4]),gridChar(b[5]));
  38. printf("---+---+---\n");
  39. printf(" %c | %c | %c\n",gridChar(b[6]),gridChar(b[7]),gridChar(b[8]));
  40. }
  41.  
  42. int win(const int* board) {
  43. //determines if a player has won, returns 0 otherwise.
  44. unsigned wins[8][3] = {{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}};
  45. int i;
  46. for(i = 0; i < 8; ++i) {
  47. if(board[wins[i][0]] != 0 &&
  48. board[wins[i][0]] == board[wins[i][1]] &&
  49. board[wins[i][0]] == board[wins[i][2]])
  50. return board[wins[i][2]];
  51. }
  52. return 0;
  53. }
  54.  
  55. int alphabeta(int* board, int depth, int alpha, int beta, bool max_player) {
  56.  
  57. int score = 0;
  58. max_player = true;
  59.  
  60. if(depth == 0){
  61. return score;
  62. }
  63.  
  64. if(max_player) {
  65. alpha = INT_MIN;
  66. while (depth != 0) {
  67. score = alphabeta(board, depth - 1, alpha, beta, !max_player);
  68. alpha = MAX(alpha, score );
  69. if (beta <= alpha) break;
  70. }
  71. return alpha;
  72. }
  73. else {
  74. beta = INT_MAX;
  75. while (depth != 0) {
  76. score = alphabeta(board, depth - 1, alpha, beta, !max_player);
  77. beta = MIN(beta, score );
  78. if (beta <= alpha) break;
  79. }
  80. return beta;
  81. }
  82. }
  83.  
  84.  
  85. void computerMove(int* board) {
  86. int move = -1;
  87. int score = -2;
  88. int i;
  89. for(i = 0; i < 9; ++i) {
  90. if(board[i] == 0) {
  91. board[i] = 1;
  92. int tempScore = -alphabeta(board,6, -10000, 10000, true);
  93. board[i] = 0;
  94. if(tempScore > score) {
  95. score = tempScore;
  96. move = i;
  97. }
  98. }
  99. }
  100. //returns a score based on minimax tree at a given node.
  101. board[move] = 1;
  102. }
  103.  
  104.  
  105. void playerMove(int* board) {
  106. int move = 0;
  107. do {
  108. printf("\nInput move ([0..8]): ");
  109. scanf("%d", &move);
  110. printf("\n");
  111. } while (move >= 9 || move < 0 && board[move] == 0);
  112. board[move] = -1;
  113. }
  114.  
  115. int main() {
  116. int board[9] = {0,0,0,0,0,0,0,0,0};
  117. //computer squares are 1, player squares are -1.
  118. printf("Computer: O, You: X\nPlay (1)st or (2)nd? ");
  119. int player=0;
  120. scanf("%d",&player);
  121. printf("\n");
  122. unsigned turn;
  123. for(turn = 0; turn < 9 && win(board) == 0; ++turn) {
  124. if((turn+player) % 2 == 0)
  125. computerMove(board);
  126. else {
  127. draw(board);
  128. playerMove(board);
  129. }
  130. }
  131. switch(win(board)) {
  132. case 0:
  133. printf("A draw. How droll.\n");
  134. break;
  135. case 1:
  136. draw(board);
  137. printf("You lose.\n");
  138. break;
  139. case -1:
  140. printf("You win. Inconceivable!\n");
  141. break;
  142. }
  143. }
  144.  
  145.  
Time limit exceeded #stdin #stdout 5s 3460KB
stdin
Standard input is empty
stdout
Standard output is empty