TC下完美运行的推箱子:
#include<string.h>
#include<bios.h>
#include<stdio.h>
#include<dos.h>
#include<graphics.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#define
MAX
2
/*游戏中总关数*/
#define
STARTX
180
#define
STARTY
80
/*初始位置*/
#define
BKCOLOR
BLACK
/*背景颜色*/
#define
MANCOLOR RED
/*人物颜色*/
#define
OBJECTCOLOR
YELLOW
/*物体颜色*/
#define STEPMAX
5
#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
typedef struct c
{
int x;
int y;
}Add;
typedef struct a
{
int x;
int y;
}Player;
Player p;
/*一些全局变量定义*/
int MissionNum;
/*玩家正在玩的关数*/
int BoxNum;
/*目的地的个数*/
int Key;
/*玩家按键*/
int map[10][10];
/*地图.(空=0),(人=1),(箱子=2),(墙=3),(目的地=4),(人+目的地=5),(箱子+目的地=6)*/
int StepNum;
int BoxMove[STEPMAX];
int Step[STEPMAX];
/*一些函数定义*/
void Init();
void Game();
void InitMission(int );
void NextMission();
void InitPic(int ,int ,int );
int
Move(Add );
void DrawWall(int ,int );
void DrawBack(int ,int );
void DrawBox(int ,int );
void DrawObject(int ,int );
void DrawMan(int ,int );
int JudgeWin();
void game1();
void game2();
int main()
{
Init();/*初始化图形模式*/
Game();
return 0;
}
void Init()
{
/*设置图形驱动和模式*/
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc\\bgi");
}
void Game()/*游戏开始*/
{
int i,j,flag;
Add ad;
MissionNum=0;
NextMission();
do
{
flag=0;
Key=bioskey(0);/*获取一个键盘输入*/
switch(Key)
{
case Key_Enter:{NextMission();break;}/*键入ENTER键进入下一关*/
case Key_Up:{ad.x=-1;ad.y=0;flag=1;break;}/*键入四个方向建移动*/
case Key_Down:{ad.x=1;ad.y=0;flag=1;break;}
case Key_Left:{ad.x=0;ad.y=-1;flag=1;break;}
case Key_Right:{ad.x=0;ad.y=1;flag=1;break;}
case Key_R:{MissionNum--;NextMission();break;}/*键入R重新开始这一关*/
case Key_Esc:{exit(1);}/*键入ESC键退出*/
}
if(flag==1)
{
if(Move(ad))/*移动后改变二维数组值*/
{
if(JudgeWin())
{
/*游戏结束给出提示*/
gotoxy(10,3);
printf("\t\tWell done!");
gotoxy(10,4);
printf("\t\tpress any key continue...");
getch();
getch();
NextMission();
}
}
}
}while(1);
}
/*初始化关卡*/
void InitMission(int n)
{
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
map[i][j]=0;
switch(n)
{
case 1:game1();break;
/*第一关*/
case 2:game2();break;
/*第二关*/
}
}
/*初始化整个游戏图像和重绘整个游戏图像*/
void InitPic(int n,int i,int j)
{
switch(n)
{
case 0:DrawBack(i,j);break;
case 1:DrawMan(i,j);break;
case 2:DrawBox(i,j);break;
case 3:DrawWall(i,j);break;
case 4:DrawObject(i,j);break;
case 5:DrawMan(i,j);break;
case 6:DrawBox(i,j);break;
}
}
/*选择下一关*/
void NextMission()
{
int i,j;
if(MissionNum+1>MAX)
MissionNum=1;
else
MissionNum++;
InitMission(MissionNum);
setbkcolor(BKCOLOR);
cleardevice();
for(i=0;i<10;i++)
for(j=0;j<10;j++)
InitPic(map[i][j],i,j);
switch(MissionNum)
{
case 1:outtextxy(300,330,"game 1");break;
case 2:outtextxy(300,330,"game 2");break;
}
for(i=0;i<STEPMAX;i++)
{
Step[i]=BoxMove[i]=0;
}
StepNum=0;
}
/*移动后改变整个二维数组的值*/
int Move(Add a)
{
int flag;
int i=StepNum%STEPMAX;
switch(map[p.x+a.x][p.y+a.y])
/*看下一位置为什么,改变二维数组的值,重绘整个游戏画面*/
{
case 0:{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;}
case 2:{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.y+2*a.y],p.x+2*a.x,p.y+2*a.y);
p.x=p.x+a.x;p.y=p.y+a.y;flag=1;BoxMove[i]=1;
}
else flag=0;
break;}
case 3:flag=0;break;
case 4:{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;}
case 6:{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]=5;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.y+2*a.y],p.x+2*a.x,p.y+2*a.y);
p.x=p.x+a.x;p.y=p.y+a.y;flag=1;BoxMove[i]=1;
}
else flag=0;
break;}
}
return flag;
}
/*画出墙壁*/
void DrawWall(int i,int j)
{
DrawBack(i,j);
setfillstyle(9,2);
bar(STARTX+20*j-9,STARTY+20*i-9,STARTX+20*j+9,STARTY+20*i+9);
}
/*画出搬运工*/
void DrawMan(int i,int j)
{
DrawBack(i,j);
setcolor(MANCOLOR);
circle(STARTX+20*j,STARTY+20*i,9);
arc(STARTX+20*j-3,STARTY+20*i-2,20,160,3);
arc(STARTX+20*j+4,STARTY+20*i-2,20,160,3);
arc(STARTX+20*j,STARTY+20*i-2,220,320,7);
}
/*背景设置*/
void DrawBack(int i,int j)
{
setfillstyle(1,BKCOLOR);
bar(STARTX+20*j-9,STARTY+20*i-9,STARTX+20*j+9,STARTY+20*i+9);
}
/*画出目的地*/
void DrawObject(int i,int j)
{
DrawBack(i,j);
setcolor(OBJECTCOLOR);
line(STARTX+20*j-9,STARTY+20*i,STARTX+20*j+9,STARTY+20*i);
line(STARTX+20*j-9,STARTY+20*i-9,STARTX+20*j+9,STARTY+20*i+9);
line(STARTX+20*j-9,STARTY+20*i+9,STARTX+20*j+9,STARTY+20*i-9);
}
/*画出箱子*/
void DrawBox(int i,int j)
{
DrawBack(i,j);
setfillstyle(9,3);
bar(STARTX+20*j-9,STARTY+20*i-9,STARTX+20*j+9,STARTY+20*i+9);
}
/*判断游戏是否结束*/
int JudgeWin()
{
int n=0,i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(map[i][j]==6) n++;
if(n==BoxNum)
return 1;
else
return 0;
}
void game1()
/*第一关*/
{
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
map[i][j]=0;
for(i=5;i<=9;i++)
map[0][i]=3;
for(i=0;i<=4;i++)
{
map[i][5]=map[i][9]=3;
}
for(i=2;i<=7;i++)
map[i][1]=3;
for(i=4;i<=8;i++)
map[i][8]=3;
for(i=4;i<=7;i++)
map[8][i]=3;
map[2][2]=map[2][3]=map[3][3]=map[4][3]=map[4][4]=map[4][5]=map[6][4]=map[7][2]=map[7][3]
=map[7][4]=map[4][7]=map[4][9]=3;
map[2][6]=map[2][7]=map[3][7]=2;
map[3][2]=map[4][2]=map[5][2]=4;
p.x=1;p.y=8;
map[1][8]=1;
BoxNum=3;
}
void game2()
/*第二关*/
{
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
map[i][j]=0;
for(i=1;i<=5;i++)
{
map[0][i]=map[6][i]=3;
}
for(i=2;i<=4;i++)
{
map[1][i+3]=map[i][7]=map[i+2][5]=map[i][0]=3;
}
map[1][1]=map[2][1]=map[5][0]=map[5][5]=map[4][6]=map[6][0]=3;
map[2][4]=map[3][3]=map[4][2]=map[4][3]=2;
map[2][3]=map[3][2]=map[3][4]=map[4][4]=4;
p.x=1;p.y=3;
map[1][3]=1;
BoxNum=4;
}
VC报N个错~~