2017-02-02 2 views
0

Создание карточной игры для задания в школе, и я столкнулся с проблемой. В моем методе «Старт» в моем статическом классе игры я инициализирую некоторые вещи для игры, где она перестает работать.Застревание в петле, которая замедляет приложение безумно

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 секунд для прохождения цикла.

Очевидно, что я что-то пропустил.

+0

Сколько игроков? –

+1

для начала, я бы не создал новый случайный для каждого цикла – Orangesandlemons

+1

@Orangesandlemons это не делает, он повторно использует экземпляр 'Program.random', так как я вижу –

ответ

2

Создание новой нити с бесконечной петлей в каждом для каждой карты (30 карт для каждого игрока) не такая хорошая идея> :)

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

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

просто показывает, сколько кода иногда нужно поставить в вопрос :) – Orangesandlemons

 Смежные вопросы

  • Нет связанных вопросов^_^