# -------------------------
# Project: Deep Q-Learning on Plane
# Author: bc_zhang
# Date: 2019.2.12
# -------------------------
import pygame
import random
# 设置游戏屏幕大小
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 800
# 子弹类
class Bullet(pygame.sprite.Sprite):
def __init__(self, bullet_img, init_pos):
pygame.sprite.Sprite.__init__(self)
self.image = bullet_img
self.rect = self.image.get_rect()
self.rect.midbottom = init_pos
self.speed = 14
def move(self):
self.rect.top -= self.speed
# 玩家飞机类
class Player(pygame.sprite.Sprite):
def __init__(self, plane_img, player_rect, init_pos):
pygame.sprite.Sprite.__init__(self)
self.image = [] # 用来存储玩家飞机图片的列表
for i in range(len(player_rect)):
self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha())
self.rect = player_rect[0] # 初始化图片所在的矩形
self.rect.topleft = init_pos # 初始化矩形的左上角坐标
self.speed = 10 # 初始化玩家飞机速度,这里是一个确定的值
self.bullets = pygame.sprite.Group() # 玩家飞机所发射的子弹的集合
self.is_hit = False # 玩家是否被击中
# 发射子弹
def shoot(self, bullet_img):
bullet = Bullet(bullet_img, self.rect.midtop)
self.bullets.add(bullet)
# 向上移动,需要判断边界
def moveUp(self):
if self.rect.top <= 0:
self.rect.top = 0
else:
self.rect.top -= self.speed
# 向下移动,需要判断边界
def moveDown(self):
if self.rect.top >= SCREEN_HEIGHT - self.rect.height:
self.rect.top = SCREEN_HEIGHT - self.rect.height
else:
self.rect.top += self.speed
# 向左移动,需要判断边界
def moveLeft(self):
if self.rect.left <= 0:
self.rect.left = 0
else:
self.rect.left -= self.speed
# 向右移动,需要判断边界
def moveRight(self):
if self.rect.left >= SCREEN_WIDTH - self.rect.width:
self.rect.left = SCREEN_WIDTH - self.rect.width
else:
self.rect.left += self.speed
# 敌机类
class Enemy(pygame.sprite.Sprite):
def __init__(self, enemy_img, enemy_down_imgs, init_pos):
pygame.sprite.Sprite.__init__(self)
self.image = enemy_img
self.rect = self.image.get_rect()
self.rect.topleft = init_pos
self.down_imgs = enemy_down_imgs
self.speed = 8
# 敌机移动,边界判断及删除在游戏主循环里处理
def move(self):
self.rect.top += self.speed
class GameState:
def __init__(self):
# 初始化 pygame
pygame.init()
# 设置游戏界面大小、背景图片及标题
# 游戏界面像素大小
self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 游戏界面标题
# pygame.display.set_caption('PlaneDQN')
# 飞机及子弹图片集合
plane_img = pygame.image.load('game/shoot.png')
# 设置玩家飞机不同状态的图片列表,多张图片展示为动画效果
player_rect = []
player_rect.append(pygame.Rect(0, 99, 102, 126)) # 玩家飞机图片
player_rect.append(pygame.Rect(165, 234, 102, 126)) # 玩家爆炸图片
player_pos = [200, 600]
self.player = Player(plane_img, player_rect, player_pos)
# 子弹图片
self.bullet_rect = pygame.Rect(1004, 987, 9, 21)
self.bullet_img = plane_img.subsurface(self.bullet_rect)
# 敌机不同状态的图片列表,包括正常敌机,爆炸的敌机图片
self.enemy1_rect = pygame.Rect(534, 612, 57, 43)
self.enemy1_img = plane_img.subsurface(self.enemy1_rect)
self.enemy1_down_imgs = plane_img.subsurface(pygame.Rect(267, 347, 57, 43))
#存储敌机,管理多个对象
self.enemies1 = pygame.sprite.Group()
# 存储被击毁的飞机
self.enemies_down = pygame.sprite.Group()
# 初始化射击及敌机移动频率
self.shoot_frequency = 0
self.enemy_frequency = 0
# 初始化分数
self.score = 0
def frame_step(self, input_actions):
terminal = False
reward = 0.1
# 控制游戏最大帧率为 30
# 生成子弹,需要控制发射频率
# 首先判断玩家飞机没有被击中
# 循环15次发射一个子弹
# 检测输入正确性
if input_actions[0] == 1 or input_actions[1]== 1 or input_actions[2]== 1: # 检查输入正常
if input_actions[0] == 0 and input_actions[1] == 1 and input_actions[2] == 0:
self.player.moveLeft()
elif input_actions[0] == 0 and input_actions[1] == 0 and input_actions[2] == 1:
self.player.moveRight()
else:
pass
else:
raise ValueError('Multiple input actions!')
if not self.player.is_hit:
if self.shoot_frequency % 15 == 0:
self.player.shoot(self.bullet_img)
self.shoot_frequency += 1
if self.shoot_frequency >= 15:
self.shoot_frequency = 0
# 生成敌机,需要控制生成频率
# 循环30次生成一架敌机
if self.enemy_frequency % 30 == 0:
enemy1_pos = [random.randint(0, SCREEN_WIDTH - self.enemy1_rect.width), 0]
enemy1 = Enemy(self.enemy1_img, self.enemy1_down_imgs, enemy1_pos)
self.enemies1.add(enemy1)
self.enemy_frequency += 1
if self.enemy_frequency >= 100:
self.enemy_frequency = 0
for bullet in self.player.bullets:
# 以固定速度移动子弹
bullet.move()
# 移动出屏幕后删除子弹
if bullet.rect.bottom < 0:
self.player.bullets.remove(bullet)
for enemy in self.enemies1:
#2. 移动敌机
enemy.move()
#3. 敌机与玩家飞机碰撞效果处理
if pygame.sprite.collide_circle(enemy, self.player):
self.enemies_down.add(enemy)
self.enemies1.remove(enemy)
self.player.is_hit = True
reward = -1 #撞击后退出
terminal = True
self.__init__()
break
#4. 移动出屏幕后删除敌人
if enemy.rect.top < 0:
self.enemies1.remove(enemy)
#敌机被子弹击中效果处理
#将被击中的敌机对象添加到击毁敌机 Group 中
enemies1_down = pygame.sprite.groupcollide(self.enemies1, self.player.bullets, 1, 1)
for enemy_down in enemies1_down:
self.enemies_down.add(enemy_down)
# 绘制背景
self.screen.fill(0)
# screen.blit(background, (0, 0))
# 绘制玩家飞机
if not self.player.is_hit:
self.screen.blit(self.player.image[0], self.player.rect) #将正常飞机画出来
else:
# 玩家飞机被击中后的效果处理
self.screen.blit(self.player.image[1], self.player.rect) #将爆炸的飞机画出来
# 敌机被子弹击中效果显示
for enemy_down in self.enemies_down:
self.enemies_down.remove(enemy_down)
self.score += 1
self.screen.blit(enemy_down.down_imgs, enemy_down.rect) #将爆炸的敌机画出来
reward = 1
# 显示子弹
self.player.bullets.draw(self.screen)
# 显示敌机
self.enemies1.draw(self.screen)
# 绘制得分
score_font = pygame.font.Font(None, 36)
# score_t
没有合适的资源?快使用搜索试试~ 我知道了~
通过深度强化学习训练的AI玩起游戏来也是有板有眼,将人类玩家远远甩在身后。本文就将为您介绍如何训练AI玩微信飞机大战,b.zip
共10个文件
py:3个
properties:1个
pdf:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 156 浏览量
2024-05-12
19:33:14
上传
评论
收藏 12.77MB ZIP 举报
温馨提示
五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
资源推荐
资源详情
资源评论
收起资源包目录
通过深度强化学习训练的AI玩起游戏来也是有板有眼,将人类玩家远远甩在身后。本文就将为您介绍如何训练AI玩微信飞机大战,b.zip (10个子文件)
manualType.properties 10B
item.pdf 6B
PlaneDQN-master
saved_networks
checkpoint 91B
network-dqn-20000.meta 91KB
network-dqn-20000.index 1KB
network-dqn-20000.data-00000-of-00001 13.72MB
game
plane.py 8KB
shoot.png 453KB
BrainDQN_Nature.py 7KB
PlaneDQN.py 1KB
共 10 条
- 1
资源评论
- 2301_798839582024-06-17资源有一定的参考价值,与资源描述一致,很实用,能够借鉴的部分挺多的,值得下载。
枫蜜柚子茶
- 粉丝: 8966
- 资源: 5351
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功