Advertisement
SnowyCoder

Ez Tris

Jan 15th, 2017
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.88 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4.  
  5. #define TRUE 0
  6. #define FALSE 1
  7.  
  8. #define PLAYER_1 -1
  9. #define PLAYER_2 1
  10. #define UNASSIGNED 0
  11.  
  12. #define NULL -100
  13.  
  14. #define SIZE 3
  15.  
  16. #define table(index) table[index/SIZE][index%SIZE]
  17.  
  18. #define MAXIMIZE_PLAYER
  19.  
  20. void clrscr() {
  21.     printf("\n\n\n");
  22. }
  23.  
  24. int checkWin(int table[SIZE][SIZE]);
  25.  
  26.  
  27. int minLose(int table[SIZE][SIZE], int player, int depth) ;
  28.  
  29. int shouldContinue() {
  30.     int in;
  31.     do {
  32.         printf("Do you want to continue? (%d: yes, %d: no)", TRUE, FALSE);
  33.         scanf("%d", &in);
  34.     } while(in != TRUE && in != FALSE);
  35.     return in;
  36. }
  37.  
  38. char getDisplay(int player, char def) {
  39.     switch (player) {
  40.         case PLAYER_1:
  41.             return 'X';
  42.         case PLAYER_2:
  43.             return 'O';
  44.         default:
  45.             return def;
  46.     }
  47. }
  48.  
  49. void printTable(int table[SIZE][SIZE]) {
  50.     int i, j;
  51.     for (i = 0; i < SIZE; i++) {
  52.         for (j = 0; j < SIZE; j++)
  53.             printf("[%c]", getDisplay(table[i][j], (char) ('0' + (i * SIZE + j))));
  54.         printf("\n");
  55.     }
  56. }
  57.  
  58. void resetTable(int table[SIZE][SIZE]) {
  59.     int i, j;
  60.     for(i = 0; i < SIZE; i++)
  61.         for(j = 0; j < SIZE; j++)
  62.             table[i][j] = UNASSIGNED;
  63. }
  64.  
  65. int defPlayerMove(int table[SIZE][SIZE], int player) {
  66.     int in;
  67.     printf("Player %d: it's your turn!\n", player);
  68.     do {
  69.         printf("->");
  70.         scanf("%d", &in);
  71.         if(in < 0 && in >= SIZE * SIZE)
  72.             printf("Please write a proper index\n");
  73.         else if (table(in) != UNASSIGNED)
  74.             printf("The index is already used by %c\n", getDisplay(table[in/SIZE][in%SIZE], '?'));
  75.         else break;
  76.     } while (1);
  77.     return in;
  78. }
  79.  
  80. int max(int table[SIZE][SIZE], int player, int depth) {
  81.     int i, j, tmp, max = -INT_MAX;
  82.  
  83.     int winner = checkWin(table);
  84.  
  85.     if(winner == -player)
  86.         return 10 - depth;
  87.  
  88.     for(j = 0; j < 9; j++) {
  89.         if(table(j) == UNASSIGNED) {
  90.             table(j) = -player;
  91.             tmp = minLose(table, player, depth + 1);
  92.             if(tmp > max)
  93.                 max = tmp;
  94.             table(j) = 0;
  95.         }
  96.     }
  97.  
  98.     return max;
  99. }
  100.  
  101. int minLose(int table[SIZE][SIZE], int player, int depth) {
  102.     int i, j;
  103.     int move = -1, min = INT_MAX, tmp;
  104.  
  105.     int winner = checkWin(table);
  106.  
  107.     if(winner != NULL) {
  108.         if (winner == -player)
  109.             return 10 - depth;
  110.         return 0;
  111.     }
  112.  
  113.  
  114.     for(i = 0; i < 9; i++) {
  115.         if(table(i) != UNASSIGNED)
  116.             continue;
  117.         table(i) = player;
  118.  
  119.         tmp = max(table, player, depth + 1);
  120.  
  121.         if(depth == 0) {
  122.             printf("%d -> %d\n", i, tmp);
  123.         }
  124.  
  125.         if(tmp < min) {
  126.             min = tmp;
  127.             move = i;
  128.         }
  129.  
  130.         table(i) = 0;
  131.     }
  132.     return depth == 0 ? move : min;
  133. }
  134.  
  135. int minmax(int table[SIZE][SIZE], int player) {
  136.     return minLose(table, player, 0);
  137. }
  138.  
  139. int movePlayer1(int table[SIZE][SIZE]) {
  140.     return defPlayerMove(table, 1);
  141. }
  142.  
  143. int movePlayer2(int table[SIZE][SIZE]) {
  144.     int choice = minmax(table, PLAYER_2);
  145.     printf("Cpu: %d\n", choice);
  146.     return choice;
  147. }
  148.  
  149. void move(int round, int table[SIZE][SIZE]) {
  150.     int move;
  151.     if(round % 2 == 0) {
  152.         move = movePlayer1(table);
  153.         table(move) = PLAYER_1;
  154.     } else {
  155.         move = movePlayer2(table);
  156.         table(move) = PLAYER_2;
  157.     }
  158. }
  159.  
  160. int checkWin(int table[SIZE][SIZE]) {
  161.     int i;
  162.  
  163.     //Check rows
  164.     for(i = 0; i < SIZE; i++) {
  165.         if(table[i][0] != UNASSIGNED &&
  166.                 (table[i][0] == table[i][1] && table[i][1] == table[i][2]))
  167.             return table[i][0];
  168.     }
  169.  
  170.     //Check cols
  171.     for(i = 0; i < SIZE; i++) {
  172.         if(table[0][i] != UNASSIGNED &&
  173.                 (table[0][i] == table[1][i] && table[1][i] == table[2][i]))
  174.             return table[0][i];
  175.     }
  176.  
  177.     if(
  178.         table[1][1] != UNASSIGNED &&
  179.                 ((table[0][0] == table[1][1] && table[1][1] == table[2][2]) ||
  180.                 (table[0][2] == table[1][1] && table[1][1] == table[2][0]))
  181.             )
  182.         return table[1][1];
  183.  
  184.     for(i = 0; i < SIZE*SIZE; i++)
  185.         if(table(i) == UNASSIGNED) break;
  186.     if(i >= SIZE*SIZE)
  187.         return UNASSIGNED;//Tie
  188.  
  189.     return NULL;
  190. }
  191.  
  192. void match() {
  193.     int table[SIZE][SIZE], round = 0, winner;
  194.     resetTable(table);
  195.  
  196.     while ((winner = checkWin(table)) == NULL) {
  197.         clrscr();
  198.         printTable(table);
  199.         move(round++, table);
  200.     }
  201.     printTable(table);
  202.     switch (winner) {
  203.         case PLAYER_1:
  204.             printf("Player 1 win!\n");
  205.             break;
  206.         case PLAYER_2:
  207.             printf("Player 2 win!\n");
  208.             break;
  209.         default:
  210.             printf("Draw!\n");
  211.     }
  212.     printf("Match ended!\n");
  213. }
  214.  
  215.  
  216.  
  217. int main() {
  218.     do {
  219.         match();
  220.     } while (shouldContinue() == TRUE);
  221.     return 0;
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement