Я делаю пошаговые боевые действия в Java, просто чтобы посмотреть, смогу ли я во всем разобраться, но у меня проблема - PullRequest
0 голосов
/ 06 августа 2020

Итак, я делаю пошаговый боевой класс в java, когда я пытаюсь создать ролевую игру. Я предоставлю код ниже. У меня есть publi c stati c String с именем state и сканер с именем s c, а также оператор switch для состояния. Перед оператором switch state = "0". case «0» оператора switch выводит «Слизь появляется \ n (1) Attack \ n (2) Defend» и устанавливает state = «1». case "1" содержит другой оператор switch для s c .nextLine. в этом операторе switch case "1" генерирует повреждения для меня и слизи, вычитает их из нашего hp, распечатывает сообщение для атак и делает state = "2". case "2" генерирует половину повреждений слизи и распечатывает сообщение об ущербе слизи, равном половине того, что было бы, когда вы защищаетесь внутри атакующего и делает state = "2". Итак, атаковать или защищаться, он делает state = «2». Затем для первого оператора switch case "2" снова распечатывает варианты атаки и защиты и устанавливает state = "1". Когда я запускаю код, он печатает первое сообщение о том, что слизь появляется и либо атакует, либо защищается, но я не могу ввести что-либо в консоль, и код завершается. Я использую Eclipse.

package dfguy;

import java .util.Random; import java .util.Scanner;

publi c class Main {

public static String state;

public static int cmhp = 40;

public static int cchp = 40;

public static int smhp = 20;

public static int schp;

public static Random dmg = new Random();

public static Scanner sc = new Scanner(System.in);

public static void main(String[] args) {
    
    state = "0";
    
    switch(state) {
    
    case "0":
        
        System.out.println("A Slime appears!\n(1)Attack\n(2)Defend");
        
        schp = smhp;
        
        state = "1";
        
        break;
        
    case "1":
        
        switch(sc.nextLine()) {
        
        case "1":
            
            int cdmg = (dmg.nextInt(6) + 5);
            
            int sdmg = (dmg.nextInt(5) + 4);
            
            System.out.println("You attack the Slime for " + cdmg + "damage!\nThe Slime attacks "
                    + "you for " + sdmg + "damage!");
            
            schp = schp - cdmg;
            
            cchp = cchp - sdmg;
            
            state = "2";
            
            break;
            
        case "2":
            
            int sbdmg = (dmg.nextInt(3) + 2);
            
            cchp = cchp - sbdmg;
            
            System.out.println("You defend against attack! The Slme attacks for " + sbdmg + "damage!");
            
            state = "2";
            
            break;
        
        }
        
        break;
        
    case "2":
        
        System.out.println("(1)Attack\n(2)Defend");
        
        state = "1";
        
        break;
    
    }

}

}

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

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

Дело в том, что каждое состояние может повторяться снова и снова. Таким образом, вы должны задать свой вопрос в одном состоянии и ждать ответа в следующем. Если вы оставите его в этом состоянии, он просто продолжит спамить вопрос. Итак, состояние 0 должно задавать вопрос, затем состояние 1 просто зацикливается на ожидании ответа, и ответ отправляет вас в состояние 2 или 3. для получения большего количества текста.

Или вы можете даже иметь конечные автоматы внутри конечных автоматов. Дело в том, что код цикла продолжает достигать той же точки, пока не придет время заняться чем-то еще.

Все это должно быть внутри while l oop. Вы можете использовать while (true) или while (1), или даже для (;;), но мне нравится иметь логическое значение, которое я могу использовать, чтобы, если я когда-либо захочу завершить программу, я мог просто установить для него значение false и программа завершается.

Псевдокод:

boolean running = true;

while(running){
   switch(state){
      // etc. etc. for the state machine.  
      // if you want to end the program somewhere then set running to false
   }
}
0 голосов
/ 06 августа 2020

Нет l oop вокруг switch, чтобы запускать его более одного раза - так что вы go через состояние = 0, переверните его в состояние = 1, и тогда все готово.

Сейчас вы можете обойтись без while(true) { /*your switch*/ }, но в конечном итоге вы, вероятно, захотите while(!dead) { ... }. Также, возможно, поместите весь свой переключатель в другой метод, а не в main.

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