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