«Если» альтернативы заявления - PullRequest
2 голосов
/ 02 марта 2012

Я делаю домашнее задание и застрял на какой-то логике (мне кажется, я правильно использовал этот термин?). Я пишу приложение, которое показывает 12 кнопок, пронумерованных 1-12, 2 изображения кубиков и кнопку Roll.

Игрок бросает кости (2, 6-гранный кубик) и любое число (и), которые он получает, он может использовать, чтобы «покрыть» некоторые из двенадцати чисел. Например, предположим, что он бросает кости и получает 3 и 5. Он выбирает, покрывать ли 3 и 5 или сумму двух чисел - 8 (Я упоминал, что я математик? ).

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

Проблема, с которой я столкнулся, заключается в том, что, как я считаю, в выражениях if:

if (die1 == 3 && die2 == 5) {
  player can cover 3 and 5, or 8, but not both
}

Теперь, я думаю, что это работает, но если бы я написал все это, было бы 36, если утверждений (дать или взять ноль). Есть ли более простой способ?

Ответы [ 7 ]

5 голосов
/ 02 марта 2012

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

if (cover == die1 or cover == die2 or cover == ( die1 + die2)) {
    //valid..
}
2 голосов
/ 02 марта 2012

Это хороший пример использования переключателя, IMO. Это будет 2 переключателя, каждый из которых имеет 6 корпусов.

2 голосов
/ 02 марта 2012

нет, если требуется заявление. игрок может покрыть die1 и die2 или die1+die2

1 голос
/ 02 марта 2012

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

int[] covered = { die1, die2, die1+die2 };
// ... other stuff
if (comparisonValue > 6) {
  // maybe do special stuff since this uses both dice
  if (comparisonValue == covered[2]) {
    // covered/coverable behavior
  } else {
    // not
  }
} else {
  // maybe do special stuff since this only uses one die
  if (comparisonValue == covered[0] || comparisonValue == covered[1]) {
    // covered/coverable behavior
  } else {
    // not
  }
}

дает вам сначала то, что покрыто, а затем простое использование.Вы также можете foreach над массивом сделать что-то для покрытых чисел, ala

for (int c : covered) {
  // do stuff with c because it's covered
}

Это довольно хрупко, но гибкий ответ (например, сброс результатов в Collection) равен способ излишества для 6-гранных, целочисленных костей и гибкий действительно гибкий ответ (например, включение переменного числа костей, специализированное сочетание граней в результаты) подобен ядерному армагеддону для этой конкретной проблемы.

РЕДАКТИРОВАТЬ для вашей конкретной проблемы, я бы сделал что-то вроде

// start new turn, disable all buttons
// get rolls
int[] coverable = { die1, die2, die1+die2 };
for (int covered : coverable ) {
  // enabled covered button
}

Если игрок может изменить, какой из 1-12 покрыт предыдущими бросками, на основе нового результата,ну, тогда вы можете повеселиться в зависимости от того, какую помощь вы хотите им оказать.

1 голос
/ 02 марта 2012

Не проверяйте, пока игрок не попытается что-то скрыть.Только проверяя ввод, вы упрощаете все до одного if утверждения.

Если вам делать нужно знать все возможности (возможно, чтобы показать игроку возможные ходы), тогда ...вам все еще не нужны все эти if заявления.Просто выделите кнопки, которые соответствуют броску костей, и принимайте их только в качестве входных данных;Вы хотите индексировать их в массиве или карте по их значению (например, «1»), чтобы получить их.

0 голосов
/ 02 марта 2012

Вы также можете создать массив из 12 дюймов или bools. Инициализируйте все 12 элементов (скажем, 0 или false). Тогда для каждой роли вы можете сделать что-то вроде:

if (false == myArray[die1Value] && false == myArray[die2Value]) {
    myArray[die1Value] = true;
    myArray[die2Value] = true;
} else if (false == myArray[die1Value + die2Value]) {
    myArray[die1Value + die2Value]
} else if (false == myArray[die1Value] || false == myArray[die2Value]) {
    if (false == myArray[die1Value]) {
        myArray[die1Value] = true;
    }
    if (false == myArray[die2Value]) {
        myArray[die2Value] = true;
    }
} else {
    // all 12 covered
}

И, конечно, вы можете еще немного изменить этот код. Заявленная цель «Цель игры состоит в том, чтобы покрыть все числа, используя наименьшее количество бросков». не выполнимо, правда. Лучшее, что вы можете сделать, - это использовать вероятности, чтобы знать, например, следует ли вам сначала покрывать 1 и 2, 1 и 2 или 3: -)

0 голосов
/ 02 марта 2012

Я бы, вероятно, создал 2 новых объекта и использовал бы их со справочной таблицей, например:

class TossResult{
    int firstDie;
    int secondDie;
 }

Class Coverage{
    TossResult tossResult;

    int getThirdNumber(){
        return tossResult.firstDie + tossResult.secondDie;
     }
}

Затем при запуске приложения заполните свою карту:

HashMap<TossResult, Coverage> lookup = new HashMap<>();
for (int i = 0, i < SIDES_ON_DIE; i++){
    for (int j = 0, j < SIDES_ON_DIE; j++){
        TossResult tempResult = new TossResult(i,j);
        Coverage tempCoverage = new Coverage(tempResult);
        lookup.put(tempResult, tempCoverage);
    }
}

После того, как пользователь бросает кости, создайте новый TossResult и выполните lookup.get (tossResult)

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