推箱子源代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include

#include

#include

#include

#include

using std::cout;

using std::endl;

#ifndef SOKOBAN_H_ //防止文件重复包含

#define SOKOBAN_H_

#include

using std::queue;

//每一步的数据类型

struct node

{

int bx, by; //箱子的坐标

int px, py; //人的坐标

};

//推箱子类

class Sokoban

{

private:

enum {L = 15, H = 7};

char GameMap[H][L]; //地图

int Pex, Pey; //人的位置

int Boxx, Boxy; //箱子的位置

int Succeed, Prove; //是否成功到目的地, 是否可玩性

int dx[4], dy[4]; //方向数组

protected:

char Empty;

char People;

char Box;

char Block;

char Target;

int dir; //记录按键方向

node s, e;

public:

Sokoban(); //构建函数

~Sokoban() {} //析构函数,即为inline

//地图初始化函数

void Initial();

//箱子路劲验证函数,参数为箱子坐标(bx,by),人坐标(px,py) void Box_Bfs(int bx, int by, int px, int py);

//人路劲验证函数,人所到的目的地(ex,ey)

bool People_Bfs(int ex, int ey);

//地图刷新函数

void Show();

//按键判断函数

void Button();

//箱子人移动函数

void Move();

//验证越界函数

bool Check(int x, int y);

};

#endif

 Sokoban::Sokoban() //构建函数即对变量初始化

{

dir = -1;

Succeed = Prove = 0;

memset(GameMap, '.', sizeof(GameMap));

Empty = '.';

People = 'P';

Box = '#';

Block = '*';

Target = 'T';

//方向依次为上右下左

dx[0] = -1; dx[1] = 0; dx[2] = 1; dx[3] = 0;

dy[0] = 0; dy[1] = 1; dy[2] = 0; dy[3] = -1;

//随机种子,使程序每次运行时所产生的随机数不同srand(time(0));

}

//地图初始化函数

void Sokoban::Initial()

{

int count = 0, x, y;

//对地图中随机产生25个阻碍物

while(count != 25)

{

x = rand()%H;

y = rand()%L;

if(GameMap[x][y] == Empty)

{

GameMap[x][y] = Block;

count++;

}

}

while(true) //随机产生人开始的位置

{

x = rand()%H;

y = rand()%L;

if(GameMap[x][y] == Empty)

{

GameMap[x][y] = People;

Pex = x;

Pey = y;

break;

}

}

while(true) //随机产生箱子开始的位置

{

x = rand()%H;

y = rand()%L;

//不让箱子在地图的边界处

if(GameMap[x][y] == Empty && x != 0 && y != 0

&& x != H-1 && y != L-1)

{

GameMap[x][y] = Box;

Boxx = x;

Boxy = y;

break;

}

}

while(true) //随机产生目标的位置

{

x = rand()%H;

y = rand()%L;

if(GameMap[x][y] == Empty)

{

GameMap[x][y] = Target;

break;

}

}

//对游戏地图检查是否可将箱子推到目的地,即判断游戏可玩性Sokoban::Box_Bfs(Boxx, Boxy, Pex, Pey);

//如游戏不可玩,即再随机产生地图

if(!Prove)

{

memset(GameMap, '.', sizeof(GameMap)); Sokoban::Initial();

}

else

Sokoban::Show();

相关文档
最新文档