【问题标题】:Getting stuck in a loop that slows down the application insanely陷入疯狂减慢应用程序的循环中
【发布时间】:2017-06-19 16:00:46
【问题描述】:

为学校的作业制作纸牌游戏,我遇到了一个问题。 在我的静态 Game 类的“Start”方法中,我为游戏初始化了一些东西,它似乎停止工作了。

Players[0].MyTurn = true;
        for (int i = 0; i < Players.Count; i++) //Initialize decks for all players
        {
            Game.InitializeDeck(Players[i], Names);
        }
        for (int i = 0; i < Players.Count; i++) //Flush decks for all players
        {
            Game.ShuffleDeck(Players[i]);
        }

        for (int i = 0; i < Players.Count; i++) //Draw 5 cards for all players
        {
            for (int x = 0; x < 5; x++)
            {
                Game.DrawCard(Players[i]);
            }
        }

        Thread checkPlayersHealth = new Thread(CheckPlayersHealth);
        checkPlayersHealth.Start();

经过一些调试,它似乎卡在了“InitializeDeck”方法中,看起来像这样:

public static void InitializeDeck(Player player, List<string> Names)
    {
        for (int i = 0; i < 10; i++) //A loop that creates 30 randomly generated cards, with 3 of each card
        {
            Console.WriteLine("asd");
            Random random = Program.random;
            int rNameNum1 = random.Next(0, Names.Count); //r for random
            int rNameNum2 = random.Next(0, Names.Count);
            int rHealth = random.Next(0, 10); 
            int rPowerNum = random.Next(0, 5);
            int rBaseDmg = random.Next(0, 8);
            int manaCost = (rHealth + rPowerNum + rBaseDmg) / 2;
            for (int x = 0; x < 3; x++)
            {
                player.Deck.Add(new Card(Names[rNameNum1] + Names[rNameNum2], manaCost, rHealth, rPowerNum, rBaseDmg));
            }
        }
    }

卡片构造函数:

public Card(string name, int manaCost, int health, int powerNum, int baseDmg)
    {
        Name = name;
        ManaCost = manaCost;
        Health = health;
        PowerNum = powerNum;
        BaseDmg = baseDmg;

        int numOfPowers = 4; //Amount of different powers excluding "No power"
        if (powerNum <= 0)
        {
            PowerName = "No power";
        }
        else if (powerNum == 1)
        {
            PowerName = "Heal any target";
            Power = new Power(false, true, 6, Program.random.Next(1, 4));
        }
        else if (powerNum == 2)
        {
            PowerName = "Deal 1-5 Damage to the enemy champion, and heal yourself for 1-5 HP";
            Power = new Power(true, true, 5, Program.random.Next(1, 4));
        }
        else if (powerNum == 3)
        {
            PowerName = "Sacrifice health from a minion to heal yourself 1-5 HP";
        }
        else if (powerNum == numOfPowers)
        {
            PowerName = "Drain HP from yourself to deal damage to a random enemy target";
            Power = new Power(true, false, 5, Program.random.Next(1, 4));
        }

        Thread checkIfDead = new Thread(CheckIfDead);
        checkIfDead.Start();
    }

从运行循环 3 次开始,每次大约需要 0.5 秒,第三次之后需要更长的时间,循环通过大约 10 秒。

显然我在这里遗漏了一些东西。

【问题讨论】:

  • 有多少玩家?
  • 首先,我不会为每个循环创建一个新的随机数
  • @Orangesandlemons 它没有,它重用了 Program.random 实例,我可以看到
  • 你能显示new Card(吗?它执行什么等?它会加载图片等吗?
  • 如果注释掉 player.deck.add() 方法,它是否仍然滞后迭代?

标签: c# visual-studio loops for-loop console-application


【解决方案1】:

为每张卡片创建一个无限循环的新线程(每个玩家 30 张卡片)并不是一个好主意 >:)

Thread checkIfDead = new Thread(CheckIfDead);
        checkIfDead.Start();

public void CheckIfDead()
    {
        while (true)
        {
            if (Health <= 0)
            {
                Dead = true;
            }
        }
    }

【讨论】:

  • 只是显示有时需要在问题中放入多少代码 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多