我的第一篇博文:C++最初的路-经典的小游戏走迷宫
写在开始:这个博客建于大二下学期。2年多的学习,从网上借鉴的大牛经验,代码,指导数不胜数,而其中大部分来自别人的博客,于是期待有一天也能把自己在学习过程中的一些经验拿出来与大家分享。后来大概觉得离大牛太远,就没敢再奢望指导别人,反而希望有大牛能偶尔看到,给予指导,也算不负初衷。
其实我凝望了C++已经快2年了,也没见它回望于我。标题叫新手村的复活点,大概是因为在开始的地方就一直被小问题打倒吧。
下面是最近两天写的一个小程序,算是对C++的一个小小的复习,这个小游戏已经拖了半年,已经忘记了当时写它的初衷。
以下是main.cpp
#include <iostream>
#include <windows.h>
#include <string>
#include "mazeMap.h"
#include "mazePerson.h" using namespace std; int main()
{
int Map[][] = {//要求地图入口在最下面,出口在最右面
{,,,,,,,},//map[0][0:7]
{,,,,,,,},//map[1][0:7]
{,,,,,,,},//map[2][0:7]
{,,,,,,,},//map[3][0:7]
{,,,,,,,},//map[4][0:7]
{,,,,,,,},//map[5][0:7]
{,,,,,,,},//map[6][0:7]
{,,,,,,,} //map[7][0:7]
};
mazeMap map1;
map1.setmazeMap((int **)Map,,);//传入地图数组参数
map1.setmazeWall('*');//设置墙的样式
mazePerson People(map1);
Faceto faceto;
faceto = _up;
People.setPersonSpeed(MID);//设置移动速度
People.setPersonShap('T');//设置人物样式
People.start(faceto);
return ;
}
以下是mazeMap.h
#ifndef MAZEMAP_H_INCLUDED
#define MAZEMAP_H_INCLUDED
#include <string>
const bool Wall(); class mazeMap{
public:
mazeMap();
mazeMap(const mazeMap &_mazeMap);
~mazeMap();
void setmazeMap(int **_mazeArr,int _col,int _row);
void setmazeWall(char _wall);
void drawMap();
void detTerpoint(int *originPoint,int *destination);
int getCol();
int getROw();
int **getArradd();
char m_chWall;
char m_chRoad = ' ';
private: int m_iCol;
int m_iRow;
int m_iOriginpoint[];
int m_iTerpoint[];
int **m_mazeArr;
}; #endif // MAZEMAP_H_INCLUDED
以下是mazeMap.cpp
#include <iostream>
#include <string>
#include "mazeMap.h"
using namespace std; mazeMap::mazeMap()
{
m_chWall = ' ';
m_chRoad = ' ';
m_iCol = ;
m_iRow = ;
m_iOriginpoint[] = ;
m_iOriginpoint[] = ;
m_iTerpoint[] = ;
m_iTerpoint[] = ;
m_mazeArr = NULL;
} mazeMap::mazeMap(const mazeMap &_mazeMap)
{
m_iCol = _mazeMap.m_iCol;
m_iRow = _mazeMap.m_iRow;
m_chRoad = _mazeMap.m_chRoad;
m_chWall = _mazeMap.m_chWall;
m_mazeArr = _mazeMap.m_mazeArr;
m_iOriginpoint[] = _mazeMap.m_iOriginpoint[];
m_iOriginpoint[] = _mazeMap.m_iOriginpoint[];
m_iTerpoint[] = _mazeMap.m_iTerpoint[];
m_iTerpoint[] = _mazeMap.m_iTerpoint[];
} mazeMap::~mazeMap()
{
for (int i = ;i < m_iRow;i++)
{
delete []m_mazeArr[i];
m_mazeArr[i] = NULL;
}
}
void mazeMap::setmazeMap(int **mazeArr,int _col,int _row)
{
m_mazeArr = mazeArr;
m_iCol = _col;
m_iRow = _row;
} void mazeMap::setmazeWall(char _wall)
{
m_chWall = _wall;
} void mazeMap::detTerpoint(int *originPoint,int *destination)//迷宫地图入口在最下面,出口在最上面
{
int i = ;
int j = m_iRow-;
for (i = ;i<m_iCol;i++)//出口在最右边一列
{
if((*(m_mazeArr + m_iCol*i +j))!=Wall)
{
m_iTerpoint[] = i;
m_iTerpoint[] = j;
}
}
i = m_iCol-;
for (j = ;j<m_iRow;j++)
{
if((*(m_mazeArr + m_iCol*i +j))!=Wall)
{
m_iOriginpoint[] = i;
m_iOriginpoint[] = j;
}
}
destination[] = m_iTerpoint[];
destination[] = m_iTerpoint[];
originPoint[] = m_iOriginpoint[];
originPoint[] = m_iOriginpoint[]; } void mazeMap::drawMap()
{
for (int i = ;i < m_iCol;i++)
{
for (int j = ;j < m_iRow;j++)
{
if (*(m_mazeArr + m_iCol*i + j) == Wall)
{
cout<<m_chWall;
}
else
{
cout<<m_chRoad;
}
}
cout<<endl;
}
} int mazeMap::getCol()
{
return m_iCol;
} int mazeMap::getROw()
{
return m_iRow;
} int **mazeMap::getArradd()
{
return m_mazeArr;
}
以下是mazePerson.h
#ifndef MAZEPERSON_H_INCLUDED
#define MAZEPERSON_H_INCLUDED
#include <string>
#include <iostream>
#include <windows.h>
#include "mazeMap.h"
using namespace std;
enum Faceto{_up,_down,_left,_right};
enum Speed{LOW,MID,FAST};
class mazePerson{
public:
mazePerson();
mazePerson(mazeMap _mazeMap);
~mazePerson();
void setPersonPosition(int _row,int _col);
void setPersonSpeed(Speed _speed);
void setPersonShap(char _Person);
Faceto turn(Faceto _faceto);
void start(Faceto _faceto);
void gotoyx(int x,int y);
mazeMap m_mazeMap;
private:
char m_chPerson;
Faceto m_Faceto;
int m_iNowLocal[];
int m_iPreviousLocal[];
int destination[] = {,};
int originPoint[] = {,};
Speed m_Speed;
}; #endif // MAZEPERSON_H_INCLUDED
以下是mazePerson.cpp
#include <iostream>
#include <string>
#include <windows.h>
#include "mazePerson.h"
using namespace std; mazePerson::mazePerson()
{
m_chPerson = 'Y';
m_Faceto = _up;
m_Speed = LOW;
m_iNowLocal[] = ;//行
m_iNowLocal[] = ;//列
m_iPreviousLocal[] = ;
m_iPreviousLocal[] = ;
mazeMap m_mazeMap;
} mazePerson::mazePerson(mazeMap _mazeMap)
{
m_chPerson = 'Y';
m_Faceto = _up;
m_Speed = LOW;
m_iNowLocal[] = ;//coord X
m_iNowLocal[] = ;//coord Y
m_iPreviousLocal[] = ;
m_iPreviousLocal[] = ;
m_mazeMap = _mazeMap;
m_mazeMap.drawMap();
m_mazeMap.detTerpoint(originPoint,destination);
} mazePerson::~mazePerson()
{
// delete []m_iNowLocal;
// m_iNowLocal = NULL;
// delete []m_iPreviousLocal;
// m_iPreviousLocal = NULL;
} void mazePerson::setPersonPosition(int _row,int _col)
{
m_iNowLocal[] = _row;
m_iNowLocal[] = _col;
} void mazePerson::setPersonSpeed(Speed _speed)
{
m_Speed = _speed;
} void mazePerson::setPersonShap(char _Person)
{
m_chPerson = _Person;
} Faceto mazePerson::turn(Faceto _faceto)//基于右手算法,定义下一步往哪走
{
m_Faceto = _faceto;
if(m_Faceto==_up)
{
if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*m_iNowLocal[] + m_iNowLocal[]+))!=Wall)//先判断右边界
{
m_Faceto = _right;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*(m_iNowLocal[]-) + m_iNowLocal[]))!=Wall)//再判断上边界
{
m_Faceto = _up;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*m_iNowLocal[] + m_iNowLocal[]-))!=Wall)//再判断左边界
{
m_Faceto = _left;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*(m_iNowLocal[]+) + m_iNowLocal[]))!=Wall)//再判断下边界
{
m_Faceto = _left;
}
}
else if(m_Faceto==_right)
{
if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*(m_iNowLocal[]+) + m_iNowLocal[]))!=Wall)//先判断下边界
{
m_Faceto = _down;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*m_iNowLocal[] + m_iNowLocal[]+))!=Wall)//再判断右边界
{
m_Faceto = _right;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*(m_iNowLocal[]-) + m_iNowLocal[]))!=Wall)//再判断上边界
{
m_Faceto = _up;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*m_iNowLocal[] + m_iNowLocal[]-))!=Wall)//再判断左边界
{
m_Faceto = _left;
}
}
else if(m_Faceto==_down)
{
if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*m_iNowLocal[] + m_iNowLocal[]-))!=Wall)//先判断左边界
{
m_Faceto = _down;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*(m_iNowLocal[]+) + m_iNowLocal[]))!=Wall)//再判断下边界
{
m_Faceto = _right;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*m_iNowLocal[] + m_iNowLocal[]+))!=Wall)//再判断右边界
{
m_Faceto = _up;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*(m_iNowLocal[]-) + m_iNowLocal[]))!=Wall)//再判断上边界
{
m_Faceto = _up;
}
}
else if(m_Faceto==_left)
{
if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*(m_iNowLocal[]-) + m_iNowLocal[]))!=Wall)//先判断上边界
{
m_Faceto = _up;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*m_iNowLocal[] + m_iNowLocal[]-))!=Wall)//再判断左边界
{
m_Faceto = _left;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*(m_iNowLocal[]+) + m_iNowLocal[]))!=Wall)//再判断下边界
{
m_Faceto = _down;
}
else if((*(m_mazeMap.getArradd() + m_mazeMap.getCol()*m_iNowLocal[] + m_iNowLocal[]+))!=Wall)//再判断右边界
{
m_Faceto = _up;
}
} return m_Faceto;
} void mazePerson::start(Faceto _faceto)
{
char tempchPer = 'Y';
tempchPer = m_chPerson;
m_iNowLocal[]=originPoint[];
m_iNowLocal[]=originPoint[];
int speed_num = ;
if(m_Speed == LOW)
{
speed_num = ;
}
else if(m_Speed == MID)
{
speed_num = ;
}
else if(m_Speed == FAST)
{
speed_num = 0.5;
}
m_Faceto = _faceto;
//画第一个点的位置
m_iPreviousLocal[] = m_iNowLocal[];
m_iPreviousLocal[] = m_iNowLocal[];
setPersonShap(' ');
gotoyx(m_iPreviousLocal[],m_iPreviousLocal[]);
_sleep(0.05*);//delay 0.1s
setPersonShap(tempchPer);
gotoyx(m_iNowLocal[],m_iNowLocal[]);
_sleep(speed_num*);//delay 1s
while()
{
m_iPreviousLocal[] = m_iNowLocal[];
m_iPreviousLocal[] = m_iNowLocal[];
switch(m_Faceto)
{
case ://_up
{
m_iNowLocal[]=m_iNowLocal[]-;
break;
}
case ://_down
{
m_iNowLocal[]=m_iNowLocal[]+;
break;
}
case ://_left
{
m_iNowLocal[]=m_iNowLocal[]-;
break;
}
case ://_right
{
m_iNowLocal[]=m_iNowLocal[]+;
break;
}
} if((m_iNowLocal[]==destination[])&&(m_iNowLocal[]==destination[]))
{
setPersonShap(' ');
gotoyx(m_iPreviousLocal[],m_iPreviousLocal[]);
_sleep(0.1*);//delay 0.1s
setPersonShap(tempchPer);
gotoyx(m_iNowLocal[],m_iNowLocal[]);
_sleep(speed_num*);//delay 1s
break;
}
m_Faceto = turn(m_Faceto);
setPersonShap(' ');
gotoyx(m_iPreviousLocal[],m_iPreviousLocal[]);
_sleep(0.1*);//delay 1s
setPersonShap(tempchPer);
gotoyx(m_iNowLocal[],m_iNowLocal[]);
_sleep(speed_num*);//delay 1s
}
setPersonShap(' ');
gotoyx(,m_mazeMap.getROw());
cout<<endl;
cout<<"Finally reach terminal point!"<<endl;
} void mazePerson::gotoyx(int _row,int _col)
{
COORD cd;
cd.X = _row;
cd.Y = _col;
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(handle,cd);
cout<<m_chPerson;
}
代码经过验证,运行截图如下


我的第一篇博文:C++最初的路-经典的小游戏走迷宫的更多相关文章
- 程序员小张的第一篇博文 --记Markdown的使用学习
1.前言 为了即将到来的面试做准备,以及记录一下平日里自己的学习过程和生活日常,我开始进驻博客园啦!这就是我的第一篇博客(有点小激动)~ 作为一只新手,首先记录一下今晚的编写博文的学习过程吧~ 2.使 ...
- 第一篇博文:PHP函数原型中的可选参数写法为什么这么写?
第一篇,算是开始吧.简单写点儿东西. 刚开始学PHP,在看PHP Manual时遇到一个问题:含可选参数的函数原型中,可选参数的写法看不懂. 例如explode函数 array explode ( s ...
- .Net小白的第一篇博文
说起来也比较惭愧,5个月之前,我早已创建了博客园账号,那时候的我雄心壮志,给自己定下了 很多目标.现在回想起来,除了体重的增长,头发的稀疏,似乎这段时间的消逝并没有带给我什么见识上的成长.哈哈,想必大 ...
- 第一篇博文,整理一下关于Mac下安装本地LNMP环境的一些坑
安装的主要步骤是按照以下这篇文章进行的http://blog.csdn.net/w670328683/article/details/50628629,但是依然遇到了一些大大小小的坑(一个环境搞了一天 ...
- 我的第一篇博文,Python+scrapy框架安装。
自己用Python脚本写爬虫有一段时日了,也抓了不少网页,有的网页信息两多,一个脚本用exe跑了两个多月,数据还在进行中.但是总觉得这样抓效率有点低,问题也是多多的,很早就知道了这个框架好用,今天终于 ...
- 终于成为博客员的一员了,这是我的第一篇博文,写一个关于ul li内容宽度的问题和解决方案
第一次写博文,写一个刚才遇到的问题吧. 关于ul li文字长度不固定,一行显示多列.当指定宽度时,文字长度超过指定的li宽度时解决方案: 如下代码 <h4>发送对象(共10个会员)< ...
- 我的第一篇博文,开启我的Java程序人生之旅!
原文:https://blog.csdn.net/CodeYearn/article/details/89190342 自我介绍: 姓名:蔡余 性别:男 年龄:21 职业:Java开发工程师 家乡:湖 ...
- Dsyy的第一篇博文~
2017-08-07 周一 晴热热热热热 咳咳,很多人看到dsyy第一反应是什么意思?当然是大神媛媛!显然不是些(diao)(si)yy.(da)(si)yy...的别义,咋有点此地无银三百两的感 ...
- struts2 在 Action 或 Interceptor 中获取 web.xml 中配置的 <context-param> 参数 (这是我的第一篇博文,哈哈。)
最近为了改一个问题,想加一个控制开关,就在web.xml 中配置了一个 <context-param> 参数,并在 Action 或 Interceptor 中获取参数值. 1.在 web ...
随机推荐
- DDD理论学习系列(3)-- 限界上下文
1. 引言 限界上下文可以拆分为两个词,限界和上下文. 限界:是指一个界限,具体的某一个范围. 上下文:个人理解就是语境. 比如我们常说的段子: "我想静静." 这个句子一般是想表 ...
- 《高性能javascript》 --- in case of odd number of items(奇怪的条目的数量)
不知道是做着故意放的还是什么原因.总之运行后就会出现问题(奇怪的条目的数量) function merge(left, right){ var result = []; while (left.len ...
- Android studio 3.0 引起的 outputFile sync failed:not vaild
我们大多使用 android studio 改变生成安装包命名会用以下方式: applicationVariants.all { variant -> variant.outputs.each ...
- 面试(1)-java-se-字符串
http://blog.csdn.net/zhangerqing/article/details/8093919 hashCode和identityHashCode的区别 I. hashCode()方 ...
- 每R一点:各种画地图,全是知识点,90%人不知道!(转)
R语言绘制地图,在数据分析中经常能够用到,并且会达到非常好的展示效果,本节以例子形式,介绍如何使用R语言工具,画出理想的地图. 本节例子在 R version 2.15.3版本下运行顺畅,其他版本待定 ...
- AVL树(平衡二叉查找树)
首先要说AVL树,我们就必须先说二叉查找树,先介绍二叉查找树的一些特性,然后我们再来说平衡树的一些特性,结合这些特性,然后来介绍AVL树. 一.二叉查找树 1.二叉树查找树的相关特征定义 二叉树查找树 ...
- 【小练习03】CSS-表格(table)--天气预报
表格基础知识链接:http://blog.csdn.net/baidu_37107022/article/details/71713281 练习要求实现如下效果图: 代码演示 <!DOCTYPE ...
- 抽象工厂(AbstractFactory)模式-创建型模式
1.new 的问题 常见的对象创建方法: //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对具体实例的变化 怎么理解上面这句话呢? 可以这样理解:我 ...
- [原创]使用logcat快速抓取android崩溃日志
在android APP测试过程中会发生不少的crash,目前抓取日志的主流方法是通过eclipse或者eclipse的ddms组件进行捕抓,这两种方法有个缺点是启动时非常耗时.本文通过adb程序与b ...
- PHP·笔记(函数总结)
PHP 指 PHP:超文本预处理器(译者注:PHP: Hypertext Preprocessor,递归命名) PHP 是一种服务器端的脚本语言,类似 ASP PHP 脚本在服务器上执行 PHP 支持 ...