diff --git a/functions.c b/functions.c index 94ceab9..f5d564f 100644 --- a/functions.c +++ b/functions.c @@ -89,8 +89,8 @@ void player_act(char arr[3][3]) // scanf("%d,%d", &x, &y); if(arr[--x][--y] == ' ') { - arr[x][y] = 'O'; - break; + arr[x][y] = 'O'; + break; } else { @@ -99,7 +99,7 @@ void player_act(char arr[3][3]) // } } } -void computer_act(char arr[3][3]) //电脑行动 +void computer_act_easy(char arr[3][3]) //电脑行动 { srand((unsigned)time(NULL));//用系统时间初始化随机数种子 while (1)//无限循环直到遇到break退出 @@ -113,3 +113,54 @@ void computer_act(char arr[3][3]) // } } } +void mode() +{ + printf("****************************\n"); + printf("** 1. 简单模式 **\n"); + printf("** 2. 困难模式 **\n"); + printf("****************************\n"); +} + +void computer_act_hard(char arr[3][3]) +{ + int value[3][3]; + int i, j, m, count_X, count_O, count_; + for(i = 0; i < 3; i++) + { + for(j = 0; j < 3; j++) + { + if(arr[i][j] == ' ') + { + if(i - j == 1 || j - i == 1) //不在对角线上的点 + { + for(m = 0; m < 3; m++) + arr[i][m] == 'O' ? count_O++ : arr[i][m] == 'X' ? count_X++ : count_++; + if(count_X == 2) value[i][j] = 6; + else if(count_O == 2) value[i][j] = 5; + else if(count_X == 1 && count_ == 1) value[i][j] = 4; + else if(count_O == 1 && count_ == 1) value[i][j] = 3; + else if(count_ == 2) value[i][j] = 2; + else value[i][j] = 1; + count_O = count_X = count_ = 0; + for(m = 0; m < 3; m++) + arr[m][j] == 'O' ? count_O++ : arr[m][j] == 'X' ? count_X++ : count_++; + if(count_X == 2) value[i][j] = 6; + else if(count_O == 2) value[i][j] = 5; + else if(count_X == 1 && count_ == 1) value[i][j] = 4; + else if(count_O == 1 && count_ == 1) value[i][j] = 3; + else if(count_ == 2) value[i][j] = 2; + else value[i][j] = 1; + count_O = count_X = count_ = 0; + } + /*else if() + { + + + }*/ + } + else + value[i][j] = 0; + + } + } +} diff --git a/main.c b/main.c index a8a7a94..be1aee3 100644 --- a/main.c +++ b/main.c @@ -2,55 +2,79 @@ #include #include #include "sanziqi.h" -#define computer_first 1 -#define player_first 0 int main() //主函数 { - char arr[3][3]; + char arr[3][3], ch; while(1) { menu(); - int i=0; - scanf("%d",&i); - if(i) + int i = 0; + scanf("%d", &i); + if(i == start_game) { + int choice = 0; + mode(); init_board(arr); - print_board(arr); - if(whom_act()==computer_first) + if(scanf("%d", &choice) == 1) { - while(i++<9) + switch(choice) { - computer_act(arr); + case 1: print_board(arr); - if(judge(arr)=='X') break; - player_act(arr); - print_board(arr); - if(judge(arr)=='O') break; + if(whom_act() == computer_first) + { + while(i++ < 9) + { + computer_act_easy(arr); + print_board(arr); + if(judge(arr) == 'X') break; + player_act(arr); + print_board(arr); + if(judge(arr) == 'O') break; + } + if(judge(arr) == 'O') + printf("你赢了。\n"); + else if(judge(arr)=='X') + printf("你输了。\n"); + else + printf("平局"); + } + else + { + while(i++ < 9) + { + player_act(arr); + print_board(arr); + if(judge(arr) == 'O') break; + computer_act_easy(arr); + print_board(arr); + if(judge(arr) == 'X') break; + } + if(judge(arr) == 'O') + printf("你赢了。\n"); + else if(judge(arr)=='X') + printf("你输了。\n"); + else + printf("平局\n"); + } + break; + case 2: + computer_act_hard(arr); + break; + default: + printf("wrong input!请重新输入\n"); } - if(judge(arr)=='O') - printf("你赢了。\n"); - else - printf("你输了。\n"); } else { - while(i++<9) - { - player_act(arr); - print_board(arr); - if(judge(arr)=='O') break; - computer_act(arr); - print_board(arr); - if(judge(arr)=='X') break; - } - if(judge(arr)=='O') - printf("你赢了。\n"); - else - printf("你输了。\n"); + while ((ch = getchar()) != EOF && ch != '\n');//清空缓存区,防止scanf接收上次的非法输入从而死循环 + printf("wrong input!请重新输入\n"); } } - else + else if(i == end_game) break; + else + printf("wrong input!请重新输入\n"); } return 0; } diff --git a/sanziqi.h b/sanziqi.h index 339ea22..4b26e80 100644 --- a/sanziqi.h +++ b/sanziqi.h @@ -3,6 +3,11 @@ #include #include #include +#define computer_first 1 +#define player_first 0 +#define start_game 1 +#define end_game 0 +void mode(); void init_board(char arr[3][3]); //初始化棋盘 @@ -18,8 +23,9 @@ char judge(char arr[3][3]); // void player_act(char arr[3][3]); //玩家行动 -void computer_act(char arr[3][3]); //电脑行动 +void computer_act_easy(char arr[3][3]); //电脑行动 +void computer_act_hard(char arr[3][3]); #endif // SANZIQI_H_INCLUDED