Мне нужна свежая пара глаз для отладки - PullRequest
0 голосов
/ 15 ноября 2011

Целью этого задания было создание класса Field и Robot и объектов этих классов.

Один объект поля ограничен квадратом точек от (0, 0) до (50, 50) и содержит 3 куска золота и 3 бомбы.

Три объекта-робота ищут в поле (один за другим) золото слева направо (0, 0) до (0, 50) и спускаются по полю (1, 0) до 1, 50) и так далее.

Роботы уничтожаются бомбами, которые являются местами по входу пользователя. Как только золото собрано, оно не может быть взято другим роботом, и одна бомба взорвалась, но больше не делает этого.

Это моя попытка решить проблему до сих пор, я продолжаю работать над ней, но был бы признателен за то, чтобы вторая пара глаз увидела что-то, чего мне не хватает. Программа компилируется, но бомбы и золото не "правильно" найдены, и на выходе говорится, что следующие роботы умирают на той же бомбе, что и предыдущая. Кроме того, есть несколько фрагментов кода, удаленных комментариями, я сделал это, чтобы протестировать различные части программы. Я думаю, что в этом разделе у меня проблемы. Методы field.alreadyFound () и field.alreadyBombed () возвращают логическое значение со значением true. В моих утверждениях if должно быть сказано, что золото / бомба уже найдены, игнорируйте его.

while(x <= 50 && y <= 50 && alive2 == true)
{   foundGold1 = robot2.look(field.locateGold1());
    foundGold2 = robot2.look(field.locateGold2());
    foundGold3 = robot2.look(field.locateGold3());
    foundBomb1 = robot2.look(field.locateBomb1()); 
    foundBomb2 = robot2.look(field.locateBomb2());
    foundBomb3 = robot2.look(field.locateBomb3());

    if (foundGold1 == true)
    {
        if (field.alreadyFound1() == true) 
        { 
        }
        else
        {
            robot2.addGold();
            field.foundGold1();
        }
    }
    if (foundGold2 == true)
    {
        if (field.alreadyFound2() == true) 
        { 
        }
        else
        {
            robot2.addGold();
            field.foundGold2();
        }
    }
    if (foundGold3 == true)
    {
        if (field.alreadyFound3() == true) 
        { 
        }
        else
        {
            robot2.addGold();
            field.foundGold3();
        }
    }
    if (foundBomb1 == true)
    {
        if (field.alreadyBombed1() == true)
        {
        }
        else
        {
            alive2 = false;
        }
    }
    if (foundBomb2 == true)
    {
        if (field.alreadyBombed2() == true)
        {
        }
        else
        {
            alive2 = false;
        }
    }
    if (foundBomb3 == true)
    {
        if (field.alreadyBombed3() == true)
        {
        }
        else
        {
            alive2 = false;
        }
    }
    y = y + 1;
    robot2.setLocation(x, y);
    //System.out.println(y);

    if (y == 50)
    {
        x = x + 1;
        y = 0;
    }    

Ответы [ 3 ]

1 голос
/ 15 ноября 2011

Я вижу одну потенциальную проблему, хотя, вероятно, она не связана с вашей проблемой.

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

1 голос
/ 15 ноября 2011

Здесь слишком много неучтенной логики, чтобы точно знать, почему ваша программа не работает.

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

  • Использование скобок Open / Close, молодые программисты часто оказываются захваченными попытками минимизировать свой код настолько, насколько это возможно (смотри, я сделал это в 2 строки кода вместо 3)!
  • Вам не нужно проверять, является ли логическая переменная == true / false. Вы можете просто сказать if (foundGold1) ИЛИ, если хотите узнать, ложно ли это, вы говорите if (!foundGold1)

Сказано, 1013 *

Проблема действительно сводится к тому, что у вас, кажется, есть набор логики, который включает в себя такие вещи, как

  • найдено Золото1, найдено Золото2, найдено Золото3
  • robot2 (есть робот1 и robot3)?
  • foundBomb1, foundBomb2, foundBomb3
  • alive2 (есть живые1 и живые3)?

Вы могли бы хранить их в массивах, чтобы реально уменьшить количество необходимых проверок, однако я полагаю, что это в некоторой степени зависит от некоторых деталей, которые вы не раскрыли.

0 голосов
/ 15 ноября 2011

Я думаю, что некоторый ваш код слишком многословен и пушист, чтобы вы могли увидеть, что на самом деле происходит.Возьмем небольшой раздел:

if (foundGold1 == true)
{
    if (field.alreadyFound1() == true) 
    { 
    }
    else
    {
        robot2.addGold();
        field.foundGold1();
    }
}

Это можно записать так:

if (foundGold1) {
    if (! field.alreadyFound1()) {
        robot2.addGold();
        field.foundGold1();
    }
}

В зависимости от того, как этот код будет «расти» с течением времени, вы можете немного его упростить.далее:

if (foundGold1 && ! field.alreadyFound1()) {
    robot2.addGold();
    field.foundGold1();
}

Обратите внимание на предупреждение Мэтью Кокса: молодые программисты часто оказываются втянутыми в попытки минимизировать свой код настолько, насколько возможно (смотри, я сделал это в 2 строки кода вместо3!) - Я не спорю о переформатированном макете, потому что он меньше, а потому, что Я считаю, что это легче читать .В зависимости от сложности будущего кода, я мог бы дать совершенно противоположный совет разбить условия.Главный приоритет - написание разборчивого кода.(Компилятор может выяснить практически все, что вы ему набрасываете - вы должны быть в состоянии понять это тоже.)

Его дальнейший совет использовать массивы для foundBomb[], foundGold[], robot[] и т. Д. Превосходны - лучше всего их использовать с использованием функции аргументы вместо написания нескольких функций.

вместо field.alreadyFound1(), field.alreadyFound2() и т. Д.,попробуйте: field.alreadyFound(int something) - когда вы позвоните им, это будет field.alreadyFound(2).Это позволяет сократить количество функций на три (что означает, что вам не нужно исправлять ошибки по три раза в каждой функции) и упрощает расширение программы до пяти или шести полей, груд золота, бомб, роботов и т. Д.Тогда это просто параметр функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...