用链表写贪吃蛇链表时吃掉食物应该怎么增加结点。

C语言链表实现贪食蛇游戏
C语言实现贪食蛇游戏,采用链表实现,首先 创建方向结构体、食物结构体、蛇身链表结构体、蛇的属性结构体
  用到windows.h头文件里的gotoxy()函数,作用是将光标定位到指定坐标。
  主程序:
  int main(void)
//程序入口
  {
   Homepage();
   while(1)
   {
  
keybordhit(); //监控键盘按键
  
//蛇的坐标变化
  
//蛇的重绘
  
keybordhit(); //监控键盘按键
  
Sleep(SPEECH); //暂时挂起线程
   }
   return 0;
  }
  总体思路:处于死循环,所以,蛇循环移动,keybordhit()函数可以监控键盘按键
  如果键盘有键被按下,且按下的键是W、A、S、D,则改变蛇的方向。
  move()函数,刷新蛇身每个结点的坐标,且根据蛇的方向通过Addnode()函数改变各结点坐标
  draw()函数,重绘蛇的形状。
  Sleep(time)函数 为蛇行动的速度。
  
运行环境:Windows/Visual C/C++
相关标签:
软件大小:23.7K
软件属性:共享版 | 简体中文
软件评级:
收录更新: |
相关链接:暂无演示
软件截图:
下载地址:
本类推荐下载
本类最新更新
最新网页特效做游戏学编程:手把手教你做贪吃蛇游戏做游戏学编程:手把手教你做贪吃蛇游戏游戏2组百家号大家好,我是四眼长腿奶爸,专注机器人教育(乐高EV3,Arduino),少儿启蒙编程教育(Scratch,Python)!喜欢我的作品请点击右上角的 “ + 关注 ” 订阅我的头条号吧!谢谢!前两节课,我们共同分析并编写了《迷宫》和《飞机大战》两个游戏(参照文章《手把手教你乐高机器人编程&scratch少儿游戏编程》),相信大家对于游戏的思路设计以及程序的代码编写都有了更深的了解,今天继续我们的第三节游戏编程课---《贪吃蛇》。贪吃蛇老规矩,首先看一下《贪吃蛇》的游戏界面和运行界面。游戏界面游戏运行动画游戏素材&思路分析游戏素材:游戏背景(游戏运行界面、游戏结束界面)、苹果、贪吃蛇(蛇头、蛇身)、记录得分。思路分析:1、游戏开始后,舞台背景切换成游戏运行界面;当蛇头碰到舞台边缘或者蛇头碰到蛇身时,游戏结束,舞台背景切换成游戏结束界面。2、苹果随机出现在游戏界面的任何位置,等待一段时间,如果未被贪吃蛇吃到,则自动消失并出现在下一随机位置,此时贪吃蛇的蛇身将因为未吃到苹果而被加长一定的长度;如果苹果被贪吃蛇吃到,则苹果停止等待自动消失并出现在下一个随机位置。3、得分是记录玩家通过贪吃蛇吃到的苹果的数量,吃到一个苹果得1分,在每次游戏开始前,得分清零。4、游戏开始后,贪吃蛇自动移动,方向键控制蛇头的方向,蛇身跟着蛇头的方向一起移动;蛇头每吃掉一个苹果,得分加1,蛇身加长一定的长度。5、本游戏的重点是蛇身的增加和移动,在这里,我们把贪吃蛇拆分成蛇头和蛇身来设计,蛇头通过角色图片来设置,蛇身则通过绘图功能来实现。6、蛇头每移动一次,通过画笔在当前位置(xy坐标)用蛇身的颜色描绘一次,这样,蛇身就比原来多了一块,要想使蛇身保持长度不变,那就应该在蛇尾的位置(xy坐标)用舞台的背景色再描绘一次,用舞台的背景色抹掉刚才蛇身的颜色,这样,蛇身就又减少了一块。贪吃蛇的移动最后就变成移动一次,蛇头用蛇身颜色画一块,蛇尾用舞台背景颜色画一块覆盖原来的颜色,连贯起来就有了移动的动画效果。7、每移动一次,蛇头的绘画动作是一定要做的,至于蛇尾要不要做覆盖绘画,就要看蛇身长度了,只有在蛇头绘画完后的长度大于蛇身固有的长度时,才做一次覆盖绘画动作。8、蛇头吃到苹果,贪吃蛇的蛇身长度增加1,蛇头在规定的时间内未吃到苹果,苹果自动消失,蛇身长度增加5。实现思路&程序编写1、编写游戏界面&游戏脚本1)游戏的运行界面直接采用默认的白色背景即可。2)游戏的结束界面通过绘制新背景来实现。选中绘制新背景,新建游戏结束界面绘制游戏结束界面3)游戏开始后,设置舞台背景为游戏运行界面(背景1)。设置游戏初始脚本2、编写苹果角色&游戏脚本1)默认加载的小猫角色本游戏用不到,在角色库中选择小猫点击鼠标右键,点击删除。2)游戏中的苹果从角色库中选择(角色库-》分类-》全部-》Apple),缩小至游戏合适大小。从角色库选取Apple角色3)游戏开始后,苹果出现在游戏的随机位置,然后等待一定的时间,消失,然后再出现游戏的随机位置。。。。以此类推,重复执行。之前我们讲过,游戏界面的x坐标是(-240到240)和y坐标是(-180到180),如果苹果出游戏界面的边缘,那贪吃蛇吃到苹果立马就等于碰到了边缘,游戏就结束了,所以苹果的随机位置可以调整在x坐标(-220到220)和y坐标(-160到160)之间产生。当蛇头碰到苹果时,也会通知苹果不需要再等待,消失本次产生的苹果,再随机产生一个新苹果,那在这里产生苹果不直接创建,而是用消息的方式来产生。创建并广播一个新消息:随机生成苹果接收到随机生成苹果消息后,随机生成位置并显示苹果随机出现运行动画效果3、编写蛇头角色&游戏脚本1)游戏中的蛇头造型我们从本地上传自定义图片。(造型不一定一样,自行下载图片)上传蛇头造型2)游戏开始后,蛇头默认在中心点(0,0)位置,蛇头朝向左方向,重复自动移动,按下方向键蛇头转向对应的方向。蛇头自动移动,按下方向键运动脚本3)蛇头每移动一次,通过画笔去绘画蛇身。通过画笔描绘蛇身蛇头绘制蛇身4)上面我们讲过,蛇头只绘制蛇身,多余的蛇身需要蛇尾来覆盖绘画,需要告诉蛇尾蛇身的长度以及在哪个位置(x坐标,y坐标)进行覆盖绘画,这里我们用scratch的新概念链表来记录每次蛇头绘画的位置(x坐标,y坐标)。链表就相当于一个容器,用来记录多个数据,放入链表中的第一个数据是离蛇头距离最远的,靠近蛇尾最近的,放入链表中的最后一个数据是离蛇头最近的,离蛇尾最远的,也就是说,蛇头每增加一个位置,蛇尾就要删除一个离它最近的位置,即链表的第一条数据。新建变量蛇身长度,并设为10存储蛇头每次移动的x坐标,y坐标4、编写蛇尾角色&游戏脚本1)游戏中的蛇尾角色只涉及到绘画操作,可以任意选择,在此从角色库中选择(角色库-》分类-》全部-》Ball),并缩小至合适大小。从角色库选择蛇尾角色2)游戏开始后,设置画笔的颜色为舞台的背景色(白色),画笔的大小比绘制蛇身的颜色的画笔大小略大(12),监控蛇头存储的x坐标(或y坐标)的数量是不是大于蛇身的长度,如果大于,则将存储的链表中离蛇尾最近的位置(链表的第一条数据)删除。蛇尾删除多余的存储数据贪吃蛇运动效果5、编写完善脚本1)新建得分变量,在舞台加载游戏运行界面是设定为0。新建得分变量游戏开始时,将得分清空为02)新增游戏结束消息,当蛇头碰到蛇身或者蛇头碰到边缘时,广播游戏结束消息,舞台收到消息,将游戏界面切换至结束界面。判断蛇头是否碰到蛇身或者边缘游戏界面切换至结束界面3)如果苹果显示一直没碰到蛇头,自动消失,并将蛇身长度增加5。蛇头未碰到苹果,蛇身长度增加54)当蛇头碰到苹果,蛇身长度增加1,得分增加1,播放吃苹果的声音,蛇头发送消息告诉苹果,可以将本次的苹果消失,再创建一个新苹果了。蛇头碰到苹果的脚本苹果接收到消息,重新生成一个新苹果至此,贪吃蛇的思路分析和程序编写都已完成,大家动手试一试吧!做游戏学编程系列课程中的所有文字及配图均为四眼长腿奶爸原创,转载联系作者:alickfang,未经许可,不得转载,违者必究!本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。游戏2组百家号最近更新:简介:每天实时更新游戏资讯作者最新文章相关文章写贪吃蛇,俄罗斯方块,这些小游戏对初学C的真必要吗? - 知乎35被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答111 条评论分享收藏感谢收起25 条评论分享收藏感谢收起温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
struct node
struct node *
二、定义每个结点有学号和分数以及指向下一个结点的指针,现在想写一个creat_nod能够创建一个结点,希望它带num和score两个参数,创建完毕以后直接返回该结点结构体类型指针。
struct node *creat_nod(int x,int y)
struct node *p;&
& & & & p =
p-&score =
三、删除某个结点,希望直接给定链表head以及学号,就删除特定学号结点,这里有3种情况,表头,表尾和表中。
1、表头情形,将第二个结点升为头结点,head=head-&释放头结点存储空间。&
2、表中与表尾情形类似,直接删除,将自己指向下一个的地址传给上一个结点,表尾时传的是NULL。
struct node *del_nod(node *n_head,int x)
& &struct node *p,*q;
& &if(n_head==NULL) cout&&"链表为空!";//排除特殊情形
& while(p!=NULL&&p-&num!=x) {q=p;p=p-&}//找到要删的结点位置
& & & &if(p==n_head) {n_head=p-&}//删除头结点情形
& else if(p!=NULL) {q-&next=p-&}
else cout&&x&&"不在链表中!";
& &return n_
四、插入某个结点,希望链表根据学号予以排序,也分3种情形,表头、表尾和表中。
1、表头情形下,插入节点变成表头,先将表头地址给新结点的next,再将新结点地址赋给表头。
2、表尾情形下,先将新结点地址赋给表尾next,再将新结点的next置空。新结点成了尾节点。
3、表中情形下,新结点地址给前一个结点的next,新结点的next指向下一个结点。
struct node *insert_nod(node *n_head,int x,int y)
struct node *p,*q,*n_
n_nod-&num=x;
n_nod-&score=y;
if(n_head==NULL) {n_head=n_n_nod-&next=NULL;}//排除特殊情形
while(p!=NULL&&x&p-&num)
}//找到插入点
if(p==n_head){n_nod-&next=n_n_head=n_}//插入头结点之前的情形
else if(p==NULL){q-&next=n_n_nod-&next=NULL;}
& & &q-&next=n_n_nod-&next=p;
五、给一个头指针,即可打印所有结点,需要遍历每个结点。
void print_nod(node *w)
& & struct node *p;
if(w=NULL) cout&&"链表为空!";
while(p!=NULL)
cout&&"学号:"&&p-&num&&setw(10)&&"分数:"&&p-&score&&
六、根据头指针和学号能够查找相应结点并输出成绩。
void search_nod(node *w,int x)
struct node *p;
while(p!=NULL&&p-&num!=x)
if(p==NULL) cout&&"您找的学号不存在!";
else print_nod(p);
七、链表的逆序,我希望只给一个头指针就能实现逆序功能,注意交换指针时要注意保存指向下一个结点的指针。
struct node *reverse_nod(node *n_head){&struct node *p,*q,*t;&&int i=0;&p=n_&if(n_head==NULL) cout&&"链表为空!";&else&{&&while(t!=NULL)&&{&&&if(i==0){&&&&q=p;&&&&p=p-&&&&&&&&q-&next=NULL;&&&&t=p-&&&&&p-&next=q;&&&&&&&i++;&&&}//开头的情形,需要将头结点的next清空&&&else &&&&{&&&&&q=p;&&&&&p=t;&&&&&t=p-&&&&&&p-&next=q;&&&&}&&}&&&n_head=p;&&}
&return n_
八、下面写一个主函数测试它们。
int main()
struct node *head,*stu1,*stu2,*stu3;
num=1170381;
head=creat_nod(num,score);
num=1170382;
stu1=creat_nod(num,score);
num=1170384;
stu2=creat_nod(num,score);
num=1170385;
stu3=creat_nod(num,score);
head-&next=stu1;
stu1-&next=stu2;
stu2-&next=stu3;
stu3-&next=NULL;//创建了一个4个结点的链表
head=insert_nod(head,);
& & head=insert_nod(head,);
head=insert_nod(head,);
print_nod(head);//插入3个结点并打印
head=del_nod(head,1170380);
head=del_nod(head,1170383);
head=del_nod(head,1170386);
print_nod(head);
cout&&//删除插入的结点
cout&&"请输入您查找的学号:";
search_nod(head,num);//查找指定结点并打印
运行结果:
主函数加入该行:&
head=reverse_nod(head);&print_nod(head);&运行结果为:
上面为正序,下面为逆序。&
阅读(5022)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'一个C++程序完成链表的增加结点、删除结点、打印、查询、逆序等操作',
blogAbstract:'
一、每个结点结构体声明如下,注意该链表是不带表头的单链表:
struct node
struct node *
二、定义每个结点有学号和分数以及指向下一个结点的指针,现在想写一个creat_nod能够创建一个结点,希望它带num和score两个参数,创建完毕以后直接返回该结点结构体类型指针。
struct node *creat_nod(int x,int y)
struct node *p;&
& & & & p =
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:8,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}扫二维码下载作业帮
3亿+用户的选择
下载作业帮安装包
扫二维码下载作业帮
3亿+用户的选择
关于链表存储二叉树的题目若用链表存储一棵二叉树时,每个结点除数据域外,还有指向左孩子和右孩子的两个指针。在这种存储结构中,n个结点的二叉树共有_____2n___个指针域,其中有____n-1____个指针域是存放了地址,有____n+1____个指针是空指针。为什么?在线等。
作业帮用户
扫二维码下载作业帮
3亿+用户的选择
因为有n个节点,每个节点都存了一个lchild,一个rchild,所以共2n个指针域。因为除了根节点,其他所有的节点都存在自己的父节点,而父节点肯定存在指向其孩子的指针,所以有n-1个存了地址(根节点没有父节点,所以-1),因为总数是2n个所以NULL的就是2n-(n-1)=n+1个
为您推荐:
扫描下载二维码}

我要回帖

更多关于 c语言贪吃蛇链表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信