贪吃蛇游戏的代码
#define N 200
#include <graphicsh>
#include <stdlibh>
#include <dosh>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/得分/
int gamespeed=50000;/游戏速度自己调整/
struct Food
{
int x;/食物的横坐标/
int y;/食物的纵坐标/
int yes;/判断是否要出现食物的变量/
}food;/食物的结构体/
struct Snake
{
int x[N];
int y[N];
int node;/蛇的节数/
int direction;/蛇移动方向/
int life;/ 蛇的生命,0活着,1死亡/
}snake;
void Init(void);/图形驱动/
void Close(void);/图形结束/
void DrawK(void);/开始画面/
void GameOver(void);/结束游戏/
void GamePlay(void);/玩游戏具体过程/
void PrScore(void);/输出成绩/
/主函数/
void main(void)
{
Init();/图形驱动/
DrawK();/开始画面/
GamePlay();/玩游戏具体过程/
Close();/图形结束/
}
/图形驱动/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
/开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙/
void DrawK(void)
{
/setbkcolor(LIGHTGREEN);/
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/设置线型/
for(i=50;i<=600;i+=10)/画围墙/
{
rectangle(i,40,i+10,49); /上边/
rectangle(i,451,i+10,460);/下边/
}
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /左边/
rectangle(601,i,610,i+10);/右边/
}
}
/玩游戏具体过程/
void GamePlay(void)
{
randomize();/随机数发生器/
foodyes=1;/1表示需要出现新食物,0表示已经存在食物/
snakelife=0;/活着/
snakedirection=1;/方向往右/
snakex[0]=100;snakey[0]=100;/蛇头/
snakex[1]=110;snakey[1]=100;
snakenode=2;/节数/
PrScore();/输出得分/
while(1)/可以重复玩游戏,压ESC键结束/
{
while(!kbhit())/在没有按键的情况下,蛇自己移动身体/
{
if(foodyes==1)/需要出现新食物/
{
foodx=rand()%400+60;
foody=rand()%350+60;
while(foodx%10!=0)/食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到/
foodx++;
while(foody%10!=0)
foody++;
foodyes=0;/画面上有食物了/
}
if(foodyes==0)/画面上有食物了就要显示/
{
setcolor(GREEN);
rectangle(foodx,foody,foodx+10,foody-10);
}
for(i=snakenode-1;i>0;i--)/蛇的每个环节往前移动,也就是贪吃蛇的关键算法/
{
snakex[i]=snakex[i-1];
snakey[i]=snakey[i-1];
}
/1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头/
switch(snakedirection)
{
case 1:snakex[0]+=10;break;
case 2: snakex[0]-=10;break;
case 3: snakey[0]-=10;break;
case 4: snakey[0]+=10;break;
}
for(i=3;i<snakenode;i++)/从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来/
{
if(snakex[i]==snakex[0]&&snakey[i]==snakey[0])
{
GameOver();/显示失败/
snakelife=1;
break;
}
}
if(snakex[0]<55||snakex[0]>595||snakey[0]<55||
snakey[0]>455)/蛇是否撞到墙壁/
{
GameOver();/本次游戏结束/
snakelife=1; /蛇死/
}
if(snakelife==1)/以上两种判断以后,如果蛇死就跳出内循环,重新开始/
break;
if(snakex[0]==foodx&&snakey[0]==foody)/吃到食物以后/
{
setcolor(0);/把画面上的食物东西去掉/
rectangle(foodx,foody,foodx+10,foody-10);
snakex[snakenode]=-20;snakey[snakenode]=-20;
/新的一节先放在看不见的位置,下次循环就取前一节的位置/
snakenode++;/蛇的身体长一节/
foodyes=1;/画面上需要出现新的食物/
score+=10;
PrScore();/输出新得分/
}
setcolor(4);/画出蛇/
for(i=0;i<snakenode;i++)
rectangle(snakex[i],snakey[i],snakex[i]+10,
snakey[i]-10);
delay(gamespeed);
setcolor(0);/用黑色去除蛇的的最后一节/
rectangle(snakex[snakenode-1],snakey[snakenode-1],
snakex[snakenode-1]+10,snakey[snakenode-1]-10);
} /endwhile(!kbhit)/
if(snakelife==1)/如果蛇死就跳出循环/
break;
key=bioskey(0);/接收按键/
if(key==ESC)/按ESC键退出/
break;
else
if(key==UP&&snakedirection!=4)
/判断是否往相反的方向移动/
snakedirection=3;
else
if(key==RIGHT&&snakedirection!=2)
snakedirection=1;
else
if(key==LEFT&&snakedirection!=1)
snakedirection=2;
else
if(key==DOWN&&snakedirection!=3)
snakedirection=4;
}/endwhile(1)/
}
/游戏结束/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/输出成绩/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,YELLOW);
bar(50,15,220,35);
setcolor(6);
settextstyle(0,0,2);
sprintf(str,"score:%d",score);
outtextxy(55,20,str);
}
/图形结束/
void Close(void)
{
getch();
closegraph();
}
程序结束,请采纳
用C语言来实现也是一个好玩的事情。这个游戏我写完后放在知乎,竟然点赞的人数超级多。我觉得大家喜欢,一个方面是因为写得简单,大家都能看得懂,一个可扩展性还是非常强的。
我试了说一下这个代码 核心的三个函数
menu();
setup();
draw();
menu用来设置菜单,也就是我们一运行看到的那个。setup用来设置参数,我们需要设置高度和宽度,还有分数,食物的位置。draw也就是画,也就是画整个画面。
还有一个枚举类型 这个结构体用来设置蛇的几个状态,我觉得这个也是面向对象编程的一个思想,把蛇的状态都封装成一个枚举类型。
typedef enum
{
STOP = 0,
LEFT,
RIGHT,
UP,
DOWN
}Direction;
还有
/判断贪吃蛇的长度/
void logic()
这个函数,这个函数应该是整个贪吃蛇的精髓了,要理解代码怎么把蛇给连接起来。用了点巧妙的东西。
来看这里面的关键代码
/把上一个位置记下/
int lastX = tailX[0];
int lastY = tailY[0];
int last2X, last2Y;
/重新获取当前的位置/
tailX[0]=x;
tailY[0]=y;
int i=0;
/遍历整条蛇的长度 把 0 的位置空出来,其余蛇的位置往后面的空间移动/
for(i=1; i ntail;i++)
{
last2X = tailX[i];
last2Y = tailY[i];
tailX[i]=lastX;
tailY[i]=lastY;
lastX = last2X;
lastY = last2Y;
}
lastX lastY 用来存上一次的蛇头的位置。后面的 for 循环,通过tail 蛇的长度,把蛇上个状态给保存到数组tailX tailY里面。
完整代码
#include stdioh
#include stdlibh
#include stdboolh
#include Windowsh
#include timeh
#include conioh /键盘输入获取/
bool gameOver;
bool stop = false;
bool hit = false;
/游戏的边框大小/
const int width = 50;
const int height = 20;
/蛇的坐标,食物的坐标还有分数/
int x,y,fruitX,fruitY,score;
/蛇每个点的坐标/
int tailX[200],tailY[200];
/蛇的默认长度/
int ntail=3;
typedef enum
{
STOP = 0,
LEFT,
RIGHT,
UP,
DOWN
}Direction;
Direction Dir;
/开始菜单/
void menu()
{
int a;
printf( ------------------------------------------------------------------\n
printf( | 贪吃蛇游戏 |\n
printf( | 1) 新游戏 |\n
printf( | 2) 开始边界 |\n
printf( | 3) 退出游戏 |\n
printf( ------------------------------------------------------------------\n
printf( ---- 请输入你的选择:
scanf( %d ,
}
/初始化状态/
void setup()
{
gameOver = false;
/根据当前时间设置“随机数种子”/
srand(time(NULL));
Dir = STOP;
/贪吃蛇的位置,固定在中间/
x= width/2;
y= height/2;
/食物的位置,位置是随机的/
fruitX = rand()%width;
fruitY = rand()%height;
score = 0;
}
/绘制界面/
void draw()
{
if(stop == true)
{
return;
}
system( cls /清除屏幕/
printf( 分数:%d ,score);
printf( \n
/第一行/
int i;
for(i= 0 ;i width+1;i++)
{
printf( -
}
printf( \n
/画中间的画面/
int p;
for(p= 0 ;p height;p++)/高度/
{
int q;
for(q= 0 ;q width;q++)/宽度/
{
/第一行最后已给字符/
if(q==0 || q==width-1)
{
printf( |
}
if(p == fruitY q == fruitX)/食物的随机坐标/
{
printf( O
}
else
{
int k=0;
bool print = false;
/贪吃蛇的长度 默认长度是 3/
for(k=0;k ntail;k++)
{
if(tailX[k]==q tailY[k]==p)
{
printf(
print = true;
}
}
/如果这个位置打印了 就不要打印空格了/
if(!print)
{
printf(
}
}
}
printf( \n
}
/最后一行/
int j;
for(j= 0 ;j width+1;j++)
{
printf( -
}
}
/按键输入控制/
void input()
{
if(_kbhit())
{
/获取键盘的输入字符/
switch(_getch())
{
case 4 :
case 75:/左键/
Dir = LEFT;
hit= true;
break;
case 8 :
case 72:/上键/
Dir = UP;
hit= true;
break;
case 6 :
case 77:/右键/
Dir = RIGHT;
hit= true;
break;
case 2 :
case 80:/向下键盘键 /
Dir = DOWN;
hit= true;
break;
case x :
case 27:/ESE/
gameOver = true;
break;
case 32:/空格 暂停键/
stop = !stop;
break;
}
}
else if(!hit stop == false)/如果没有改变方向/
{
x++;
}
}
/判断贪吃蛇的长度/
void logic()
{
if(stop == true)
{
return;
}
/把上一个位置记下/
int lastX = tailX[0];
int lastY = tailY[0];
int last2X, last2Y;
/重新获取当前的位置/
tailX[0]=x;
tailY[0]=y;
int i=0;
/遍历整条蛇的长度 把 0 的位置空出来,其余蛇的位置往后面的空间移动/
for(i=1; i ntail;i++)
{
last2X = tailX[i];
last2Y = tailY[i];
tailX[i]=lastX;
tailY[i]=lastY;
lastX = last2X;
lastY = last2Y;
}
/根据方向来改变x y 的值/
switch(Dir)
{
case UP:
y--;
break;
case DOWN:
y++;
break;
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
}
if(x 0 || width x || y 0 || height y)
{
gameOver = true;
/清除屏幕/
system( cls
printf( ------------------------------------------------------------------\n
printf( | |\n
printf( | |\n
printf( | 游戏结束 |\n
printf( | |\n
printf( | |\n
printf( ------------------------------------------------------------------\n
}
if(x==fruitX y==fruitY)
{
/吃了一个食物,蛇的长度增加1/
ntail++;
score+=10;
/更新下一个食物的位置/
fruitX = rand()%width;
fruitY = rand()%height;
}
}
int main()
{
#if 0
while(1)
{
printf( %d\n ,_getch());
}
#endif
menu();
setup();
draw();
/循环画贪吃蛇的界面/
while(!gameOver)
{
draw();
input();
logic();
Sleep(70);
}
return 0;
}
上面这段代码直接在Dev C++上面应该是可以运行的,很多人在知乎上私信问我,为什么我的贪吃蛇执行不了呢,可能就是平台不同,少了这个头文件,少了那个头文件,但是你为什么不能跟我一样,用Dev C++呢,轻量级,简单。代码的精髓是什么?我认为精髓一定是思想,不是你写了多少行代码,用了什么高端的IDE。
我自认为我的注释已经写得不错了,所以就没有什么好说明的了吧,有不明白的把代码过一下,至于屏幕刷新这个东西,如果只是用时间刷新就会闪屏,所以出现了一个双缓存,把要显示的东西送到一个buff里面去,另一个buff用来显示,这样就可以保证不会出现闪屏。除了写贪吃蛇,可以用这个方法写其他小程序,挺有意思的。
在知乎上,发起了一个C语言 100 行代码之内实现贪吃蛇的问题。我觉得很不错,里面很多同学的回复都非常赞,特别是叶大神的回复。
0142235ea7197f4e1d7ClTovjpng
学习C/C++编程知识,想要成为一个更加优秀的程序员,或者你学习C/C++的时候有难度,可以来UP主页的C++编程学习圈,里面不仅有学习视频和文件资料,还有更多志同道合的朋友,欢迎初学者和想转行的朋友,和大家一起交流成长会比自己琢磨更快哦! UP也上传了一些C/C++学习的视频教程和C语言基础教程,有兴趣的小伙伴可以看看~ 谢谢阅读!
文章知识点与官方知识档案匹配
C技能树首页概览
115488 人正在系统学习中
点击阅读全文
打开CSDN APP,看更多技术内容
C语言之出圈游戏(详解)
PTA7-5 出圈游戏 用指针实现以下功能:有n个人围成一个圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号。 (1)编程提示 每三个人离开,置为0;当数到最后一个人时,将指针重新指向第一个人;m表示离开的人数,当m=n-1时,说明只剩下一个人,循环结束。 输入样例: 10 输出样例: 4 上面是题目的要求。 本小白的思路是让n个人形成一个一维数组,每次判断该人是不是要离开, 如果离开,这就不添加到这个一维数组里,并记录下来离开的人数,否则,就在数组里加上这
继续访问
9718 整数因子分解(优先做)
9718 整数因子分解(优先做)Description输入格式输出格式输入样例输出样例 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G++;GCC;VC Description 大于1的正整数 n 都可以分解为 n = x1 x2 … xm, 每个xi为大于1的因子,即1<xi<=n 。 例如:当n=12时,共有8种不同的分解式: 12 = 12 12 = 62 12 = 43 12 = 34 12 = 322 12 =
继续访问
C语言链表——圈中游戏问题(数到3退出)
问题描述: 有n个人围成一圈,从第1个人开始报数1、2、3,每报到3的人退出圈子。使用链表找出最后留下的人。
继续访问
套圈游戏c语言程序设计教程课后答案,概率统计习题带答案
概率论与数理统计习题及题解沈志军 盛子宁第一章 概率论的基本概念1.设事件B A ,及B A 的概率分别为q p ,及r ,试求)(),(),(B A P B A P AB P 及)(AB P2.若C B A ,,相互独立,试证明:C B A ,,亦必相互独立。3.试验E 为掷2颗骰子观察出现的点数。每种结果以),(21x x 记之,其中21,x x 分别表示第一颗、第二颗骰子的点数。设事件}10
继续访问
c语言贪吃蛇设计意义,C语言贪吃蛇设计理念pdf
基于C语言的 “贪吃蛇”游戏的设计与实现摘3功能描述 本游戏主要实现以下几种功能:“贪吃蛇”游戏贪 游 游吃 戏 戏蛇 显 分的
继续访问
热门推荐 一个好玩的小游戏(纯C语言编写)
最近在看知乎是发现了一个这一个专栏 >
一个参考实例,在VC++60中可以运行成功(可能还有问题)\x0d\\x0d\#include \x0d\#include \x0d\#include \x0d\#include \x0d\#include //使用当前时间做种子;\x0d\enum dir{up,down,left,right}; //枚举类型enum dir;\x0d\//围墙;\x0d\class Fence{\x0d\public:\x0d\ void InitFence();\x0d\ void OutputF();\x0d\public:\x0d\ char game[20][20];\x0d\}f; //定义对象;\x0d\//画框框;\x0d\void Fence::InitFence(){\x0d\ for(int i=0; ix =x; q->y =y;\x0d\ q->next =head;\x0d\ q->prior =NULL;\x0d\ if(head) head->prior =q;\x0d\ head =q;\x0d\ if(!tail) tail =head;\x0d\ fgame[x][y]= ''; //f对象可以在定义Fence类时定义; 且Fence类在SnakeNode类前定义;\x0d\}\x0d\int SnakeNode::get_x(){\x0d\ return x;\x0d\}\x0d\int SnakeNode::get_y(){\x0d\ return y;\x0d\}\x0d\//删除尾结点;\x0d\void SnakeNode::delete_tail(){\x0d\ SnakeNode p =tail;\x0d\ fgame[tail->get_x()][tail->get_y()]= ' ';//把尾结点的坐标表示的''置为空格;\x0d\ if(tail==head)\x0d\ tail= head= NULL;\x0d\ else{\x0d\ tail= tail->prior;\x0d\ tail->next= NULL;\x0d\ }\x0d\ delete p;\x0d\}\x0d\//move移动;\x0d\class move{\x0d\public:\x0d\ dir point; //枚举变量point: 控制方向;\x0d\ int food_x;\x0d\ int food_y;\x0d\public:\x0d\ void moving();\x0d\ void change_point(char); //改变方向;\x0d\ void get_food();\x0d\};\x0d\void move::moving(){\x0d\ int a,b;\x0d\ a= head->get_x(); //取得头结点横坐标\x0d\ b= head->get_y(); //头结点纵坐标\x0d\ switch(point){\x0d\ case up: --a; break;\x0d\ case down: ++a; break;\x0d\ case left: --b; break;\x0d\ case right: ++b; break;\x0d\ }\x0d\ if(a==19||b==19||a==0||b==0){ //判断是否撞墙; \x0d\ coutadd_head(a,b);\x0d\ get_food();\x0d\ }\x0d\ else{\x0d\ head->add_head(a,b); //插入头结点;\x0d\ head->delete_tail(); //删除尾结点;\x0d\ }\x0d\}\x0d\void move::change_point(char keydown){\x0d\ switch(keydown){\x0d\ case 'w': point= up; break;\x0d\ case 's': point= down; break;\x0d\ case 'a': point= left; break;\x0d\ case 'd': point= right; break;\x0d\ }\x0d\}\x0d\void move::get_food(){\x0d\ srand((unsigned int) time(NULL)); //做种子(程序运行时间); \x0d\ food_x= rand()%18+1; \x0d\ food_y= rand()%18+1;\x0d\ fgame[food_x][food_y]= '';\x0d\}\x0d\//main();\x0d\int main()\x0d\{\x0d\ coutadd_head(4,3);\x0d\ head->add_head(4,4);\x0d\ head->add_head(4,5);\x0d\ mget_food();\x0d\ fOutputF();\x0d\ while (true){\x0d\ char keydown= getch(); //getch()返回键盘上读取的字符;包含头文件\x0d\ mchange_point(keydown);\x0d\ while(!kbhit()){ //判断有没有按键落下;\x0d\ system("cls"); //清屏函数;\x0d\ mmoving();\x0d\ fOutputF();\x0d\ Sleep(200);\x0d\ }\x0d\ }\x0d\ return 0;\x0d\}
以上就是关于求贪吃蛇的程序代码(c语言)全部的内容,包括:求贪吃蛇的程序代码(c语言)、利用解释型语言编写的贪吃蛇程序什么意思、基于C++的贪吃蛇游戏能运行出来的完整代码有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)