You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

221 lines
6.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;//随机数012
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';
}