c语言链表写贪吃蛇思路,C语言构建的链表贪吃蛇

用C语言链表写的贪吃蛇(程序设计时做的,做的不好大佬勿喷)

702762bd0c8dfd60cbad99e2d16e08c2.png

借助游戏内容分析贪吃蛇所需的功能主要包括这几块:

移动光标模块

打印地图模块和基本规则信息

读取最高分文件

打印初始蛇模块

打印时给予蛇的初始移动方向

产生食物模块

1)、保证食物在地图内产生

2)、保证食物不能出现在蛇体

蛇的生命状态判断模块

1)、撞墙导致死亡

2)、头撞身体部位死亡

6.运行模块

1)、让蛇移动

2)、根据按键来改变蛇的移动方向

3)、对待分数的增加游戏难度的增加

4)、蛇在吃食物后分数的增加

7.结束模块

在遇到撞墙或者撞自己部位死亡时结束程序,并进行分数与历史最高分作比较,最终达到最高分的更新

以下为代码

#include

#include

#include //控制台输入和输出

#include //窗口函数

#include

#define W 1//蛇的运动方向W:上 S:下 A: 左 D:右

#define S 2

#define A 3

#define D 4

/*

定义全局变量

*/

typedef struct{

int x;

int y;

}place;//定义坐标结构体

typedef struct ZB{

place data;

struct ZB *next;

}snake;//定义蛇的链表

/*

定义全局链表

*/

snake *head,*p,*q,*h;//

place food;//定义食物坐标

int score=0,bestscore,game_flag=0,ch,sleep=400;//定义得分score死亡判断game_flag方向判断ch蛇的速度sleep

/*

函数声明

*/

void gotoxy(int x,int y);//定位光标

void map_creat();//运用定位函数打印地图

void ini_snack();//随机产生蛇

void cre_food();//随机产生食物

void live_jud_1();//判断自己是否撞墙死亡

void live_jud_2();//判断自己是否撞到自己

void move();//蛇的移动

void rungame();//游戏运行

void gameover();//游戏结束界面

void changch();//改变方向

int color(int c);//改颜色函数

/*

构建定位函数

*/

int color(int c)

{

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c); //更改文字颜色

return 0;

}

void gotoxy(int x,int y)//定位光标

{

COORD pos;

HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);

pos.X=x;

pos.Y=y;

SetConsoleCursorPosition(handle,pos);

}

/*

打印地图

*/

void map_creat()//运用定位函数打印地图

{

FILE *fp;//创建一个记录最高分的文件

fp=fopen("score.1","r");

fscanf(fp,"%d",&bestscore);//读取最高分

fclose(fp);

gotoxy(54,26);

printf("Your Best Score : %d\t", bestscore);//打印出最高分

int i,j;

for(i=0;i<48;i++)

{

gotoxy(i,0);

printf("#");

color(6);

gotoxy(i,26);

printf("#");

color(6);

}

for(j=0;j<26;j++)

{

gotoxy(0,j);

printf("#");

color(6);

gotoxy(48,j);

printf("#");

color(6);

}

gotoxy(54,10);

printf("游戏规则:");

gotoxy(54,12);

printf("向上移动:↑\n");

gotoxy(54,14);

printf("向下移动:↓\n");

gotoxy(54,16);

printf("向左移动:←\n");

gotoxy(54,18);

printf("向右移动:→\n");

gotoxy(54,20);

printf("吃一个食物分数加10");

gotoxy(54,22);

printf("按空格键暂停游戏");

gotoxy(54,24);

printf("按ESC直接结束游戏");

}

/*

构建初始蛇

*/

void ini_snack()//产生蛇

{

int i;

/*

采用尾插法构建蛇的链表初始长度设为二

*/

head=(snake *)malloc(sizeof(snake));

head->data.x=48/2;

head->data.y=26/2;

head->next=NULL;

h=head;

for(i=1;i<=2;i++)

{

p=(snake *)malloc(sizeof(snake));

p->data.x=48/2+i;

p->data.y=26/2;

h->next=p;

h=p;

}

p->next=NULL;

/*

将蛇打印出来

*/

h=head;

while(h!=NULL)

{

gotoxy(h->data.x,h->data.y);

color(5);

printf("@");

h=h->next;

}

ch=W;//蛇的初始方向

}

/*

随机产生食物

*/

void cre_food()//随机产生食物

{

srand((unsigned)time(NULL));//为了防止每次产生的随机数相同,种子设置为time

/*

随机产生食物

*/

food.x=rand()%(48-2)+1;

food.y=rand()%(26-2)+1;

while(p!=NULL)

{

/*

判断食物是否与蛇重合,如果重合重新产生

*/

if(p->data.x==food.x&&p->data.y==food.y)

cre_food();

p=p->next;

}

gotoxy(food.x,food.y);

color(1);

printf("$");//打印食物

}

/*

判断是否死亡

*/

void live_jud_1()//判断自己是否撞墙死亡

{

if(head->data.x==0||head->data.x==48||head->data.y==0||head->data.y==26)//撞墙

{

game_flag=1;

gameover();

}

}

void live_jud_2()//判断自己是否撞到自己

{

q=head->next;

while(q!=NULL)

{

if(head->data.x==q->data.x&&head->data.y==q->data.y)//撞自己

{

{

game_flag=2;

gameover();

}

break;

}

q=q->next;

}

}

/*

游戏进行界面

*/

void move()

{

snake *l;

live_jud_1();

l=(snake *)malloc(sizeof(snake));

/*

构建一个新的节点通,过新节点来表示下一次头节点所在的位置

将新节点当作移动后的头节点

如果新头节点的坐标等于食物的坐标得分加10,食物的标志变为1

因为蛇的链表长度加了一,如果是移动的话找出尾节点并打印出 然后删掉该尾节点

如果吃到了食物就直接将蛇打印出来

*/

if(ch==W)

{

l->data.x=head->data.x;

l->data.y=head->data.y-1;

if(l->data.x==food.x&&l->data.y==food.y)

{

l->next=head;

head=l;

q=head;

while(q!=NULL)//将蛇重新打印一边

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

score+=10;

cre_food();//构建新的食物

}

else

{

l->next=head;

head=l;

q=head;

while(q->next->next!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

gotoxy(q->next->data.x,q->next->data.y);

printf(" ");//将蛇尾去掉

free(q->next);

q->next=NULL;

}

}

if(ch==A)

{

l->data.x=head->data.x-1;

l->data.y=head->data.y;

if(l->data.x==food.x&&l->data.y==food.y)

{

l->next=head;

head=l;

q=head;

while(q!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

score+=10;

cre_food();

}

else

{

l->next=head;

head=l;

q=head;

while(q->next->next!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

gotoxy(q->next->data.x,q->next->data.y);

printf(" ");

free(q->next);

q->next=NULL;

}

}

if(ch==S)

{

l->data.x=head->data.x;

l->data.y=head->data.y+1;

if(l->data.x==food.x&&l->data.y==food.y)

{

l->next=head;

head=l;

q=head;

while(q!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

score+=10;

cre_food();

}

else

{

l->next=head;

head=l;

q=head;

while(q->next->next!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

gotoxy(q->next->data.x,q->next->data.y);

printf(" ");

free(q->next);

q->next=NULL;

}

}

if(ch==D)

{

l->data.x=head->data.x+1;

l->data.y=head->data.y;

if(l->data.x==food.x&&l->data.y==food.y)

{

l->next=head;

head=l;

q=head;

while(q!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

score+=10;

cre_food();

}

else

{

l->next=head;

head=l;

q=head;

while(q->next->next!=NULL)

{

gotoxy(q->data.x,q->data.y);

color(5);

printf("@");

q=q->next;

}

gotoxy(q->next->data.x,q->next->data.y);

printf(" ");

free(q->next);

q->next=NULL;

}

}

live_jud_2();//判断是否撞自己死亡

}

void rungame()//运行游戏

{

while(1)

{

gotoxy(54,8);

printf("Your Score:%d",score);

/*

以下确保不能向上运动时改方向为向下等情况

*/

if(GetAsyncKeyState(VK_UP)&&ch!=S)

ch=W;

else if(GetAsyncKeyState(VK_DOWN)&&ch!=W)

ch=S;

else if(GetAsyncKeyState(VK_LEFT)&&ch!=D)

ch=A;

else if(GetAsyncKeyState(VK_RIGHT)&&ch!=A)

ch=D;

/*

根据分数和Sleep函数来确定游戏难度

*/

if(score>=50&&score<100)

sleep=300;

else if(score>=100&&score<300)

sleep=250;

else if(score>=300)

sleep=200;

if(GetAsyncKeyState(VK_SPACE))//输入space暂停游戏

{

while(1)

{

Sleep(300);

if(GetAsyncKeyState(VK_SPACE))

break;

}

}

else if (GetAsyncKeyState(VK_ESCAPE))//输入ESC直接结束游戏

{

game_flag=3;

gameover();

}

Sleep(sleep);

move();

}

}

/*

游戏结束界面

*/

void gameover()//游戏结束界面

{

FILE *fp;

system("cls");//清屏

gotoxy(48/2,26/2-2);

printf("\tGame Over!!!");//打印出游戏结束界面

gotoxy(48/2,26/2);

if(game_flag==1)

printf("\t你撞墙了!!!\n");

else if(game_flag==2)

printf("\t傻孩子!你不能吃你自己!!!\n");

else if(game_flag==3)

printf("\t您已结束游戏!");

gotoxy(48/2,26/2+2);

printf("\tYour score:%d\n",score);//打印出得到的分数

if(score>bestscore)//如果此次游戏分数大于以前最高分

{

fp=fopen("score.1","w");

fprintf(fp,"%d",score);//将此次分数保存在最高分文件里

fclose(fp);

}

system("pause");

exit(0);

}

/*

主函数

*/

int main()

{

system("color 9");

map_creat();

ini_snack();

cre_food();

rungame();

return 0;

}

标签:head,food,gotoxy,next,链表,贪吃蛇,printf,C语言,data

来源: https://blog.csdn.net/ippcp/article/details/106817372

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用普罗米修斯和格拉法纳乐器来刺豪猪

Adam Bien的Porcupine库使配置用作应用程序隔板的专用执行程序服务变得容易。 我创建了一个扩展&#xff0c;通过MicroProfile Metrics公开了豪猪统计信息。 我们还可以通过Prometheus和Grafana仪表板使仪器可见。 进行此扩展的原因是我们希望对Porcupine线程池的检测进行简单…

三层网络架构

三层网络架构 数据中心网络是连接数据中心大规模服务器进行大型分布式计算的桥梁。 传统数据中心网络普遍采用树型拓扑方案&#xff0e; 典型的拓扑由三层交换机互联构成&#xff0c;分别是接入层交换机、汇聚层交换机和核心层交换机。Cisco称之为&#xff1a;分级的互连网络模…

SDN

直接理解 SDN是在2009年左右出现的一种新型网络结构&#xff0c;它将数据层面与控制层面分离&#xff0c;使用中央控制器完成网络的操作和管理&#xff0c;并通常采用OpenFlow协议作为其核心通信协议&#xff0c;拥有着集中式控制、可编程、部署灵活性和数据层面与控制层面相互…

IP地址分类(A类 B类 C类 D类 E类)

IP地址类型 公有地址 公有地址&#xff08;Public address&#xff09;由Inter NIC&#xff08;Internet Network Information Center因特网信息中心&#xff09;负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。 私有地址 私有地址&am…

android 开发 短信,Android开发之短信发送

今天要讲的是使用Android开发发送短信程序。我们先来看下运行效果图(1) 图(2)图(3)图(1)&#xff1a;当我们运行项目时&#xff0c;出现在屏幕的效果&#xff1b;图(2)&#xff1a;当我们输…

ISP (互联网服务提供商)

ISP&#xff1a;全称为Internet Service Provider&#xff0c;即因特网服务提供商&#xff0c;能提供拨号上网服务、网上浏览、下载文件、收发电子邮件等服务&#xff0c;是网络最终用户进入Internet的入口和桥梁。它包括Internet接入服务和Internet内容提供服务。这里主要是In…

应用层组播、IP组播

通常说的组播一般指IP组播&#xff0c;IGMP协议等 什么是应用层组播&#xff1f; 应用层组播通过在应用层复制和缓存数据包而不是在路由器上复制数据包来避免IP组播的部署问题。应用层组播无须对路由器作任何修改,因此在 Internet 上非常容易部署 为了改善网络效率&#xff0…

android 酷炫倒计时,android 好用的倒计时

android倒计时 是在原有TextView的基础上进行二次开发的自定义View效果图这个主要是结合了android的CountDownTimer&#xff0c;这个一般就是发送短信的倒计时。包含功能倒计时时间超过一个小时显示 时&#xff1a;分&#xff1a;秒时间小于一小时显示&#xff1a;分 &#xff…

音视频常见问题分析和解决:延迟(时延 delay)和抖动

延迟和抖动 延迟&#xff1a;是网络传输中的一个重要指标&#xff0c;测量了数据从一个端点到另外一个端点所需的时间。一般我们用毫秒作为其单位。通常我们也把延迟叫做延时&#xff0c;但是延时有时还会表示数据包发送端到接受端的往返时间。这个往返时间我们可以通过网络监…

forkjoin_应用ForkJoin –从最佳到快速

forkjoin到目前为止&#xff0c;JDK 7已很好地掌握在开发人员手中&#xff0c;并且大多数人都听说过ForkJoin&#xff0c;但是没有多少人有时间或机会去尝试它。 它引起了并且可能仍然引起一些混乱&#xff0c;与普通线程池有什么不同。 [1] 我在本文中的目标是通过一个代码示…

android usb触摸屏驱动 win10,Win10手机居然这样兼容安卓:直接运行apk!

摘要&#xff1a;“应用太少是硬伤&#xff01;”这是WP粉吐槽微软简洁而有力的一句话。最新的Win10Mobile预览版中首次引入了微软的安卓子系统&#xff0c;这也是微软推行的ProjectAstoria的一部分。那么Win10手机究竟要如何兼容安卓应用呢&#xff1f;微软最新一份招聘启事似…

Java应用程序中的验证

我经常看到的项目几乎没有任何有意识的数据验证策略。 他们的团队在截止日期&#xff0c;明确要求的巨大压力下工作&#xff0c;只是没有足够的时间以适当且一致的方式进行验证。 因此&#xff0c;数据验证代码随处可见&#xff1a;JavaScript片段&#xff0c;Java屏幕控制器&a…

升级鸿蒙系统如何退出,华为鸿蒙2.0系统升级了怎么退回EMUI11系统-操作教程详解...

华为鸿蒙2.0系统升级了怎么退回EMUI11系统&#xff1f;很多用户升级了又不知道如何才能退回到原来的系统&#xff0c;下面就让老铁下载小编为大家带来&#xff0c;2.0系统升级退回EMUI11系统操作教程详解。这次开启华为鸿蒙2.0系统手机开发者beta版公测招募的机型有华为P40 、P…

OpenFlow和SDN的历史和原理介绍

OpenFlow相关的历史、新闻&#xff1a;http://blog.csdn.net/jincm13/article/details/7825754 起源与发展 【https://36kr.com/p/5035985】   OpenFlow起源于斯坦福大学的Clean Slate项目组 [1] 。CleanSlate项目的最终目的是要重新发明英特网&#xff0c;旨在改变设计已略…

小米miuiVS华为鸿蒙,华为鸿蒙2.0 vs 小米MIUI 12.5

原标题&#xff1a;华为鸿蒙2.0 vs 小米MIUI 12.5不久前有媒体在视频中展示了鸿蒙2.0和苹果IOS14两个操作系统下App的启动速度&#xff0c;结果是鸿蒙2.0完胜IOS14。此后不久&#xff0c;该媒体发布了华为鸿蒙2.0和小米MIUI 12.5对比视频。同上次一样&#xff0c;这次依然是选择…

具有MicroProfile配置的可配置JAX-RS ExceptionMapper

当您使用JAX-RS创建REST服务时&#xff0c;通常要么不返回任何内容&#xff08;例如HTTP 201/2/4等&#xff09;&#xff0c;要么返回某些数据&#xff08;可能采用JSON格式&#xff08;因此HTTP 200&#xff09;&#xff0c;或者返回某些异常/错误&#xff08;例如HTTP 4xx或5…

Ad-hoc

Ad-hoc这个词来源于拉丁语&#xff0c;在百度上解释为“for this purpose only”&#xff0c;在wiki上解释为“for this”&#xff0c;其中文在wiki上被解释成包含特设的、特定目的的&#xff08;地&#xff09;、即席的、临时的、将就的、专案的”这么多种含义。在wireless ne…

android5.0 v4a,【图】多图讲解V4A提高G5音效详细步骤(G5音效可以更棒的)

首先感谢论坛前辈&#xff0c;看着你们介绍的方法&#xff0c;我把G5应有的音效搞出来了&#xff0c;效果提升非常明显。(看清了&#xff0c;如果不是非常明显&#xff0c;我也不会费这么大劲在这儿做讲解)。特记录和总结过程如下&#xff1a;1. 安装一键ROOT。2. 安装虚拟按…

Multi-commodity Flow Problem

多物网络流问题&#xff08;Multi-commodity Flow Problem&#xff09;是多种物品&#xff08;或货物&#xff09;在网络中从不同的源点流向不同的汇点的网络流问题。 定义

信干噪比、信噪比

信干噪比 名词定义 信干噪比SINR&#xff08;Signal to Interference plus Noise Ratio&#xff09;&#xff0c;指的是系统中信号与干扰和噪声之和的比。 信号是指来自设备外部需要通过设备进行处理的电子信号。 干扰是指系统本身以及异系统带来的干扰&#xff0c;如同频干扰…