目录
一、前言
大家好,我是一名C语言初学者,在这篇博客中,我想和大家分享一下我学习C语言过程中编写的一个小项目——三子棋游戏。希望能对其他C语言初学者有所帮助。
二、游戏介绍
首先,让我们来了解一下三子棋游戏的规则。三子棋是一种简单的棋类游戏,它由一个3x3的棋盘和两个玩家组成。每个玩家轮流在棋盘上放置自己的棋子,目标是在横向、纵向或对角线上先形成一条连线,即获得胜利。如果棋盘填满,但没有任何一方获胜,则为平局。
三、编写过程
接下来,我将介绍一下我是如何使用C语言来实现这个小游戏的。
1、建立游戏大体选择框架
首先,使用“do while”循环语句建立起游戏的大体框架:打印游戏界面->选择开始或者退出->选错则给出反馈重新选择。
void jiemian()//游戏界面
{
printf("************************\n");
printf("** 1.play * 2.out game**\n");
printf("************************\n");
}
void test()//游戏界面选择
{
int put = 0;
do
{
jiemian ();
scanf("%d", &put);
switch (put)
{
case 1:
printf("play game\n\n");
break;
case 2:
printf("out game\n\n");
break;
default:
break;
}
} while (put != 2);
}
2、游戏主体
(1)、棋盘的创建打印与重置
我创建了一个3x3的数组来表示棋盘(使用宏定义棋盘横竖的大小方便后期调整)。
棋盘可使用二维数组创建,格式输出为自习喜欢的样子。棋盘初始化则需要单独的函数功能进行每个元素访问并赋值字符‘空格’;数组的每个元素可以取三种状态:玩家的棋子、电脑的棋子。我使用了字符常量来表示这些状态,例如‘ * ’表示玩家的棋子,‘ # ’表示电脑的棋子,‘空格’表示没有放棋子。
然后,我编写了一个函数来打印当前的棋盘状态。我使用了嵌套的for循环来遍历数组,并根据每个元素的状态打印相应的字符。(检验当前代码是否有问题)
(2)、编写玩家下棋和电脑下棋功能
接下来,我编写了一个函数来获取玩家的输入。我使用了scanf函数来获取玩家输入的行和列,然后将玩家的棋子放置在对应的位置上。需要注意的是,我还要检查玩家的输入是否合法,即行和列的值是否在合法范围内,并且所选的位置是否为空。
编写电脑下棋时可使用rand函数和srand函数详细功能大概为产生随机数和重置随机种子(详细功能请自行查找)。
/玩家下棋
void playrgame(char pan[hen][shu])
{
int a = 0;
int b = 0;
while (1)
{
printf("玩家走:>");
scanf("%d,%d", &a, &b);
if ((a-1 <= hen && a-1 >= 0) && (b-1 >= 0 && b-1 <= shu))
{
if (pan[a - 1][b - 1] == ' ')
{
pan[a-1][b-1] = '*';
break;
}
else
{
printf("已有棋子。");
}
}
else
{
printf("请重新输入有效坐标!");
}
}
}
void compute(char pan[hen][shu])//电脑走
{
while (1)
{
int x = rand() % hen;
int y = rand() % shu;
if (pan[x][y] == ' ')
{
pan[x][y] = '#';
break;
}
else
{
;
}
}
}
(3)、判断是否结束功能
然后,我编写了一个函数来判断游戏是否结束。我使用了一系列的if语句来检查当前的棋盘状态是否满足获胜条件。如果玩家获胜,我就返回相应的‘ * ’信息;电脑获胜,我就返回相应的‘ # ’。如果棋盘已经填满,但没有任何一方获胜,我就返回‘ o ’信息。
char panduan(char pan[hen][shu])//判断输赢:玩家赢返回“*”;电脑赢“#”;平局“o”
{
int i = 0;
for (i = 0; i < 3; i++)
{
if (pan[i][0] == pan[i][1] && pan[i][2] == pan[i][1] && pan[i][1] != ' ')
{
return pan[i][0];
}
}
for (i = 0; i < 3; i++)
{
if (pan[0][i] == pan[1][i] && pan[1][i] == pan[2][i] && pan[0][i] != ' ')
{
return pan[0][i];
}
}
if (pan[0][0] == pan[1][1] && pan[1][1] == pan[2][2] && pan[0][0] != ' ')
{
return pan[0][0];
}
if (pan[0][2] == pan[1][1] && pan[1][1] == pan[2][0] && pan[0][2] != ' ')
{
return pan[0][2];
}
for (i = 0; i < 3; i++)
{
int j = 0;
for (j == 0; j < 3; j++)
{
if (pan[i][j] == ' ')
return 'o';
}
}
return 'g';
}
(4)、实现轮流下棋与判断输赢功能
最后,我编写了一个主函数来控制游戏的流程。我使用了一个循环来让两个玩家轮流下棋,直到游戏结束。每轮下棋后,我会打印当前的棋盘状态,并检查游戏是否结束。如果游戏结束,我就打印相应的胜利或平局信息,并结束游戏。(这里的变量ci记录进行的前两把不进行胜负判断)
while (1)
{
static int ci = 1;
playrgame(pan);//玩家下棋
qipan(pan, hen, shu);//打印棋盘
if (ci > 2)
{
g = panduan( pan,hen,shu);//判断输赢:玩家赢返回“*”;电脑赢“#”;平局“o”
if ('*' == g)
{
printf("玩家赢!\n");
break;
}
if ('#' == g)
{
printf("电脑赢!\n");
break;
}
if ('g' == g)
{
printf("平局!\n");
break;
}
if ('o' == g)
{
;
}
}
compute(pan);//机器下棋
qipan(pan, hen, shu);//打印棋盘
if (ci > 2)
{
g = panduan(pan,hen,shu);//判断输赢:玩家赢返回“*”;电脑赢“#”;平局“o”
if ('*' == g)
{
printf("玩家赢!\n");
break;
}
if ('#' == g)
{
printf("电脑赢!\n");
break;
}
if ('g' == g)
{
printf("平局!\n");
break;
}
if ('o' == g)
{
;
}
}
ci++;
}
四、感想
通过这个小项目,我学到了很多关于C语言的知识,例如数组的使用、循环和条件语句的应用等。同时,我也锻炼了自己的逻辑思维能力和编程能力。
总结一下,这个三子棋游戏是我作为一名C语言初学者自己完成的一个小项目。通过这个项目,我不仅巩固了自己的C语言知识,还提高了自己的编程能力。希望我的经验可以对其他C语言初学者有所帮助。谢谢大家的阅读!