我正在考虑制作一个“编程游戏”,即每个玩家编写一个程序来控制他们的“机器人”,然后这些程序会互相攻击以查看谁获胜(通过某些“胜利”的定义) )。
为了公平起见,每个bot程序应该以相同的速度执行,因此使用本机预编译的C / C ++代码似乎是不可能的。
我可以想到3个选项,但我不确定2:
所以基本上,我想问题是我可以控制JVM或某些语言解释器的执行速度(理论上不是 - 在实践中)吗?还是有其他选择我没想到?
答案 0 :(得分:0)
JVM不是实时的,我怀疑是你的操作系统。依赖于JVM和/或进程交互不会起作用,因为您受操作系统调度,JVM线程调度等的影响。
如果要协调多个线程,那么您应该查看JVM线程模型,特别是如何使用locks来协调2个线程。
答案 1 :(得分:0)
一种选择是编写您自己的JVM,您只需从每个程序运行固定数量的字节码指令。字节码更易于消化人类可读的源代码,因此您可以使用相对较少的实现工作,而您的用户可以使用任何可以生成Java字节码的编程语言进行编程。
如果你制定一些限制,比如“没有线程”和“没有尝试/捕获”,这会变得更容易。您需要实现java.lang.*
中的一些核心语言功能以及一些特定于域的I / O功能,但对于大多数JRE的其余部分(例如java.util.*
),您应该能够从现有的JRE实现中执行字节码(如果你分发游戏引擎,则为模数法律约束)。
与在现成的优化JVM上运行相比,预计会在10x和100x之间放缓(取决于您的实施技术)。
或者,在调试模式下运行现有JVM,使用游戏pretending to be a debugger单步执行参赛者计划。无论是比自己写一个简单的JVM更容易还是更难,我不确定。