Java如何实现迷宫游戏
发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章主要讲解了"Java如何实现迷宫游戏",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java如何实现迷宫游戏"吧!题目 通过让游戏角色自动寻找迷
千家信息网最后更新 2024年11月23日Java如何实现迷宫游戏
这篇文章主要讲解了"Java如何实现迷宫游戏",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Java如何实现迷宫游戏"吧!
题目 通过让游戏角色自动寻找迷宫出口,走出迷宫,来练习C++面向对象之封装的基础知识。迷宫图如下所示,其中X表示墙。
1、程序分析
走出去的原理:遵循右手规则或左手规则。右手扶墙走,就会走出迷宫,反之,亦然。
step1 创建迷宫类,打印出迷宫地图。
step2 创建走迷宫的人的类。
2、程序实现
MazeMap.h
#ifndef MAZEMAP_H#define MAZEMAP_H#include#include //COORD//在二维数组里,1代表墙,0代表路#define WALL 1#define ROAD 0class MazeMap{ public: MazeMap(char wall = 'X'); ~MazeMap();/*设置迷宫地图*/void setMazeMap(int *mazemap, int row, int col);void pintMazeMap();int** getMap(); //返回地图二维数组指针const char m_cRoad; //常数据成员:路void setExitPosition(int x,int y); //设置迷宫出口 COORD m_COORDExitPostion; //迷宫的出口private:const char m_cWall; //常数据成员:墙int** m_pMap; //指向迷宫地图二维数组的二级指针int m_iMapRow; //二维数组的行数int m_iMapCol; //二维数组的列数};#endif
MazeMap.cpp
#include "MazeMap.h"/***************************函数名称:MazeMap()*函数功能:构造函数,初始化参数*函数参数:wall 墙的表示符号*修改时间:2016.7.18***************************/MazeMap::MazeMap(char wall):m_cWall(wall),m_cRoad(' '){ m_pMap = NULL;}/**************************函数名称:~MazeMap()*函数功能:析构函数,释放动态申请的内存空间*修改时间:2016.7.18**************************/MazeMap::~MazeMap(){if(m_pMap) {for(int i = 0; i < m_iMapRow; i++) { delete m_pMap[i]; m_pMap[i] = NULL; } delete m_pMap; }}/*********************************函数名称:setMazeMap()*函数功能:设置迷宫地图,传递参数*函数参数:*mazemap 存储地图数据的二维数组的指针* row 二维数组的行数* col 二维数组的列数*修改时间:2016.7.18**********************************/void MazeMap::setMazeMap(int *mazemap, int row, int col){ m_iMapRow = row; m_iMapCol = col;//为存储迷宫地图的二维数组动态分配内存空间m_pMap = new int*[m_iMapRow]; //分配m_iMapRow个存储int类型指针的内存空间for(int i = 0; i < m_iMapRow; i++) m_pMap[i] = new int[m_iMapCol]; //分配m_iMapCol个存储int类型的内存空间//将二维数组迷宫地图的数据拷贝给二级指针for(int i = 0; i < m_iMapRow; i++) {for(int j = 0; j < m_iMapCol; j++) { m_pMap[i][j] = *mazemap; mazemap++; } }}/*************************************************函数名称:pintMazeMap()*函数功能:打印迷宫地图*修改时间:2016.7.18*************************************************/void MazeMap::pintMazeMap(){ system("cls");for(int i = 0; i < m_iMapRow; i++) {for(int j = 0; j < m_iMapCol; j++) {if(m_pMap[i][j]) //数组元素为1,则打印代表墙的字符std::cout << m_cWall;else //否则,打印代表路的字符std::cout << m_cRoad; } std::cout << std::endl; }}/*************************************************函数名称:getMap()*函数功能:返回地图二维数组指针*返 回 值:二级指针*修改时间:2016.7.18*************************************************/int** MazeMap::getMap(){return m_pMap;}/*************************************************函数名称:setExitPosition()*函数功能:设置迷宫的出口*函数参数:x 迷宫出口位置所在行数 y 迷宫出口位置所在列数*修改时间:2016.7.18*************************************************/void MazeMap::setExitPosition(int x, int y){ m_COORDExitPostion.X = x; m_COORDExitPostion.Y = y;}
MazeMan.h
#ifndef MAZEMAN_H#define MAZEMAN_H#include#include "MazeMap.h"enum direction{U,D,L,R};class MazeMan{ public: MazeMan(char man = 'T',char manface = R);void setPosition(int x, int y); //设置游戏角色位置void setMap(MazeMap *map); //设置地图对象bool walkUp(); //向上走bool walkDown(); //向下走bool walkLeft(); //向左走bool walkRight(); //向右走void moveForward(direction direct); //根据传入的方向让游戏角色前进一步 void start(); //游戏开始函数private:char m_cMan; //代表游戏角色的字符char m_cManFace; //游戏角色的朝向int m_iSteps; //记录游戏角色已经走的步数 COORD m_COORDManCurrentPosition; //游戏角色的当前位置MazeMap *m_pMap; //地图对象};#endif
MazeMan.cpp
#include "MazeMan.h"/**************************函数名称:MazeMan()*函数功能:构造函数,初始化数据成员*函数参数:man 表示游戏角色的字符 manface 游戏角色的朝向*修改时间:2016.7.18**************************/MazeMan::MazeMan(char man,char manface){ m_cMan = man; m_cManFace = manface; m_iSteps = 0;}/********************************函数名称:setMap()*函数功能:设置地图对象中的地图*函数参数:*map 地图对象的指针*修改时间:2016.7.18********************************/void MazeMan::setMap(MazeMap *map){ m_pMap = map;}/*******************************函数名称:setPosition()*函数功能:设置游戏角色位置*函数参数:x 角色所在位置的横坐标 y 角色所在位置的纵坐标*修改时间:2016.7.18********************************/void MazeMan::setPosition(int x, int y){ unsigned long numWritten;//获得命令行窗口的窗口句柄HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); m_COORDManCurrentPosition.X = x; m_COORDManCurrentPosition.Y = y;//在指定坐标位置填充指定的字符,这里我们在游戏角色的当前位置填充代表游戏角色的字符,使游戏角色采出现FillConsoleOutputCharacter(handle,m_cMan,1,m_COORDManCurrentPosition,&numWritten);//参数说明:控制台屏幕缓冲区句柄,要向控制台缓冲区写入的字符;应写入的字符单元数;//一个COORD结构,它指定字符的字符是要写的第一个单元格的坐标;//指向接收的实际写入控制台屏幕缓冲区的字符数的变量的指针。}/*************************************************函数名称:moveForward()*函数功能:根据传入的方向让游戏角色前进一步*函数参数:direct 移动的方向*修改时间:2016.7.18*************************************************/void MazeMan::moveForward(direction direct){ unsigned long numWritten;//获取命令行窗口的窗口句柄HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//在指定坐标位置填充指定的字符,这里我们在游戏角色的当前位置填充空格,使游戏角色消失FillConsoleOutputCharacter(handle,m_pMap->m_cRoad,1,m_COORDManCurrentPosition,&numWritten);switch(direct) {case U: m_COORDManCurrentPosition.Y -= 1;break;case D: m_COORDManCurrentPosition.Y += 1;break;case L: m_COORDManCurrentPosition.X -= 1;break;case R: m_COORDManCurrentPosition.X += 1;break;default:break; }//游戏角色坐标更新,在新的坐标FillConsoleOutputCharacter(handle,m_cMan,1,m_COORDManCurrentPosition,&numWritten);//移动完成后跟新游戏角色的朝向m_cManFace = direct;}/*************************************************函数名称:walkUp()*函数功能:向上走一步,若成功,则返回ture;若失败,则返回false*修改时间:2016.7.18*************************************************/bool MazeMan::walkUp(){if(m_pMap->getMap()[m_COORDManCurrentPosition.Y - 1][m_COORDManCurrentPosition.X])return false;else moveForward(U);return true;}/*************************************************函数名称:walkDown()*函数功能:向下走一步,若成功,则返回ture;若失败,则返回false*修改时间:2016.7.18*************************************************/bool MazeMan::walkDown(){if(m_pMap->getMap()[m_COORDManCurrentPosition.Y + 1][m_COORDManCurrentPosition.X])return false;else moveForward(D);return true;}/*************************************************函数名称:walkLeft()*函数功能:向左走一步,若成功,则返回ture;若失败,则返回false*修改时间:2016.7.18*************************************************/bool MazeMan::walkLeft(){if(m_pMap->getMap()[m_COORDManCurrentPosition.Y][m_COORDManCurrentPosition.X - 1])return false;else moveForward(L);return true;}/*************************************************函数名称:walkRight()*函数功能:向右走一步,若成功,则返回ture;若失败,则返回false*修改时间:2016.7.18*************************************************/bool MazeMan::walkRight(){if(m_pMap->getMap()[m_COORDManCurrentPosition.Y][m_COORDManCurrentPosition.X + 1])return false;else moveForward(R);return true;}/*************************************************函数名称:start()*函数功能:游戏开始函数*修改时间:2016.7.18*************************************************/void MazeMan::start(){while(true) { m_pMap->pintMazeMap();switch(m_cManFace) {case U://游戏角色朝上时,先向右,再向上,再向左,最后向下(右手原则)walkRight() || walkUp() || walkLeft() || walkDown();break;case D: walkLeft() || walkDown() || walkRight() || walkUp();break;case L: walkUp() || walkLeft() || walkDown() || walkRight();break;case R: walkDown() || walkRight() || walkUp() || walkLeft();break;default:break; } m_iSteps++;if(m_COORDManCurrentPosition.X == m_pMap->m_COORDExitPostion.X && m_COORDManCurrentPosition.Y == m_pMap->m_COORDExitPostion.Y)break; std::cout << "已经走了" << m_iSteps - 1 << "步"; Sleep(500); }}
Main.cpp
#include "MazeMap.h"#include "MazeMan.h"#define MapRow 11 //迷宫地图的行数#define MapCol 11 //迷宫地图的列数int main(){//定义并初始化存储地图数据的二维数组int map[MapRow][MapCol] = { {WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL}, {WALL, ROAD, ROAD, ROAD, WALL, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD}, {WALL, ROAD, WALL, WALL, WALL, ROAD, WALL, WALL, WALL, ROAD, WALL}, {WALL, ROAD, ROAD, ROAD, WALL, ROAD, ROAD, ROAD, WALL, ROAD, WALL}, {WALL, ROAD, WALL, ROAD, WALL, ROAD, WALL, ROAD, WALL, WALL, WALL}, {WALL, ROAD, WALL, ROAD, ROAD, ROAD, WALL, ROAD, WALL, ROAD, WALL}, {WALL, ROAD, WALL, WALL, WALL, ROAD, WALL, WALL, WALL, ROAD, WALL}, {WALL, ROAD, WALL, ROAD, WALL, ROAD, ROAD, ROAD, WALL, ROAD, WALL}, {WALL, WALL, WALL, ROAD, WALL, WALL, WALL, ROAD, WALL, ROAD, WALL}, {ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, ROAD, WALL}, {WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL, WALL} };//从堆中实例化地图对象MazeMap *mm = new MazeMap(); mm->setMazeMap(&map[0][0],MapRow,MapCol); mm->setExitPosition(10,1); mm->pintMazeMap();//从堆中实例化游戏角色对象MazeMan *man = new MazeMan();//设置角色起始位置man->setPosition(0,9);//设置游戏要走的地图man->setMap(mm);//用new的方式从堆中实例化的对象,使用完毕之后需要手动释放内存man->start();delete mm; mm = NULL;delete man; man = NULL;std::cout << "闯关成功!" << std::endl; system("pause");}
3、运行结果
T代表人
感谢各位的阅读,以上就是"Java如何实现迷宫游戏"的内容了,经过本文的学习后,相信大家对Java如何实现迷宫游戏这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
函数
迷宫
角色
地图
游戏角色
功能
名称
时间
数组
位置
字符
二维
参数
指针
对象
代表
数据
出口
成功
内存
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
经济网络安全工作总结
金融软件开发外包公司
长春有名的网络技术参考价格
网络安全主持人稿结束语
第三产业国内生产总值历年数据库
数据库文档自动生成器
锐捷网管系统服务器
海康发布的网络安全白皮书
珠海软件开发类公司有哪些
软件开发工程师未来发展
庚顿数据库的安全配置
血吼服务器可以转服吗
小米笔记本能做软件开发么
嘉洲服务器
我的世界手机党可以玩的服务器
神武未能成功连接服务器
世界网络安全组织会议活动
四川成都网络技术学校
软件开发合同备案在什么网站
数据库中位图索引、
北京国家网络安全宣传片2020
中国武术名家数据库杨应槐
网络安全主题班会绘画
数据库参考文献英文2017
金融软件开发协议书
数据库IO数量
台湾代理服务器下载
数据库日志文件保存什么
k8s 数据库工具
广西猴赛雷互联网科技