贪吃蛇源程序.docx
- 文档编号:24627530
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:30
- 大小:21.85KB
贪吃蛇源程序.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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪吃 源程序