通过C++设计了一个迷宫游戏,涉及到链表,C++基本操作,终端字符处理,深度优先遍历算法。下面开始吧!
#define MAX_X 20
#define MAX_Y 30
bool flag = false;
bool slow = false;
bool autogame = true;
int maze[MAX_X][MAX_Y]; //迷宫
2.路线栈
路线栈设计来记录移动路径。路径栈是一个类,它可以记录地图的坐标和移动轨迹。
class stack_of_maze{
private:
//code
public:
//code
};
在成员变量中定义一个数据结构来包括地图坐标和移动信息。
//记录迷宫坐标
struct node
{
int x;
int y;
char direction; //上一步路径(如何来的)
node* next;
};
node* head;
构造和析构
stack_of_maze(){
//初始化
head = NULL;
}
~stack_of_maze(){
node* p = head;
//逐个删除
while(head!=NULL){
head = head->next;
delete p;
p = head;
}
}
压栈
设置一个新节点用于插入,首先将信息记录到新节点中,再把新节点插入到栈顶。这个函数的功能用于添加新的移动信息。
void push(int xx,int yy,char ddirection){
//定义一个新节点
node* new_node = new node;
//赋值
if(new_node!=NULL){
new_node->x = xx;
new_node->y = yy;
new_node->direction = ddirection;
new_node->next = NULL;
//判断栈是否为空,如果为空则直接把新节点赋值给栈,否则添加到栈顶
if(head==NULL)
head = new_node;
else{
new_node->next = head;
head = new_node;
}
}
else
cout<<"内存分配失败"<
出栈
推出栈顶元素,用于判断路径是否正确,如果下一个节点为空则说明路径错误,前方不能通行。
node* pop(int& xx,int& yy){
if(head!=NULL){
node* p = head;
head = head->next;
xx = p->x;
yy = p->y;
delete p;
}
return head;
}
打印
打印路径信息。
void print(){
if(head!=NULL){
node* p = head;
while(p!=NULL){
cout<<" "<x<<" "<y<<" "<direction<next;
}
}
else
cout<<"栈为空,打印失败"<
3.创建地图
首先把地图全设置为1,即死路,然后除了出入口和最外一层墙壁保持不变,其他位置采用随机函数来初始化通路为0。纵坐标为x,横坐标为y.
void createMaze(){
int maxway = MAX_X * MAX_Y; //最大通路
int x,y;
//先填充迷宫
for(x=0;x
4. 打印地图
根据标记列表对应符号来打印地图。
void printMaze(){
int x,y;
//清屏,如果是windows环境使用system("cls")
system("clear");
//打印地图
for(x=0;x
4.1检查地图
因为地图的创建是随机的,所以为了能正确的进行游戏,检查创建的地图是否正确,这里传递定义一条备用路径来检验,如果通路则flag标记为true,游戏使用这个地图。
void check(stack_of_maze &s){
//备份地图
int temp[MAX_X][MAX_Y];
for(int x=0;x
4.2移动
移动的规则是已知的,在这里主要进行命令识别,得到正确的命令后,首先判断下一个地址是否通路,如果是则要清除当前信息再移动到下一步。
void move(){
int x=1,y=1; //出发点
//一直游戏,直到走出
while(1){
//判断输入的命令
switch(getch()){
case 's':
if(maze[x+1][y]==0){
//清空当前位置信息
maze[x][y] = 0;
x = x + 1;
//当前位置
maze[x][y] = 7;
printMaze();
if((x==MAX_X-1)&&(y==MAX_Y-2)){
cout<<"\n\n 成功走出"<
4.3自动游戏
游戏会根据深度优先算法自动搜索路径,其中游戏会根据slow标志选择游戏速度。
void autoMove(stack_of_maze &s){
int x=1,y=1; //出发点
while(1){
maze[x][y] = 2;
//向下
if(maze[x+1][y]==0){
s.push(x,y,'D');
maze[x][y] = 3; //在当前位置做一个向下的标志
x = x + 1;
maze[x][y] = 7; //当前位置
if(slow)
printMaze();
if((x==MAX_X-1)&&(y==MAX_Y-2)){
s.push(x,y,'*');
cout<<"\n\n 成功走出"<
4.4 开始游戏
首先会调用函数创建地图,然后根据标志位来进行游戏。因为会回调menu()函数,所以前面需要先声明一下。
void menu();
void gamestart(){
//初始化地图
flag = false;
while(!flag){
stack_of_maze stack;
//创建地图
createMaze();
//检查地图是否创建成功
check(stack);
//模仿进度条
system("clear");
cout<<"\t* loading. *"<
4.5 菜单
定义一个简单的菜单来选择游戏模式。
void menu(){
system("clear");
int num;
cout<<"\t****************************************"<
4.6 主函数
int main(int argc,char** argv){
menu();
return 0;
}
5.界面截图
maze 地图 autogame model menu