贪吃蛇源程序.docx
《贪吃蛇源程序.docx》由会员分享,可在线阅读,更多相关《贪吃蛇源程序.docx(30页珍藏版)》请在冰豆网上搜索。
贪吃蛇源程序
贪吃蛇源程序
本程序为贪吃蛇游戏,想必大家都玩过这个游戏,程序源代码用TC2.0编译通过,需要图形驱动文件的支持,在TC2.0的集成环境中有.
本程序利用数据结构中的链表,来将蛇身连接,同时当蛇吃到一定数目的东西时会自动升级,及移动速度会加快,程序会时刻将一些信息显示在屏幕上,包括所得分数,要吃多少东西才能升级,并且游戏者可以自己手动选择游戏级别,级别越高,蛇的移动速度越快.
另外,此游戏可能与CPU的速度有关系.
源代码如下:
**********************************************************************************
/*******************************COMMENTS**********************************/
/*snake_game.c
*/
/*itisagameforentermainment.
*/
/*inthebegin,thereisonlyasnakehead,anditwillhavetoeatfood */
/*tobecomestronger,anditeatapieceoffoodeachtime,itwill */
/*lengthenit'sbody,withthenumberoffoodthesnakeeatsgoingup,it*/
/*willbecomelongmoreandmore,andthescorewillgoesupalso. */
/*thereisalwaysusefulinformationduringthegameprocess. */
/*ifthepathbywhichthesnakegoestoeatfoodistheshortest,the */
/*scorewilladdupadouble.
*/
/*
*/
/*enjoyyourself,andanyproblem,contact */
/*************************************************************************/
/*allheadfilethatwillbeused*/
#include
#include
#include
#include
#include
#include
/*usefulMACRO*/
#defineFOOD_SIZE 8
#define SCALE 8
#define UP_KEY 0x4800
#define DOWN_KEY 0x5000
#define LEFT_KEY 0x4b00
#define RIGHT_KEY 0x4d00
#define MOVE_UP 1
#define MOVE_LEFT 2
#define MOVE_DOWN 3
#define MOVE_RIGHT 4
#define INVALID_DIRECTION 0
#define QUIT_KEYC 0x1051
#define QUIT_KEY 0x1071
#define SELECT_KEYC 0x1f53
#define SELECT_KEY 0x1f73
#define PAUSE_KEYC 0x1950
#define PAUSE_KEY 0x1970
#defineDEFAULT_LEVEL 1
#define HELP_COLOR WHITE
#define WELCOME_COLOR WHITE
#define DEFAULT_COLOR GREEN
/*definethemacroasfollowstoimprovethegameinfuture*/
#defineFOOD_COLOR YELLOW
#define SNAKE_HEAD_COLOR RED
#defineDEFAULT_SNAKE_COLOR YELLOW
#define EXIT_COLOR WHITE
#defineSCORE_COLOR YELLOW
/*sturctureforsnakebodymainly,andfoodalso*/
typedefstructfood_infor *FOOD_INFOR_PTR;
typedefstructfood_infor{
intposx; /*positionforeachpieceofsnakebody*/
intposy;
intnext_move; /*nextmovedirection*/
intpre_move; /*previousmovedirection,seemsunuseful*/
intbeEaten; /*xidentifierforsnakebodyorfood*/
FOOD_INFOR_PTR next;/*pointertonextpieceofsnakebody*/
FOOD_INFOR_PTR pre; /*pointertopreviouspieceofsnakebody*/
}FOOD_INFOR;
/*structureforsnakehead*/
typedefstruct_snake_head{
intposx;
intposy;
intnext_move;
intpre_move;
inteatenC; /*numberoffoodthathavebeeneaten*/
inthop; /*numberofstepstoeatfood*/
FOOD_INFOR_PTRnext; /*pointertothefirstpieceofeatenfood*/
}SNAKE_HEAD;
/*theleft-upcornerandright-downcorner*/
typedefstructpoint{
intx;
inty;
}POINT;
/*standardsforgamespeed
*/
/*beforelevel5,thetimeintervalislevel_b[level-1]/10,andafter*/
/*level5,thetimeintervalis1.00/level_b[level-1] */
floatlevel_b[9]={10.0,8.0,6.0,3.0,1.0,20.0,40.0,160.0,640.0};
/*availablevarary*/
SNAKE_HEADsnake_head;
FOOD_INFOR *current; /*alwayspointtofood*/
POINT border_LT,border_RB;
int driver,mode; /*forgraphicsdriver*/
int maxx,maxy; /*maxlengthandwidthofscreen,inpixel*/
int eaten; /*identifierifthefoodiseaten*/
int score=0; /*totalscore*/
int level=DEFAULT_LEVEL;/*levelorspeed*/
float interval; /*basedonspeed*/
int snake_color=DEFAULT_SNAKE_COLOR;/*snakebodycolor*/
int hopcount=0; /*theshortestnumberofstepsforsnake*/
/*toeatfood*/
/*allsubfunction*/
voidinit_graphics();
voidgenerate_first_step();
int judge_death();
int willeatfood();
voidgenerate_food();
voidaddonefood();
voidredrawsnake();
voidshow_all();
voidsort_all();
voidchange_direction();
voidhelp();
voidshow_score(int);
voidchange_level();
voidshow_level();
voidrelease(SNAKE_HEAD);
int can_promote();
voidwin();
voidshow_infor_to_level();
voidshow_eaten();
voidcalculate_hop();
/*mainfunctionorentry*/
voidmain()
{
char str[50]="YOULOSE!
!
!
"; /*failinformation*/
clock_tstart;
int querykey;
int tempx,tempy;
/*iffailandwanttoresumegame,gohere*/
retry:
init_graphics();
show_all(); /*showwall*/
generate_first_step(); /*generatefoodandsnakehead*/
show_score(score); /*showscoretoplayer*/
eaten=0;
/*begintoplaygame*/
while
(1)
{
if(judge_death()==1) /*die*/
break;
if(willeatfood()==1)
{
eaten=1;
addonefood();
snake_head.hop++;
if(snake_head.hop==hopcount)
score+=level*2;
else
score+=level;
can_promote();
show_score(score);
}
sort_all();
redrawsnake();
snake_head.hop++;
show_infor_to_level();
show_eaten();
show_all();
change_direction();
if(eaten==1)
{
generate_food();
calculate_hop();
snake_head.hop=0;
eaten=0;
}
if(level<=5)
interval=level_b[level-1]/10.0;
else
interval= 1.00/level_b[level-1];
start=clock();
while((clock()-start)/CLK_TCK {
querykey=bioskey
(1);
if(querykey!
=0)
{
switch(bioskey(0))
{
caseUP_KEY:
snake_head.next_move=MOVE_UP;
break;
caseLEFT_KEY:
snake_head.next_move=MOVE_LEFT;
break;
caseDOWN_KEY:
snake_head.next_move=MOVE_DOWN;
break;
caseRIGHT_KEY:
snake_head.next_move=MOVE_RIGHT;
break;
caseSELECT_KEYC:
caseSELECT_KEY:
change_level();
score=0;
show_score(score);
show_level();
break;
casePAUSE_KEYC:
casePAUSE_KEY:
while(!
bioskey
(1));
break;
caseQUIT_KEYC:
caseQUIT_KEY:
gotoexit_game;
default:
break;
}
}
}
}
settextstyle(DEFAULT_FONT,0,2);
setcolor(EXIT_COLOR);
tempx=border_LT.x+(border_RB.x-border_LT.x-textwidth(str))/2;
tempy=border_LT.y+(border_RB.y-border_LT.y)/2;
outtextxy(tempx,tempy,str);
strcpy(str,"presstoretry,orENTERkeytoexit");
tempy+=textheight(str)*2;
settextstyle(DEFAULT_FONT,0,1);
tempx=border_LT.x+(border_RB.x-border_LT.x-textwidth(str))/2;
outtextxy(tempx,tempy,str);
select:
while(!
bioskey
(1));
querykey=bioskey(0);
if((querykey==0x1372)||(querykey==0x1352))
{
level=DEFAULT_LEVEL;
score=0;
release(snake_head);
closegraph();
gotoretry;
}
if(querykey!
=0x1c0d)
gotoselect;
closegraph();
return;
exit_game:
release(snake_head);
closegraph();
}
/*subfunctionshow_eaten() */
/*function:
toshowthetotalnumberpieceoffood*/
/* thathavebeeneatenbysnakeanytime*/
voidshow_eaten()
{
inttempx,tempy;
intsize;
void*buf;
charstr[15];
settextstyle(DEFAULT_FONT,0,1);
setcolor(DEFAULT_COLOR);
sprintf(str,"eaten:
%d",snake_head.eatenC);
tempx=0;
tempy=border_LT.y+textheight(str)*6;
size=imagesize(tempx,tempy,tempx+textwidth(str)+textwidth("A"),
tempy+textheight(str));
buf=malloc(size);
getimage(tempx,tempy,tempx+textwidth(str)+textwidth("A"),
tempy+textheight(str),buf);
putimage(tempx,tempy,buf,XOR_PUT);
outtextxy(tempx,tempy,str);
free(buf);
}
/*subfunction:
show_infor_to_level */
/*function:
showinformationtoplayerthathowmanypieces*/
/* offoodhavetobeeneatentogettonextlevel*/
/* ,andthisisnotrelatedwithscore,butonly */
/* eatennumberoffood
*/
/*
*/
/*levelstandard:
lethighlevelstandforthenumberof */
/* piecesoffoodthatcanbeputintthe */
/* verticaldirectionofplayarea,and */
/* beforelevel5,aslongasthesnakeeat */
/* aquarterofhighlevel,itwillgotonext*/
/* level,andbetweenlevel5and7,aslong */
/* asthesnakeeatonethirdsofhighlevel,*/
/* itwillgotonextlevel,andbetween */
/* level8and9,thesnakewillgotonext */
/* levelaslongasiteathalfofhighlevel*/
/*note:
levelisbetween1to9. */
voidshow_infor_to_level()
{
inthighlevel;
intsize;
inttempx,tempy;
inttoeat;
void*buf;
charstr[50];
highlevel=(border_RB.y-border_LT.y)/SCALE;
switch(level)
{
case1:
case2:
case3:
case4:
toeat=(highlevel/4)*level-snake_head.eatenC;
break;
case5:
case6:
case7:
toeat=(highlevel+highlevel/3*(level-4)) -snake_head.eatenC;
break;
case8:
case9:
toeat=(highlevel*2+highlevel/2*(level-7))-
snake_head.eatenC;
break;
default:
break;
}
settextstyle(DEFAULT_FONT,0,1);
setcolor(DEFAULT_COLOR);
if(snake_head.next==NULL)
{
sprintf(str,"nextlevel");
tempx=0;
tempy=border_LT.y+textheight(str)*2;
outtextxy(tempx,tempy,str);
}
if(toeat<0)
toeat=0;
sprintf(str,"%d:
%d",level+1,toeat);
tempx=0;
tempy=border_LT.y+textheight(str)*4;
size=imagesize(tempx,tempy,tempx+textwidth(str)+textwidth("A"),tempy+
textheight(str));
buf=malloc(size);
getimage(tempx,tempy,tempx+textwidth(str)+textwidth("A"),tempy+
textheight(str),buf);
putimage(tempx,tempy,buf,XOR_PUT);
outtextxy(tempx,tempy,str);
free(buf);
}
/*subfunction:
win() */
/*function:
iftheplayerpasslevel9,thisfunction */
/* willbecalled,toshow"YOUWINinformation*/
/* andafterakeyispre