贪吃蛇c语言代码
发布时间:2025-05-19 01:06:41 发布人:远客网络
一、贪吃蛇c语言代码
int gamespeed=50000;/*游戏速度自己调整*/
int yes;/*判断是否要出现食物的变量*/
int life;/*蛇的生命,0活着,1死亡*/
void GameOver(void);/*结束游戏*/
void GamePlay(void);/*玩游戏具体过程*/
void PrScore(void);/*输出成绩*/
GamePlay();/*玩游戏具体过程*/
initgraph(&gd,&gm,"c:\\tc");
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
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);/*下边*/
rectangle(50,i,59,i+10);/*左边*/
rectangle(601,i,610,i+10);/*右边*/
food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇头*/
snake.x[1]=110;snake.y[1]=100;
while(1)/*可以重复玩游戏,压ESC键结束*/
while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
if(food.yes==1)/*需要出现新食物*/
while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
food.yes=0;/*画面上有食物了*/
if(food.yes==0)/*画面上有食物了就要显示*/
rectangle(food.x,food.y,food.x+10,food.y-10);
for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
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])
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||
snake.y[0]>455)/*蛇是否撞到墙壁*/
if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
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;/*画面上需要出现新的食物*/
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
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)/*如果蛇死就跳出循环*/
if(key==UP&&snake.direction!=4)
if(key==RIGHT&&snake.direction!=2)
if(key==LEFT&&snake.direction!=1)
if(key==DOWN&&snake.direction!=3)
outtextxy(200,200,"GAME OVER");
setfillstyle(SOLID_FILL,YELLOW);
sprintf(str,"score:%d",score);
二、C语言的贪吃蛇源代码
//******友情提示:如想速度快点,请改小_sleep(500)函数中参数*****
intsum=1,over=0;//蛇的长度,游戏结束(自吃或碰墙)
intdx[4]={0,0,-1,1};//左、右、上、下的方向
structSnake//蛇的每个节点的数据类型
intnow;//保存当前节点的方向,0,1,2,3分别为左右上下
constcharShead='@';//蛇头
constcharSbody='#';//蛇身
constcharSfood='*';//食物
constcharSnode='.';//'.'在地图上标示为空
voidCreate_Food();//在地图上随机产生食物
voidButton();//取出按键,并判断方向
voidCheck_Border();//检查蛇头是否越界
voidCheck_Head(intx,inty);//检查蛇头移动后的位置情况
system("title贪吃蛇");//控制台的标题
memset(GameMap,'.',sizeof(GameMap));//初始化地图全部为空'.'
printf("\n小小C语言贪吃蛇\n");
printf("按任意方向键开始游戏\n");
getch();//先接受一个按键,使蛇开始往该方向走
Button();//取出按键,并判断方向
voidCreate_Food()//在地图上随机产生食物
if(GameMap[fx][fy]=='.')//不能出现在蛇所占有的位置
_sleep(500);//延迟半秒(1000为1s),即每半秒刷新一次地图
if(over)//自吃或碰墙即游戏结束
system("cls");//清空地图再显示刷新吼的地图
printf("\n小小C语言贪吃蛇\n");
printf("按任意方向键开始游戏\n");
voidButton()//取出按键,并判断方向
if(kbhit()!=0)//检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
while(kbhit()!=0)//可能存在多个按键,要全部取完,以最后一个为主
key=getch();//将按键从控制台中取出并保存到key中
//记录当前蛇头的位置,并设置为空,蛇头先移动
x=Snake[0].x;y=Snake[0].y;GameMap[x][y]='.';
Snake[0].x=Snake[0].x+dx[Snake[0].now];
Snake[0].y=Snake[0].y+dy[Snake[0].now];
Check_Head(x,y);//蛇头移动后的位置情况,参数为:蛇头的开始位置
if(sum==t)//未吃到食物即蛇身移动哦
for(i=1;i<sum;i++)//要从蛇尾节点向前移动哦,前一个节点作为参照
if(i==1)//尾节点设置为空再移动
GameMap[Snake[i].x][Snake[i].y]='.';
if(i==sum-1)//为蛇头后面的蛇身节点,特殊处理
else//其他蛇身即走到前一个蛇身位置
GameMap[Snake[i].x][Snake[i].y]='#';//移动后要置为'#'蛇身
voidCheck_Border()//检查蛇头是否越界
if(Snake[0].x<0||Snake[0].x>=H
||Snake[0].y<0||Snake[0].y>=L)
voidCheck_Head(intx,inty)//检查蛇头移动后的位置情况
if(GameMap[Snake[0].x][Snake[0].y]=='.')//为空
GameMap[Snake[0].x][Snake[0].y]='@';
if(GameMap[Snake[0].x][Snake[0].y]=='*')//为食物
GameMap[Snake[0].x][Snake[0].y]='@';
Snake[sum].x=x;//新增加的蛇身为蛇头后面的那个
GameMap[Snake[sum].x][Snake[sum].y]='#';
Create_Food();//食物吃完了马上再产生一个食物
三、c语言 贪吃蛇 程序
蛇每吃一个食物蛇身子就增加一格,用UP, DOWN, LEFT, RIGHT控制蛇头的运动,而蛇身子跟着蛇头走,每后一格蛇身子下一步走到上一格蛇身子的位置,以此类推。
typedef enum{UP, DOWN, LEFT, RIGHT} DIR;
struct Snake_body*next;//下一个蛇身
struct Snake_body*prev;//前一个蛇身
SetConsoleCursorPosition(hout, pos);
else if(j== 0|| j== WID- 1)//第一列或最后一列
PSNAKE pnew=(PSNAKE)calloc(1, sizeof(SNAKE));
pnew->next= head;//新创建蛇身的next指向原先的蛇头
head->prev= pnew;//原先的蛇头的prev指向新创建的蛇身
head= pnew;//把新创建的蛇身作为新的蛇头
SetConsoleCursorPosition(hout, head->pos);
if(head->pos.Y> BEG_Y+ 1)
if(head->pos.Y< BEG_Y+ HEI- 2)
if(head->pos.X> BEG_X+ 2)
if(head->pos.X< BEG_X+(WID- 2)* 2)
AddBody(pos);//添加了一个新的蛇头
SetConsoleCursorPosition(hout, ptmp->pos);
DIR dir= RIGHT;//初始蛇的方向是向右的
COORD pos={BEG_X+ 2, BEG_Y+ HEI/ 2};
system("mode con cols=90 lines=30");
hout= GetStdHandle(STD_OUTPUT_HANDLE);
printf("------------贪吃蛇的移动------------");
1,可以设置光标,就能实现制定位置打印制定符号。
2,涉及一个结构体,包含两个元素坐标元素和一个结构体指针。
3,结构体串联形成链表,遍历获取成员坐标,打印符号得到蛇身。
4,不断的加头,去尾,重新遍历坐标,再打印形成蛇的移动。
5,食物产生的位置判定,不能越界,也不能与蛇身体重合。
6,蛇的转向判定,一条规则,不允许倒退。
7,转向的实现,跟行进方向决定新的关节坐标(当前头的上下左右)
8,死亡检测,是否头节点坐标是否与墙壁重合,是否与身体其他关节重合。
9,加速减速,设置刷新休眠时间实现。