贪吃蛇源程序.docx

上传人:b****4 文档编号:3704588 上传时间:2022-11-24 格式:DOCX 页数:24 大小:22.44KB
下载 相关 举报
贪吃蛇源程序.docx_第1页
第1页 / 共24页
贪吃蛇源程序.docx_第2页
第2页 / 共24页
贪吃蛇源程序.docx_第3页
第3页 / 共24页
贪吃蛇源程序.docx_第4页
第4页 / 共24页
贪吃蛇源程序.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

贪吃蛇源程序.docx

《贪吃蛇源程序.docx》由会员分享,可在线阅读,更多相关《贪吃蛇源程序.docx(24页珍藏版)》请在冰豆网上搜索。

贪吃蛇源程序.docx

贪吃蛇源程序

贪吃蛇源程序

本程序为贪吃蛇游戏,想必大家都玩过这个游戏,程序源代码用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*/

/*   andafterakeyispressed,thegamew

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1