6

在学习 Java 时,我正在尝试开发一个基本的基于文​​本的游戏。我希望能够计算游戏中的回合数,以此来管理某些事件的节奏。例如,更衣室可能被限制为每轮一次(在测试代码中为一秒)。小型生物可能会以更高的速度攻击或更换房间,而较大的生物可能更麻烦。目前很好?伟大的。

所以,我做了这个,并立即意识到每次 while 循环等待玩家输入命令时我都会碰到一个块。代码:

private void startPlaying() {
    //declare clock/round variables.
    int lastRound = 0;
    int currentRound = 0;
    long lastTime = System.currentTimeMillis();
    long currentTime;

    while (player.getIsPlaying()){
        //Clocking
        currentTime = System.currentTimeMillis();
        if ((lastTime + 1000) < currentTime) {
            lastTime = currentTime;
            lastRound = currentRound;
            currentRound++;
            System.out.println("Current round:\t" + currentRound + "\tCurrent time:\t" + currentTime); //EDIT:NOTE: This is just a test line to observe the loop.
        }//end if (Clocking)

        Command command = new Command();
        String[] commandString = command.setAll(); //Array gets parsed elsewhere.
        player.doCommand(commandString);  
        //Class Player extends Pawn extends Actor; Pawn has most command methods.
    }
    finishPlaying();
}//END STARTPLAYING()

所以,这是我的问题:

有没有办法我可以使用单独的方法来记录时间/回合并发到 while 循环向玩家展示命令提示符?

如果没有,是否有其他方法可以使这成为我还没有看到/实践过的非问题?

4

4 回答 4

4

看看并发教程。使用线程,您可以在不停止其他进程的情况下等待用户输入(并使这些其他进程同时执行 - 不是并行,而是分时执行)。

于 2013-03-20T17:07:22.777 回答
1

它被称为“游戏循环”,无论用户的输入如何,游戏都可以顺利运行。

最直接的解决方案 - 创建 2 个线程,第一个线程将等待用户输入并将其放入ConcurrentLinkedQueue容量 1。第二个线程将运行您的游戏循环,如果队列不为空,则从队列中获取用户输入来处理它。

你可以使用任何你想在 2 个线程之间交换数据的数据结构,它甚至可以是 volatile 字符串变量。对这个变量的唯一要求读写访问应该以某种方式同步。

于 2013-03-20T17:12:50.630 回答
1

实时文字冒险?听起来不错。我不建议尝试针对这个特定问题进行并发,有更简单的方法。

通常,您不会将输入阻塞与以秒为单位的时间混合。除非你对这个设计有心,否则我建议你。

1)不要阻止用户输入。通过检查每一帧的按键来编写您自己的输入处理代码。然后你可以计算迭代之间的时间差。例如,一个怪物每秒移动 1 个方块,所以如果当前循环迭代花费了 100 毫秒,那么它移动了 0.1 个方块。float(即使您在文本网格上绘制,也将这些值在内部存储为s。

2) 根据用户输入以“ticks”为单位增加游戏时间。这将是 NetHack/Roguelike 风格。怪物每刻可以移动这么多块,而不是每秒。

于 2013-03-20T17:13:54.927 回答
1

是的,有办法。您需要将“循环计数”代码放在它自己的线程中,这样它就不会被等待输入数据的用户阻塞。该java.util.concurrency软件包可以帮助解决这个问题。

查看Java Doc, scheduleAtFixedRate() 方法将以固定的时间间隔执行一个可运行的。“循环计数”代码将移至实现可运行接口的类。这将在设定的时间间隔内执行。不过,这是相当先进的。

于 2013-03-20T17:14:31.793 回答