我正在构建一个基于文本的冒险游戏,我目前仍然遇到了一个问题。
我有两个变量来保存名为map(rooms)
和x
的{{1}}的值,我正在从类中更改它们,并且只要它退出类代码就会返回到主要重置y
和x
的值。
y
这是大部分相关代码的总结。
我已经使用断点和踩了几次来完成程序,我完全相信,只要我离开Player类,变量int x = 0, y = 0;
...
void IncreaseY(){
y++;
}
void MoveDirection(Direction direction)
{
switch (direction)
{
case North:
DecreaseY();
break;
case South:
IncreaseY();
break;
case East:
IncreaseX();
break;
case West:
DecreaseX();
break;
case None:
break;
default:
break;
}
}
...
class player{
void DoStuff()
{
MoveDirection(South);
}
}
...
void main()
{
Player player = Player.NewOrLoadCharacter();
player.doStuff();
}
和x
就会重置为y
可能导致重置变量0
和x
的原因是什么?
注意:这是一个刚出现的问题,因为它之前已经运作正常。
编辑:源代码:http://pastebin.com/uKS55LEZ
P.S。:我知道代码编写得很糟糕,我开始于一周前从C#转移C ++。
答案 0 :(得分:1)
自从这个答案首次发布以来,代码发生了很大的变化,但问题实际上仍然是一种海市蜃楼。
以下是当前版本的代码所发生的事情(OP问题在撰写本文时并不代表这种情况):
主要是有一个玩家声明:
Player player;
在标准游戏循环中,此代码存在:
while( true )
{
ClearConsole();
Print(map.CreateMap(player));
map.doRoom(player);
}
与早期版本相比,这有了很大改进(更清洁)。导致所述行为的一个小问题。它是函数doRoom的签名(这可能适用于CreateMap,但我对此表示怀疑)。
void doRoom(Player player)
这是Room的成员(在上面的循环中,该地图)。问题在于玩家是按价值传递的。这意味着制作播放器副本以提供doRoom的输入参数。此副本由doRoom更改(例如,移动x和y)。当doRoom返回时,它所作用的副本会蒸发(从范围落下) - 编辑后的数据也随之消失。
将签名更改为
void doRoom(Player & player)
现在,该函数引用了播放器。没有复制品。因此,对玩家所做的更改将从循环的一次迭代保留到下一次。
我之前说过,这个可能适用于map.CreateMap,但只有当CreateMap修改播放器的内容时才会出现这种情况。如果没有,那就无所谓了,但是创建一个播放器副本只是为了让CreateMap产生的输出在技术上会更慢。它可以作为参考,因为我建议doRoom必须采取。
还有一个小问题。上面的主循环无法逃脱。没有办法结束游戏。 <{1}}应该返回一个bool,也许如果返回false,则打破循环。