Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #define MAX 10
- #define SIZE 3
- struct node
- {
- int a[SIZE][SIZE];
- node *next;
- };
- void assign_matrix(int a[][SIZE], int b[][SIZE])
- {
- for (int i = 0; i < SIZE; i++)
- {
- for (int j = 0; j < SIZE; j++)
- {
- a[i][j] = b[i][j];
- }
- }
- }
- int isbase_case(node *n)
- {
- int ar[SIZE][SIZE];
- int val = 0;
- assign_matrix(ar,n->a);
- if((ar[0][0]==1&&ar[0][1]==1&&ar[0][2]==1)||
- (ar[1][0]==1&&ar[1][1]==1&&ar[1][2]==1)||
- (ar[2][0]==1&&ar[2][1]==1&&ar[2][2]==1)||
- (ar[0][0]==1&&ar[1][0]==1&&ar[2][0]==1)||
- (ar[0][1]==1&&ar[1][1]==1&&ar[2][1]==1)||
- (ar[0][2]==1&&ar[1][2]==1&&ar[2][2]==1)||
- (ar[0][0]==1&&ar[1][1]==1&&ar[2][2]==1)||
- (ar[0][2]==1&&ar[1][1]==1&&ar[2][0]==1)
- ||
- (ar[0][0]==2&&ar[0][1]==2&&ar[0][2]==2)||
- (ar[1][0]==2&&ar[1][1]==2&&ar[1][2]==2)||
- (ar[2][0]==2&&ar[2][1]==2&&ar[2][2]==2)||
- (ar[0][0]==2&&ar[1][0]==2&&ar[2][0]==2)||
- (ar[0][1]==2&&ar[1][1]==2&&ar[2][1]==2)||
- (ar[0][2]==2&&ar[1][2]==2&&ar[2][2]==2)||
- (ar[0][0]==2&&ar[1][1]==2&&ar[2][2]==2)||
- (ar[0][2]==2&&ar[1][1]==2&&ar[2][0]==2)
- )
- return 1;
- else
- {
- // check for full board
- int b_break = 0;
- for (int i = 0; i < SIZE && !b_break; i++)
- {
- for (int j = 0; j < SIZE; j++)
- {
- if(ar[i][j] == 0)
- {
- val = 1;
- b_break = 1;
- }
- }
- }
- return !val;
- }
- return 0;
- }
- int isgoal(node *n)
- {
- int ar[SIZE][SIZE];
- int val;
- assign_matrix(ar,n->a);
- if((ar[0][0]==1&&ar[0][1]==1&&ar[0][2]==1)||
- (ar[1][0]==1&&ar[1][1]==1&&ar[1][2]==1)||
- (ar[2][0]==1&&ar[2][1]==1&&ar[2][2]==1)||
- (ar[0][0]==1&&ar[1][0]==1&&ar[2][0]==1)||
- (ar[0][1]==1&&ar[1][1]==1&&ar[2][1]==1)||
- (ar[0][2]==1&&ar[1][2]==1&&ar[2][2]==1)||
- (ar[0][0]==1&&ar[1][1]==1&&ar[2][2]==1)||
- (ar[0][2]==1&&ar[1][1]==1&&ar[2][0]==1)
- ||
- (ar[0][0]==2&&ar[0][1]==2&&ar[0][2]==2)||
- (ar[1][0]==2&&ar[1][1]==2&&ar[1][2]==2)||
- (ar[2][0]==2&&ar[2][1]==2&&ar[2][2]==2)||
- (ar[0][0]==2&&ar[1][0]==2&&ar[2][0]==2)||
- (ar[0][1]==2&&ar[1][1]==2&&ar[2][1]==2)||
- (ar[0][2]==2&&ar[1][2]==2&&ar[2][2]==2)||
- (ar[0][0]==2&&ar[1][1]==2&&ar[2][2]==2)||
- (ar[0][2]==2&&ar[1][1]==2&&ar[2][0]==2)
- )
- return 1;
- else
- {
- // check for full board
- int b_break = 0;
- val = -1;
- for (int i = 0; i < SIZE && !b_break; i++)
- {
- for (int j = 0; j < SIZE; j++)
- {
- if(ar[i][j] == 0)
- {
- val = 0;
- b_break = 1;
- }
- }
- }
- return val;
- }
- }
- int static_value(node* n)
- {
- int ar[SIZE][SIZE];
- int val = 0;
- int nsum, dsum, ccsum, cpsum;
- int jj;
- int check_done
- ;
- assign_matrix(ar,n->a);
- if((ar[0][0]==1&&ar[0][1]==1&&ar[0][2]==1)||
- (ar[1][0]==1&&ar[1][1]==1&&ar[1][2]==1)||
- (ar[2][0]==1&&ar[2][1]==1&&ar[2][2]==1)||
- (ar[0][0]==1&&ar[1][0]==1&&ar[2][0]==1)||
- (ar[0][1]==1&&ar[1][1]==1&&ar[2][1]==1)||
- (ar[0][2]==1&&ar[1][2]==1&&ar[2][2]==1)||
- (ar[0][0]==1&&ar[1][1]==1&&ar[2][2]==1)||
- (ar[0][2]==1&&ar[1][1]==1&&ar[2][0]==1)
- )
- return 10;
- else if((ar[0][0]==2&&ar[0][1]==2&&ar[0][2]==2)||
- (ar[1][0]==2&&ar[1][1]==2&&ar[1][2]==2)||
- (ar[2][0]==2&&ar[2][1]==2&&ar[2][2]==2)||
- (ar[0][0]==2&&ar[1][0]==2&&ar[2][0]==2)||
- (ar[0][1]==2&&ar[1][1]==2&&ar[2][1]==2)||
- (ar[0][2]==2&&ar[1][2]==2&&ar[2][2]==2)||
- (ar[0][0]==2&&ar[1][1]==2&&ar[2][2]==2)||
- (ar[0][2]==2&&ar[1][1]==2&&ar[2][0]==2)
- )
- return -10;
- else
- {
- // return when node is deep 2
- nsum = 0;
- int b_break;
- b_break = 0;
- for (int i = 0; i < SIZE && !b_break; i++)
- {
- check_done = 0;
- int j;
- for (j = 0; j < SIZE; j++)
- {
- if(ar[i][j] == 1 || ar[i][j] == 0)
- {
- nsum+=ar[i][j];
- if(j==SIZE-1)
- b_break = 1;
- }
- else
- {
- // bug 2: khi no duyet toi cot 3 thi nsum lai reset ve 0 -> done!
- check_done = 1;
- break;
- }
- }
- if(check_done)
- nsum = 0;
- }
- dsum = 0;
- b_break = 0;
- for (int i = 0; i < SIZE && !b_break; i++)
- {
- check_done = 0;
- for (int j = 0; j < SIZE; j++)
- {
- if(ar[j][i] == 1 || ar[j][i] == 0)
- {
- dsum+=ar[j][i];
- if(j==SIZE-1)
- b_break = 1;
- }
- else
- {
- check_done = 1;
- break;
- }
- }
- if (check_done)
- dsum = 0;
- }
- ccsum = 0;
- jj = 0;
- for (int i = 0; i < SIZE && jj<SIZE; i++)
- {
- if(ar[i][jj] == 1 || ar[i][jj] == 0)
- {
- ccsum+=ar[i][jj];
- jj+=1;
- }
- else
- break;
- }
- cpsum = 0;
- jj = 0;
- for (int i = SIZE-1; i >= 0 && jj<SIZE; i--)
- {
- if(ar[i][jj] == 1 || ar[i][jj] == 0)
- {
- cpsum+=ar[i][jj];
- jj+=1;
- }
- else
- break;
- }
- return nsum+dsum+ccsum+cpsum;
- }
- // no state has value of 2, 1 -> done!
- }
- void zeros(int a[][SIZE])
- {
- for (int i = 0; i < SIZE; i++)
- for (int j = 0; j < SIZE; j++)
- a[i][j] = 0;
- }
- void generate(node *n, node* val[], int &id, int b_move)
- {
- int b[SIZE][SIZE];
- node *t;
- id = 0;
- for (int i = 0; i < SIZE; i++)
- for (int j = 0; j < SIZE; j++) //generate all possible of computer move
- if ((n->a)[i][j] == 0)
- {
- zeros(b);
- assign_matrix(b,n->a);
- if(b_move == 1)
- b[i][j] = 1; // bug 5: follow which next move (computer of player) -> done!
- else if(b_move == 2)
- b[i][j] = 2;
- t = (node *)malloc(sizeof(node));
- assign_matrix(t->a,b);
- t->next = NULL;
- val[id++] = t;
- }
- }
- // bug 3: mini_max must return node*
- int mini_max(node *n, int b_move, int deep, node *&temp)
- {
- if (isbase_case(n)||deep == 2)
- return static_value(n);
- // generate all possible move
- node* val[MAX];
- //int b_move = 0; // b_move must be change when recursive call
- int max, min, id, t1, t2,bb_move;
- //bb_move = b_move;
- generate(n,val, id, b_move);
- deep += 1;
- if(b_move == 1)
- {
- b_move = 2;
- max = mini_max(val[0],b_move,deep,temp);
- temp = val[0];
- for (int i = 1; i < id; i++)
- // bug 7: when recursive call b_move = 2 not back to 1 -> done!
- {
- t1 = mini_max(val[i],b_move,deep,temp);
- if (t1 > max)
- {
- max = t1;
- // return node *
- temp = val[i];
- }
- }
- return max;
- }
- else if (b_move == 2)
- {
- b_move = 1;
- min = mini_max(val[0],b_move,deep,temp);
- for (int i = 1; i < id; i++)
- {
- t2 = mini_max(val[i],b_move,deep,temp);
- if (t2 < min)
- {
- min = t2;
- // bug 8: can't return temp correct
- // -> when root is 1 assign temp only max and otherwise
- //temp = val[i];
- }
- }
- return min;
- }
- else
- return 0;
- }
- void ar_printf(int a[][SIZE])
- {
- for (int i = 0; i < SIZE; i++)
- {
- for (int j = 0; j < SIZE; j++)
- {
- printf("%d ",a[i][j]);
- }
- printf("\n");
- }
- }
- int main()
- {
- int ar[SIZE][SIZE];
- int b_move;
- int x, y, value;
- //node *result;
- zeros(ar);
- b_move = 1;
- node *t;
- // code for game loop
- ar[0][0] = 0;
- ar[0][1] = 0;
- ar[0][2] = 0;
- ar[1][0] = 0;
- ar[1][1] = 0;
- ar[1][2] = 0;
- ar[2][0] = 0;
- ar[2][1] = 0;
- ar[2][2] = 0;
- ar_printf(ar);
- /*t = (node *)malloc(sizeof(node));
- assign_matrix(t->a,ar);
- t->next = NULL;
- printf("%d\n",isbase_case(t));*/
- while(true)
- {
- printf("\nx y >> ");
- scanf("%d %d", &x,&y);
- ar[x][y] = 2;
- printf("\n");
- ar_printf(ar);
- t = (node *)malloc(sizeof(node));
- assign_matrix(t->a,ar);
- t->next = NULL;
- b_move = 1;
- if (isgoal(t) == 1)
- {
- printf("You win!\n");
- break;
- }
- else if(isgoal(t) == -1)
- {
- printf("Game end!\n");
- break;
- }
- else
- {
- printf("wait ...\n");
- // bug 6: return error output
- node *result;
- result = NULL;
- value = mini_max(t,b_move,0,result);
- printf("%d\n",value);
- if (isgoal(result) == 1) // bug 9: declare in while loop -> done!
- {
- ar_printf(result->a);
- printf("You lose!\n");
- break;
- }
- else
- {
- assign_matrix(ar,result->a);
- ar_printf(ar);
- }
- }
- //break;
- }
- // bug 1: all value return 20 -> because no state has value of 2, 1
- // khong the nao sinh ra nua thi tra ve gia tri static --> 10, -10, 0???
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement