Пропуск ходов (4/5 кода завершено, просто нужно немного помощи по стратегии)

У меня небольшая проблема. Направления решения общей проблемы следующие:

  • На игровом поле 31 клетка. Первая ячейка помечена START, последняя ячейка END, а остальные ячейки пронумерованы от 1 до 29.

  • Есть три игрока, A, B и C. Игра начинается со всеми игроками в клетке START. Игрок А всегда ходит первым, затем В, затем С, затем А и так далее. Игра заканчивается, когда игрок достигает клетки END или за ее пределами.

  • Каждый ход состоит из броска 8-гранного кубика и перемещения на такое же количество клеток вперед. Однако, если на кубике выпало 4, переместитесь назад на столько же клеток (но не раньше, чем СТАРТ!); если на кубике выпало 6, игрок вообще не двигается и проигрывает следующий ход. Если игрок приземляется на клетку, занятую другим игроком, игрок, который был на этой клетке, немедленно переходит к СТАРТУ.

Входные данные: броски восьмигранного кубика для пяти игр. Каждая игра состоит из положительных целых чисел, представляющих броски, заканчивающихся 0. Первое число для игрока A, затем B, затем C, затем A и так далее. Каждая игра заканчивается, как описано выше, или когда считывается 0.

Выходные данные: для каждой игры выведите окончательные позиции игроков A, B и C. Позиции всех трех игроков должны быть правильными, чтобы получить кредит за каждый выход; частичного кредита нет.

Итак, прежде чем я начну объяснять проблему, у меня готово 80% кода. Я ни в коем случае не ищу кого-то, кто сделает мою работу, я просто ищу кого-то, кто мог бы объяснить мне стратегию, которую можно использовать для следующей части проблемы.

Я полностью завершил код для части движения в лаборатории, например, для всех случаев с кубиками от 1 до 8, за исключением 6. Теперь моя проблема в том, что я не совсем знаю, как заставить программу пропустить ход игроков И следующий ход если на костях выпало 6. Другими словами, как мне выполнить требование «пропустить ход и проиграть следующий ход»? Код, который у меня есть до сих пор (работает только для входов без числа 6), приведен ниже:

import java.util.Scanner;

public class seniorLab{
    static String input;
    static double parsedInput;
    static int i = 0;
    static int count = 1;
    static int positionA;
    static int positionB;
    static int positionC;
    static int valueOfRoll;
    static boolean aAtEnd;
    static boolean bAtEnd;
    static boolean cAtEnd;

    public seniorLab(){
    }

    static void labLoop(){
        for (int i = 0; i < input.length(); i++){
            if (input.charAt(i) != '0'){
                if (i % 3 == 0){
                    valueOfRoll = charToNum(input.charAt(i));
                    positionA += valueOfRoll;
                    if (positionA == positionB){
                        positionB = 0;
                    } 
                    if (positionA == positionC){
                        positionC = 0;
                    }
                     if (positionA >= 31){
                        aAtEnd = true;
                        break;
                    }
                } else if (i % 3 == 1){
                    valueOfRoll = charToNum(input.charAt(i));
                    positionB += valueOfRoll;
                    if (positionB == positionA){
                        positionA = 0;
                    } 
                    if (positionB == positionC){
                        positionC = 0;
                    }
                    if (positionB >= 31){
                        bAtEnd = true;;
                        break;
                    }
                 } else if (i % 3 == 2){
                   valueOfRoll = charToNum(input.charAt(i));
                    positionC += valueOfRoll;
                    if (positionC == positionA){
                         positionA = 0;
                    }
                    if (positionC == positionB){
                        positionB = 0;
                    }
                    if (positionC >= 31){
                        cAtEnd = true;
                        break;
                    }
                }
            } else if (input.charAt(i) == '0'){
                break;
            }
        }
        System.out.print("Output #" + count + ":  ");
        System.out.print("A-" + positionA + ", B-" + positionB + ", C-" + positionC);
    }

    static int charToNum(char ch){
        switch (ch) {
            case '1': return 1;
            case '2': return 2;
            case '3': return 3;
            case '4': return -4;
            case '5': return 5;
            case '7': return 7;
            case '8': return 8;
        }
        return 0;
    }

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        System.out.print("Line #" + count + ":  ");
        input = in.nextLine();
        input = input.replaceAll("[,]", "");
        seniorLab sL = new seniorLab();
        sL.labLoop();
    }
}

Спасибо за любую помощь!


person user2918120    schedule 16.11.2013    source источник
comment
В общем, похоже, что у вас есть значение позиции для каждого игрока, но нет никакого понятия о ходах, кроме этого цикла. Это звучит правильно?   -  person Dennis Meng    schedule 16.11.2013
comment
Да, я могу правильно отслеживать позиции (например, все тестовые примеры, которые не включают в себя 6, работают отлично), но сейчас я полностью полагаюсь на положение чисел в строке, чтобы вычислить, чья очередь. Например, позиция первого символа по модулю на 3 равна 0, а для второго символа модуль на 3 равен 1, а для третьего символа модуль на 3 равен 2. Следовательно, игрок А будет двигаться, когда модуль i равен 0, игрок B, когда он равен 1, и игрок C, когда он равен 2. Я не знаю, как анализировать, кто какой ход пропустил.   -  person user2918120    schedule 16.11.2013
comment
Да, похоже, вам придется сделать что-то немного другое с определением поворотов. Я позволю тебе сделать несколько попыток.   -  person Dennis Meng    schedule 16.11.2013
comment
Сначала я думал использовать 3 логических значения, skipA, skipB и skipC, чтобы определить, чья сейчас очередь, но это закончилось неудачей. Затем я попытался использовать цикл for, который просто непрерывно запускал три метода (moveA, moveB и moveC), все из которых принимали логические значения в своих параметрах и запускались только в том случае, если соответствующее им логическое значение skipX было ложным. Это также не удалось, потому что мне нужно было бы увеличить свою позицию в строке. Как-то закончились идеи после этого.   -  person user2918120    schedule 16.11.2013
comment
Что пошло не так с первым подходом?   -  person Dennis Meng    schedule 16.11.2013
comment
Проблема заключалась в том, что мне нужно было знать, когда установить для него значение false (это сбило меня с толку) и как запустить все три метода, пока я не достигну конца входной строки чисел. Я не мог зациклить это, потому что много раз входная строка не делилась полностью на 3 (для каждого игрока), а это означало, что иногда C ходил последним, а иногда B ходил последним, и тот же случай с A.   -  person user2918120    schedule 16.11.2013
comment
Например, эта входная строка: 3,7,2,6,5,3,2,4,7,8,5,4,8,2,0 A переместит 3, B на 7 и C на 2. Тогда A выкинет 6 (пропуск A установлен в true), а B переместит 5, C переместит 3. Затем A (потому что вы выбросили 6 и skipA верно) проиграет свой ход, поэтому B переместит 2, а C переместит ход 4. Проблема здесь заключается в том, как заставить A, B и C непрерывно делать это, а затем как и КОГДА установить skipA обратно в false, чтобы A мог продолжить после того, как он был пропущен.   -  person user2918120    schedule 16.11.2013
comment
Ну и как долго они пропускаются? Если это только один ход, то в вашем чеке в истинном случае вы можете просто установить его обратно в ложное и не делать бросок.   -  person Dennis Meng    schedule 16.11.2013
comment
В вашей проверке вы предлагаете мне иметь метод, который проверяет мои логические значения, чтобы увидеть, являются ли они ложными? Не могли бы вы поместить это в полукод для меня?   -  person user2918120    schedule 16.11.2013
comment
Похоже, что, поскольку вы потенциально должны пропустить более одного хода, простое логическое значение может быть не лучшим способом отследить это. Можете ли вы придумать что-то, что позволило бы вместо этого назначить произвольное количество ходов для пропуска?   -  person scriptocalypse    schedule 16.11.2013


Ответы (1)


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

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

set all positions to 0
set all skip booleans to false
put the three players in the queue in order
for each character in the game string
    while the skip variable for the guy in front is true
        set it to false
        move the guy to the back of the line, leaving a new person in front

    // note that we only reach here if the person in front isn't getting
    // skipped this time. thus, the character corresponds to *his* move

    set the roll to the character that we're at right now
    if the roll is 6
        set skip value for that player to be true
    else
        calculate and modify that player's position as normal
    move player to back of queue

Вот некоторые моменты, связанные с этим подходом:

  1. Теперь мы меняем положение вверх только в том случае, если это не «следующий ход», утраченный ранее, или ход, который вы потеряли, выкинув 6 на этом ходу.
  2. Часть while the skip variable for the guy in front is true может запутаться в зависимости от того, как реализованы другие вещи. Поскольку это ваша программа, я позволю вам взвесить все за и против возможных подходов.
  3. Вместо очереди вы можете использовать int в качестве переменной, чтобы обозначить, чья сейчас очередь (используя, например: 0 для A, 1 для B, 2 для C) и просто не забывайте циклически проходить через 0 -1-2, где в противном случае вы меняли бы игроков в очереди.

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

person Community    schedule 16.11.2013
comment
Привет. Я поместил все это в обычный код, и он не работает, и я знаю, почему: мне нужно аннулировать текущий И следующий ход. В этом случае я должен установить целое число для количества пропусков? Таким образом, переключатель вернет skipA = 2, и когда skipA станет равным 0, тогда A снова начнет работать. - person user2918120; 16.11.2013
comment
Звучит как план. Мой ответ был призван направить вас в правильном направлении, а не быть универсальным. Похоже, вы думаете об интересной идее, почему бы не попробовать? - person Dennis Meng; 16.11.2013