sOwlO Ответов: 1

ГСЧ стрельба - не могу понять одну вещь


Привет. Моя идея-это 2 obejcts, стреляющие друг против друга. А когда у кого-то будет 0 или меньше HP, программа должна перестать работать.

И я сделал это. Он работает, но есть одна вещь, которую я должен починить и не могу понять!

Мой код выглядит примерно так:

<pre>static void Main(string[] args)
        {
            int hp1 = 1200;
            int dps1 = 0;
            int dmg1 = 0;
            int hp2 = 1500;
            int dps2 = 0;
            int dmg2 = 0;
            Random tiger = new Random();
            Random mause = new Random();
            while (hp1 > dmg2 || hp2 > dmg1)
            {
                dps1 = tiger.Next(150, 300);
                Console.WriteLine(dps1 + " shooted to Mause.");
                dmg1 = dps1 + dmg1;
                dps2 = mause.Next(130, 350);
                Console.WriteLine(dps2 + " shooted to Tiger.");
                dmg2 = dps2 + dmg2;
                if (dmg2 > hp1) { Console.WriteLine("Mause won!"); }
                else if (dmg1 >hp2) { Console.WriteLine("Tiger won!"); }
            }
            Console.ReadKey();
        }

Когда я запускаю это, все в порядке. Но в конце концов - выход такой:

225 shooted to Mause.
247 shooted to Tiger.
238 shooted to Mause.
277 shooted to Tiger.
Mause won!
227 shooted to Mause.
150 shooted to Tiger.
Mause won!


Почему он всегда пишет, что Мауз выиграл 2 раза? Когда dmg2 выше, чем hp1, он должен завершить программу. Почему есть следующие побеги и победитель написан дважды?

Что я уже пробовал:

Я немного разбираюсь в ГСЧ, но понятия не имею, что я здесь делаю не так. Есть идеи?

1 Ответов

Рейтинг:
5

Patrice T

Цитата:
А когда у кого-то будет 0 или меньше HP, программа должна перестать работать.

Но ваш код неверен.
Настоящий кодекс:
while (hp1 > dmg2 || hp2 > dmg1)

петля до тех пор, пока у 1 из обоих объектов остается hp.
И этот код:
while (hp1 > dmg2 && hp2 > dmg1)

циклы до тех пор, пока оба объекта имеют оставшиеся hp.

И с помощью этого кода Тигр не проверяется, когда МАУЗ выиграл.
if (dmg2 > hp1) { Console.WriteLine("Mause won!"); }
else if (dmg1 >hp2) { Console.WriteLine("Tiger won!"); }

Попробуйте вместо этого этот код:
if (dmg2 > hp1) { Console.WriteLine("Mause won!"); }
if (dmg1 >hp2) { Console.WriteLine("Tiger won!"); }

Совет: смешивание индексов-плохая идея, это просто усложняет ситуацию, проще проектировать так, чтобы индексы совпадали. Нравится:
if (dmg1 > hp1) { Console.WriteLine("Mause won!"); }
if (dmg2 >hp2) { Console.WriteLine("Tiger won!"); }


-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Отладка кода C# в Visual Studio - YouTube[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


sOwlO

Большое вам спасибо! Действительно полезный.