📄 pushbox.h
字号:
/************************************************
程序名称: initGame
功能: 初始化游戏关卡数据
编写人: XXXXXX
编写时间: 2006-11-20
修改人: jiang
修改时间: 2006-12-13
版权所有: XXXXXX
************************************************/
#define EMPTY " " //空白区域
#define N_EMPTY 0 //对应的值
#define AISLE " " //走廊
#define N_AISLE 1
#define WALL "█" //墙壁
#define N_WALL 2
#define BOX "▓" //未在目标位置的箱子
#define N_BOX 3
#define AIM "□" //未放箱子的目标
#define N_AIM 4
#define MAN "○" //人
#define N_MAN 5
#define BOX_OK "▲" //■已经在目标位置的箱子[即已放箱子的目标]
#define N_BOX_OK 6
#define ESC 0x1B
#define UP 'w'
#define DOWN 's'
#define LEFT 'a'
#define RIGHT 'd'
#define RESTART 'q'
#define PF(a) printf("%s",a)
//定义坐标位置的结构体
typedef struct point
{
int x;
int y;
}Point;
Point man_p;
char spData[16][22];//坐标矩阵
/************************************************
功能:初始化游戏关卡数据
输入参数:speed--游戏级别
输出参数:计算结果由outPm3传出
返回:
操作成功时返回1
操作失败时返回0
************************************************/
int initGame(int speed)
{
char filename[200]=""; //文件名
char t[5];
FILE *fp; //文件指针
int i,j;
/****
// strcpy(filename,"sp\\\\sp");
//D:\e\operating_system(jiangweijin)\code1\push_box\sp
strcpy(filename,"D:\\e\\operating_system(jiangweijin)\\code1\\push_box\\sp\\sp");
strcat(filename,itoa(speed,t,10));
strcat(filename,".dat");
*****/
//strcpy(filename,"D:\\e\\operating_system(jiangweijin)\\code1\\push_box\\sp\\sp");
strcpy(filename,"..\\sp\\sp");
strcat(filename,itoa(speed,t,10));
strcat(filename,".dat");
//printf("%s",filename);
// getchar();getchar();
if((fp=fopen(filename,"rb"))==NULL)
{
printf("\n不能打开关卡数据");
getch();
return 0;
}
else
if(fread(spData, 352, 1, fp) != 1)
{
printf("\n关卡数据错误");
getch();
fclose(fp);
return 0;
}
fclose(fp);
for(i = 0; i < 16; ++i)
for(j = 0; j < 22; ++j)
if(spData[i][j] == 5)
{
//找到人的初始位置 并把这个点的地图数据改为走廊[简化后面的判断]
man_p.x = j;
man_p.y = i;
spData[i][j] = N_AISLE;
break;
}
return 1;
}
/************************************************
函数功能:展示当前游戏界面
输入参数:无
输出参数:无
返回: 无
************************************************/
void displayNow()
{
int i, j;
system("cls");
for(i = 0; i < 16; ++i)
{
for(j = 0; j < 22; ++j)
{
if(man_p.x == j && man_p.y == i)
{
PF(MAN);
continue;
}
switch(spData[i][j])
{
case N_EMPTY:
PF(EMPTY); break;
case N_MAN:
case N_AISLE:
PF(AISLE); break;
case N_WALL:
PF(WALL); break;
case N_BOX:
PF(BOX); break;
case N_AIM:
PF(AIM); break;
case N_BOX_OK:
PF(BOX_OK); break;
default:
break;
}
}
PF("\n");
}
}
/************************************************
函数功能:输赢判断
输入参数:无
输出参数:无
返回:
赢时返回1
输时返回0
************************************************/
int isWin()
{
int i,j;
for(i = 0; i < 16; ++i)
for(j = 0; j < 22; ++j)
if(spData[i][j] == 3)
return 0;
return 1;
}
/************************************************
函数功能:获得有效按键 返回按键值
输入参数:无
输出参数:无
返回:
返回有效按键 值
************************************************/
unsigned char getKey()
{ unsigned char key;
do
{
key = getch();
}while(key != RESTART && key != ESC && key != LEFT && key != RIGHT && key != UP && key != DOWN);
return key;
}
/************************************************
函数功能:移箱子
输入参数:box_p--箱子当前位置,boxf_p---箱子目标位置
输出参数:无
返回: 无
************************************************/
void moveBox(Point box_p,Point boxf_p)
{
//如果箱子前 为走廊则标记为未放到目标位置的箱子 否则标记为放到目标位置的箱子
spData[boxf_p.y][boxf_p.x] = spData[boxf_p.y][boxf_p.x] == N_AISLE ? N_BOX : N_BOX_OK;
//如果箱子当前位置为已经放到目标位置的箱子则标记为未放箱子的目标 否则标记为走廊
spData[box_p.y][box_p.x] = spData[box_p.y][box_p.x] == N_BOX_OK ? N_AIM : N_AISLE;
}
/************************************************
函数功能:人移动
输入参数:deltax---x轴的位移量, deltay---y轴的位移量
输出参数:无
返回: 无
************************************************/
void moveMan(const int deltax, const int deltay)
{
man_p.x += deltax;
man_p.y += deltay;
}
/*获得点x的地图值*/
int getMP(Point x)
{
return spData[x.y][x.x];
}
/************************************************
函数功能:玩游戏
输入参数:无
输出参数:无
返回:
退出返回0
顺利过关返回1
************************************************/
int playGame()
{
/*********************
#define ESC 0x1B
#define UP 'w'
#define DOWN 's'
#define LEFT 'a'
#define RIGHT 'd'
#define RESTART 'q'
**********************/
int deltax, deltay;
Point manf_p, manff_p;
displayNow();
while(1)
{
switch (getKey())
{
case ESC:
return 0;
case RESTART:
return -1;
case LEFT:
manf_p.x = man_p.x-1; manff_p.x = man_p.x-2;
manf_p.y = manff_p.y = man_p.y;
deltax = -1; deltay = 0;
break;
case RIGHT:
manf_p.x = man_p.x+1; manff_p.x = man_p.x+2;
manf_p.y = manff_p.y = man_p.y;
deltax = 1; deltay = 0;
break;
case UP:
manf_p.x = manff_p.x = man_p.x;
manf_p.y = man_p.y-1; manff_p.y = man_p.y-2;
deltax = 0; deltay = -1;
break;
case DOWN:
manf_p.x = manff_p.x = man_p.x;
manf_p.y = man_p.y+1; manff_p.y = man_p.y+2;
deltax = 0; deltay = 1;
break;
default:;
}
switch(getMP(manf_p))
{
case N_AISLE:
case N_AIM:
//人前方走廊或未放箱子的目标
moveMan(deltax, deltay);
displayNow();
break;
case N_BOX:
case N_BOX_OK:
//人前方为箱子或放到目标位置的箱子
if(getMP(manff_p) == N_AISLE || getMP(manff_p) == N_AIM)
{//箱子前方为走廊或未放箱子的目标--移动
moveBox(manf_p, manff_p);
moveMan(deltax, deltay);
displayNow();
if(isWin()) return 1;
}
break;
default:
//墙壁
printf("\a");
break;
}
}
return 0;
}
/***
根据玩家选择的游戏级别speed
指定一个游戏初始化文件spXX.dat
打开文件
if(打开文件失败)
{
退出程序
}else
{
if(读文件失败)
{
退出程序
}
关闭文件
}
for()
{
for()
{
确定人和墙壁的位置
}
}
程序返回
****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -