final verson

master
Your Name 7 years ago
parent a8ddbeb1bd
commit cdc80fe044

@ -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';
}

@ -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;
}

@ -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

Loading…
Cancel
Save