变量复位"randomly"
variable resetting "randomly"
我正在创建一个基于文本的冒险游戏,我目前被困在一个问题上。
我有两个变量,它们保存map(rooms)
的值,称为x
和y
,我从一个类中更改它们,一旦它退出类代码回到main,它就会重置x
和y
的值。
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
和y
的重置?
注意:这是一个刚刚出现的问题,因为它以前工作得很好。
编辑:源代码:http://pastebin.com/uKS55LEZ
注::我知道代码写得很差,一周前我从c#转到了c++。
自从这个答案第一次发布以来,代码发生了很大的变化,但这个问题实际上仍然是一种海市蜃楼。
下面是当前版本代码的情况(在撰写本文时,OP问题并不代表这种情况):
在main中有一个这样声明的Player:
Player player;
在标准游戏循环中,存在以下代码:
while( true )
{
ClearConsole();
Print(map.CreateMap(player));
map.doRoom(player);
}
这比早期版本有了很大的改进(更简洁)。有一个小问题导致了所描述的行为。这是doRoom函数的签名(这可能适用于CreateMap,尽管我对此表示怀疑)。
void doRoom(Player player)
这是Room的成员(在上面的循环中,这是map)。问题在于玩家是按价值传递的。这意味着玩家的副本将为doRoom提供输入参数。该副本由doRoom更改(例如,移动x和y)。当doRoom返回时,它所作用的副本就会消失(从作用域中消失),而编辑过的数据也随之消失。
将签名更改为
void doRoom(Player & player)
现在,函数接受一个player的引用。没有复制。因此,对玩家所做的更改将从循环的一次迭代保留到下一次。
我之前说过这可能适用于map。CreateMap,但这只在CreateMap修改播放器内容时成立。如果没有,那也没关系,但从技术上讲,仅仅为了生成CreateMap产生的输出而创建一个player的副本会更慢。它可以带一个参考,我建议doRoom必须带一个参考。
还有一个小问题。上面的主循环没有逃脱的方法。没有办法结束这个游戏。map.doRoom( player )
可能应该返回一个bool值,如果返回false,则中断循环。