![](/img/trans.png)
[英]I am running a java based game on netbeans . How do I figure out the data flow in it?
[英]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.