小游戏——————三子棋(保姆级教学)-ag九游会j9官方网站

ag九游会j9官方网站-j9九游会登录入口首页新版
1
小游戏——————三子棋(保姆级教学)
2023-06-16
89 浏览
江海入海,知识涌动,这是我参与江海计划的第3篇。
今天我给大家带来一个小游戏,三子棋的简单实现。跟着本篇文章,你也可以做出属于你自己的三子棋。
                                                        游戏的整体思路
1.text.c————用来测试游戏
2.game.c————游戏功能的实现
3.game.h————游戏功能的声明
‘*’代表着玩家下的棋(也表示赢),‘#’代表电脑下的棋(也表示赢),‘q’表示和棋,‘c’表示继续,
text.c————我们用来测试游戏,我们玩游戏时都会先玩一把,所以我们会选择用do while的循环来解决,当我们第一次进入时,就应该有一个菜单来问我们是否玩游戏,这就用到了我们的menu函数,然后我们可以根据我们选择来选择是否玩游戏。
plain text
复制代码
int main()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出成功\n");
break;
default:
printf("选择错误,重新选择:>\n");
break;
}
} while (input);
return 0;
}
image.gif

我们定义了一个int类型的临时变量input,然后我们根据input的不同来选择是否进行游戏,当我们选择1时,我们就玩游戏,选择0时就选择退出游戏,如果不是这2个数就重新选择。
这是我们来实现menu函数,我们只需要打印菜单就行,所以我们不需要传参和返回值,直接printf就可以了
plain text
复制代码
void menu()
{
printf("*************************\n");
printf("******** 1.play *******\n");
printf("******** 0.exit *******\n");
printf("*************************\n");
}
image.gif

" width="16" class="ne-image-loading-icon">
image.gif
编辑
这样一看,我们就完成了菜单的打印。当我们选择1时,我们就进入了switch的选择,进入了game函数。

plain text
复制代码
void game()
{
char board[row][col] = { 0 };
initboard(board, row, col);
displayboard(board, row, col);
char ret = 0;
while (1)
{
playermove(board, row, col);
displayboard(board, row, col);
ret = iswin(board, row, col);
if (ret != 'c')
break;
//电脑下
computermove(board, row, col);
displayboard(board, row, col);
ret = iswin(board, row, col);
if (ret != 'c')
break;
}
if (ret == '*')
printf("玩家赢\n");
else if (ret == '#')
printf("电脑赢\n");
else
printf("和局\n");
}
image.gif


我们先定义一个3行3列的二维数组,为了我们代码的可读性,我们就可以将行改为row,列对应为col,这是我们就可以在game.h中#define了


 game. h
image.gif

game.h中,我们是把库函数都放在了game.h中,然后我们用#define定义了一下row ,col的数,这样当我们想把棋盘改为5x5的时候,只需要改变game.h的值就可以实现所有的改变。
回到text.c中,我们定义完char类型的二维数组,我们就要初始化它,将二维数组全部初始化为‘ ’。  这时我们就需要在game.h中声明一下initboard的函数,将我们的二维数组、行、列全部传进去。
 game.h中我们就可以这样声明
image.gif

然后我们函数的实现就让在了game.c中,
image.gif

我们想,把棋盘初始化后,是不是要显示棋盘,我们就要用到我们的displayboard的函数,目标是实现这个图。
" width="16" class="ne-image-loading-icon">
image.gif
编辑
" width="16" class="ne-image-loading-icon">
image.gif
编辑我们发现第一行是由空格和|组成的,我们row是3,然而我们最后一列没有|,我们就可以分别来实现它,而第二行就是___和|组成的,最后一列也是没有|。这时可以实现displayboard函数了,代码如下。
image.gif

当然,我们也要在game.h中声明这个函数,当我们实现完显示棋盘的函数,这时我们就可以来实现用户走的函数了,我们可以定义一个playermove的函数,定义一个电脑移动的函数(computermove),我们在game.h中声明一下,然后就可以在game.c中实现了
image.gif

 我们定义pos_x和pos_y来表示要走的位置,我们落的棋子就必须在棋盘中,这就有了第一个if的判断,第二个if判断中如果落得那个位置是‘ ’,就代表了那个位置没有人下,我们就可以把“*”下在那个位置,然后挑出循环,如果下的位置有人落了,我们就要重新下,循环一下就可以实现了。但请注意,我下的位置是[pos_x-1][pos_y],这是因为我们的数组下标是从0开始的,而用户玩的时候,以为的1行1列就是我们的0行0列,所以我们都要-1,。
image.gif

 电脑下的棋子当然要下在棋盘内,所以我们用到了%row,表示着0-row-1的位置,我们要在棋盘内随机落子,我们就要用到rand函数,rand函数就要用到srand函数,我们可以把srand放在main函数中,
image.gif

这个代表着时间戳,我们显示生活中的时间都是一直在走的,这样我们就可以实现随机落子了,我们用srand函数中用到了time的类型我们就把它置位空,类型强转为(unsigned int),注意,我们的srand要把它放在while函数之前,不能放在while函数中,我们可以这样理解,如果我们把srand函数放在whlie函数中,我们是不是每次循环的时候,时间都要重新设定一下,这样就不符合我们的定义了。
然后就是我们的iswin函数了,我们把board,row,col传参传过去,我们要实现iswin函数,老方法需要我们在game.h中声明一下,在game.c中实现函数
image.gif

 我们定义一个int类型的变零i,然后我们用for循环,进入第一个if判断,如果连着3个都相等,而且都不等于‘ ’,我们就可以返回board【i】【0】,代表着谁连3个就谁赢,第二个if判断就是判断列是否相等,第三个和第四个是判断斜对角是否3个连着的。

当棋盘满了的时候,我们就返回了‘q’,代表着和棋,如果上述三个都不满足,就表示继续下棋。
isfull函数需要我们遍历一下,用for循环,代码如下,
image.gif
如果我们的3行3列棋盘都没有‘ ’的时候就代表着满了返回1,如果有一个等于‘ ’,我们就返回0,我们的isfull函数就根据我们返回值来判断棋盘是否为空。
 最后,附上game.c的代码
image.gif

game.h的代码
image.gif

text.c的代码  
image.gif

" width="16" class="ne-image-loading-icon">
image.gif
编辑
最后:这样我们就实现了简单的三子棋,当然我们也有问题,当我们的棋盘变成10x10时,我们iswin的判断就有问题了,我们也只能判断3子棋,如果有兴趣,可以适当改一下代码,让它变成多子棋。
avatarname
后发表内容
1个评论
uu木uuuuuuuu。v忙吧
您的社区活跃积分 3,登录后即可领取  
网站地图