【问题标题】:Java score points automatically increasingJava分数自动增加
【发布时间】:2016-02-20 15:14:45
【问题描述】:

我正在做一个学校项目。我正在为 PC 构建基于 Java 的文本游戏。 我正在构建的游戏很简单,你买房子然后出租。所以我要问的是,我怎样才能让每所房子的钱每秒自动增加(每秒 1 美元),然后自动将其自动添加到用户的银行账户中。我环顾四周,他们说使用线程暂停游戏 1000(毫秒),然后执行 counter++。但是我已经尝试过了,并且对于基于文本的游戏,它会暂停游戏并让用户等待。我希望用户继续与基于文本的游戏的其他功能进行交互,同时他的银行中每秒的钱正在增加。

【问题讨论】:

  • 与其尝试进行手动线程管理,不如创建一个每秒运行一次并执行任何必要更新的ScheduledExecutorService
  • @Mazzoseven 如果你能展示一个示例程序输出就好了。

标签: java loops increment auto-increment text-based


【解决方案1】:

由于您正在做一个基于文本的游戏,并且您的问题中没有说明这将是多人游戏还是单人游戏,如果这是一个单人游戏,我将不会实时实施此模拟(游戏) .

实现 discrete-time simulation 可能更合适(这意味着您不必使用线程)。您可以将每个房屋创建为具有currentTime 属性的对象。每次出租房屋时,请更新其currentTime。每当您需要检查银行帐户以获取租金收入时。检查每间房屋的已用租赁时间并相应更新您的银行帐户。

【讨论】:

    【解决方案2】:

    我同意让线程休眠 1000 毫秒可能是最好的解决方案。您在尝试该解决方案时似乎遇到的问题可能是由于未使用多线程造成的。 Thread.sleep(1000); 命令应该位于与您用于用户界面的主线程不同的线程上。

    以下可能是实现修改银行余额的线程的一种可能方式:

     public class RevenueThread implements Runnable {
    
        public void run() {
           while(true){
              // add to bank balance
              MainClass.BankBalance += MainClass.PropertyCount * INCOME_PER_PROPERTY;
    
              // sleep for 1 second
              try{
                 Thread.sleep(1000);
              }catch(Exception ex){
                 System.err.println( ex.getMessage() );
              }
    
           }
    
    
        }
    
    
     }
    

    使用适当的变量名称等修改该代码以满足您的需要。

    要将其与您的代码集成,您可以将其添加到您的 main() 函数中:

     Runnable rev = new RevenueThread();
     Thread revThread = new Thread(rev);
     revThread.start();`
    

    注意:如果我的回答显得有些简短或包含任何错误,我深表歉意。我正在用手机输入这个解决方案,所以请耐心等待:P


    编辑:以下是每秒增加银行余额的另一种(也许更准确)方法:

    public class RevenueThread implements Runnable {
    
        public void run() {
            // Variable to keep track of payout timing:
            long lNextPayout = System.currentTimeMillis() + 1000; // Current time + 1 second
    
            while(true){
                if(lNextPayout <= System.currentTimeMillis()){
                    // At least 1000 milliseconds have passed since the last payout
                    // Add money to the player's bank balance
                    MainClass.BankBalance += MainClass.PropertyCount * INCOME_PER_PROPERTY;
    
                    // Now set up the next payout time:
                    lNextPayout += 1000;
                }
    
                // sleep for 50 milliseconds to prevent CPU exhaustion
                try{
                    // Thread.sleep() can throw an InterruptedException.
                    Thread.sleep(50);
                }catch(Exception ex){
                    // If sleep() is interrupted, we should catch the exception
                    // and print the error message to the standard error stream
                    // (STDERR) by using System.err
                    System.err.println( ex.getMessage() );
                }
            }
        }
    }
    

    这个版本有什么不同,为什么更好?这个版本使用系统的当前时间每1000毫秒支付一次。因为sleep() 可能会抛出异常,所以这个更新版本可以防止用户在 1 秒内被多次支付,因为sleep() 抛出了异常并且整整一秒都没有休眠。

    如何使用? 使用方式与之前的版本完全相同。 (即,只需创建一个新的RevenueThread 对象,然后为其创建一个Thread 对象,并在该新线程上调用.start()。)同样,您应该根据需要替换和重命名变量以适应您的项目.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2013-05-21
      • 1970-01-01
      • 2017-07-07
      • 2013-06-06
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多