繁体   English   中英

我正在 Java 中制作一个回合制战斗的东西,只是想看看我自己能不能弄清楚,但我有一个问题

[英]I am making a turn based combat thing in Java just to see if I can figure it out myself, But I have a problem

因此,当我尝试制作 rpg 时,我正在 java 中进行回合制战斗 class。 我将在下面提供代码。 我有一个名为 state 的公共 static 字符串和一个名为 sc 的扫描仪,以及一个用于 state 的 switch 语句。 在 switch 语句之前,state = "0"。 switch 语句的 case "0" 打印出 "A Slime appears\n(1)Attack\n(2)Defend" 并使 state = "1"。 case "1" 中有另一个用于 sc.nextLine 的 switch 语句。 在这个 switch 语句中,案例“1”对我和史莱姆产生伤害,从我们的 hp 中减去它们,并打印出攻击消息,并使 state = “2”。 案例“2”产生史莱姆的一半伤害并打印出史莱姆伤害的消息,是它的一半,你在攻击中防御,并使 state = “2”。 因此,无论是进攻还是防守,它都会使 state = "2"。 然后对于第一个switch语句,case“2”再次打印出攻击和防御选项,使state =“1”。 当我运行代码时,它会打印第一条消息说粘液出现并攻击或防御,但我无法在控制台中输入任何内容并且代码被终止。 我正在使用 Eclipse。

package dfguy;

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

public 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;
        
        }

    }

}

switch周围没有循环可以多次运行它 - 所以你 go 通过 state=0,将其翻转到 state=1 然后你就完成了。

现在你可以摆脱while(true) { /*your switch*/ }但最终你可能想要while(.dead) {... } 也可能将您的整个开关放入不同的方法中,而不是全部在main中完成。

您正在编写一个正确的 state 机器,但是关于 state 机器的一个关键是它需要反复调用。 第一次通过 state 是一回事,后来它变成了另一回事。

问题是,每个 state 都可能一遍又一遍地运行。 所以你必须在一个 state 中提出你的问题,然后等待下一个响应。 如果您将其留在 state 中,它将继续发送垃圾邮件问题。 所以 state 0 应该问这个问题,然后 state 1 只是循环等待响应,响应将您发送到 state 2 或 3 以获取更多文本。

或者您甚至可以在 state 机器中安装 state 机器。 关键是循环代码一直到达同一点,直到需要做其他事情为止。

整个事情必须在一个while循环内。 您可以使用 while(true) 或 while(1),甚至 for(;;),但我喜欢使用 boolean 值,这样如果我想结束程序,我可以将其设置为 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
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM