C++实现推箱子游戏

一,项目简介

用两天闲余时间回顾了推箱子这款经典的小游戏,目前设置了5关,只能实现基本的人物移动。判断胜利条件,其他功能还未实现(例:撤回到上一步,自由选择关卡等),也顺便复习了C++的相关知识。

二, 代码区

Class Map(地图类)

Map.h:
#pragma once
#define N 10
#define M 10
//地图类
class Map
{
public:
	Map();
	~Map();
	void Init();

	void ReadMapFile(int map[M][N], int size,const char* filename );
	void WriteMapFile(int map[M][N], int size, const char* filename);
private:
	
};

Map.cpp:
#include "Map.h"
#include
#include
using namespace std;


Map::Map()
{
	
}
//地图初始化方法
void Map::Init()
{
	int Map[10][10] =
	{
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 0, 0, 4, 3, 0, 1, 1, 1, 1 },
		{ 1, 0, 4, 3, 4, 3, 0, 0, 1, 1 },
		{ 1, 7, 3, 4, 3, 4, 2, 0, 1, 1 },
		{ 1, 0, 4, 3, 4, 3, 0, 1, 1, 1 },
		{ 1, 0, 0, 4, 3, 0, 0, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
		{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
	};
	WriteMapFile(Map, 10, "map/map_05.txt");

}
//读取地图文件
void Map::ReadMapFile(int map[M][N], int size, const char* filename)
{
	FILE* pfile = nullptr;
	fopen_s(&pfile, filename, "rb");
	fread(map, 10 * size * 4, 1, pfile);
	fclose(pfile);
}
//写入地图文件
void Map::WriteMapFile(int map[M][N], int size, const char* filename)
{
	FILE* pfile = nullptr;
	fopen_s(&pfile, filename, "wb");
	fwrite(map, 10 * size * 4, 1, pfile);
	fclose(pfile);
}
Map::~Map()
{

}
Class Game (游戏类)

Game.h:
#define _GAEM_H__
#ifdef _GAEM_H__

#include 
using namespace std;
#include 
#include 
#pragma warning (disable:4996)
#define N 10
#define M 10

/***************************建立一个推箱子相关操作的类***********************/
/*--------------------------Game类编写-----------------------------------*/
/****************************************************************************/
class Game
{
public:
	int Move(int map[M][N], char ch);
	void Drop(int map[M][N],int c);
	int juide(int map[M][N]);
private:
	int push(int map[M][N], int offsetX,int offsetY);
	void Postion(int map[M][N]);
	int posX;
	int posY;
};
#endif /*_GAME_H__*/


Game.cpp:
#include "Game.h"

//按键控制人物移动
int Game::Move(int map[M][N], char ch)
{
	static int step = 0;
	int offsetx = 0;
	int offsety = 0;
	switch (ch)
	{
		//向上移动
	case 'w':case 'W':
		offsetx = -1;
		offsety = 0;
		if (push(map, offsetx, offsety) == 1)
			step++;
		break;
		//向下移动
	case 's':case 'S':
		offsetx = 1;
		offsety = 0;
		if (push(map, offsetx, offsety) == 1)
			step++;
		break;
		//向左移动
	case 'a':case 'A':
		offsetx = 0;
		offsety = -1;
		if (push(map, offsetx, offsety) == 1)
			step++;
		break;
		//向右移动
	case 'd':case 'D':
		offsetx = 0;
		offsety = 1;
		if (push(map, offsetx, offsety) == 1)
			step++;
		break;
	default:
		break;
	}
	return step;
}
//界面打印
void Game::Drop(int map[M][N], int c)
{
	cout <<"\t\t"<<"**********************第 "<
}
Main:
#include
#include
using namespace std;
#pragma warning (disable:4996)
#define M 10
#define N 10

//定义一个10*10地图,1表示墙,0表示空地,2表示人
//3表示箱子,4表示成功点
//1.人物可以站到成功点中,显示人
//2.箱子推入成功点后,可以推出来
//3.记录步数,显示在控制台上
//4.界面:提示(■代表墙....)/游戏开始界面
//5.最终提示全部推入,提示成功
//周围都是墙,中间都是空地
#include"Map.h"
#include"Game.h"
int main()
{
	Map _map;
	//_map.Init();
	int map[M][N];
	char filename[] = "map/map_0";
	int custom = 2;
	while (custom <= 5)
	{
		char buffer[80];
		sprintf(buffer, "%s%d", filename, custom);         //连接filename和custom,以字符串保存到buffer中
		strcat(buffer, ".txt");                            //字符串连接
		_map.ReadMapFile(map, N, buffer);
		Game game;
		int step = 0;
		while (game.juide(map))                           //游戏胜利,跳出循环
		{
			system("cls");
			game.Drop(map, custom);
			char ch = _getch();                           //按键输入
			step = game.Move(map, ch);
			system("cls");
		}
		custom++;                            //关卡+1
		cout << "你赢了!" << endl;
		cout << "共走:" << step << "步" << endl;;
		system("pause");
		
	}
	
	
	return 0;
}



三,实现效果

项目目录图片

C++实现推箱子游戏_第1张图片

地图文件图片

C++实现推箱子游戏_第2张图片
实现效果

C++实现推箱子游戏_第3张图片

你可能感兴趣的:(C/C++)