思路:
三子棋是一种只需要行、列、斜中任意一种情况三个相同棋子相连便胜利的游戏。本程序中,要求玩家与电脑PK,棋盘坐标用一个二维数组保存起来,玩家通过键盘输入坐标落子,电脑通过srand和rand函数随机产生坐标落子。每次落子都需要判断游戏是否结束。
程序模块
1.游戏菜单,供用户进入游戏
2.创建初始化棋盘
3.打印棋盘的实时状态
4.控制电脑落子
5.用户输入坐标
6.判断游戏是否达到结束条件
代码实现
全局变量定义及函数声明
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//g_表示全局变量
char g_broad[ROW][COL];
初始化数组
void Init()
{
//把数组中的每个元素都初始化成' '
for (int row = 0; row< ROW;row++)
for (int col = 0; col < COL; col++)
g_broad[row][col] = ' ';
}
棋盘展示
void Print()
{
for (int row = 0; row < ROW; row++)
{
printf("| %c | %c | %c |\n", g_broad[row][0], g_broad[row][1],
g_broad[row][2]);
printf("----|---|---|\n");
}
}
玩家落子
void PlayerMove()
{
printf("玩家落子");
while(1)
{
printf("请输入一组坐标(row col):");
int row = 0, col = 0;
scanf("%d %d", &row, &col);
if (row < 0 || row >= ROW || col < 0 || col >= COL)
{
//用户输入的坐标非法
printf("坐标输入非法,请重新输入!n");
continue;
}
if (g_broad[row][col] != ' ')
{
printf("当前位置已经有子了,请重新输入!\n");
continue;
}
g_broad[row][col] = 'x';
break;
}
}
电脑落子
void ComputerMove()
{
//让电脑产生两个随机数
printf("电脑落子!\n");
while (1){
int row = rand() % ROW;
int col = rand() % COL;
if (g_broad[row][col] != ' ')
{
continue;
}
g_broad[row][col] = 'o';
break;
}
}
判断棋盘是否满了
int IsFull()
{
//如果棋盘满了返回1,没有返回0
for (int row = 0; row < ROW; row++)
{
for (int col = 0; col < COL;col++)
if (g_broad[row][col] == ' ')return 0;
}
//如果遍历结束也没找到空格说明
return 1;
}
判断是否分出胜负
char CheckWinner()
{
//检查所有行
for (int row = 0; row < ROW; row++)
{
if (g_broad[row][0] == g_broad[row][1]
&& g_broad[row][1] == g_broad[row][2] && g_broad[row][0] != ' '){
return g_broad[row][0];
}
}
//检查所有列
for (int col = 0; col < COL; col++)
{
if (g_broad[0][col] == g_broad[1][col]
&& g_broad[1][col] == g_broad[2][col] && g_broad[0][col] != ' ')
return g_broad[0][col];
}
//检查对角线
if (g_broad[0][0] == g_broad[1][1]
&& g_broad[0][0] == g_broad[2][2]&&
g_broad[0][0] != ' ')
return g_broad[0][0];
if (g_broad[0][2] == g_broad[1][1]
&& g_broad[0][2] == g_broad[2][0] &&
g_broad[0][2] != ' ')
return g_broad[0][0];
if (IsFull())
return 'q';
return ' ';
}
主函数
int main()
{
srand((unsigned) time(0));
Init();
char winner = 0;
while (1)
{
Print();
PlayerMove();
winner = CheckWinner();
if (winner != ' ')
{
break;
}
ComputerMove();
system("cls");
if (winner != ' ')
{
break;
}
}
if (winner == 'x')
printf("你赢了!\n");
else if (winner == 'o')
printf("你输了\n");
else if (winner == 'q')
printf("和棋!你和电脑55开!\n");
system("pause");
return 0;
}