您的位置:首页 > 编程语言 > C语言/C++

使用C++编写简单的迷宫游戏

2018-02-28 14:17 801 查看
迷宫游戏就是玩家在地图中移动,移动至终点则游戏结束。
自己用文本文档手打了个小地图,0表示空白,1表示墙,文件名随意,我改成了map.MapData。然后程序里定义一个全局变量char Map[MapLenX][MapLenY];(长宽自定义)行为X,列为Y。定义char型常量RoadSymbol = '0', WallSymbol = '1', PlayerSymbol = '+'。
本游戏为面向对象编写的,所以就要设计一个类。数据需要一个坐标和一个bool型储存是否到达终点。所以自定义了个结构体储存坐标struct point
{
int x, y;
};还需要构造函数,析构函数,然后写个移动的函数PlayerMove(),再写个判断是否到达终点的函数CheckIfWin()。每走完一步就要刷新屏幕,所以还需要写个函数Refresh(),然后PlayerActor类就完成了。class PlayerActor
{
public:
point m_Location;
bool m_IfWin;
PlayerActor();
~PlayerActor();
void PlayerMove(int _Direc);
void Refresh(void);
void CheckIfWin(void);
};构造函数析构函数先不着急, 先定义一下PlayerMove()。思路是先判断是否可移动。若能,当前位置的地图标记设为RoadSymbol, 移动即更新坐标,新坐标位置在地图上标记为PlayerSymbol, 刷新画面,判断输赢。Refresh()思路为先用system("cls")清屏,然后逐行打印。若地图上某点为RoadSymbol输出空格, WallSymbol输出'*', PlayerSymbol输出'+'。
     接下来定义玩家起始位置和终点PlayerStart和PlayerEnd并初始化。main函数大体流程如下:读入地图,实例化PlayerActor,当!m_IfWin时接收键盘按键来移动,当m_IfWIn时弹出提示框并结束。所以还需要一个全局函数PlayerControl来接收按键并调用PlayerMove()。
        至此,构造函数的流程也明确了。初始化m_IfWin和m_Location,在地图上表明玩家位置和重点位置,刷新屏幕,没了。然后再把能定义为常量的都定位常量,修改一下细节,就能得到一个简陋的走迷宫游戏了。
#include<iostream>
#include<cstdio>
#include"conio.h"
#include"windows.h"
/////////////////////////
struct point
{
int x, y;
};

///////////////////////

const point PlayerStart = {10, 2};
const point PlayerEnd = {2, 10};

const int MapLenX = 11, MapLenY = 10;
const char EndSymbol = '#', PlayerSymbol = '+', WallSymbol = '1', RoadSymbol = '0';
char Map[MapLenX][MapLenY];

const int MoveX[4] = {-1, 1, 0, 0}, MoveY[4] = {0, 0, -1, 1}; //// UP, DOWN, LEFT, RIGHT
const int _UP = 0, _DOWN = 1, _LEFT = 2, _RIGHT = 3;

///////// CLASS ///////////////

class PlayerActor
{
public:
point m_Location;
bool m_IfWin;
PlayerActor();
~PlayerActor();
void PlayerMove(int _Direc);
void Refresh(void);
void CheckIfWin(void);
};

/////////// MEMBER FUNCTIONS /////////////

PlayerActor::PlayerActor()
{
m_IfWin = false;
this-> m_Location.x = PlayerStart.x;
this-> m_Location.y = PlayerStart.y;
Map[this-> m_Location.x][this-> m_Location.y] = PlayerSymbol;
Map[PlayerEnd.x][PlayerEnd.y] = EndSymbol;
PlayerActor::Refresh();
}

PlayerActor::~PlayerActor()
{

}

void PlayerActor::PlayerMove(int _Direct)
{
if ( Map[this-> m_Location.x+MoveX[_Direct]][this-> m_Location.y+MoveY[_Direct]] == RoadSymbol
|| Map[this-> m_Location.x+MoveX[_Direct]][this-> m_Location.y+MoveY[_Direct]] == EndSymbol )/////// JUDGE IF CAN MOVE
{
Map[this-> m_Location.x][this-> m_Location.y] = RoadSymbol;
this-> m_Location.x += MoveX[_Direct];
this-> m_Location.y += MoveY[_Direct];
Map[this-> m_Location.x][this-> m_Location.y] = PlayerSymbol;
PlayerActor::Refresh();
PlayerActor::CheckIfWin();
}
}

void PlayerActor::Refresh(void)
{
system("cls"); //////CLEAR SCREEN
for (int i=1; i<=MapLenX; i++)
{
for (int j=1; j<=MapLenY; j++)
{
if (Map[i][j] == RoadSymbol)
printf(" ");
else if (Map[i][j] == WallSymbol)
printf("* ");
else if (Map[i][j] == '+')
printf("%c ", PlayerSymbol);
else if (Map[i][j] == EndSymbol)
printf("%c ",EndSymbol);
}
printf("\n");
}
}

void PlayerActor::CheckIfWin(void)
{
if (this-> m_Location.x == PlayerEnd.x && this-> m_Location.y == PlayerEnd.y)
m_IfWin = true;
}

///////////// GLOBAL FUNCTION ////////////////

void PlayerControl(PlayerActor* Player, int _KEY)
{
switch (_KEY)
{
case 119 : Player->PlayerMove(_UP); //// w 119
break;
case 115 : Player->PlayerMove(_DOWN); ///////s 115
break;
case 97 : Player->PlayerMove(_LEFT); //// a 97
break;
case 100 : Player->PlayerMove(_RIGHT); //// d 100
break;
default:
break;
}
}

//////// MAIN FUNCTION ///////////

int main()
{
///////// READ MAP /////////////
freopen("map.MapData", "r", stdin);
for (int i=1; i<=MapLenX; i++)
{
for (int j=1; j<=MapLenY; j++)
{
std::cin >> Map[i][j];
}
}
//// CREATE PLAYERACTOR ////
PlayerActor* Player = new PlayerActor;
while (!Player->m_IfWin)
{
PlayerControl(Player, _getch());
}
system("cls");
MessageBox(NULL, "You Win!", "Congratulations!", MB_OK);
delete Player;
return 0;
}地图map.MapData:1111111111
1000000001
1011111111
1010000001
1011111101
1000000101
1111110101
1000010101
1011110101
1000000001
1111111111
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: