01
前情提要
说明:
此小游戏使用c++。
"方块"指组成游戏地图的元素,目前的几种方块:空地、墙、门 、水、树、触发器;
“玩家”指可以通过键盘操控位置的方块;
前面的内容:编程脑洞:游戏地图显示、编程小游戏(二)更复杂的地图、编程小游戏(三)简单交互方块
02
失败记录
首先,有两个和玩家有关的全局变量row和col,用于表示玩家的坐标,可以加入玩家类中。创建一个玩家对象p1然后用查找替换把row改成p1.row,col改成p1.col(后来发现这俩是私有成员,于是又写了getRow()和getCol(),再把需要改变坐标的移动玩家函数放进玩家类当中)
默认的坐标是(0,0),但是如果这个坐标无法通行(卡在墙里)怎么办?那就在初始化的时候判断,如果卡墙就换坐标,直到可以通行。
class C_Player
{
int row,col;
public:
C_Player(int r=0,int c=0)
{
//这里判断是否此坐标有墙
//如果有,重新随机坐标
//随机坐标:r=rand()%MAP_LEN;c同理;
row=r;
col=c;
}
}p1;
如果要在构造函数中判断是否有墙的话,得传入地图数组作为参数。不过为了考虑通用性,也就是为之后让玩家进入其他地图做准备,那么“玩家类”里面要定位玩家坐标,除了横坐标row和纵坐标col之外,还需要一个地图坐标。
我首先想到的是加一个属性:
二维数组map[MAP_LEN][MAP_LEN];
但是这样子赋值就变得很麻烦。
既然只是需要定位到某个地图,那不如将地图编号,用一个变量mapID来存储。
如何编号呢?
用指针指向二维数组吗?这是一个办法,但是我现在还不是很会。用指针指向二维数组的第一个元素,好像ok。试一下吧!
int *mapP;
C_Player(int r=0,int c=0,int *mapP=&test_map[0][0])
{
for(int i=0;i
{
for(int j=0;j
{
if(i==r&&j==c&&*mapP==1)//找到坐标并判定
{
//此处应有重新随机坐标的代码
}
mapP ++;
}
}
row=r;
col=c;
}
写着写着我有些犹豫,随机坐标的部分怎么写啊?这样吗:
while(坐标处不是空地)
{
随机坐标;
}
然而“坐标处不是空地”这个判定部分就是上面的一大串……
那把上面的封装成函数试试。
bool C_Player :: illegalXY(int r,int c)//坐标合法性判定
{
for(int i=0;i
{
for(int j=0;j
{
if( i==r && j==c && *mapP != 0 )
{
return false;
}
mapP ++;
}
}
return true;
}
再把这个放进构造函数:
while(illegalXY(r,c))
{
r=rand()%MAP_LEN;
c=rand()%MAP_LEN;
}
编译运行,结果出问题了,无法正常运行。
……然后发现mapP这个指针指向的是……
mmp不搞那么复杂了,重来重来!俩小时了都。
干脆把初始点(0,0)固定为空地
领取专属 10元无门槛券
私享最新 技术干货