变量“随机”重置

时间:2015-09-19 19:45:43

标签: c++ visual-c++

我正在构建一个基于文本的冒险游戏,我目前仍然遇到了一个问题。

我有两个变量来保存名为map(rooms)x的{​​{1}}的值,我正在从类中更改它们,并且只要它退出类代码就会返回到主要重置yx的值。

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

问题:

可能导致重置变量0x的原因是什么?

注意:这是一个刚出现的问题,因为它之前已经运作正常。

编辑:源代码:http://pastebin.com/uKS55LEZ

P.S。:我知道代码编写得很糟糕,我开始于一周前从C#转移C ++。

1 个答案:

答案 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,则打破循环。