www.pudn.com > C-box.rar > C-box.C
#include#include #include #include #include #include #include #include #include #include #define MAX 3 /*游戏的总关数*/ #define STEPMAX 3 /*悔棋的最大步数*/ #define Key_R 0x1372 #define Key_Up 0x4800 #define Key_Enter 0x1c0d #define Key_Down 0x5000 #define Key_P 0x1970 #define Key_Esc 0x11b #define Key_Right 0x4d00 #define Key_Left 0x4b00 #define BKCOLOR GREEN /*设置背景颜色*/ #define STARTX 40 /*画游戏界面时,二维数组中ghose[0][0]左上角顶点在VGA模式下的横坐标*/ #define STARTY 80 /*画游戏界面时,二维数组中ghose[0][0]左上角顶点在VGA模式下的纵坐标*/ int ghose[10][10]; /*用来表示游戏中各种状态的二维数组*/ int BOXNUM; /*每关中箱子的个数*/ int MISSIONNUM; /*玩家正在玩的关数*/ int Key; /*从键盘读取按键值*/ int STEPNUM; /*人走的步数*/ int DIRECTIONKEY; /*用来记录玩家所按的方向键*/ int BOXMOVE[STEPMAX]; /*记录人行走时箱子移动了没有.如有,BOXMOVE[ i ]=1,否则BOXMOVE[ i ]=0*/ int STEP[STEPMAX]; /*记录人行走的方向*/ typedef struct CURRENT { int x; int y; }PLAYER; PLAYER p; /*p.x和p.y分别表示人当前所在的横纵坐标*/ typedef struct ADD { int x; int y; }ADD; /*人行走或悔棋时,用来表示人下一步移动需要增加的横纵坐标值*/ void GAME() /*游戏过程的控制*/ { int i,j,flag; ADD a; MISSIONNUM=0; NEXTMISSION(); do { flag=0; Key=bioskey(0); switch(Key) { case Key_Enter:{NEXTMISSION();break;} case Key_Up:{a.x=-1;a.y=0;flag=1;DIRECTIONKEY=Key;break;} case Key_Down:{a.x=1;a.y=0;flag=1;DIRECTIONKEY=Key;break;} case Key_Left:{a.x=0;a.y=-1;flag=1;DIRECTIONKEY=Key;break;} case Key_Right:{a.x=0;a.y=1;flag=1;DIRECTIONKEY=Key;break;} case Key_R:{MISSIONNUM--;NEXTMISSION();break;} case Key_P:{REVERSELYMOVE();break;} case Key_Esc:{DRAWEND();break;} } if(flag==1) { if(MOVE(a)) /*判断下一步是否能走,若能走就记录这一步*/ { REGISTERSTEP(); /*登记步子为了悔棋用,但只能悔三步*/ if(JUDGEWIN()) {settextstyle(1,0,2); setcolor(RED); outtextxy(40,10,"YOU HAVE PASSED THIS MISSION!"); outtextxy(40,30,"PLEASE PRESS ANYKEY TO CONTINUE!"); bioskey(0); NEXTMISSION(); } } } }while(1); } NEXTMISSION() /*画下一关的游戏界面和游戏初始化*/ {int i,j; if(MISSIONNUM+1>MAX) MISSIONNUM=1; else MISSIONNUM++; cleardevice(); CHOOSEMISSION(MISSIONNUM); for(i=0;i<10;i++) for(j=0;j<10;j++) DRAWMISSION(ghose[i][j],j,i); DRAWINTRODUCTION(); settextstyle(1,0,2); switch(MISSIONNUM) { case 1:outtextxy(60,50,"MISSION 1");break; case 2:outtextxy(60,50,"MISSION 2");break; case 3:outtextxy(60,50,"MISSION 3");break; } for(i=0;i 4;m++,n--) ghose[m][n]=1; ghose[6][8]=ghose[8][5]=ghose[5][3]=1; ghose[8][1]=2; /*构造人物在的地方,值为2*/ for(m=2;m<4;m++) ghose[m][2]=ghose[3][m]=3; /*构造箱子放的地方,值为3*/ ghose[1][8]=ghose[6][6]=ghose[8][8]=4; /*构造目的地,值为4*/ p.x=8; p.y=1; /*设定玩家起点*/ BOXNUM=3; /*设定这关的箱子数*/ } MISSION2() /*画第二关的游戏界面*/ {int m,n; for(m=0;m<10;m++) for(n=0;n<10;n++) ghose[m][n]=0; for(m=0;m<10;m++) ghose[0][m]=ghose[9][m]=ghose[m][0]=ghose[m][9]=1; for(m=2;m<4;m++) ghose[m][1]=ghose[3][m-1]=1; for(m=3,n=6;m>1&&n<8;m--,n++) ghose[m][n]=1; for(m=4;m<7;m++) ghose[6][m]=ghose[m+1][5]=1; ghose[1][4]=ghose[2][8]=1; ghose[6][8]=2; for(m=3;m<5;m++) ghose[m][4]=ghose[4][m]=3; ghose[4][2]=3; ghose[2][6]=ghose[3][7]=ghose[5][6]=ghose[7][6]=4; p.x=6; p.y=8;BOXNUM=4; } MISSION3() /*画第三关的游戏界面*/ {int m,n; for(m=0;m<10;m++) for(n=0;n<10;n++) ghose[m][n]=0; for(m=0;m<10;m++) ghose[0][m]=ghose[9][m]=ghose[m][0]=ghose[m][9]=1; for(m=2,n=5;m<4&&n<7;m++,n++) ghose[m][n]=1; ghose[1][3]=ghose[3][3]=ghose[4][1]=ghose[5][4]=ghose[6][7]=ghose[7][5]=ghose[8][3]=1; ghose[4][4]=2; for(m=6;m<8;m++) ghose[m][2]=ghose[m][4]=3; ghose[7][3]=3; for(m=6;m<9;m++) ghose[1][m]=4; ghose[3][1]=ghose[8][7]=4; p.x=4; p.y=4; BOXNUM=5; } DRAWMISSION(int n,int i,int j) /*依据ghose[ i ][j]所对应的值,在相应位置画出图像*/ { switch(n) { case 0:DRAWBACK(i,j);break; case 1:DRAWWALL(i,j);break; case 2:DRAWMAN(i,j);break; case 3:DRAWBOX(i,j);break; case 4:DRAWFLAG(i,j);break; case 5:DRAWMAN1(i,j);break; case 6:DRAWBOX1(i,j);break; } } CHOOSEMISSION(int n) /*根据关数去画相应的游戏界面*/ { switch(n) { case 1:MISSION1();break; case 2:MISSION2();break; case 3:MISSION3();break; } } DRAWINTRODUCTION( ) /*画游戏界面旁边的介绍*/ { int n; char *s[10]={"WALL","MAN","BOX","DESTINATION","MAN&&DESTINATION","BOX&&DESTINATION","P--REVERSELYMOVE","ENTER--Nextmission","ESC--Exit","R--Replay"}; settextstyle(1,0,2); outtextxy(430,40,"INTRODUCTION"); settextstyle(0,0,1); for(n=0;n<6;n++) outtextxy(500,100+n*50,s[n]); DRAWWALL1(455,82); DRAWMAN2(473,151); DRAWBOX2(455,182); DRAWFLAG1(467,220); DRAWMAN3(473,301); DRAWBOX3(455,335); setcolor(RED); for(n=6;n<10;n++) outtextxy(455,370+(n-5)*20,s[n]); } void main() /*主函数*/ { Init(); setbkcolor(BLACK); cleardevice(); ABOVEALL(); setbkcolor(BLUE); cleardevice(); setbkcolor(BKCOLOR); cleardevice(); GAME(); getch(); closegraph(); }