我正在使用PyQt创建自己的棋盘游戏版本Battleship。 PyQt主窗口包含自己的板和敌方板。棋盘由玩家可向其射击的可点击磁贴组成。该实现支持HUMANvsAI和AIvsAI游戏。我想通过仿真测试我的AI算法的强度。例如,我想循环运行1,000个AIvsAI游戏,并获得%胜利率,平均准确性等统计信息。
我正在努力运行PyQt应用多次以收集游戏数据,例如在for循环中。具体来说,我找不到运行该应用程序,退出它并再次重新运行它的方法。从概念上讲,我正在寻找这样的东西:
# conceptual snippet for i in range(n): app = QApplication([]) window = MainWindow(b_size, boat_dict, players) app.exec_()
具有在其他地方退出该应用程序并在每次游戏结束时调用的调用:
# conceptual snippet if is_game_over(): sys.exit(app.exec_())
但是这个简单的解决方案打破了for循环。欢迎就顺序(例如循环方法)或并行线程多次运行和退出PyQt应用程序提供任何反馈。
您不应该使用sys.exit()
,因为该指令用于终止程序的执行,如果要终止Qt应用程序,则必须使用QCoreApplication::quit()
(或QCoreApplication::exit(0)
)。另外,另一个改进将是使用多处理:
import random
from multiprocessing import Pool
from PyQt5 import QtCore, QtWidgets
def create_app(i):
app = QtWidgets.QApplication([])
w = QtWidgets.QMainWindow()
w.setWindowTitle("Game-{}".format(i))
w.show()
# emulate end-game
def end_game():
QtCore.QCoreApplication.quit()
timeout = random.randint(1000, 2000) # 1000-2000 milliseconds
QtCore.QTimer.singleShot(timeout, end_game)
app.exec_()
# emulate results
o = {"victory": random.randint(0, 101), "average": random.randint(0, 101)}
return o
def main():
results = []
pool = Pool(processes=8)
for i in range(1000):
r = pool.apply_async(create_app, args=(i,))
results.append(r)
pool.close()
pool.join()
print([result.get() for result in results])
if __name__ == "__main__":
main()