#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 3
#define col 3
#define NULL 0
void initBoard(char arr[row][col]) //初始化棋盘
{
int i = 0, j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
arr[i][j] = ' ';
}
}
}
void menu(void) //打印开始菜单
{
printf("1.play 0.exit\n");
printf("请选择:>");
}
void ChessBoard(char a[row][col]) //打印棋盘
{
int i,j;
for (i = 0; i < 4; i++)
{
printf(" --- --- --- \n");
if (i <= 2)
{
for (j = 0; j <= 2; j++)
{
printf("| %c ", a[i][j]);
}
if (j == 3)
{
printf("|\n");
}
}
}
}
void PlayerMove(char a[row][col])
{
int x,y;
while (1)
{
printf("请输入坐标(格式:1 2):>");
scanf("%d %d", &x, &y);
x--;
y--; //使得坐标从(1.1)开始
if (a[x][y] == ' ') //落点必须为空
{
a[x][y] = 'X';
break; //输入成功跳出循环,结束
}
else
{
printf("错误输入\n");
continue; //输入错误再次循环,重新输入
}
}
}
void RobotPlay(char a[row][col])
{
int x = 0;
int y = 0;
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (a[i][j] == ' ')
{
a[i][j] = '0';
if (((a[i][0] == a[i][1]) && (a[i][1] == a[i][2])) && (a[i][0] != ' '))
{
a[i][j] = '0';
return;
}
else if (((a[0][j] == a[1][j]) && (a[1][j] == a[2][j])) && (a[0][j] != ' '))
{
a[i][j] = '0';
return;
}
else if (((a[0][0] == a[1][1]) && (a[0][0] == a[2][2])) && (a[1][1] != ' '))
{
a[i][j] = '0';
return;
}
else if (((a[0][2] == a[1][1]) && (a[0][2] == a[2][0])) && (a[1][1] != ' '))
{
a[i][j] = '0';
return;
}
a[i][j] = ' '; //从第一个点开始优先检验是否存在可以使己方三个子相连的落点
//若存在则置0并结束函数,不能存在则执行下一条语句
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (a[i][j] == ' ')
{
a[i][j] = 'X';
if (((a[i][0] == a[i][1]) && (a[i][1] == a[i][2])) && (a[i][0] != ' '))
{
a[i][j] = '0';
return;
}
else if( ((a[0][j] == a[1][j]) && (a[1][j] == a[2][j])) && (a[0][j] != ' '))
{
a[i][j] = '0';
return;
}
else if (((a[0][0] == a[1][1]) && (a[0][0] == a[2][2])) && (a[1][1] != ' '))
{
a[i][j] = '0';
return;
}
else if (((a[0][2] == a[1][1]) && (a[0][2] == a[2][0]))&&(a[1][1] != ' '))
{
a[i][j] = '0';
return;
}
a[i][j] = ' '; //从第一点开始检验是否存在使对方三子相连的落点
} //若存在置0并结束函数,不存在则继续
}
}
while (1) //不存在使得己方或对方三子相连时随机下点
{
srand((unsigned)time(NULL));
i = rand() % 3;
srand((unsigned)time(NULL));
j = rand() % 3;
if (a[i][j] == ' ')
{
a[i][j] = '0';
return;
}
}
}
char CheckWin(char a[row][col])
{
int i,j;
for (i = 0; i < row; i++)
{
if ((a[i][0] == a[i][1]) && (a[i][1] == a[i][2]))
{
return a[i][0];
}
}
for (j = 0; j < col; j++)
{
if ((a[0][j] == a[1][j]) && (a[1][j] == a[2][j]))
{
return a[0][j];
}
}
if ((a[0][0] == a[1][1]) && (a[1][1] == a[2][2]))
{
return a[1][1];
}
else if ((a[0][2] == a[1][1]) && (a[1][1] == a[2][0]))
{
return a[1][1];
} //检验是否有三子相连的点,存在则返回该点
for (i = 0; i < row; i++) //不存在三字相连点时棋盘是否下满
{
for (j = 0; j < col; j++)
{
if (a[i][j] == ' ')
{
return ' '; //未下满返回空格继续下
}
}
}
return 'e'; //下满则平局,返回e
}
int main()
{
char arr[row][col] = { 0 }; //创建2维数组用于存放棋子
int input = 0;
char ret;
do{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
initBoard(arr); //初始化棋盘,数组内容全部置空格
ChessBoard(arr); //打印棋盘
do
{
PlayerMove(arr); //玩家下
ChessBoard(arr);
if ((ret = CheckWin(arr)) != ' ')
{
break;
} //检验胜负
RobotPlay(arr); //电脑下
ChessBoard(arr);
ret = CheckWin(arr);
} while (ret == ' '); //检验胜负
if (ret == 'X')
{
printf("玩家赢\n");
}
else if (ret == '0')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
break;
case 0:
break;
default:
printf("输入错误请重新输入:>\n");
break;
}
} while (input); //保证可再次进行游戏
system("pause");
return 0;
}
VS环境下实现一个简单的三子棋游戏
最新推荐文章于 2022-04-03 20:14:53 发布