Java-线程问题
好的,我只学了大约一个星期的java,决定制作一个基于文本的游戏。 在我开始使用线程之前,一切都很顺利。 我希望能够检测到用户是否在游戏的任何部分输入“inv”来检查他们的库存。 唯一的问题是当我开始游戏时,游戏机会问“你想玩游戏吗?”你必须输入两次“是”。我认为这是因为线程有一个if语句,检查它是否等于'inv',然后检查用户是否输入'yes'开始游戏 (我知道这可能是非常低效的代码,这是我的第一个游戏xD)Java-线程问题,java,multithreading,thread-sleep,Java,Multithreading,Thread Sleep,好的,我只学了大约一个星期的java,决定制作一个基于文本的游戏。 在我开始使用线程之前,一切都很顺利。 我希望能够检测到用户是否在游戏的任何部分输入“inv”来检查他们的库存。 唯一的问题是当我开始游戏时,游戏机会问“你想玩游戏吗?”你必须输入两次“是”。我认为这是因为线程有一个if语句,检查它是否等于'inv',然后检查用户是否输入'yes'开始游戏 (我知道这可能是非常低效的代码,这是我的第一个游戏xD) 主课 菜单课 这是来自“游戏类”的线索 注意:我没有粘贴所有的代码 因此,当
主课 菜单课
这是来自“游戏类”的线索
注意:我没有粘贴所有的代码
因此,当控制台询问“欢迎!你想玩吗?我必须先输入“是”,因为线程正在检查下一个输入是否为“inv”,然后我可以继续输入“是”,告诉程序我想玩 任何帮助都将不胜感激,这让我发疯。
如果您需要更多信息,请询问我:)您的游戏中应该只有一个循环。您读取输入(一次),检查它是否为inv或其他类型,如果不是,则运行常规代码。我看绝对没有理由在那里放线。事实上,您必须输入两次yes是有意义的:因为您从同一输入中听到两次,可能第一次检查它是否等于inv的线程听到它,并且什么也不做,第二次正确的线程执行任务。如果执行线程,您应该让所有控制台I/O都从单个线程执行。有两个Scanner实例彼此异步运行。即使您解决了要求启动游戏的具体问题,您仍然可能会遇到不知道哪个线程将首先获取您的输入的情况。一般来说,不同的线程不应该尝试使用相同的资源。为什么在控制台游戏中使用线程?这是违反直觉的。正如您所发现的,除非引入某种形式的同步,否则多个线程不会互相等待。真正的解决方案是在这里不使用线程。如果您想使用线程,那么只让一个线程与用户交互,让其他线程完成其余的工作(不管是什么)会更容易。
import java.util.Scanner;
public class Game extends gameClass{
public static void main(String[] args) throws InterruptedException{
Scanner input = new Scanner(System.in);
Thread t1 = new Thread(new gameClass());
t1.start();
Menu.menu();
gameClass.beginning();
}
}
import java.util.Scanner;
public class Menu{
public static void menu() throws InterruptedException{
Scanner input = new Scanner(System.in);//keyboard input
boolean playingGame=false;
String yesno;
System.out.println("Welcome! Would you like to play?");
while(playingGame==false){//repeats if until user input yes/no.
yesno = input.nextLine();
if (yesno.equalsIgnoreCase("yes")){
playingGame = true;
System.out.println("Great!");
public void run(){
Scanner input = new Scanner(System.in);
try{
while(true){
if (input.nextLine().equalsIgnoreCase("inv")){
System.out.println(inventory);
}else if ((input.nextLine().equalsIgnoreCase("help"))||(input.nextLine().equalsIgnoreCase("what do i do"))){
help();
}
Thread.sleep(200);
}
}catch(Exception e){}
}
public static void help(){
}
}