简介:
目标很简单:实现一个 三子棋小游戏。三子棋大家都玩过,规则就不提及了。本博文中实现的三子棋在对局中,电脑落子是随机的,不具有智能性,玩家的落子位置使用键盘输入坐标。下面开始详细介绍如何实现一个简单的三子棋游戏。
步骤一:制定框架
想要实现一个小游戏,第一件事就是制定框架,那么制定框架是什么意思?怎么制定框架?
#include"chess.h"
int main()
{
int n = 0;
do
{
menu();
printf("input:\n");
scanf("%d", &n);
switch(n)
{
case 1:
game();
break;
case 0:
printf("exit\n");
break;
default:
printf("input error,input again:\n");
break;
}
} while(n);
return 0;
}
这里的menu函数只是一个打印函数,定义如下:
void menu()
{
printf("**************\n");
printf("*** 1.play ***\n");
printf("*** 0.exit ***\n");
printf("**************\n");
}
将main函数写全就是制定了一个完整的框架,只要我们输入1,就会进入game函数(之后实现)进行游戏,输入0就会退出游戏,结束程序,输入其他数会让我们重新输入。整个过程就是这么简单。我们只需要实现了game的过程,整个游戏就制作完成了。
那么game函数怎么实现呢?
步骤二:实现game函数
我们在做一个项目的时候,需要把函数的声明放在头文件里,函数的定义放在源文件里,但是具体情况可以根据个人偏好来,我个人是喜欢把主函数里会用到的函数声明放进头文件里,定义放在源文件里。如果在函数的定义中需要实现另外一个函数,就在另外一个函数的声明和定义就都放在源文件里。
要实现game函数,我们需要先将game的流程想清楚:
我们默认玩家先下棋,玩家输入一个合法坐标,然后电脑在下棋。并且每当玩家或者电脑下棋之后需要判断对局是否结束,如果结束,那么最后落子的一方胜利。另外,在玩家或者电脑下棋之后我们需要将棋盘和棋子打印出来。
void game()
{
char pieces[ROW][COL] = { 0 };
piecesInit(pieces, ROW, COL);
board(pieces, ROW, COL);
while (1)
{
system("cls");
board(pieces, ROW, COL);
printf("player move!\n");
playerMove(pieces, ROW, COL);
system("cls");
board(pieces,ROW,COL);
if (judge(pieces, ROW, COL))
{
printf("you win\n");
break;
}
printf("computer move!\n");
computerMove(pieces, ROW, COL);
Sleep(1000);
system("cls");
board(pieces, ROW, COL);
if (judge(pieces, ROW, COL))
{
printf("you lose\n");
break;
}
}
}
pieces二维数组是用来储存棋子位置信息的,玩家的棋子是星号,电脑的棋子是井号
下面对game函数中用到的函数进行解释:
piecesInit:将pieces初始化,使得每一个元素都是空格,这样初始状态就不会打印出棋子
board:传入pieces数组,将棋盘和棋子一并打印
playerMove:玩家下棋,将pieces中的一个空格元素变为星号
computerMoe:电脑下棋,将pieces中的一个空格元素变为井号
judge:返回值是int,如果对局结束了就返回1,未结束返回0
这样整个game的流程就形成了
步骤三:实现game函数中的各个函数
void board(char pieces[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
printf(" %c | %c | %c \n",pieces[i][0],pieces[i][1],pieces[i][2]);
if (i < row - 1)
{
printf("---|---|---\n");
}
}
}//如果不理解,可以在自己的电脑上把棋盘敲出来,就会明白board函数的原理,不敲出来不可能搞明白
void playerMove(char pieces[ROW][COL],int row,int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("x:\n");
scanf("%d", &x);
printf("y:\n");
scanf("%d", &y);
x--;//用户输入的起始位置是1,而数组下标起始位置是0
y--;
if (x < 0 || x>2 || y < 0 || y>2 || pieces[x][y] != ' ')//判断是否非法
printf("error,again\n");
else
break;//正确输入,退出循环
}
pieces[x][y] = '*';
}
void computerMove(char pieces[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % 3;//取0到2的一个数
y = rand() % 3;
if (x >= 0 && x <= 2 && y >= 0 && y <= 2 && pieces[x][y] == ' ')//如果位置合法
{
pieces[x][y] = '#';
break;
}
}
}
int judge(char pieces[ROW][COL], int row, int col)
{
//判断是否有一行三个棋子一样
for (int i = 0; i < row; i++)
{
int sum = pieces[i][0] + pieces[i][1] + pieces[i][2];
if (sum == 3 * '*' || sum == 3 * '#')
return 1;
}
//判断是否有一列三个棋子一样
for (int j = 0; j < col; j++)
{
int sum = pieces[0][j] + pieces[1][j] + pieces[2][j];
if (sum == 3 * '*' || sum == 3 * '#')
return 1;
}
//判断两个对角线是否有三个棋子一样
int sum1 = pieces[0][0] + pieces[1][1] + pieces[2][2];
int sum2 = pieces[0][2] + pieces[1][1] + pieces[2][0];
if (sum1 == 3 * '*' || sum1 == 3 * '#' || sum2 == 3 * '*' || sum2 == 3 * '#')
return 1;
return 0;
}
这样就实现了一个简单的三子棋,看看效果如何: