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("
");
}
printf("
小小C语言贪吃蛇
");
printf("按任意方向键开始游戏
");
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("
**游戏结束**
");
printf(">_<
");
getchar();
break;
}
system("cls");//清空地图再显示刷新吼的地图
for(i=0;i<H;i++)
{
for(j=0;j<L;j++)
printf("%c",GameMap[i][j]);
printf("
");
}
printf("
小小C语言贪吃蛇
");
printf("按任意方向键开始游戏
");
}
}
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语言控制面板贪吃蛇源代码
//******友情提示:如想速度快点,请改小_sleep(500)函数中参数*****
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<time.h>
const int H= 8;//地图的高
const int L= 16;//地图的长
char GameMap[H][L];//游戏地图
int key;//按键保存
int sum= 1, over= 0;//蛇的长度,游戏结束(自吃或碰墙)
int dx[4]={0, 0,-1, 1};//左、右、上、下的方向
int dy[4]={-1, 1, 0, 0};
struct Snake//蛇的每个节点的数据类型
{
int x, y;//左边位置
int now;//保存当前节点的方向, 0,1,2,3分别为左右上下
}Snake[H*L];
const char Shead='@';//蛇头
const char Sbody='#';//蛇身
const char Sfood='*';//食物
const char Snode='.';//'.'在地图上标示为空
void Initial();//地图的初始化
void Create_Food();//在地图上随机产生食物
void Show();//刷新显示地图
void Button();//取出按键,并判断方向
void Move();//蛇的移动
void Check_Border();//检查蛇头是否越界
void Check_Head(int x, int y);//检查蛇头移动后的位置情况
int main()
{
Initial();
Show();
return 0;
}
void Initial()//地图的初始化
{
int i, j;
int hx, 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();//取出按键,并判断方向
}
void Create_Food()//在地图上随机产生食物
{
int fx, fy;
while(1)
{
fx= rand()%H;
fy= rand()%L;
if(GameMap[fx][fy]=='.')//不能出现在蛇所占有的位置
{
GameMap[fx][fy]= Sfood;
break;
}
}
}
void Show()//刷新显示地图
{
int i, 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");
}
}
void Button()//取出按键,并判断方向
{
if(kbhit()!= 0)//检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
{
while(kbhit()!= 0)//可能存在多个按键,要全部取完,以最后一个为主
key= getch();//将按键从控制台中取出并保存到key中
switch(key)
{//左
case 75: Snake[0].now= 0;
break;
//右
case 77: Snake[0].now= 1;
break;
//上
case 72: Snake[0].now= 2;
break;
//下
case 80: Snake[0].now= 3;
break;
}
}
}
void Move()//蛇的移动
{
int i, x, y;
int t= 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 ]='#';//移动后要置为'#'蛇身
}
}
void Check_Border()//检查蛇头是否越界
{
if(Snake[0].x< 0|| Snake[0].x>= H
|| Snake[0].y< 0|| Snake[0].y>= L)
over= 1;
}
void Check_Head(int x, int y)//检查蛇头移动后的位置情况
{
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语言 的 贪吃蛇 代码 谢谢 大家啦。。。
你好,很荣幸回答你的问题,我这里是一个c的贪吃蛇源代码,希望对你有帮助,不过运行这个时需要你的软件包含惊蛰EasyX图形函数,比如vc++6.0,如遇到问题问题可以联系我,希望对你有帮助。
#include<graphics.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<stdio.h>
#define LEFT'a'
#define RIGHT'd'
#define DOWN's'
#define UP'w'
#define ESC 27
#define N 200/*蛇的最大长度*/
int i;
char key;
int score=0;/*得分*/
int gamespeed=100;/*游戏速度自己调整*/
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=9,gm=2;
initgraph(&gd,&gm,"");
cleardevice();
}
/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/
setcolor(LIGHTCYAN);
setlinestyle(PS_SOLID,0,1);/*设置线型*/
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)
{
srand(time(NULL));/*随机数发生器*/
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(BLACK);/*把画面上的食物东西去*/
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(RED);/*画出蛇*/
for(i=0;i<snake.node;i++)
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
Sleep(gamespeed);
setcolor(BLACK);/*用黑色去除蛇的的最后*/
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=getch();/*接收按键*/
if(key== ESC) break;/*按ESC键退出*/
switch(key)
{
case UP:
if(snake.direction!=4)/*判断是否往相反的方向移动*/
snake.direction=3;
break;
case RIGHT:
if(snake.direction!=2)
snake.direction=1;
break;
case LEFT:
if(snake.direction!=1)
snake.direction=2;
break;
case DOWN:
if(snake.direction!=3)
snake.direction=4;
break;
}
}/*endwhile(1)*/
}
/*游戏结束*/
void GameOver(void)
{
cleardevice();
PrScore();
setcolor(RED);
setfont(56,0,"黑体");
outtextxy(200,200,"GAME OVER");
getch();
}
/*输出成绩*/
void PrScore(void)
{
char str[10];
setfillstyle(YELLOW);
bar(50,15,220,35);
setcolor(BROWN);
setfont(16,0,"宋体");
sprintf(str,"score:%d",score);
outtextxy(55,16,str);
}
/*图形结束*/
void Close(void)
{
closegraph();
}
关于c语言贪吃蛇源代码的内容到此结束,希望对大家有所帮助。