干爆三子棋!!!

大家好,我是你们的代码无敌超有实力的老师,今天给大家教一下三子棋代码。

首先三子棋代码的一个大体思路,我来给大家简单讲一下,话不多说,咱们开干:

首先咱们需要来理一下,像这种大型的代码,有较多的函数,我建议大家,将函数的声明放头文件里,框架以及实现分别放入不同的源文件里,比如我这里将三子棋的实现放在了 gg.c这个源文件里,游戏的思路放在game.c以及函数相关的定义放在了test.h这个头文件里。

首先让我们先看游戏的具体思路:

首先使用了一do while 语句来实现游戏的开始及使用,之所以使用do while 语句是因为do while 语句是先进行一次实现,在根据while里面判断条件的真假,来决定是不是要继续进行,这里 do while 里的scand((unsigned int )time (NULL))我们先不管,我们先来从menu这个函数来看,首先进入menu之后会出现一个简易的菜单,里面的内容是1进入游戏还有0 你们懂得,没办法,哥比较有个性,1和0其实是让玩家自己选择的,既然自己选择,咱们创造了一个input 的变量用于scanf输入的一个使用,那么这里的switch对应菜单的使用 ,那么1就让进入游戏,0就退出,若是输入别的呢,就用default 来提示重新输入,此时while里的判断条件input 就很巧妙,1继续,0退出游戏,那么游戏框架的思路已经出来了。

接下来,要思考的就是如何实现game()这个函数

首先我们要下的是三子棋这个游戏,我们得有一个3*3的棋盘吧,那么我们接下来就创造一个函数,那么提到3*3自然要用到三行三列,那么自然想到了2维数组,那么先有个三行三列的数组board[hang][lie],为什么不直接使用board[3][3]呢?要使用hanglie这又是什么鬼呢?

其实这里的board[hang][lie]用的define定义的标识符常量

 那么有人问了?是不是有病啊,这不是多此一举吗?其实不是的,define 这个定义我是将他放在头文件test.h里,以后假设我们要换成个10*10的棋盘只要头文件改一下,再放源文件里引一下头文件就可以了

引头文件记住用" "就欧克了。

那我们回到有了这样一个3*3的数组,那就先给棋盘初始化一下吧,就是就3*3的棋盘里全部存放空格,那这里创造了一个函数chusi(board,hang,lie)穿参的时候将数组,行,列,全部穿过去,打印空格

打印其实就用两个for循环就可以完成。

那么这时候我们我们便开始打印棋盘用的是dayin(board,hang,lie)这个函数,那问题来了,如何打印这个棋盘呢?

我们来整理一下思路,首先我们前面说过#define的hang,lie是为了可以更改棋盘的大小,那我们棋盘的要有hang,lie来控制。

ok,如果我们要打印这样一个棋盘

那我们来观察  中间空格的地方是我们下棋的位置,也就是说我们打印的时候需要一个注意。

那我们来看第一行 是不是我们下印一个下棋的位置,在三子棋中就打印三次,接下来我们打印 | 是不是要打印两次,注意接下来是不是换一行,在打印,接下来我们打印 ---是不是要打印三次,|打印两次。那我们把

   |   |  

---|---|---

当作一次循环,那么是不是循环三次就应该打印出一个棋盘,但实际上呢,我们想一想---|---|---是不是只用打印两次,那么我们在前面加上一个限制条件让它少打印一次,是不是就OK了。

你看看,我们先是不是用两个for循环 ,分别打印一下 |  |  以及--- |---|---就可以了,让他们作为一次循环,再将他们放入一个大的for循环让他们打印三次,只不过打印---|----|----的时候少打印一次就好了,那么这时候printf(" %c " ,board [i] [j])的好处就出来了,将不同的我们要下的位置放在棋盘里。

那棋盘打印出来了,我们是不是应该让玩家下棋呢?其实玩家下棋的思路很简单,如果玩家下棋的地方是空格且在棋盘里就下,我们来看

 玩家下棋是不是要两个变量,然后输入用scanf是不是就行了,这里用while(1)不确定退出的条件,所以让他一直循环,很多同学问了,怎么退出了?很简单嘛,加个break跳出就OK了,这里判断的时候很多人就问了?为什么输入坐标会是大于1呢?数组的下标不是从0开始吗?各位,这是我们程序员才知道的,玩家就正常该咋输咋输入,咱们打印的时候下标减一就OK了,要是输入超出范围了,咱就提醒一下嘛,反正一直循环呢,直到输入成一次,跳出来,在把玩家输入打印下来,那此时我们board[][]已经存放了玩家下的棋,这时我们直接在引用一下打印的函数dayin(board,hang,lie)就OK了

大家看再次使用这个函数

到打印board这个数组里面内容的时候,是不是就将玩家下的棋随i,j的改变打印到玩家想下的地方呢?ok,大家先不要看is_win这个函数, 我们继续来思考,玩家下棋之后,是不是该电脑下棋了,那我们来创造一个函数computer_move(board, hang, lie),电脑下棋的思路跟玩家下棋一样,唯一不同的是电脑如何下呢?

今天我们只是给同学提供一种方法,我们让电脑下随机值好不好,那我们这里以时间的返回来当返回值,时间是不是随时在变呢,那这里就是随机值,

大家看这里有个rand(),这里其实就创造了随机值,你看我们让随机值%han其实就是算下来就是0 1 2这三个值再拿x,y来接收,然后后面思路就跟玩家下棋一样了不过使用rand()必须在前面加上scand()

里面使用了time(NULL),其实就是以时间来创造,因为我们使用了scand以及time这些库函数,所以要在前面加他们对应的头文件

然后继续使用dayin(board,hang,lie)这个函数将电脑输入的位置打印下来就🆗,那我们这玩家跟电脑打印不可能只打印一次,得看谁赢来停啊,那我们就继续使用while(1)让玩家电脑一直下,那玩家下一次是不是又可能赢了啊,电脑同理要判断。

我们在来想,下棋的结果有几种呢,其实无非就四种,玩家赢* 电脑赢# 游戏继续q 平局w,玩家赢返回* 电脑赢返回# 游戏继续返回q 平局返回w

那来看

is_win函数这个函数结束之后,来判断if(ret!='q')如果不等于q为真,即不等于游戏继续为真,则跳出来,那游戏不继续是不是结束了,那看结果呢到底是平局呢还玩家赢呢等等,我们根据返回的类型来判断,用printf来提示。

ok,那我们如何来创造is_win这个函数呢,我们来看看

 那赢的条件是什么呢?我们想想是不是三行中,三列中有任意一个直线相连的玩家或电脑下的三个字符相等就赢了,或者两条对角线三个字符相等也能判断输赢,则用for循环以让有一个变量从0到2判断行数和列数,return board[][]的东西,这时候return #或*的好处就出来了,不管谁赢,都能返回相应的值,那好了,输赢判断好了,如何判断平局呢?我们来想一下,其实只要棋盘里的所有下棋的地方都没了,就是平局,那我们来创造is_full这个函数

 这里注意两个for循环走完后,我们在第2个for循环里判断,如果这里有一个地方还有空格证明还有地方下,return 0;如果循环走完没有一个地方是空格则return1;

再来判断如果是1则return w

函数遇到return值结束,如果这时候还没有结束,即没赢,没平局,则return q游戏继续。

ok,三子棋的代码就讲到这里,我是你们超级无敌超级6的hx老师,觉得这篇文章对你有帮助的点个关注

 

 

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值