0

好的,我只学习了大约一周的 java 并决定制作一个基于文本的游戏。在我开始使用线程之前,一切都运行得很顺利。我希望能够检测用户是否在游戏的任何部分输入“inv”来检查他们的库存。唯一的问题是当我开始游戏时,控制台会询问“你想玩游戏吗?” 你必须输入“是”两次。我认为这是因为线程有一个 if 语句来检查它是否等于“inv”,然后检查用户是否输入“是”来开始游戏。

(我知道它可能非常低效的代码,这是我的第一个游戏 xD)


主班

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!");

这是来自“gameClass”的线程

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(){

}
}

注意:我没有粘贴所有代码。


因此,当控制台询问“欢迎!你想玩?' 我必须先输入'yes',因为线程正在检查下一个输入是否是'inv' 然后我可以继续输入'yes'来告诉我要播放的程序。

任何帮助将不胜感激,这让我发疯了。

如果您需要更多信息,请问我 :)

4

2 回答 2

0

您的游戏中应该只有一个循环。您读取输入(一次),检查它是否是 inv 或其他,如果不是,则运行常规代码。我认为绝对没有理由在那里有一个线程。事实上,你必须输入两次 yes 是有道理的:因为你从同一个输入中听到了两次,可能第一次检查它是否等于 inv 的线程听到它,并且什么也不做,而在第二次正确的线程完成这项工作。

于 2013-03-30T23:13:02.073 回答
0

如果你做线程,你应该让你的所有控制台 I/O 发生在一个线程中。您有两个相互异步运行的 Scanner 实例。即使您解决了要求开始游戏的具体问题,您仍然可能会遇到不知道哪个线程会先获取您的输入的情况。一般来说,不同的线程不应该尝试使用相同的资源。

于 2013-03-30T23:42:22.847 回答