训练简单小游戏的强化学习工具箱

这是一个使用深度强化学习训练简单小游戏的工具箱,包含贪吃蛇和跳跳人游戏。工具箱支持实时监测训练情况,使用Python、TensorFlow-gpu、PyQt5等技术。训练模型可保存和加载,通过服务器实现数据可视化。代码和详细教程链接提供。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码地址如下:
http://www.demodashi.com/demo/14072.html

详细

先上效果图:

  • 启动界面

启动界面

  • 主界面

主界面

  • 设置界面

设置界面

  • 服务器界面(使用highchart模板画出每一局得分情况)

服务器界面

配置的两款简单小游戏以及训练效果:

  • 贪吃蛇

  • “是男人就下一百层”(修改)

跳跳人
*原图像太大被迫修改大小

使用说明:

####【设置窗口】

→在上面的主界面中点击倒三角形状的键,屏幕上会弹出一个黑色的设置窗。在该窗口界面上,用户可以通过拖动滑块条、在框内输入具体数值两种方法设置模型参数。滑块条和编辑框互联。

【在服务器上查看训练结果】

→点击最小化按钮,将会复制浏览器地址到剪切板上,可以将其粘贴到浏览器中实时监测训练情况。窗口中的折线图每隔五秒从temp.db数据库中获取更新的数据并加入到折线图中,实施实时数据可视化。

####【关闭按钮】


→当点击关闭按钮时,若训练次数超过1000帧,将会弹出窗口询问是否保存记录。否则会由于训练次数过少,对训练没有意义而直接退出不保存结果,以提高效率。

→点击确认

→成功保存



####【新建模式训练】

→选择训练游戏

→开始训练(点击播放按钮)

→鼠标放在进度条上能看到具体数值

####【加载模式训练】

→点击切换按钮



→此时再点击播放按钮,会弹出窗口用于选择加载模型

→点击开始按钮开始训练,同时设置窗口按钮、模式转换按钮都会失效,以确保训练顺利进行。

###1、相关配置

  • Python 3
  • TensorFlow-gpu
  • pygame
  • OpenCV-Python
  • PyQt5
  • sys
  • threading
  • multiprocessing
  • shelve
  • os
  • sqlite3
  • socket
  • pyperclip
  • flask
  • glob
  • shutil
  • numpy
  • pandas
  • time
  • importlib

###2、文件目录

|————MyLibrary.py 用于设置游戏中人物等类
|————run_window.py 启动主程序,包括启动界面
|————mainwindow.py 主界面程序
|————setting.py 参数调节窗口程序
|————message_box.py 消息框窗口程序
|————DQL.py 人工智能主程序,负责选择和启动游戏、启动深度强化学习内核
|————DQLBrain.py 深度强化学习内核
|————game_setting.py 存储已有游戏决策状态数、库名等信息,新游戏加入必须将相关信息也加入在其中
|————flask_tk.py 服务器文件
|————jumpMan.py 跳跳人游戏文件
|————greedySnake.py 贪吃蛇游戏文件
|————resource 窗口图片资源文件夹
|————save_networks 已得出的模型文件
|————templates
   |————index.html 网页前端模板文件
|————static
   |————exporting.js
   |————highcharts-zh_CN.js
   |————highstock.js
   |————jquery.js
|————temp.db 临时数据库,用于服务器和AI端数据交互使用
|————greedy_snake.data-00000-of-00001
|————greedy_snake.index
|————greedy_snake.meta 以上三个为一个训练好的模型
|————greedy_snake.db.bak
|————greedy_snake.db.dat
|————greedy_snake.db.dir 以上三个为一个模型文件
|————setting_resource.py 设定窗口的资源文件
|————resource_message_box.py 消息框窗口的资源文件
|————resource.py 主窗口的资源文件
|————document.py 根据数据库文件自动化生成报告

###3、实现过程
整个demo主要分为四大部分:主窗口、算法和游戏内核、服务器以及管理版本数据库文件部分。

各模块之间的关系

  • 启动界面

	import sys
	from  mainWindow import MAINWINDOW
	from PyQt5.QtWidgets import QApplication,QSplashScreen
	from PyQt5 import QtCore,QtGui,QtWidgets
	if __name__ == '__main__':
		app = QApplication(sys.argv)

		#初始化启动界面
		splash=QtWidgets.QSplashScreen(QtGui.QPixmap("启动界面.png"))

		#展示启动界面
		splash.show()

		#设置计时器
		timer = QtCore.QElapsedTimer()

		#计时器开始
		timer.start()

		#保证启动界面出现3s
		while timer.elapsed() < 3000:
			app.processEvents()

		#初始化主界面
		MainWindow = MAINWINDOW()

		#展示主界面
		MainWindow.show()

		#主界面完全加载后,启动界面消失
		splash.finish(MainWindow)

		sys.exit(app.exec_())
  • 主界面(均使用Qtdesigner完成)

    import gameSetting
    import resource
    from PyQt5 import QtWidgets,QtCore,QtGui
    from collections import deque
    from threading import Thread
    from multiprocessing import Process
    import shelve
    import sqlite3
    import socket
    import pyperclip
    from DQL import AI
    import setting
    import messageBox
    import webServers
    import glob
    import shutil
    
    game_start=False
    
    class myThread(Thread):
        def __init__(self,game,model,replay_memory,timestep,setting):
            Thread.__init__(self)
            self.game=game
            self.model=model
            self.setting=setting
            self.replay_memory=replay_memory
            self.timestep=timestep
    
        def run(self):
            self.AI = AI(self.game,self.model,self.replay_memory,self.timestep,int(self.setting["Explore"]),float(self.setting["Initial"]),float(self.setting["Final"]),float(self.setting["Gamma"]),int(self.setting["Replay"]),int(self.setting["Batch"]),)
            self.AI.playGame()
    
        def stop(self):
            self.AI.closeGame()
    
    class MAINWINDOW(QtWidgets.QWidget):
        def __init__(self, parent=None):
    
            #父类初始化
            super().__init__()
    
            #主窗体对象初始化
            self.setObjectName("Form")
            self.setEnabled(True)
            self.resize(681, 397)
            self.setStyleSheet("background-color: rgb(255, 255, 255);")
            self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
    
            #进度条初始化
            self.progressBar = QtWidgets.QProgressBar(self)
            self.progressBar.setEnabled(True)
            self.progressBar.setGeometry(QtCore.QRect(140, 348, 291, 23))
            self.progressBar.setProperty("value", 0)
            self.progressBar.setTextVisible(False)
            self.progressBar.setObjectName("progressxzBar")
    
            #启动按钮初始化
            self.control = QtWidgets.QPushButton(self)
            self.control.setGeometry(QtCore.QRect(10, 325, 71, 71))
            self.control.setStyleSheet("border-image: url(:/bottom/resource/开始按钮.png);")
            self.control.setText("")
            self.control.setObjectName("control")
            self.control_state=False
    
            #下拉框初始化
            self.game_selection = QtWidgets.QComboBox(self)
            self.game_selection.setEnabled(True)
            self.game_selection.setGeometry(QtCore.QRect(530, 343, 141, 31))
            self.game_selection.setAutoFillBackground(False)
            self.game_selection.setStyleSheet("QComboBox{border-image: url(:/list/resource/下拉框.png)} \n""QComboBox::drop-down {image: url(:/bottom/resource/下拉框按钮.png)  }")
            self.game_selection.setEditable(False)
            self.game_selection.setInsertPolicy(QtWidgets.QComboBox.NoInsert)
            self.game_selection.setIconSize(QtCore.QSize(0, 0))
            self.game_selection.setFrame(False)
            self.game_selection.setObjectName("game_selection")
    
            #模式选择按钮加载
            self.mode = QtWidgets.QPushButton(self)
            self.mode.setGeometry(QtCore.QRect(440, 340, 71, 41))
            self.mode.setStyleSheet("border-image: url(:/bottom/resource/空白模式.png);\n""")
            self.mode.setText("")
            self.mode.setObjectName("mode")
            self.mode_state = False
    
            #背景图初始化
            self.label = QtWidgets.QLabel(self)
            self.label.setGeometry(QtCore.QRect(0, 0, 681, 331))
            self.label.setStyleSheet("border-image: url(:/image/resource/Background.png);")
            self.label.setText("")
            self.label.setObjectName("label")
    
            #设置按钮初始化
            self.setting = QtWidgets.QPushButton(self)
            self.setting.setGeometry(QtCore.QRect
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值