求贪吃蛇的程序代码(c语言)

求贪吃蛇的程序代码(c语言),第1张

贪吃蛇游戏的代码

#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++的贪吃蛇游戏能运行出来的完整代码有哪些等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9348859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存