c语言贪吃蛇?c语言 贪吃蛇 程序
在这个信息爆炸的时代,了解c语言贪吃蛇和c语言 贪吃蛇 程序的重要性不言而喻。本文将为您带来全面的解读,助您在这个领域中游刃有余。
C语言的贪吃蛇源代码
//******友情提示:如想速度快点,请改小_sleep(500)函数中参数*****
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<time.h>
constintH=8;//地图的高
constintL=16;//地图的长
charGameMap[H][L];//游戏地图
intkey;//按键保存
intsum=1,over=0;//蛇的长度,游戏结束(自吃或碰墙)
intdx[4]={0,0,-1,1};//左、右、上、下的方向
intdy[4]={-1,1,0,0};
structSnake//蛇的每个节点的数据类型
{
intx,y;//左边位置
intnow;//保存当前节点的方向,0,1,2,3分别为左右上下
}Snake[H*L];
constcharShead='@';//蛇头
constcharSbody='#';//蛇身
constcharSfood='*';//食物
constcharSnode='.';//'.'在地图上标示为空
voidInitial();//地图的初始化
voidCreate_Food();//在地图上随机产生食物
voidShow();//刷新显示地图
voidButton();//取出按键,并判断方向
voidMove();//蛇的移动
voidCheck_Border();//检查蛇头是否越界
voidCheck_Head(intx,inty);//检查蛇头移动后的位置情况
intmain()
{
Initial();
Show();
return0;
}
voidInitial()//地图的初始化
{
inti,j;
inthx,hy;
system("title贪吃蛇");//控制台的标题
memset(GameMap,'.',sizeof(GameMap));//初始化地图全部为空'.'
system("cls");
srand(time(0));//随机种子
hx=rand()%H;//产生蛇头
hy=rand()%L;
GameMap[hx][hy]=Shead;
Snake[0].x=hx;Snake[0].y=hy;
Snake[0].now=-1;
Create_Food();//随机产生食物
for(i=0;i<H;i++)//地图显示
{
for(j=0;j<L;j++)
printf("%c",GameMap[i][j]);
printf("\n");
}
printf("\n小小C语言贪吃蛇\n");
printf("按任意方向键开始游戏\n");
getch();//先接受一个按键,使蛇开始往该方向走
Button();//取出按键,并判断方向
}
voidCreate_Food()//在地图上随机产生食物
{
intfx,fy;
while(1)
{
fx=rand()%H;
fy=rand()%L;
if(GameMap[fx][fy]=='.')//不能出现在蛇所占有的位置
{
GameMap[fx][fy]=Sfood;
break;
}
}
}
voidShow()//刷新显示地图
{
inti,j;
while(1)
{
_sleep(500);//延迟半秒(1000为1s),即每半秒刷新一次地图
Button();//先判断按键在移动
Move();
if(over)//自吃或碰墙即游戏结束
{
printf("\n**游戏结束**\n");
printf(">_<\n");
getchar();
break;
}
system("cls");//清空地图再显示刷新吼的地图
for(i=0;i<H;i++)
{
for(j=0;j<L;j++)
printf("%c",GameMap[i][j]);
printf("\n");
}
printf("\n小小C语言贪吃蛇\n");
printf("按任意方向键开始游戏\n");
}
}
voidButton()//取出按键,并判断方向
{
if(kbhit()!=0)//检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
{
while(kbhit()!=0)//可能存在多个按键,要全部取完,以最后一个为主
key=getch();//将按键从控制台中取出并保存到key中
switch(key)
{//左
case75:Snake[0].now=0;
break;
//右
case77:Snake[0].now=1;
break;
//上
case72:Snake[0].now=2;
break;
//下
case80:Snake[0].now=3;
break;
}
}
}
voidMove()//蛇的移动
{
inti,x,y;
intt=sum;//保存当前蛇的长度
//记录当前蛇头的位置,并设置为空,蛇头先移动
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_Border();//蛇头是否越界
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)//为蛇头后面的蛇身节点,特殊处理
{
Snake[i].x=x;
Snake[i].y=y;
Snake[i].now=Snake[0].now;
}
else//其他蛇身即走到前一个蛇身位置
{
Snake[i].x=Snake[i+1].x;
Snake[i].y=Snake[i+1].y;
Snake[i].now=Snake[i+1].now;
}
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)
over=1;
}
voidCheck_Head(intx,inty)//检查蛇头移动后的位置情况
{
if(GameMap[Snake[0].x][Snake[0].y]=='.')//为空
GameMap[Snake[0].x][Snake[0].y]='@';
else
if(GameMap[Snake[0].x][Snake[0].y]=='*')//为食物
{
GameMap[Snake[0].x][Snake[0].y]='@';
Snake[sum].x=x;//新增加的蛇身为蛇头后面的那个
Snake[sum].y=y;
Snake[sum].now=Snake[0].now;
GameMap[Snake[sum].x][Snake[sum].y]='#';
sum++;
Create_Food();//食物吃完了马上再产生一个食物
}
else
over=1;
}
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语言 贪吃蛇 程序
基本思路:
蛇每吃一个食物蛇身子就增加一格,用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语言贪吃蛇和c语言 贪吃蛇 程序的问题解决了您的问题,那么我们由衷的感到高兴!