用C语言实现 三子棋 小游戏

接下来将总结一下最近学的如何用C实现简单的三子棋小游戏。

由于代码量比较大,使用的函数比较多,建议在开始写之前用vc先创建好.h头文件和.c源文件用于定义和声明函数以及游戏测试,也方便分模块管理。在.h头文件中声明函数,game.c源文件定义函数的实现过程,test.c用来测试整个游戏。

在开始游戏的时候,希望在屏幕上一上来就打印一个简易的菜单,让用户选择玩游戏还是退出游戏,所以我们在text.c文件中用do while循环,将打印菜单这一操作用menu()这个函数封装起来,使整个main()函数更加简洁;用scanf()来获取用户的输入,因为用户除了选择1和0外还可能输入其它的数,所以我们用switch()语句来进行控制;将input作为do while语句的循环条件,当用户输入1时就可以无限次进入game()玩游戏,直到输入0无法进入循环,游戏结束。

游戏的过程用game()函数封装,当玩家输入1时先把棋盘打印一下,那就要先对棋盘进行初始化;观察以下棋盘,到时候玩家和电脑要在棋盘上下棋,下的棋子可用不同字符代替,这样的话可以用一个3*3的数组board来存储整个棋盘上的数据,而我们看到的空棋盘上实际上每个格子都放着一个空格,打印棋盘本质上打印的是存放在这里面的数据那就是打印数组;初始化棋盘和打印棋盘,要知道有几行row几列col,实际上是对整个数组进行操作,所以要将这些数据传给函数。在.h头文件中声明函数,game.c源文件定义函数的实现内容,行和列如果直接用char board[3][3]那就写死只能是3*3的棋盘格,为了后期按需求变化,所以我们在.h头文件中定义全局变量Row存放行数和Col存放列数,到时候要是想要10*10的棋盘可直接在.h文件中修改。

                                   函数调用

      声明函数

函数实现过程

打印棋盘,可将棋盘每一行看做数据+分隔符组成,“ %c | %c | %c \n”  +  “---|---|---”;数据看做“ %c ”+“|”组成,分隔符看做“---”+“|”组成,最后一行和最后一列可用判断条件进行控制

   数据                

分隔符                    列

             行

 最终效果

函数实现过程

接下来我们就要开始下棋,逻辑是玩家下一步,接着电脑下一步,除非棋盘满了不然这一过程将在game()函数中无限次循环下去,所以用while()函数不考虑其他特殊原因让他恒为真;不管是玩家还是电脑实际上都是向二维数组board进行数据存储的操作,操作的时候又要具体知道在第几行第几列的哪一个格子,所以要将数组和行列传给函数PlayMove()玩家下棋函数和ComputerMove()电脑下棋函数.

函数声明

玩家下棋时要先输入坐标,玩家输入的坐标又分为三种情况:1.合法范围内的坐标输入才能下棋接着判断这个坐标对应数组中是否存放为空格,如果是空格就可以下,2.不是空格就提示他已经被占用要重新输入坐标,3.以上都不是,坐标输入非法,请重新输入!直到输入正确坐标,所以我们用while()语句实现;需要注意的一点是:普通玩家并不是程序员,他们不知道数组的下标是从0开始,他们输入按正常情况从1开始,所以在进行判断是否被占用的时候要对应的下标-1。

还有一点是:我们定义,x为横坐标,y为纵坐标,为什么判断的时候不直接<=3而是<=row和col,这一点也是为了不把代码写死,我们前面在头文件中定义Row为3,Col为3,将其传给函数是为了后期如果不想要3*3的棋盘,想改成10*10的话可以灵活变换所以代码。

电脑下棋,不考虑其智能化随机找空位下就行。代码基本和玩家的一样,唯一要考虑的一点是如何实现电脑在合法范围内随机找位置下的功能,这就必须得用到srand()函数、time()函数,利用时间戳在主函数main()中生成随机数,然后在电脑下棋的函数中用rand()函数%上对应范围内行和列,则生成合法范围内随机数,这边就不对此函数进行介绍,可自行百度。这些函数使用要引的头文件有:time.h 和stdlib.h。

main()中生成随机数

最后,就剩下一个判断输赢的程序小游戏就完成了,我们希望玩家、电脑每走一步棋就用Iswin()判断一次输赢,这一过程同样也是对数组进行判断,最后把棋盘的结果再打印在屏幕上一次。判断输赢无非就:1.玩家赢了2.电脑赢了3.平局4.以上都没有就继续游戏;我们规定返回“q”——平局,返回“*”——玩家赢,返回“#”——电脑赢,返回“c”——继续游戏

以上游戏运行的逻辑

在头文件中定义输赢函数

在判断赢时条件是:1.行有三个相同字符,2.列有三个相同字符,3.两条对角线有三个相同字符

Isfull()函数用来判断是否满足平局要求,直接在game.c文件实现就行,不用在.h头文件中定义;应为这是在判断输赢函数中的嵌套调用。是否满就是遍历循环一下board二维数组的每个元素是否为空格,如果有空格则返回0,这样平局条件就不会进入,返回“c”游戏将继续;如果遍历下来无空格,返回1,进入平局判断条件,返回“q”.

运行结果展示:

以上就是本人总结所学三子棋小游戏的实现过程,其中也有一部分代码没那么完善,例如在电脑下棋的那一部分,代码可考虑一下人机对弈让电脑灵活起来而不只是找个空位下就行;还有一个是在判断输赢那块,我每行每列以及对角线判断条件是写死的,只能用于3*3棋盘格,可借鉴一下玩家下棋那一块的代码进行改进。

戛然而止也是一种美,感谢观看!

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值