我正在做一个学校项目。我正在为 PC 构建基于 Java 的文本游戏。我正在构建的游戏很简单,你买房子然后出租。所以我要问的是,我怎样才能让每个房子的钱每秒自动增加(每秒 1 美元),然后自动将其自动添加到用户的银行账户中。我环顾四周,他们说使用线程暂停游戏 1000(毫秒),然后执行 counter++。但是我已经尝试过了,并且对于基于文本的游戏,它会暂停游戏并让用户等待。我希望用户继续与基于文本的游戏的其他功能进行交互,同时他的银行中每秒的钱正在增加。
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()
该新线程。)同样,您应该根据需要替换和重命名变量以适合您的项目。
由于您正在做一个基于文本的游戏,并且在您的问题中没有说明这将是多人游戏还是单人游戏,如果这是一个单人游戏,我不会实时实施这个模拟(游戏)。
它可能更适合实现离散时间模拟(这意味着您不必使用线程)。您可以将每个房屋创建为具有currentTime
属性的对象。每次出租房屋时,更新其currentTime
. 每当您需要检查银行帐户以获取租金收入时。检查每所房屋的已租用时间并相应地更新您的银行帐户。