贪吃蛇C语言知识学习.docx
《贪吃蛇C语言知识学习.docx》由会员分享,可在线阅读,更多相关《贪吃蛇C语言知识学习.docx(12页珍藏版)》请在冰点文库上搜索。
贪吃蛇C语言知识学习
#include
#include
#include
#include
#include
//蛇头移动方向
#defineUP1
#defineDOWN2
#defineLEFT3
#defineRIGHT4
//死亡判定(怼墙或怼自己)
#defineKISSASS1
#defineKISSWALL2
//坐标转化
#definePOINT(x,y)((y)*80+(x)+1)//将(x,y)坐标转化为一个int类数值
#defineGETX(x)(((x)-1)%80)//将int类数值提取出原先的x
#defineGETY(y)(((y)-1)/80)//同理,提取出y
HANDLEConsole;
voidPosition(intx,inty);//移动光标到(x,y)//Windows.h
voidDrawMap();//画墙
voidShowText(char*text);//根据字符串的长短智能打印出包围字符串的笑脸
voidResetSnake();//初始化贪吃蛇
intRefreshSnake();//更新蛇的移动
voidCreatFood();//生成食物
voidDraw();//画出蛇身和食物
voidRefreshScreen();//屏幕刷新
voidGameOver(intType);//游戏结束条件
intGaming();//代码跑起来
charplay=0;////值为1则继续游戏,值为0游戏退出
charpause=0;//值为1则暂停,值为0游戏继续
chardirection;//蛇头方向
intsnake[500];//snake[0]为蛇头
intbody;//蛇身体长度
intnewbody;//吃完食物新长的蛇身
intaddHead,deleteTail;//增加蛇头擦去蛇尾,使贪吃蛇动起来
intfood=0;//食物
voidmain()
{
CONSOLE_CURSOR_INFOCurrInfo={sizeof(CONSOLE_CURSOR_INFO),0};
Console=GetStdHandle(STD_OUTPUT_HANDLE);
DrawMap();
ShowText("Copyrightreserveby张博元");
while(Gaming())
{
if(play)
DrawMap();
};
return0;
}
voidPosition(intx,inty)//移动光标到(x,y)//Windows.h
{
COORDcoors={x,y};
SetConsoleCursorPosition(Console,coors);
}
voidDrawMap()//画墙
{
inti;
for(i=3;i<70;i=i+12)
{
Position(i,0);
printf("===我是墙===");
}
for(i=0;i<25;i=i+1)
{
Position(0,i);
printf("||");
}
for(i=3;i<70;i=i+12)
{
Position(i,24);
printf("============");
}
for(i=0;i<25;i=i+1)
{
Position(76,i);
printf("||");
}
}
voidShowText(char*text)//根据字符串的长短智能打印出包围字符串的笑脸
{
inti;
intstrLength=strlen(text);//得到字符串长度
Position(40-(strLength/2)-1,11);
printf("%c",1);
for(i=0;i{
printf("%c",1);
}
printf("%c",1);
Position(40-(strLength/2)-1,12);
printf("%c",1);
printf(text);
printf("%c",1);
Position(40-(strLength/2)-1,13);
printf("%c",1);
for(i=0;i{
printf("%c",1);
}
printf("%c",1);
}
voidResetSnake()//初始化贪吃蛇
{
intx,y;
for(x=39,y=0;y<2;y++)
{
snake[y]=POINT(x,7-y);
}
body=2;//设定蛇身初始长度为2
newbody=6;
addHead=0;
deleteTail=0;
direction=LEFT;
}
intRefreshSnake()//更新蛇的移动//返回值为1游戏结束
{
intx,y;
memcpy(snake+1,snake,sizeof(int)*body);
if(!
newbody)
{
deleteTail=snake[body];
snake[body]=0;
}
else
{
body++;
newbody--;
}
x=GETX(snake[0]);
y=GETY(snake[0]);
switch(direction)//控制蛇头移动方向
{
caseUP:
y-=1;//蛇头向上移动一格(对应坐标y-1)
snake[0]=POINT(x,y);
break;
caseDOWN:
y+=1;
snake[0]=POINT(x,y);
break;
caseLEFT:
x-=1;
snake[0]=POINT(x,y);
break;
caseRIGHT:
x+=1;
snake[0]=POINT(x,y);
break;
}
addHead=snake[0];
if(x>75||x<3||y>23||y<1)//检测是否撞墙
{
GameOver(KISSWALL);
return1;
}
inti;
for(i=1;i
if(snake[0]==snake[i])//检测是否撞到自己身体
{
GameOver(KISSASS);
return1;
}
if(snake[0]==food)
{
while
(1)//食物的位置不与蛇身重合
{
food=(rand()%(75*23));
for(i=0;snake[i];i++)
if(food==snake[i])//检测是否吃到食物,吃到则reset食物
food=0;
if(food)//如果food==0则重新建立一个食物坐标
break;
}
CreatFood();//吃了?
再来一个!
newbody=(rand()%6)+1;//吃完食物蛇身增长一节
}
return0;
}
voidCreatFood()//生成食物
{
if(GETX(food)>75||GETX(food)<3||GETY(food)>23||GETY(food)<1)
CreatFood;
else
Position(GETX(food),GETY(food));
printf("%c",4);
}
voidDraw()//画出蛇身和食物
{
system("cls");
inti;
for(i=0;snake[i];i++)
{
Position(GETX(snake[i]),GETY(snake[i]));
printf("%c",1);
}
CreatFood();
}
voidRefreshScreen()//屏幕刷新
{
if(deleteTail)
{
Position(GETX(deleteTail),GETY(deleteTail));
printf("");
}
if(addHead)
{
Position(GETX(addHead),GETY(addHead));
printf("%c",1);
}
addHead=deleteTail=0;
}
voidGameOver(intType)//游戏结束条件
{
switch(Type)
{
caseKISSASS:
//撞到自己身体
ShowText("NOOB!
当你以光速绕着一棵树奔跑就会发现自己在怼自己!
");
break;
caseKISSWALL:
//撞墙
ShowText("NOOB!
你有考虑过墙的感受吗→→");
}
food=0;
play=0;
memset(snake,0,sizeof(int)*500);//内存初始化
}
intGaming()//执行
{
intKeyboardInput;
Sleep(60);//速度
if(kbhit())
{
KeyboardInput=getch();
if(KeyboardInput==0||KeyboardInput==0xE0)
{
KeyboardInput=getch();
switch(KeyboardInput)//方向控制
{
case72:
if(direction!
=DOWN)
direction=UP;
break;
case80:
if(direction!
=UP)
direction=DOWN;
break;
case75:
if(direction!
=RIGHT)
direction=LEFT;
break;
case77:
if(direction!
=LEFT)
direction=RIGHT;
break;
}
}
if(KeyboardInput=='\r')//暂停
{
if(!
play)
{
play=1;
if(pause)
{
Draw();
pause=0;
}
}
else
{
ShowText("不许暂停,继续怼!
!
");
play=0;
pause=1;
}
}
elseif(KeyboardInput==0x1B)//退出
return0;
}
if(play)
{
if(!
food)
{
srand(clock());
food=(rand()%(75*23));
ResetSnake();
Draw();
}
else
{
if(!
RefreshSnake())
{
RefreshScreen();
}
}
}
return1;
}
//Allrightsreserveby博元