?? c-box.c
字號:
#include<stdio.h>
#include<dos.h>
#include<string.h>
#include<stdlib.h>
#include<bios.h>
#include<graphics.h>
#include<conio.h>
#include <alloc.h>
#include<time.h>
#include <math.h>
#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<STEPMAX;i++)
STEP[i]=BOXMOVE[i]=0;
STEPNUM=0;}
REGISTERSTEP() /*登記步子*/
{ int i;
STEPNUM++;
i=(STEPNUM-1)%STEPMAX;
STEP[ i ]=DIRECTIONKEY;}
int JUDGEWIN() /*人每走一步,就判斷贏了沒有*/
{int n=0,i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(ghose[i][j]==6) n++;
if(n==BOXNUM) return 1;
else return 0;}
MOVE(ADD a) /*依據人的下一位置的狀態來控制人的行走*/
{ int flag;
int i=STEPNUM%STEPMAX;
switch(ghose[p.x+a.x][p.y+a.y]) /*下一位置的判斷*/
{ case 0:{if(ghose[p.x][p.y]==5) /*當前位置是否為目的地,且下一位置是空地*/
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=4;}
if(ghose[p.x][p.y]==2) /*判斷當前位置是否為起點*/
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=0;}
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
p.x=p.x+a.x;p.y=p.y+a.y;
ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=2;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
flag=1;break;}
case 3:{if(ghose[p.x+2*a.x][p.y+2*a.y]==0||ghose[p.x+2*a.x][p.y+2*a.y]==4) /*下一位置是箱子*/
{if(ghose[p.x+2*a.x][p.y+2*a.y]==0)
{if(ghose[p.x][p.y]==5)
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=4;}
if(ghose[p.x][p.y]==2)
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=0;}
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x);
ghose[p.x+a.x][p.y+a.y]=2;
ghose[p.x+2*a.x][p.y+2*a.y]=3;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); }
if(ghose[p.x+2*a.x][p.y+2*a.y]==4)
{if(ghose[p.x][p.y]==5)
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=4;}
if(ghose[p.x][p.y]==2)
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=0;}
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x);
ghose[p.x+a.x][p.y+a.y]=2;
ghose[p.x+2*a.x][p.y+2*a.y]=6;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); }
p.x=p.x+a.x; p.y=p.y+a.y;flag=1;BOXMOVE[ i ]=1;break;}
else flag=0;break;}
case 1:flag=0;break;
case 4:{if(ghose[p.x][p.y]==5)
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=4;}
if(ghose[p.x][p.y]==2)
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=0;}
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
p.x=p.x+a.x;p.y=p.y+a.y;
ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=5;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
flag=1;break;}
case 6:{if(ghose[p.x+2*a.x][p.y+2*a.y]==0||ghose[p.x+2*a.x][p.y+2*a.y]==4)
{if(ghose[p.x+2*a.x][p.y+2*a.y]==0)
{if(ghose[p.x][p.y]==5)
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=4;}
if(ghose[p.x][p.y]==2)
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=0;}
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x);
ghose[p.x+a.x][p.y+a.y]=5;
ghose[p.x+2*a.x][p.y+2*a.y]=3;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); }
if(ghose[p.x+2*a.x][p.y+2*a.y]==4)
{if(ghose[p.x][p.y]==5)
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=4;}
if(ghose[p.x][p.y]==2)
{ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x][p.y]=0;}
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x);
ghose[p.x+a.x][p.y+a.y]=5;
ghose[p.x+2*a.x][p.y+2*a.y]=6;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); }
p.x=p.x+a.x; p.y=p.y+a.y;flag=1;BOXMOVE[ i ]=1;}
else flag=0;break;}
}
return flag; }
REVERSELYMOVE() /*對悔棋的處理*/
{ int i;
ADD a;
i=(STEPNUM-1)%STEPMAX;
if(STEP[ i ]==0) return;
else{ switch(STEP[ i ])
{case Key_Up:{a.x=1;a.y=0;MOVEBACK(a);break;}
case Key_Down:{a.x=-1;a.y=0;MOVEBACK(a);break;}
case Key_Left:{a.x=0;a.y=1;MOVEBACK(a);break;}
case Key_Right:{a.x=0;a.y=-1;MOVEBACK(a);break;} }
STEPNUM--;STEP[ i ]=0;BOXMOVE[ i ]=0;}}
MOVEBACK(ADD a) /*分箱子沒有移動和箱子移動了兩種情況分別進行悔棋*/
{ int i=(STEPNUM-1)%STEPMAX;
if(BOXMOVE[ i ]==0) /*箱子沒移動就退人走的步子*/
{ if(ghose[p.x+a.x][p.y+a.y]==0&&ghose[p.x][p.y]==2)
{ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x+a.x][p.y+a.y]=2;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);}
if(ghose[p.x+a.x][p.y+a.y]==4&&ghose[p.x][p.y]==5)
{ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
ghose[p.x][p.y]=4;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x+a.x][p.y+a.y]=5;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);}
if(ghose[p.x+a.x][p.y+a.y]==5&&ghose[p.x][p.y]==0)
{ ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
ghose[p.x][p.y]=4;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x+a.x][p.y+a.y]=2;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);}
if(ghose[p.x+a.x][p.y+a.y]==2&&ghose[p.x][p.y]==4)
{ ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
ghose[p.x][p.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x+a.x][p.y+a.y]=5;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);}
p.x=p.x+a.x;p.y=p.y+a.y;}
else if(BOXMOVE[ i ]==1) /*若箱子動了,退人也退箱子*/
{if(ghose[p.x-a.x][p.y-a.y]==3&&ghose[p.x][p.y]==2&&ghose[p.x+a.x][a.y+p.y]==0)
{ghose[p.x-a.x][p.y-a.y]=ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x);
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
ghose[p.x-a.x][p.y-a.y]=0;
DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x);
ghose[p.x][p.y]=3;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x+a.x][p.y+a.y]=2;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
}
if(ghose[p.x-a.x][p.y-a.y]==3&&ghose[p.x][p.y]==5&&ghose[p.x+a.x][a.y+p.y]==0)
{ghose[p.x-a.x][p.y-a.y]=ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x);
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
ghose[p.x-a.x][p.y-a.y]=0;
DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x);
ghose[p.x][p.y]=6;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
ghose[p.x+a.x][p.y+a.y]=2;
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
}
if(ghose[p.x-a.x][p.y-a.y]==3&&ghose[p.x][p.y]==2&&ghose[p.x+a.x][a.y+p.y]==4)
{ghose[p.x-a.x][p.y-a.y]=ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0;
DRAWMISSION(ghose[p.x][p.y],p.y,p.x);
DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x);
DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);
ghose[p.x-a.x][p.y-a.y]=0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -