C语言控制台版贪吃蛇文档格式.docx
《C语言控制台版贪吃蛇文档格式.docx》由会员分享,可在线阅读,更多相关《C语言控制台版贪吃蛇文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
#defineJ_RIGHT0xE04D
#defineJ_UP0xE048
#defineJ_DOWN0xE050
#defineJ_PGUP0xE049
#defineJ_DELETE0xE053
#defineJ_END0xE04F
#defineJ_PGDW0xE051
#defineS_TIME230
#defineCALTIME(x)(S_TIME-(x)*22)
/*---------------------------------------------------------------------------*/
/*LOCALFUNCTIONDECLARE*/
voidShowBye(void);
voidShowPause(void);
voidprint_explian(void);
voidgotoxy(intx,inty);
voiddraw_map(Psnake*head);
voiddraw_snake(Psnake*head);
voidEmptySnake(Psnake*head);
voiddraw_food(Coordinate*food);
voidHasKey(Dir*direction,int*pause);
voidIniHead(Psnake*head,Psnake*tail);
voidIniCoord(Psnake*head,intx,inty);
voidIniSnake(Psnake*head,Psnake*tail,intn);
voidDelTail(Psnake*head,Psnake*tail,intx,inty);
intMenu();
intSetDifficulty(int*diff);
intjkGetKey(void);
intsetCursorVisible(intb);
intIniFood(Psnake*head,Coordinate*food);
intInSnake(Psnake*head,intx,inty);
intMoveSnake(Psnake*head,Psnake*tail,Dir*direction,Coordinate*food,int*leng);
intIsOver(Psnake*head,intx,inty);
intHitSelf(Psnake*head,intx,inty);
intShowOver(int*score);
函数接口实现
#include<
stdio.h>
stdlib.h>
windows.h>
conio.h>
assert.h>
time.h>
#include"
snake.h"
//直接移动光标到X,Y坐标上。
windowsapi实现
voidgotoxy(intx,inty)
COORDpos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
//获取按键信息
intjkGetKey(void)
intrk=0;
intk=getch();
if(k==J_FUNC_KEY)
{
k=getch();
rk=0xFF00|k;
returnrk;
}
if(k==J_CTRL_KEY)
rk=0xE000|k;
rk=0x0000|k;
//绘制地图
voiddraw_map(Psnake*head)
inti;
system("
cls"
);
for(i=min_x;
i<
max_x;
i++)
gotoxy(i,min_y);
printf("
*"
gotoxy(i,max_y);
for(i=min_y;
max_y;
i++)
gotoxy(min_x,i);
gotoxy(max_x-1,i);
print_explian();
draw_snake(head);
//绘制蛇
voiddraw_snake(Psnake*head)
Snake*pnode=*head;
while(pnode!
=NULL)
gotoxy(pnode->
coord.x,pnode->
coord.y);
#"
pnode=pnode->
next;
//绘制食物
voiddraw_food(Coordinate*food)
gotoxy(food->
x,food->
y);
printf("
%c"
3);
intMenu()//这里是菜单选择的界面
intchoose=1,ischoose=1;
intdiff=1,i;
//displaymenuinterface
system("
//clearscreen首先清屏
printf("
************************************************\n"
Startgame.\n"
ChooseDifficulty.\n"
Quit.\n"
\nWarning:
PleaseselectEnglishinputmethod."
\n\n"
do{
for(i=1;
i<
=3;
i++){
gotoxy(2,i);
//光标移到(2,i)处
if(i==choose)
printf("
16);
//这里显示的是选择的三角
else
"
}
//getkeydown
switch(jkGetKey()){
//获取键盘按键,方向键只能通过扫描码获取
caseJ_UP:
if(choose>
1)
choose--;
break;
caseJ_DOWN:
if(choose<
3)
choose++;
caseJ_ENTER:
ischoose=0;
default:
;
}while(ischoose);
switch(choose){
case2:
SetDifficulty(&
diff);
//选择难度的界面
case1:
returndiff;
case3:
returnQUIT;
return0;
intSetDifficulty(int*diff)//显示选择难度的界面
assert(NULL!
=diff);
//toshowsetdifficultylevelinterface
gotoxy(0,max_y/2-9);
%c\n\n"
30);
//显示正三角
%c\n"
31);
//显示倒三角
\nPleasepressUPorDOWNtochoosedifficultylevel."
while
(1)
gotoxy(0,max_y/2-8);
printf("
Difficultylevel:
%d"
*diff);
//获取按键信息并选择难度
if(*diff>
1)
(*diff)--;
if(*diff<
9)
(*diff)++;
return0;
//初始化蛇
voidIniSnake(Psnake*head,Psnake*tail,intn)
inti=0;
assert(head!
=NULL);
++i;
for(;
n;
Snake*newsnake;
newsnake=(Snake*)malloc(sizeof(Snake));
if(newsnake==NULL)
{
fprintf(stderr,"
memoryerror!
"
exit
(1);
newsnake->
next=NULL;
pnode->
next=newsnake;
pnode=newsnake;
*tail=pnode;
//初始化坐标地址
voidIniCoord(Psnake*head,intx,inty)
coord.x=x--;
coord.y=y;
//初始化食物
intIniFood(Psnake*head,Coordinate*food)
srand((unsigned)time(NULL));
food->
x=rand()%(max_x-2)+1;
y=rand()%(max_y-2)+1;
}while(InSnake(head,food->
y));
returnTRUE;
//判断食物是否生成在蛇身体上
intInSnake(Psnake*head,intx,inty)
if(pnode->
coord.x==x&
&
pnode->
coord.y==y)
returnTRUE;
returnFALSE;
//移动蛇
intMoveSnake(Psnake*head,Psnake*tail,Dir*direction,Coordinate*food,int*leng)
Snake*pnode=*head;
intx=pnode->
coord.x;
inty=pnode->
coord.y;
intbeing_food=TRUE;
switch(*direction){
caseU:
y--;
caseD:
y++;
caseL:
x--;
caseR:
x++;
default:
if(food->
x==x&
food->
y==y)//判断是否是食物
newsnake=(Snake*)malloc(sizeof(Snake));
assert(newsnake!
next=*head;
coord.x=x;
*head=newsnake;
being_food=FALSE;
(*leng)++;
if(IsOver(head,x,y))//判断是否死亡
returnOVER;
if(being_food)
DelTail(head,tail,x,y);
//未吃到食物时
returnbeing_food;
//跟新尾部坐标擦除尾部,移到下一坐标造成视觉移动
voidDelTail(Psnake*head,Psnake*tail,intx,inty)
gotoxy((*tail)->
coord.x,(*tail)->
while(pnode->
next!
=*tail)
(*tail)->
*head=*tail;
*tail=pnode;
//判断游戏结束
intIsOver(Psnake*head,intx,inty)
if(x==min_x||x==max_x||y==min_y
||y==max_y||HitSelf(head,x,y)==1)
returnTRUE;
//判断是否吃到自己,返回结果
intHitSelf(Psnake*head,intx,inty)
Snake*pnode=(*head)->
//打印说明
voidprint_explian(void)//说明
gotoxy(61,5);
Level:
gotoxy(61,8);
Score:
gotoxy(61,15);
欢迎来到贪吃蛇游戏!
gotoxy(61,16);
按空格键暂停!
gotoxy(61,17);
祝你好运!
//释放内存
voidEmptySnake(Psnake*head)
Snake*psave;
while(*head)
psave=(*head)->
free(*head);
*head=psave;
voidShowPause()//显示暂停的界面
charkey;
gotoxy(0,max_y/2-6);
****************\n"
********\n"
*******************\n"
*******\n"
***************\n"
\n\nPleasepressSPACEtocontinue."
while(key=jkGetKey()){
//只当按下回车键时退出循环返回游戏
if(key==J_SPACE)
break;
//消除光标,直接COPY的
intsetCursorVisible(intb)
HANDLEhd=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFOccInfo;
GetConsoleCursorInfo(hd,&
ccInfo);
ccInfo.bVisible=!
!
b;
returnSetConsoleCursorInfo(hd,&
//判断是否按键
voidHasKey(Dir*direction,int*pause)
if(kbhit())
switch(jkGetKey())
{
caseJ_UP:
if(*direction!
=D)
*direction=U;
break;
=U)
*direction=D;
caseJ_RIGHT:
if(*direction!
=L)
*direction=R;
caseJ_LEFT:
=R)
*direction=L;
caseJ_SPACE:
*pause=1;
;
}
//初始化head,tail
voidIniHead(Psnake*head,Psnake*tail)
*head=(Snake*)malloc(sizeof(Snake));
assert(*head!
(*head)->
*tail=(Snake*)malloc(sizeof(Snake));
assert(*tail!
//显示结果
intShowOver(int*score)
intkey;
gotoxy(16,max_y/2-3);
================================"
gotoxy(16,max_y/2-2);
GAMEOVER"
gotoxy(16,max_y/2-1);
gotoxy(16,max_y/2+1);
YOUGOTSCORE:
%u"
*score);
Sleep(2000);
gotoxy(16,max_y/