您好,欢迎访问三七文档
一、题目阐述:通过本学期对C语言的学习,对程序编译有了初步的了解,并运用了各种函数(如文件包含,宏定义,结构体,函数调用等)编写了这个推箱子游戏。二、设计思路:程序中“3”代表墙壁,“2”代表箱子,“4”代表目的地,“0”代表空,“5”代表人+目的地,“1“代表人,“6“代表箱子+目的地,用“Enter”键选择关数,按“p“键可以毁步,但最多只能毁5次。通过上下左右键实现箱子的上下左右移动,在可移动的范围内,推送到目的地。在推动的过程中若彻底失败,便按r键重新启动游戏。三、主要解决问题的方法及技术关键1、主要问题及解决方法★函数的定义及调用★光标的定位设置处理问题★光标的定位设置处理是通过voidgotoxy(intx,inty)函数实现的。定位设置手段是通过型参x、y获取定位点,应用int86的中断调用完成光标定位。★数组函数,switch,if语句,for循环语句的应用2、技术关键★光标定位C语言中循环语句的使用★C语言绘图及定义函数的使用intgd=DETECT,gm;C!=’y’&&c!=’y’C!=’y’&&c!=’y’&&c!C=getchar();Printf(“\n\nPleaseinputyourname…”)Char;Inputname();Judgeide();Key!=key-EnterCASEKey=bio=key(0);bio=key(1)IFSetbkcolor(BKCOLOR);Game();break;Idc=0Idc=1ViewRecord();bio=keyIdc=2DeleteRecord=();bio=keyIdc=3exit(0);四:程序清单:#defineMAX2/*游戏中总关数*/#defineSTARTX180#defineSTARTY80#defineBKCOLORBLACK#defineMANCOLORRED#defineOBJECTCOLORYELLOW#defineTIMEINT2#defineSTARNUM300#defineSTEPMAX5#includestring.hIFIFTheend.Inti,I,flog;1Flog=0;flag==1Key=Key_EnterNextMission();time(&t1);break;#includebios.h#includestdio.h#includedos.h#includegraphics.h#includeconio.h#includetime.h#includestdlib.h#includestdio.h#defineKey_R0x1372#defineKey_Up0x4800#defineKey_Enter0x1c0d#defineKey_Down0x5000#defineKey_P0x1970#defineKey_Esc0x11b#defineKey_Right0x4d00#defineKey_Left0x4b00typedefstructstar{intx;inty;intc;}Star;Stars[STARNUM];typedefstructrecord{charname[20];intsecond;structtimet;structdated;}Record;Recordr[MAX];typedefstructc{intx;inty;}Add;typedefstructa{intx;inty;}Player;Playerp;charname[20];/*进入游戏时记录玩家的姓名*/time_tt1,t2;/*游戏结束时的时间*/intIde;/*开始进入游戏时,选择菜单时返的功能号(1,2,3)*/intMissionNum;/*玩家正在玩的关数*/intBoxNum;/*目的地的个数*/intKey;/*玩家按键*/intmap[10][10];/*地图.(空=0),(人=1),(箱子=2),(墙=3),(目的地=4),(人+目的地=5),(箱子+目的地=6)*/intStepNum;intDirectionKey;/*用来表示方向键最后一次按键*/intBoxMove[STEPMAX];intStep[STEPMAX];/*函数定义*/voidInputName();voidInit();voidMainMenu();voidJudgeRecord();voidWriteRecord();voidJudgeIde();voidDrawMenu(int);voidGame();voidInitMission(int);voidNextMission();voidInitPic(int,int,int);intMove(Add);voidDrawWall(int,int);voidDrawBack(int,int);voidDrawBox(int,int);voidDrawObject(int,int);voidDrawMan(int,int);voidDrawStar();intJudgeWin();voidInitMission1();voidInitMission2();intTimeCome();voidChangeStar();voidInputName();voidViewRecords();voidDeleteRecords();voidRegisterStep();voidReverselyMove();voidMoveBack(Add);voidmain(){InputName();Init();/*驱动显卡*/srand(time(&t1));MainMenu();/*画开始菜单(1.startgame2.viewrecords3.deleterecords4.exitgame)*/}voidInputName(){charc;clrscr();do{printf(\n\nPleaseinputyourname:);scanf(%s,name);printf(Areyousurethenameright(Y/N):);do{c=getch();}while(c!='Y'&&c!='y'&&c!='N'&&c!='n');}while(c!='Y'&&c!='y');}voidInit(){intgd=DETECT,gm;initgraph(&gd,&gm,c:\\tc);}voidMainMenu(){setbkcolor(BKCOLOR);cleardevice();/*DrawStar();/*画开始菜单的背景画面*/DrawStar();Ide=0,Key=0;DrawMenu(Ide);do{if(bioskey(1))/*有键按下则处理按键*/{Key=bioskey(0);switch(Key){caseKey_Down:{Ide++;Ide=Ide%4;DrawMenu(Ide);break;}caseKey_Up:{Ide--;Ide=(Ide+4)%4;DrawMenu(Ide);break;}}}else{if(TimeCome())ChangeStar();}/*改变背景*/}while(Key!=Key_Enter);JudgeIde();/*根据Ide运行不同的程序*/}voidJudgeIde(){switch(Ide){case0:Game();break;case1:{ViewRecords();bioskey(0);MainMenu();break;}case2:{DeleteRecords();ViewRecords();bioskey(0);MainMenu();break;}case3:exit(0);}}voidGame(){inti,j,flag;Addad;MissionNum=0;NextMission();do{flag=0;Key=bioskey(0);switch(Key){caseKey_Enter:{NextMission();time(&t1);break;}caseKey_Up:{ad.x=-1;ad.y=0;flag=1;DirectionKey=Key;break;}caseKey_Down:{ad.x=1;ad.y=0;flag=1;DirectionKey=Key;break;}caseKey_Left:{ad.x=0;ad.y=-1;flag=1;DirectionKey=Key;break;}caseKey_Right:{ad.x=0;ad.y=1;flag=1;DirectionKey=Key;break;}caseKey_R:{MissionNum--;NextMission();break;}caseKey_Esc:{MainMenu();break;}caseKey_P:{ReverselyMove();break;}}if(flag==1){if(Move(ad)){RegisterStep();if(JudgeWin()){JudgeRecord();NextMission();}}}}while(1);}voidInitMission(intn){inti,j;for(i=0;i10;i++)for(j=0;j10;j++)map[i][j]=0;switch(n){case1:InitMission1();break;/*第一关*/case2:InitMission2();break;/*第二关*/}}voidInitPic(intn,inti,intj){switch(n){case0:DrawBack(i,j);break;case1:DrawMan(i,j);break;case2:DrawBox(i,j);break;case3:DrawWall(i,j);break;case4:DrawObject(i,j);break;case5:DrawMan(i,j);break;case6:DrawBox(i,j);break;}}voidNextMission(){inti,j;if(MissionNum+1MAX)MissionNum=1;elseMissionNum++;InitMission(MissionNum);setbkcolor(BKCOLOR);cleardevice();for(i=0;i10;i++)for(j=0;j10;j++)InitPic(map[i][j],i,j);switch(MissionNum){case1:outtextxy(200,230,Mission1);break;case2:outtextxy(200,230,Mission2);break;}time(&t1);for(i=0;iSTEPMAX;i++){Step[i]=BoxMove[i]=0;}StepNum=0;}intMove(Adda){intflag;inti=StepNum%STEPMAX;switch(map[p.x+a.x][p.y+a.y]){case0:{map[p.x][p.y]-=1;InitPic(map[p.x][p.y],p.x,p.y);p.x=p.x+a.x;p.y=p.y+a.y;map[p.x][p.y]+=1;InitPic(map[p.x][p.y],p.x,p.y);flag=1;break;}case2:{if(map[p.x+2*a.x][p.y+2*a.y]==0||map[p.x+2*a.x][p.y+2*a.y]==4){map[p.x][p.y]-=1;map[p.x+a.x][p.y+a.y]=1;map[p.x+2*a.x][p.y+2*a.y]+=2;InitPic(map[p.x][p.y],p.x,p.y);InitPic(map[p.x+a.x][p.y+a.y],p.x+a.x,p.y+a.y);InitPic(map[p.x+2*a.x][p
本文标题:500行C语言程序
链接地址:https://www.777doc.com/doc-5131288 .html