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