|
|
#include"sanziqi.h"
|
|
|
|
|
|
void menu() //菜单
|
|
|
{
|
|
|
printf("****************************\n");
|
|
|
printf("* 1.start game *\n");
|
|
|
printf("* 0.exit game *\n");
|
|
|
printf("****************************\n");
|
|
|
}
|
|
|
void print_board(char arr[3][3]) //打印棋盘
|
|
|
{
|
|
|
printf("\n");
|
|
|
int i;
|
|
|
for (i = 0; i < 3; i++)
|
|
|
{
|
|
|
printf("%c |%c |%c\n", arr[i][0], arr[i][1], arr[i][2]);
|
|
|
if (i < 2)
|
|
|
printf("—+—+—\n");
|
|
|
}
|
|
|
printf("\n");
|
|
|
}
|
|
|
void init_board(char arr[3][3]) //初始化棋盘
|
|
|
{
|
|
|
|
|
|
int i, j;
|
|
|
for (i = 0; i < 3; i++)
|
|
|
{
|
|
|
for (j = 0; j < 3; j++)
|
|
|
{
|
|
|
arr[i][j] = ' ';
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
int who_act() //选择谁先行动
|
|
|
{
|
|
|
int input = 0;char ch=0;
|
|
|
printf("****************************\n");
|
|
|
printf("** Who goes first? **\n");
|
|
|
printf("** 1:Computer **\n");
|
|
|
printf("** 2:You **\n");
|
|
|
printf("****************************\n");
|
|
|
while (1)
|
|
|
{
|
|
|
printf("Choose who act first:");
|
|
|
scanf("%d", &input);
|
|
|
if (input == 1)
|
|
|
return 1;
|
|
|
else if (input == 2)
|
|
|
return 2;
|
|
|
else
|
|
|
{
|
|
|
while ((ch = getchar()) != EOF && ch != '\n');
|
|
|
printf("wrong input\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
int check_(char arr[3][3]) //判断棋子是否下满
|
|
|
{
|
|
|
int i = 0, j = 0, ch = 0;
|
|
|
for (i = 0; i < 3; i++)
|
|
|
for(j = 0; j < 3; j++)
|
|
|
if(arr[i][j]!=' ') ch++;
|
|
|
return ch;
|
|
|
}
|
|
|
char judge_win(char arr[3][3]) //判断输赢,谁达到三字则返回对应的字符
|
|
|
{
|
|
|
int i;
|
|
|
for (i = 0; i < 3; i++)
|
|
|
{
|
|
|
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][0] != ' '))//行
|
|
|
return arr[i][0];
|
|
|
else if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[0][i] != ' '))//列
|
|
|
return arr[0][i];
|
|
|
else if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[1][1] != ' '))//对角线
|
|
|
return arr[1][1];
|
|
|
else if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[1][1] != ' '))
|
|
|
return arr[1][1];
|
|
|
}
|
|
|
return ' ';
|
|
|
}
|
|
|
void player_act(char arr[3][3]) //玩家行动
|
|
|
{
|
|
|
int x = 0;
|
|
|
int y = 0;
|
|
|
char ch;
|
|
|
while (1)
|
|
|
{
|
|
|
printf("Coordinnate: x,y (0<x<4,0<y<4)\n");
|
|
|
int i=scanf("%d,%d", &x, &y);
|
|
|
if(i==2&&arr[--x][--y] == ' ')
|
|
|
{
|
|
|
arr[x][y] = 'O';
|
|
|
break;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
while ((ch = getchar()) != EOF && ch != '\n');//清空缓存区,防止scanf接收上次的非法输入从而死循环
|
|
|
printf("wrong input!\n");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
void computer_act_easy(char arr[3][3]) //电脑行动
|
|
|
{
|
|
|
srand((unsigned)time(NULL));//用系统时间初始化随机数种子
|
|
|
while (1)//无限循环直到遇到break退出
|
|
|
{
|
|
|
int x = rand() % 3;//计算机随机落子
|
|
|
int y = rand() % 3;
|
|
|
if (arr[x][y] == ' ')
|
|
|
{
|
|
|
arr[x][y] = 'X';
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
void mode()
|
|
|
{
|
|
|
printf("****************************\n");
|
|
|
printf("** 1. Easy **\n");
|
|
|
printf("** 2. Normal **\n");
|
|
|
printf("****************************\n");
|
|
|
}
|
|
|
|
|
|
void computer_act_normal(char arr[3][3])
|
|
|
{
|
|
|
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)//如果电脑先手,则电脑随机选择棋盘4个角
|
|
|
{
|
|
|
do
|
|
|
{
|
|
|
srand((unsigned)time(NULL));
|
|
|
i=rand()%3;//随机数0,1,2
|
|
|
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] == ' ')
|
|
|
{
|
|
|
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] += 100;
|
|
|
else if(count_O == 2) value[i][j] += 50;
|
|
|
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] += 100;
|
|
|
else if(count_O == 2) value[i][j] += 50;
|
|
|
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] += 0;
|
|
|
count_X = 0;
|
|
|
count_O = 0;
|
|
|
count_ = -1;
|
|
|
if(i - j != 1 && j - i != 1)
|
|
|
{
|
|
|
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] += 100;
|
|
|
else if(count_O == 2) value[i][j] += 50;
|
|
|
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] += 100;
|
|
|
else if(count_O == 2) value[i][j] += 50;
|
|
|
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';
|
|
|
}
|