使用Python实现CartPole游戏

在深度强化学习内容的介绍中,提出了CartPole游戏进行深度强化学习,现在提供一种用Python简单实现Cart Pole游戏的方法。

1. 游戏介绍

CartPole 游戏是一个经典的强化学习问题,其中有一个小车(cart)和一个杆(pole)。

目标是通过移动小车来保持杆的平衡,使其尽可能长时间地保持直立。

这个问题常常用来测试强化学习算法的性能。

2. 开始做游戏

使用 pygame 实现 CartPole 游戏的界面,我们需要自己编写游戏的逻辑和渲染部分。以下是一个简单的 pygame 实现,它模拟了 CartPole 游戏的基本机制,并提供了一个可视化界面。

2.1. 依赖库

首先,确保你已经安装了 pygame 库。如果没有安装,可以使用 pip 安装:

pip install pygame

2.2. 游戏代码

以下是使用 pygame 实现 CartPole 游戏的代码。

这个代码的注释和细节,可以帮助您理解游戏的各个部分。

import pygame  
import sys  
import math  
  
# 初始化pygame  
pygame.init()  
  
# 设置屏幕大小  
screen_width = 800  
screen_height = 600  
screen = pygame.display.set_mode((screen_width, screen_height))  
pygame.display.set_caption("CartPole Game")  
  
# 设置颜色  
BLACK = (0, 0, 0)  
WHITE = (255, 255, 255)  
  
# 设置帧率  
clock = pygame.time.Clock()  
fps = 60  
  
# CartPole 参数
# 小车宽高  
cart_width = 50  
cart_height = 20  

# 杆宽高
pole_length = 200  
pole_width = 10  

# 力量和重力加速度
force = 10.0  
gravity = 9.8  

# 小车和杆的质量
mass_cart = 1.0  
mass_pole = 0.1  

length = pole_length / 2  # 实际上是一半的pole_length,用于计算  
dt = 1.0 / fps  # 时间步长  
  
# 游戏状态  
x = screen_width // 2  # cart的x坐标  
x_dot = 0  # cart的速度  
theta = 0  # pole的角度  
theta_dot = 0  # pole的角速度  

# 更新状态  
def update_state(action):  
    global x, x_dot, theta, theta_dot  
      
    # 计算作用力  
    force_x = force if action == 1 else -force  
      
    # 计算系统的动力学  
    costheta = math.cos(theta)  
    sintheta = math.sin(theta)  
    temp = (force_x + pole_length * theta_dot**2 * sintheta) / (mass_cart + mass_pole)  
    thetaacc = (gravity * sintheta - costheta * temp) / (length * (4.0/3.0 - mass_pole * costheta**2 / (mass_cart + mass_pole)))  
    xacc = temp - pole_length * thetaacc * costheta / mass_cart  
      
    # 更新速度和位置  
    x_dot += xacc * dt  
    x += x_dot * dt  
    theta_dot += thetaacc * dt  
    theta += theta_dot * dt  
      
    # 限制cart的位置在屏幕内  
    x = min(max(x, cart_width // 2), screen_width - cart_width // 2)  
      
    # 如果pole太倾斜,则重置游戏  
    if abs(theta) > math.pi / 2:  
        x = screen_width // 2  
        x_dot = 0  
        theta = 0  
        theta_dot = 0  

# 绘制小车  
def draw_cart():  
    pygame.draw.rect(screen, BLACK, (x - cart_width // 2, screen_height - cart_height - 20, cart_width, cart_height))  

# 绘制杆  
def draw_pole():  
    pole_end_x = x + pole_length * math.sin(theta)  
    pole_end_y = screen_height - cart_height - 20 - pole_length * math.cos(theta)  
    pygame.draw.line(screen, YELLOW, (x, screen_height - cart_height - 20), (pole_end_x, pole_end_y), pole_width)  
  

def main_loop():  
    running = True  
    while running:  
        for event in pygame.event.get():  
            if event.type == pygame.QUIT:  
                running = False  
            elif event.type == pygame.KEYDOWN:  
                if event.key == pygame.K_LEFT: #键盘左键响应 
                    update_state(0)  # 向左移动  
                elif event.key == pygame.K_RIGHT:  #键盘右键响应
                    update_state(1)  # 向右移动  
          
        # 渲染屏幕  
        screen.fill(WHITE)  
        draw_cart()  
        draw_pole()  
        pygame.display.flip()  
          
        # 控制帧率  
        clock.tick(fps)  
  
    pygame.quit()  
    sys.exit()  
  
if __name__ == '__main__':  
    main_loop()

以上的代码提供了 CartPole 游戏的完整实现,包括游戏的物理逻辑、渲染逻辑和主循环。

游戏会一直运行,直到用户关闭窗口。

在每个时间步,游戏都会随机选择一个动作(向左或向右移动小车),并更新小车和杆的状态。

然后,使用 pygame 绘制小车和杆,并显示在游戏窗口中。

2.3. 运行游戏

要开始这个游戏,首先需要确保你的环境中已经安装了pygame库。

可以将上面的代码保存为一个Python文件,比如命名为cartpole_game.py

然后,使用Python解释器来运行这个文件。在命令行中输入以下命令:

python cartpole_game.py

游戏窗口应该会打开,并显示CartPole游戏的初始状态。

游戏会自动开始,并随机选择动作来控制小车移动,以保持杆子的平衡。

您可以观察游戏的进行,并尝试修改代码来改变游戏的行为或增加新的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/779920.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache Seata tcc 模块源码分析

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 一 .导读 spring 模块分析中讲到,Seata 的 spring 模块会对涉及到分布式业务的 b…

进程控制-wait和waitpid进程回收

wait 阻塞函数 函数作用: 1. 阻塞并等待子进程退出 2. 回收子进程残留资源 3. 获取子进程结束状态(退出原因) pid_t wait(int *wstatus); 返回值: ‐1 : 回收失败,已经没有子进程了 >0 : 回收子进程对应的…

《linux系统内核设计与实现》-实现最简单的字符设备驱动

开发linux内核驱动需要以下4个步骤&#xff1a; 1 编写hello驱动代码 驱动代码如下 helloDev.c&#xff0c;这是一个最小、最简单的驱动&#xff0c;去掉了其他的不相干代码&#xff0c;尽量让大家能了解驱动本身。 #include <linux/module.h> #include <linux/mod…

python函数和c的区别有哪些

Python有很多内置函数&#xff08;build in function&#xff09;&#xff0c;不需要写头文件&#xff0c;Python还有很多强大的模块&#xff0c;需要时导入便可。C语言在这一点上远不及Python&#xff0c;大多时候都需要自己手动实现。 C语言中的函数&#xff0c;有着严格的顺…

vulhub-activemq(CVE-2016-3088)

在 Apache ActiveMQ 5.12.x~5.13.x 版本中&#xff0c;默认关闭了 fileserver 这个应用&#xff08;不过&#xff0c;可以在conf/jetty.xml 中开启&#xff09;&#xff1b;在 5.14.0 版本后&#xff0c;彻底删除了 fileserver 应用。【所以在渗透测试过程中要确定好 ActiveMQ …

2024年世界人工智能大会(WAIC)各大佬的精彩发言

2024年世界人工智能大会&#xff08;WAIC&#xff09;在上海举行&#xff0c;受到了广泛关注和参与。以下是大会首日的主要观点和议题的总结&#xff1a; AI 应用落地&#xff1a;大会讨论了AI应用如何落地&#xff0c;即如何在当前阶段利用大模型技术实现实际应用。 AI 安全&…

nginx转发的问题

我在项目配置的时候遇到一个问题&#xff1a; 配置了域名转发&#xff0c;且配置了https nginx配置如下&#xff1a; server {listen 443 ssl;server_name yourdomain.com;ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/private.key;loca…

收银系统源码-线上商城预售功能

1.功能描述 预售&#xff1a;智慧新零售收银系统&#xff0c;线上商城营销插件之一&#xff0c;商品出售时可设置以支付定金或全款的方式提前预售&#xff0c;门店按订单量备货&#xff0c;降低压货成本&#xff1b; 2.适用场景 易损商品提前下单备货&#xff0c;如水果生鲜…

拼多多20240509实习生笔试

题目一 解题思路 分类讨论 情况一&#xff1a;5元汉堡也买不完。 情况二&#xff1a;5元汉堡能买完&#xff0c;非5元买不起。 情况三&#xff1a;都能买起&#xff0c;或还有剩余买原价汉堡。 题目二 解题思路 找规律&#xff0c;假设有...xy...&#xff0c;x在前。如果交换x…

KubeSphere 社区双周报|2024.06.21-07.04

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2024.06.21-07.04…

nodejs实现:支付宝订单查询

nodejs实现&#xff1a;支付宝订单查询&#xff1b; 原生http请求&#xff0c;不使用三方库&#xff1b; 代码如下&#xff1a; const https require(https); const crypto require(crypto); const querystring require(querystring);// 支付宝公共参数 const PRIVATE_KE…

联想小新14Pro,误删了一个注册表,怎么办?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

flask模块化、封装使用cache(flask_caching)

1.安装flask_caching库 pip install flask_caching 2.创建utils Python 软件包以及cache_helper.py 2.1cache_helper.py代码 from flask_caching import Cachecache Cache()class CacheHelper:def __init__(self, app, config):cache.init_app(app, config)staticmethoddef…

常见的Java运行时异常

常见的Java运行时异常 1、ArithmeticException&#xff08;算术异常&#xff09;2、ClassCastException &#xff08;类转换异常&#xff09;3、IllegalArgumentException &#xff08;非法参数异常&#xff09;4、IndexOutOfBoundsException &#xff08;下标越界异常&#xf…

【python】python母婴数据分析模型预测可视化(数据集+论文+PPT+源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

AiPPT的成功之路:PMF付费率与增长策略

如果要给 2023 年的 AI 市场一个关键词&#xff0c;那肯定是“大模型”&#xff0c;聚光灯和大家的注意力、资金都投向了那些大模型公司&#xff1b;而如果要给 2024 年的 AI 市场一个关键词&#xff0c;则一定是 PMF&#xff08;产品市场契合&#xff09;。如果没有 PMF&#…

VuePress 的更多配置

现在&#xff0c;读者应该对 VuePress、主题和插件等有了基本的认识&#xff0c;除了插件&#xff0c;VuePress 自身也有很多有用的配置&#xff0c;这里简单说明下。 ‍ ‍ VuePress 的介绍 在介绍了 VuePress 的基本使用、主题和插件的概念之后&#xff0c;我们再来看看官…

Oracle RAC 19c 打补丁至最新版本-19.23.0.0.0

实验环境-我是从19.0.0.0直接打到19.23.0.0.0&#xff0c;适合刚部署好的集群打补丁直接到最新版本。 查看当前环境 查询集群中运行的 Oracle Clusterware 软件的 activex 版 查询本地节点上二进制文件中存储的 Oracle Clusterware 软件的版本 查询本地服务器上 OHAS 和 Oracle…

windows无法访问github

##一、如果发现windows无法访问github时 一般就是我们的dns出现了问题&#xff0c;此时我们需要更换一个dns访问 ##二、解决方法 首先我们访问ip查询地址&#xff0c; https://ipchaxun.com/github.com/ 可更换下面历史ip进行测试&#xff0c;在windows的cmd里面输入ping git…

【C++】开源:命令行解析库CLI11配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍命令行解析库CLI11配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#x…