在三子棋游戏中,首先输出一个菜单,供玩家选择进行游戏或是退出游戏
游戏规则:
'o'代表玩家落子(玩家落子从键盘输入对应的坐标)
'#'代表电脑落子(电脑落子随机生成)
在一个3*3的棋盘中,当玩家的棋子在一行、一列或对角线上连成一条线时,则玩家胜利,同理,则是电脑胜利
如果棋盘上的棋子落满时。还没有分出胜负,则是平局
玩家输入错误时,可以重新输入
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 3
#define clo 3
#define m 2
#define n 0
void menu() //打印菜单
{
printf("**********三子棋游戏**********\n");
printf("**********0-开始游戏**********\n");
printf("**********1-退出游戏**********\n");
}
void chessboard(char arr[row][clo]) //打印棋盘并初始化
{
printf("-------------\n");
printf("| %c | %c | %c |\n", arr[0][0], arr[0][1], arr[0][2]);
printf("-------------\n");
printf("| %c | %c | %c |\n", arr[1][0], arr[1][1], arr[1][2]);
printf("-------------\n");
printf("| %c | %c | %c |\n", arr[2][0], arr[2][1], arr[2][2]);
printf("-------------\n");
}
void player(char arr[row][clo]) //玩家落子
{
int i = 0, j = 0;
printf("请输入您想要落子的坐标");
scanf_s("%d %d",&i,&j );
if (i < 0 || i>2 || j < 0 || j>2 || arr[i][j] != ' ')//输入不符合要求或是要落子的地方已经有棋,则显示输入有误
{
printf("您的输入有误,请重新输入:");
scanf_s("%d %d", &i, &j);
}
if (arr[i][j] == ' ')//arr[i][j]这里应该用i,j,之前是arr[row][clo],结果输入坐标之后的棋盘只是一张空棋盘并没有o
{
arr[i][j] = 'o'; //用o替换掉棋盘中原来的空格
chessboard(arr);//打印落子之后的棋盘
}
}
void computer(char arr[row][clo])//电脑落子
{
srand ( time(0));
int x = rand() % (m - n + 1) + n;
int y = rand() % (m - n + 1) + n;//生成0-2的随机数
printf("电脑开始落子!\n");
while (arr[x][y] != ' ')//当随机生成的坐标不为空格时,继续生成随机数,将子落在是空格的地方
{
x = rand() % (m - n + 1) + n;
y = rand() % (m - n + 1) + n;
}
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
chessboard(arr);
}
}
int check(char arr[row][clo])//判断谁是赢家
{
int i = 0, j = 0;
int count = 0;//计算不是空格的数量
if (((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][2] == 'o')) //当一行或一列或斜角线的o连成3个时,则玩家胜
|| ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][2] == 'o'))
|| ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][2] == 'o'))
|| ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[2][0] == 'o'))
|| ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[2][1] == 'o'))
|| ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[2][2] == 'o'))
|| ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == 'o'))
|| ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == 'o')))
return 1;//返回game并输出玩家胜利
if (((arr[0][0] == arr[0][1]) && (arr[0][1] == arr[0][2]) && (arr[0][2] == '#')) //当一行或一列或斜角线的#连成3个时,则电脑胜
|| ((arr[1][0] == arr[1][1]) && (arr[1][1] == arr[1][2]) && (arr[1][2] == '#'))
|| ((arr[2][0] == arr[2][1]) && (arr[2][1] == arr[2][2]) && (arr[2][2] == '#'))
|| ((arr[0][0] == arr[1][0]) && (arr[1][0] == arr[2][0]) && (arr[2][0] == '#'))
|| ((arr[0][1] == arr[1][1]) && (arr[1][1] == arr[2][1]) && (arr[2][1] == '#'))
|| ((arr[0][2] == arr[1][2]) && (arr[1][2] == arr[2][2]) && (arr[2][2] == '#'))
|| ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[2][2] == '#'))
|| ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && (arr[2][0] == '#')))
return 2;//返回game并输出电脑胜利
for (i=0,j = 0; j<3,j < 3;i++, j++)
{
if (arr[i][j] != ' ')
count++;
}
if (count == 9)
printf("平局");
}
void game(char arr[row][clo])//开始游戏
{
system("cls");
chessboard(arr);//打印棋盘并初始化棋盘
printf("请玩家先开始!\n");
while (1)
{
player(arr);//玩家落子
computer(arr);//电脑落子
check(arr);//判断谁是赢家
if ((check(arr)) == 1)
{
printf("恭喜玩家胜利!\n");
break;
}
if ((check(arr)) == 2)
{
printf("电脑胜利!\n");
break;
}
}
}
int main()
{
int i = 0, j = 0;
char arr[row][clo] = { { ' ', ' ', ' ' }, { ' ', ' ', ' ' }, { ' ', ' ', ' ' } };//棋盘初始化利用二维数组初始化
int a = 0;
menu();//打印菜单
printf("请输入您的选择!");
scanf_s("%d", &a);
if (a == 0) //玩家选择0之后,开始游戏
{
game(arr);
}
else //玩家选择1之后,退出游戏
{
system("cls");
printf("您已经退出游戏!\n");
}
system("pause");
return 0;
}
1.菜单界面
.2.开始游戏
3.电脑胜利
4.玩家胜利
5.输入有误
6.退出游戏
自己玩了几局,很难出现平局
还有这个代码自己虽然能理清思路,但总觉得太过于繁琐,期待在后序的学习中,能将其优化!
ヾ(◍°∇°◍)ノ゙