细致的C语言写贪吃蛇教程+详细思路-适合新手附源码

#史上最详细的C语言贪吃蛇教程

#前言

在有用C写贪吃蛇的一个想法之后,上网查了几个教程,觉得不是很能看懂。恩。。。或者说不是一下子就能看出来思路+具体怎么实现。所以,我花了早自习的时间想了想如何用最简单的方法实现,晚上大约两个小时写了出来。别说我用两小时装逼,有了思路之后就是码代码和查细节的问题。

PS:这里补充说一下C语言写的控制台游戏的原理是什么,知道的同学直接跳过这一段。实际上就是不断的用system("cls");清除屏幕再重新打印不一样的内容,在速度较快的时候就会有一种动画效果了,当然这是控制台,就没法究美观了(可以改一下控制台字体和背景颜色相对好看一点,具体百度),晃眼睛也是肯定的。

如图(中间有一点空白gif抓取的时候没抓到请忽略):

效果图

源代码已经放在了github上感兴趣的可以参考一下(顺便star一下看官们)

** 这是源码!!! C-snake-iimT **

#步入正题

我们开始说思路。

  1. 我们需要一张地图,中间是空的四周有墙体。
  2. 我们需要一条蛇,这条蛇由蛇头和蛇身组成。
  3. 我们需要食物,并且在蛇吃掉食物之后将蛇的身体变长,而且重新生成一个食物。
  4. 蛇需要移动,这应该是最难实现的。
  5. 蛇撞到墙或者撞到自己的身体就会死亡。
  6. 我们需要能用键盘控制蛇的运动方向,这个会和蛇的移动有一些联系。

Balabala我们有这么一大堆问题,我们来想想应该如何用代码实现。

  1. 整个地图我们用一个坐标系建立起来,这用一个二维字符数组就能实现了,然后我们的蛇和食物只需要将中间的空格改成蛇的头或者身体或者食物的样子就行了。

  2. 这条蛇应该如何描述,我们先区分蛇头和蛇的身体,然后一组坐标来将这个蛇的头、头后面第一节、第二节、第三节。。。。以此类推。我现在是2050的地图,所以我用一个snake[1000][3]来描述,这里面的1000是2050就是现在有1000个空(假如有人就玩到将整个地图霸占了呢)坐标,snake[i][0]的值用来描述这个坐标是头·snake[i][0]=1还是身体snake[i][0]=0,然后snake[i][1] snake[i][2]分别用来描述所在的X坐标和Y坐标(i表示某一节)。这样我们就用一个数组将蛇描述出来了,在后面我们生成视图的时候将该点的空格换成'#'或者'@'就好了。

  3. 生成食物我们需要产生随机数作为食物的坐标,而且这个随机数要在一定的范围内不能在围墙上,也不能和蛇的坐标一样。生成随机数用

srand(time(0));
int a = rand()%10+1;

这样我们就能得到1-10的数,这里的srand(time(0));初始化一下时间函数,然后rand会给我们一个很大的秒数,这个秒数在不断的变化,%10之后得到的数就在0-9,然后+1得到1-10的数。根据这个原理,生成一个在固定范围内的X坐标和Y坐标,然后用这个x坐标和y坐标去遍历snake数组看看x、y会不会同时相同,如果相同就重新生成一个知道不相同为止。这样我们就生成了一个食物的坐标。

  1. 蛇的移动,就是不断的变化那个坐标集合,我们将蛇头移动到下一个坐标之后,后面的节一次覆盖前一个就完成了一个单位的移动。这样的话,我们的方向只需要对蛇头作用就行了。现在我们设定一个direct=1即向上,direct的值1/2/3/4分别代表上下左右。现在蛇向上走,蛇头向上的话,X不变,Y-1就好了。
    (注意我们这里的坐标系是类似数学上第四象限的坐标系,所以X轴在最上面。)
    然后我们将第二个节换成前一次蛇头所在的坐标,第三个坐标变成前一次第二个的坐标,以此类推,蛇就往前移动了一个单位。

  2. 蛇头撞到墙或者撞到自己的身体,我们只需要判断蛇头的坐标是否和墙的坐标重合或者和蛇的某一节重合。所以在蛇移动之后我们用蛇头的坐标去遍历蛇自己的所有坐标并且判断蛇的X或者Y是否大于或者小于地图边界了,这样就能知道是否发生碰撞,发生碰撞之后直接break不在刷新视图就好。

  3. 当键盘有输入的时候判断是上或者下后者左或者右,然后重置direct的值,就将方向重置了。当然在向上走的时候按下键是不行的其他也是类似,所以还要判断一下。键盘读入事件我们需要用到一个函数_kbhit();如果有键盘敲击,这个函数就会返回一个非0的数。所以我们可以在每一次刷新的时候

char ch;
if(_kbhit())  //有键盘敲击
{
  ch = _getchar();
}
switch(ch)
{
    //判断用户按下了哪个键
    case 'H':   
    //按下键盘的上键_getchar()得到的是H
    //可以自己写一个程序看看上下左右分别是哪几个字符然后用来判断就行了
      if(direct!=2) 
      //如果当前的方向不是向下  就将方向重新定义为向上 其他的类似
        direct=1;
}

这样我们就通过读取键盘重新设置了方向。

  1. 这些问题我们都一一解决了,现在我们来想一下程序运行的顺序是什么。
1)初始化,将地图造出来。
2)如果有键盘输入的话,就重新设置运动方向。
3)制造食物。
4)让蛇移动,如果吃掉食物就重新生成一个食物,如果会死亡就break。
5)用蛇的坐标将地图中的空格替换为'#'和'@',将食物所在的坐标设置为'O'。
6)输出视图,即将最终生成的地图打印出来。
7)Sleep(200) 暂停200毫秒之后在进行上面的。

我们将上面这些都放在一个while(1)循环里面,只有死了才会跳出循环不在清屏打印(清屏打印其实就是刷新视图),然后输出游戏结束得分就好。

#将上述的代码实现方法写成一个一个函数,然后按照顺序放在循环体,就完成了贪吃蛇的制作。

#理解思路,模仿一下代码,写一个你自己的贪吃蛇,并且自己DIY一点其他的小创意,动手折腾吧。

我叫掏粪,如果喜喜欢我的文章请点个喜欢~欢迎关注我的的博客www.iimt.me和新浪微博。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容