From cdc80fe0449caec2a7452d58042cc926af704f11 Mon Sep 17 00:00:00 2001 From: Your Name <18408000323@stu.hut.edu.cn> Date: Mon, 7 Jan 2019 16:36:38 +0800 Subject: [PATCH] final verson --- functions.c | 146 ++++++++++++++++++++++++++++++++++++---------------- main.c | 81 ++++++++++++++++++++++------- sanziqi.h | 26 +++++++--- 3 files changed, 181 insertions(+), 72 deletions(-) diff --git a/functions.c b/functions.c index f5d564f..34872b2 100644 --- a/functions.c +++ b/functions.c @@ -1,9 +1,10 @@ #include"sanziqi.h" + void menu() //菜单 { printf("****************************\n"); - printf("* 输入1.开始游戏 *\n"); - printf("* 输入0.退出游戏 *\n"); + printf("* 1.start game *\n"); + printf("* 0.exit game *\n"); printf("****************************\n"); } void print_board(char arr[3][3]) //打印棋盘 @@ -34,35 +35,36 @@ int whom_act() //选 { int input = 0; printf("****************************\n"); - printf("** 1.电脑先手:X **\n"); - printf("** 0.玩家先手:O **\n"); + printf("** Who goes first? **\n"); + printf("** 1:Computer **\n"); + printf("** 0:You **\n"); printf("****************************\n"); while (1) { - printf("请选择谁先落子:"); + printf("Choose who act first:"); scanf("%d", &input); if (input == 1) return 1; else if (input == 0) return 0; else - printf("选择错误,请重新选择。\n"); + printf("wrong input\n"); } } -int chess_full(char arr[3][3]) //判断棋子是否下满 +int check_(char arr[3][3]) //判断棋子是否下满 { - int i, j; + int i = 0, j = 0, space = 0, ch = 0; for (i = 0; i < 3; i++) - { - for (j = 0; j < 3; j++) + for(j = 0; j < 3; j++) { - if (arr[i][j] == ' ') - return 0; + if(arr[i][j] == ' ') space++; + else ch++; } - } - return 1; + if(space == 9) return empty; + if(ch == 9) return full; + return unend; } -char judge(char arr[3][3]) //判断输赢,谁达到三字则返回对应的字符 +char judge_win(char arr[3][3]) //判断输赢,谁达到三字则返回对应的字符 { int i; for (i = 0; i < 3; i++) @@ -85,7 +87,7 @@ void player_act(char arr[3][3]) // char ch; while (1) { - printf("请落子(即输入对应x,y坐标)例如: %d,%d \n", x, y); + printf("Coordinnate:(x,y) 1<=x<=3,1<=y<=3\n"); scanf("%d,%d", &x, &y); if(arr[--x][--y] == ' ') { @@ -95,7 +97,7 @@ void player_act(char arr[3][3]) // else { while ((ch = getchar()) != EOF && ch != '\n');//清空缓存区,防止scanf接收上次的非法输入从而死循环 - printf("wrong input!请重新输入\n"); + printf("wrong input!\n"); } } } @@ -116,51 +118,105 @@ void computer_act_easy(char arr[3][3]) // void mode() { printf("****************************\n"); - printf("** 1. 简单模式 **\n"); - printf("** 2. 困难模式 **\n"); + printf("** 1. Easy **\n"); + printf("** 2. Hard **\n"); printf("****************************\n"); } void computer_act_hard(char arr[3][3]) { - int value[3][3]; - int i, j, m, count_X, count_O, count_; + int value[3][3] = {{0}}; + int i = 0, j = 0, m = 0, n = 0, count_X = 0, count_O = 0, count_ = -1; + if(check_(arr) == empty) + { + do + { + srand((unsigned)time(NULL)); + i=rand()%3; + j=rand()%3; + if((i == j && i!=1 ) || j - i == 2 || i - j == 2) + { + arr[i][j]='X'; + return; + } + }while(1); + } 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_X = 0; + count_O = 0; + count_ = -1; + 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_X = 0; + count_O = 0; + count_ = -1; + 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() - { - + if(i == j) + { + for(m = 0; m < 3; m++) + arr[m][m] == 'O' ? count_O++ : arr[m][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_X = 0; + count_O = 0; + count_ = -1; + } + if(j - i == 2 || i - j == 2 || (i == 1 && j == 1)) + { + for(m = 0, n = 2; m < 3; m++, n--) + arr[m][n] == 'O' ? count_O++ : arr[m][n] == '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_X = 0; + count_O = 0; + count_ = -1; + } - }*/ + } } else value[i][j] = 0; } } + int max = value[0][0]; + for(i = 0; i < 3; i++) + for(j = 0; j < 3; j++) + { + if(max < value[i][j]) + { + max = value[i][j]; + m = i; + n = j; + } + } + arr[m][n] = 'X'; } diff --git a/main.c b/main.c index be1aee3..5847d87 100644 --- a/main.c +++ b/main.c @@ -15,7 +15,8 @@ int main() // int choice = 0; mode(); init_board(arr); - if(scanf("%d", &choice) == 1) + again: i = scanf("%d", &choice); + if(i == 1) { switch(choice) { @@ -23,58 +24,100 @@ int main() // print_board(arr); if(whom_act() == computer_first) { - while(i++ < 9) + while(check_(arr) != full) { computer_act_easy(arr); print_board(arr); - if(judge(arr) == 'X') break; + if(judge_win(arr) == 'X' || check_(arr) == full) break; player_act(arr); print_board(arr); - if(judge(arr) == 'O') break; + if(judge_win(arr) == 'O' || check_(arr) == full) break; } - if(judge(arr) == 'O') - printf("你赢了。\n"); - else if(judge(arr)=='X') - printf("你输了。\n"); + if(judge_win(arr) == 'O') + printf("You win\n"); + else if(judge_win(arr) == 'X') + printf("You lose\n"); else - printf("平局"); + printf("Tied"); } else { - while(i++ < 9) + while(check_(arr) != full) { player_act(arr); print_board(arr); - if(judge(arr) == 'O') break; + if(judge_win(arr) == 'O' || check_(arr) == full) break; computer_act_easy(arr); print_board(arr); - if(judge(arr) == 'X') break; + if(judge_win(arr) == 'X' || check_(arr)) break; } - if(judge(arr) == 'O') - printf("你赢了。\n"); - else if(judge(arr)=='X') - printf("你输了。\n"); + if(judge_win(arr) == 'O') + printf("You win\n"); + else if(judge_win(arr) == 'X') + printf("You lose\n"); else - printf("平局\n"); + printf("Tied\n"); } break; case 2: - computer_act_hard(arr); + print_board(arr); + if(whom_act() == computer_first) + { + while(check_(arr) != full) + { + computer_act_hard(arr); + print_board(arr); + if(judge_win(arr) == 'X' || check_(arr) == full) break; + player_act(arr); + print_board(arr); + if(judge_win(arr) == 'O' || check_(arr) == full) break; + } + if(judge_win(arr) == 'O') + printf("You win\n"); + else if(judge_win(arr) == 'X') + printf("You lose\n"); + else + printf("Tied"); + } + else + { + while(check_(arr) != full) + { + player_act(arr); + print_board(arr); + if(judge_win(arr) == 'O' || check_(arr) == full) break; + computer_act_hard(arr); + print_board(arr); + if(judge_win(arr) == 'X' || check_(arr) == full) break; + } + if(judge_win(arr) == 'O') + printf("You win\n"); + else if(judge_win(arr) == 'X') + printf("You lose\n"); + else + printf("Tied\n"); + } break; default: printf("wrong input!请重新输入\n"); + goto again; } } else { while ((ch = getchar()) != EOF && ch != '\n');//清空缓存区,防止scanf接收上次的非法输入从而死循环 printf("wrong input!请重新输入\n"); + goto again; } + } else if(i == end_game) break; else + { + while ((ch = getchar()) != EOF && ch != '\n'); printf("wrong input!请重新输入\n"); + } } - return 0; + return EXIT_SUCCESS; } diff --git a/sanziqi.h b/sanziqi.h index 4b26e80..1e97963 100644 --- a/sanziqi.h +++ b/sanziqi.h @@ -7,25 +7,35 @@ #define player_first 0 #define start_game 1 #define end_game 0 + +#define full 1 + +#define empty 0 + +#define unend -1 void mode(); -void init_board(char arr[3][3]); //初始化棋盘 +void init_board(char arr[3][3]); //鍒濆鍖栨鐩 + +void print_board(char arr[3][3]); //鎵撳嵃妫嬬洏 -void print_board(char arr[3][3]); //打印棋盘 +void menu(); //鑿滃崟 -void menu(); //菜单 +int whom_act(); //閫夋嫨璋佸厛琛屽姩 -int whom_act(); //选择谁先行动 +int check_(char arr[3][3]); //鍒ゆ柇妫嬬洏鐘舵 -int chess_full(char arr[3][3]); //判断棋子是否下满 -char judge(char arr[3][3]); //判断输赢 +char judge_win(char arr[3][3]); //鍒ゆ柇杈撹耽 -void player_act(char arr[3][3]); //玩家行动 -void computer_act_easy(char arr[3][3]); //电脑行动 +void player_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