首页
学习
活动
专区
工具
TVP
发布

编程小游戏(四)封装玩家属性(失败记录

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)固定为空地

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180223G13VO500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券