变量复位"randomly"

variable resetting "randomly"

本文关键字:randomly 复位 变量      更新时间:2023-10-16

我正在创建一个基于文本的冒险游戏,我目前被困在一个问题上。

我有两个变量,它们保存map(rooms)的值,称为xy,我从一个类中更改它们,一旦它退出类代码回到main,它就会重置xy的值。

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();
}

这是大部分相关代码的总结。

我已经通过程序使用断点和步进几次,我完全肯定,只要我离开播放器类的变量xy重置回0

问题:

是什么导致了变量xy的重置?

注意:这是一个刚刚出现的问题,因为它以前工作得很好。

编辑:源代码: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,则中断循环。