广州C/C++培训
达内广州岗顶中心

18087159764

热门课程

达内广州地区C语言培训贪吃蛇结构实现

  • 时间:2017-10-09
  • 发布:广州c++培训机构
  • 来源:达内新闻

关于达内广州地区C语言培训贪吃蛇结构实现课程,今天小编会从他的设计思路、用上的知识点、具体实现这三大方面做个讲解,最后在个本课程做个总结,下面我们来看设计思路:

一、设计思路

蛇身本质上就是个结构数组,数组里存储了坐标x、y的值,再通过一个循环把它打印出来,蛇的移动则是不断地刷新重新打印。所以撞墙、咬到自己只是数组x、y值的简单比较。

二、用上的知识点

结构数组

Windows API函数

三、具体实现

先来实现静态页面,把地图、初始蛇身、食物搞定。

这里需要用到Windows API的知识,也就是对控制台上坐标的修改

1.地图。

有了Pos()函数,打印一个框就不是问题了。假如我们用"-"作为上下边框,把"|"作为左右边框,这看起来没什么不妥,但其实我们已经掉进了坑里,直接上代码及实际效果图吧。

控制台上每个字符的长宽比例(像素点)是不同的,所以才会出现上图这种蛋疼的情况。

解决方法其实也很简单,我们需要引入一些特殊符号,比如"●""■""⊙"等,这些字符的特点是它占据两个普通字符的位置

所以上下边框就有60/2=30个符号,要让它仍然是个正方形的话,左右也可以设为30(28+2)个符号.

2.初始化一条蛇

因为蛇以及食物 本质上都是一个坐标,所以我们可以定义一个新的数据类型Node,每一个Node都是一个存储了两个变量(x、y)的结构体,再通过Node来定义蛇和食物。

3.随机出现食物

先创建一个变量来存储食物的坐标

Node food;

得到它的坐标其实就是用随机值对长、宽取余,使值在区间(地图)范围内。

4.让蛇动起来

蛇每次移动背后发生的事就是数组里的值改变,再在每个坐标位置打印蛇身。

为了让蛇一直动,我们就需要一个循环

对蛇头的下一步做判断,如果吃到了食物的话,则先对分数等全局变量进行处理,再把snake[2+length-1](吃到食物后的倒数第二个变量)的值赋值给snake[2+length](此时新加的尾节)。

再从倒数第二节开始,把前一节的坐标值赋给后一节,直到第二节得到了之前蛇头坐标。在食物被吃了之后,再调用随机出现食物函数。

如果没有吃到食物的话,先到之前最后一节的坐标处,输入空格,算是销毁它再对各节重新赋值。在蛇头后每节都赋值完成之后,根据输入值单独对蛇头赋值,如输入是'w',则往上,所以蛇头纵坐标减一。

对其余输入也是同样的道理,在snake数组各值都更新之后,再用一个函数把它打印出来。

这样移动部分就实现了,现在只需处理一些小模块就行。

5.移动后的处理。

这一部分相对简单,即对判断蛇是否撞墙、是否咬到自身,再对这种情况做处理,我们用两个函数搞定它

四、总结与反思。

首先从蛇的结构上来说,结构数组的实现直接无视了"效率"这个词,数组占用大量空间且有容量限制,并不是一种好办法。

其次是BUG的问题,在ThroughWall()函数中,在对蛇头坐标进行判断时在蛇头移动到(x,1)位置时,游戏直接结束,且没有任何提示。

但诡异的是,在判断后加入 Pos(0,WIDTH);printf(" "); 这两行不相干的语句后,这个问题解决了,而我对这两行语句的原有目的则只是想把闪烁不停光标放到地图外面去。

还有就是while()循环里代码行太多,特别是switch-case 里各项,蛇身的移动(结构数组个元素坐标值的变换)应该抽象成一个move()函数。

免责声明:本文由广州c++培训机构小编转载自网络,旨在分享提供阅读,版权归原作者所有,如有侵权请联系我们进行删除。

扫码加入0元试听课程报名!

广州达内

上一篇:C语言题外话|程序员爱玩的GitHub
下一篇:达内广州岗顶中心C/C++培训:互联网下的两个商业价值

学c语言上培训机构与自学的区别?

苹果iPhone新机入水测试结果

阿里京东双11硕果累累

达内编程培训:如何成为优秀的CTO?

选择城市和中心
贵州省

广西省

海南省