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

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

移动光标模块

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

读取最高分文件

打印初始蛇模块

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

产生食物模块

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

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

  1. 写操作系统用的C语言和写应用程序的C语言不是一个

    我以前看一本书,名叫 30天自制操作系统:大概翻了一下,感觉也不是太难:因为比如,它有一整章在讲,C语言指针.C语言画一个矩形:你要是熟悉C语言的话,指针肯定理解:在没有窗口的情况下,用Turbo C ...

  2. c语言分解质因数的设计思路,C语言开发中分解质因数的操作实例

    C语言的开发在日常开发中被广泛使用,而我们都知道C语言是简单的编译方法,爱站技术频道小编今天就为大家带来了C语言开发中分解质因数的操作实例,一起去进入下文看看吧! 首先来看一个最简单的C语言实现质因数 ...

  3. C语言能否写windows应用程序,C语言能写windows的窗口吗?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //下面是一个WIN32 API写的窗体,是不是C写的?你觉得... #include LRESULT CALLBACK WndProc(HWND hwn ...

  4. c语言饭卡服务程序设计思路,C语言设计—饭卡管理程序.doc

    C语言设计-饭卡管理程序 C语言课程设计报告饭卡管理程序 完成日期:2009年12月 [题目描述]该程序为饭卡管理程序,具有下列功能:(1) 录入某位持卡人的基本信息?教师:职工号?姓名?院系?金额; ...

  5. c语言到底写什么系统,用C语言写关于操作系统的一个问题。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 怎么将软中断与共享内存相结合? 现贴代码: 软中断: #include #include #include #include int wait_mark; ...

  6. c语言如何写地图,自己用C语言写的扫雷地图

    //以下是排雷算法#include#include#includevoidmain(){intarray1[10][10],array2[10][10];inti,j,m,n; srand((unsi ...

  7. C语言可以敲哪些小游戏,C语言可以写哪些小游戏?

    C语言可以写哪些小游戏? C语言可以编手机游戏.你叫他去死不过我这有贪吃蛇的代码,你倒可以看看(用TC编译一定过( #包括 #包括 #包括 #包括 #包括 #定义输入7181 #定义ESC 283 # ...

  8. C语言-手写任务队列

    C语言-手写任务队列 文章目录 C语言-手写任务队列 基本概念 头文件 队列实现 基本概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(Firs ...

  9. c语言链表贪吃蛇脚本之家,C++控制台实现贪吃蛇游戏

    本文实例为大家分享了C++实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 刚学完了C语言,便尝试的写了贪吃蛇的代码,但是效果不佳,很多的bug,所以,这个学了C++,便重新的写了这个小游戏,用类来 ...

最新文章

  1. [文摘20070930]人际关系,你有五十五招
  2. Linux buffer/cache异同
  3. [总结]DataGrid 固定表头实现(纵向和横向滚动条滚动,而Header不动)
  4. 计算机系统基础:设备管理知识笔记
  5. oracle升级后报 06502,Oracle数据库升级后报ORA-00704和ORA-39700错误
  6. 计算机系统-小数(浮点数)在内存中的存储
  7. 为什么买入不了创业版_趋势波段买卖创业板ETF指数基金能轻松保险盈利
  8. win11开机记录如何查看 Windows11查看开机记录的设备方法
  9. python通过pcie读数据_PCIE硬盘能否直接被CPU读取?
  10. shell脚本命令行参数里的空白符
  11. 学习spf记录引发的问题(一)
  12. 复制英文和中文PDF文字到word并去除回车符
  13. win7怎么进入安全模式_win7进入安全模式教程
  14. 狂神说Spring笔记(全网最全)
  15. Python一行代码能做什么,30个实用案例代码详解
  16. 华硕主板无盘启动bios设置_【华硕主板bios启动顺序】华硕主板bois启动项_华硕主板bios硬盘启动...
  17. 《医院管理系统》项目研发总结
  18. PHP 经纬度坐标相关计算方法
  19. c语言程序水准路线,C++语言在水准路线简易平差中的应用实例(17页)-原创力文档...
  20. 那些让你相见恨晚的网站

热门文章

  1. 设计模式:不可变的嵌入式构建器
  2. 使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务
  3. Batoo JPA –比领先的JPA提供商快15倍
  4. 使用Ajax的Spring MVC REST调用
  5. JavaOne 2012:NetBeans.Next –未来路线图
  6. web.config连接mysql_web.config中配置数据库连接的方式
  7. gptuefi优势_UEFI+GPT的区别,有啥不同?写的很详细易懂
  8. python程序怎么给别人运行_如何使Python脚本作为服务运行?
  9. git.exe 启动 慢_四川成都surface电脑启动到一半黑屏维修服务地址电话
  10. 【五】每个球队胜率统计