首页编程贪吃蛇程序,c语言 贪吃蛇 程序

贪吃蛇程序,c语言 贪吃蛇 程序

编程之家2023-11-0669次浏览

各位老铁们好,相信很多人对贪吃蛇程序都不是特别的了解,因此呢,今天就来为大家分享下关于贪吃蛇程序以及c语言 贪吃蛇 程序的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

贪吃蛇程序,c语言 贪吃蛇 程序

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

贪吃蛇游戏的代码

#define N 200

#include<graphics.h>

#include<stdlib.h>

#include<dos.h>

#define LEFT 0x4b00

贪吃蛇程序,c语言 贪吃蛇 程序

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;/*得分*/

贪吃蛇程序,c语言 贪吃蛇 程序

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();/*随机数发生器*/

food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/

snake.life=0;/*活着*/

snake.direction=1;/*方向往右*/

snake.x[0]=100;snake.y[0]=100;/*蛇头*/

snake.x[1]=110;snake.y[1]=100;

snake.node=2;/*节数*/

PrScore();/*输出得分*/

while(1)/*可以重复玩游戏,压ESC键结束*/

{

while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/

{

if(food.yes==1)/*需要出现新食物*/

{

food.x=rand()%400+60;

food.y=rand()%350+60;

while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/

food.x++;

while(food.y%10!=0)

food.y++;

food.yes=0;/*画面上有食物了*/

}

if(food.yes==0)/*画面上有食物了就要显示*/

{

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10);

}

for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/

{

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1];

}

/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/

switch(snake.direction)

{

case 1:snake.x[0]+=10;break;

case 2: snake.x[0]-=10;break;

case 3: snake.y[0]-=10;break;

case 4: snake.y[0]+=10;break;

}

for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/

{

if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])

{

GameOver();/*显示失败*/

snake.life=1;

break;

}

}

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||

snake.y[0]>455)/*蛇是否撞到墙壁*/

{

GameOver();/*本次游戏结束*/

snake.life=1;/*蛇死*/

}

if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/

break;

if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/

{

setcolor(0);/*把画面上的食物东西去掉*/

rectangle(food.x,food.y,food.x+10,food.y-10);

snake.x[snake.node]=-20;snake.y[snake.node]=-20;

/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/

snake.node++;/*蛇的身体长一节*/

food.yes=1;/*画面上需要出现新的食物*/

score+=10;

PrScore();/*输出新得分*/

}

setcolor(4);/*画出蛇*/

for(i=0;i<snake.node;i++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,

snake.y[i]-10);

delay(gamespeed);

setcolor(0);/*用黑色去除蛇的的最后一节*/

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],

snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);

}/*endwhile(!kbhit)*/

if(snake.life==1)/*如果蛇死就跳出循环*/

break;

key=bioskey(0);/*接收按键*/

if(key==ESC)/*按ESC键退出*/

break;

else

if(key==UP&&snake.direction!=4)

/*判断是否往相反的方向移动*/

snake.direction=3;

else

if(key==RIGHT&&snake.direction!=2)

snake.direction=1;

else

if(key==LEFT&&snake.direction!=1)

snake.direction=2;

else

if(key==DOWN&&snake.direction!=3)

snake.direction=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++程序代码

#include<graphics.h>

#include<stdlib.h>

#include<dos.h>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;

int gamespeed=32000;

struct Food/*食物的结构体*/

{

int x;/*食物的横坐标*/

int y;/*食物的纵坐标*/

int yes;/*食物是否出现的变量*/

}food;

struct Snack/*蛇的结构体*/

{

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 PrScore(void);/*分数输出函数*/

DELAY(char ch)/*调节游戏速度*/

{

if(ch=='3')

{

delay(gamespeed);/*delay是延迟函数*/

delay(gamespeed);

}

else if(ch=='2')

{

delay(gamespeed);

}

}

Menu()/*游戏开始菜单*/

{

char ch;

printf("Please choose the gamespeed:\n");

printf("1-Fast 2-Normal 3-Slow\n");

printf("\nPlease Press The numbers..\n");

do

{ch=getch();}

while(ch!='1'&&ch!='2'&&ch!='3');

clrscr();

return(ch);

}

/*主函数*/

void main(void)

{

int ch;

ch=Menu();

Init();

DrawK();

GamePlay(ch);

Close();

}

void Init(void)

{

int gd=DETECT,gm;

initgraph(&gd,&gm,"c:\\tc");

cleardevice();

}

void DrawK(void)

{

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(char ch)

{

randomize();/*随机数发生器*/

food.yes=1;/*1代表要出现食物,0表示以存在食物*/

snake.life=0;

snake.direction=1;

snake.x[0]=100;snake.y[0]=100;

snake.x[1]=110;snake.y[1]=100;

snake.node=2;

PrScore();

while(1)/*可以重复游戏*/

{

while(!kbhit())/*在没有按键的情况下蛇自己移动*/

{

if(food.yes==1)/*需要食物*/

{

food.x=rand()%400+60;

food.y=rand()%350+60;/*使用rand函数随机产生食物坐标*/

while(food.x%10!=0)

food.x++;

while(food.y%10!=0)

food.y++;/*判断食物是否出现在整格里*/

food.yes=0;/*现在有食物了*/

}

if(food.yes==0)/*有食物了就要显示出来*/

{

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10);

}

for(i=snake.node-1;i>0;i--)/*贪吃蛇的移动算法*/

{

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1];/*贪吃蛇的身体移动算法*/

}

switch(snake.direction)/*贪吃蛇的头部移动算法,以此来控制移动*/

{

case 1:snake.x[0]+=10;break;

case 2:snake.x[0]-=10;break;

case 3:snake.y[0]-=10;break;

case 4:snake.y[0]+=10;break;

}

for(i=3;i<snake.node;i++)/*判断是否头部与身体相撞*/

{

if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])

{

GameOver();

snake.life=1;

break;

}

}

/*下面是判断是否撞到墙壁*/

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)

{

GameOver();

snake.life=1;

}

if(snake.life==1)/*如果死亡就退出循环*/

break;

if(snake.x[0]==food.x&&snake.y[0]==food.y)/*判断蛇是否吃到食物*/

{

setcolor(0);

rectangle(food.x,food.y,food.x+10,food.y-10);/*吃的食物后用黑色将食物擦去*/

snake.x[snake.node]=-20;snake.y[snake.node]=-20;/*现把增加的一节放到看不到的地方去*/

snake.node++;

food.yes=1;

score+=10;

PrScore();

}

setcolor(4);/*每次移动后将后面的身体擦去*/

for(i=0;i<snake.node;i++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);

delay(gamespeed);

DELAY(ch);

setcolor(0);

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);

}

if(snake.life==1)

break;

key=bioskey(0);/*接受按键*/

if(key==ESC)

break;

else

if(key==UP&&snake.direction!=4)/*判断是否改变方向*/

snake.direction=3;

else

if(key==RIGHT&&snake.direction!=2)

snake.direction=1;

else

if(key==LEFT&&snake.direction!=1)

snake.direction=2;

else

if(key==DOWN&&snake.direction!=3)

snake.direction=4;

}

}

void GameOver(void)

{

cleardevice();

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,"scord:%d",score);

outtextxy(55,20,str);

}

void Close(void)

{

getch();

closegraph();

}

c语言 贪吃蛇 程序

基本思路:

蛇每吃一个食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇头的运动,而蛇身子跟着蛇头走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此类推。

#include<stdio.h>

#include<conio.h>

#include<windows.h>

#define BEG_X 2

#define BEG_Y 1

#define WID 20

#define HEI 20

HANDLE hout;

typedef enum{UP, DOWN, LEFT, RIGHT} DIR;

typedef struct Snake_body

{

COORD pos;//蛇身的位置

struct Snake_body*next;//下一个蛇身

struct Snake_body*prev;//前一个蛇身

}SNAKE,*PSNAKE;

PSNAKE head= NULL;//蛇头

PSNAKE tail= NULL;//蛇尾

//画游戏边框的函数

void DrawBorder()

{

int i, j;

COORD pos={BEG_X, BEG_Y};

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

{

SetConsoleCursorPosition(hout, pos);

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

{

if(i== 0)//第一行

{

if(j== 0)

printf("┏");

else if(j== WID- 1)

printf("┓");

else

printf("━");

}

else if(i== HEI- 1)//最后一行

{

if(j== 0)

printf("┗");

else if(j== WID- 1)

printf("┛");

else

printf("━");

}

else if(j== 0|| j== WID- 1)//第一列或最后一列

printf("┃");

else

printf("");

}

++pos.Y;

}

}

//添加蛇身的函数

void AddBody(COORD pos)

{

PSNAKE pnew=(PSNAKE)calloc(1, sizeof(SNAKE));

pnew->pos= pos;

if(!head)

{

head= tail= pnew;

}

else

{

pnew->next= head;//新创建蛇身的next指向原先的蛇头

head->prev= pnew;//原先的蛇头的prev指向新创建的蛇身

head= pnew;//把新创建的蛇身作为新的蛇头

}

SetConsoleCursorPosition(hout, head->pos);

printf("◎");

}

//蛇身移动的函数

void MoveBody(DIR dir)

{

PSNAKE ptmp;

COORD pos= head->pos;

switch(dir)

{

case UP:

if(head->pos.Y> BEG_Y+ 1)

--pos.Y;

else

return;

break;

case DOWN:

if(head->pos.Y< BEG_Y+ HEI- 2)

++pos.Y;

else

return;

break;

case LEFT:

if(head->pos.X> BEG_X+ 2)

pos.X-= 2;

else

return;

break;

case RIGHT:

if(head->pos.X< BEG_X+(WID- 2)* 2)

pos.X+= 2;

else

return;

break;

}

AddBody(pos);//添加了一个新的蛇头

ptmp= tail;//保存当前的蛇尾

tail= tail->prev;

if(tail)

tail->next= NULL;

SetConsoleCursorPosition(hout, ptmp->pos);

printf("");

free(ptmp);

}

int main()

{

int ctrl;

DIR dir= RIGHT;//初始蛇的方向是向右的

COORD pos={BEG_X+ 2, BEG_Y+ HEI/ 2};

system("color 0E");

system("mode con cols=90 lines=30");

hout= GetStdHandle(STD_OUTPUT_HANDLE);

printf("------------贪吃蛇的移动------------");

DrawBorder();

//自定义几个蛇的身体

AddBody(pos);

pos.X+= 2;

AddBody(pos);

pos.X+= 2;

AddBody(pos);

pos.X+= 2;

AddBody(pos);

pos.X+= 2;

AddBody(pos);

pos.X+= 2;

AddBody(pos);

pos.X+= 2;

AddBody(pos);

//控制蛇的移动

while(ctrl= getch())

{

switch(ctrl)

{

case'w':

if(dir== DOWN)

continue;

dir= UP;

break;

case's':

if(dir== UP)

continue;

dir= DOWN;

break;

case'a':

if(dir== RIGHT)

continue;

dir= LEFT;

break;

case'd':

if(dir== LEFT)

continue;

dir= RIGHT;

break;

case'q':

return 0;

}

MoveBody(dir);

}

return 0;

}

扩展资料:

实现逻辑

1,可以设置光标,就能实现制定位置打印制定符号。

2,涉及一个结构体,包含两个元素坐标元素和一个结构体指针。

3,结构体串联形成链表,遍历获取成员坐标,打印符号得到蛇身。

4,不断的加头,去尾,重新遍历坐标,再打印形成蛇的移动。

5,食物产生的位置判定,不能越界,也不能与蛇身体重合。

6,蛇的转向判定,一条规则,不允许倒退。

7,转向的实现,跟行进方向决定新的关节坐标(当前头的上下左右)

8,死亡检测,是否头节点坐标是否与墙壁重合,是否与身体其他关节重合。

9,加速减速,设置刷新休眠时间实现。

参考资料来源:百度百科-C语言

贪吃蛇程序和c语言 贪吃蛇 程序的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

rm文件?什么是rm文件手机c语言编程软件(手机c语言编程app)