IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【强化学习】手把手教你实现游戏通关AI(1)——游戏界面实现 -> 正文阅读

[人工智能]【强化学习】手把手教你实现游戏通关AI(1)——游戏界面实现

系列文章目录

在本系列文章中笔者将手把手带领大家实现基于强化学习的通关类小游戏,笔者将考虑多种方案,让角色顺利通关。

【强化学习】手把手教你实现游戏通关AI(1)——游戏界面实现



游戏界面展示

在本游戏中,笔者将游戏界面抽象成带有颜色的方格,游戏的目标就是让AI学习一条从起点到终点的最优路径。

  • 红色——主角
  • 绿色——终点
  • 紫色——障碍物(怪兽)
  • 灰色——墙
    在这里插入图片描述

界面代码

game.py

import pygame
import sys
import time
monster = [33, 37]
start_position = 97
step = 50
target = 4  # 目标位置
# 107是为了防止在初始位置往下走
wall = [107, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 19, 29, 39, 49, 59, 69, 79, 89, 99, 91, 92, 93, 94, 95, 96, 98]
kill_wait_time = 2
is_killed = False


class Mygame():
    def __init__(self):
        super(Mygame, self).__init__()
        self.action_space = ['u', 'd', 'l', 'r']
        self.n_actions = len(self.action_space)
        # self.title("Q-learning shoot game")
        self.size = width, height = 500, 500  # 设置窗口大小
        self.screen = pygame.display.set_mode(self.size)  # 显示窗口
        # clock = pygame.time.Clock()  # 设置时钟
        self.background_color = (255, 255, 255)  # 设置颜色
        self.person = start_position
        self.monster = [33, 37]
        self.draw_map()

    def draw_map(self):
        """
        :param person:当前人的位置
        :param monster: 当前怪兽的位置
        :return:
        """
        # width、height已经给出
        rect = [0] * 110
        self.screen.fill(self.background_color)  # 填充颜色(设置为0,执不执行这行代码都一样)
        for i in range(10):
            for j in range(10):
                curr_rect = 10 * i + j
                if target == curr_rect:
                    # 绿色表示终点
                    rect[curr_rect] = pygame.draw.rect(self.screen, (0, 228, 0), ((j * step, i * step), (step, step)), width=0)
                elif curr_rect in wall:
                    # 灰色表示墙
                    rect[curr_rect] = pygame.draw.rect(self.screen, (192, 192, 192), ((j * step, i * step), (step, step)), width=0)
                elif curr_rect == self.person:
                    # 红色表示人
                    rect[curr_rect] = pygame.draw.rect(self.screen, (192, 0, 0), ((j * step, i * step), (step, step)), width=0)
                elif curr_rect in monster:
                    # 画出怪兽
                    rect[curr_rect] = pygame.draw.rect(self.screen, (138, 43, 226), ((j * step, i * step), (step, step)), width=0)
                else:
                    # 其余填充白色
                    rect[curr_rect] = pygame.draw.rect(self.screen, (255, 228, 181), ((j * step, i * step), (step, step)), width=1)
        pygame.display.update()

    def judge_win(self):
        """
        如果人到达终点, 则胜利
        :return: True or False
        """
        if self.person == target and is_killed == True:
            return True
        else:
            return False

    def reset(self):
        self.person = 97
        self.monster = [33, 37]
        print(self.person)
        return self.person, self.monster

    def judge_collision(self, temp_person):
        """判断人是否碰撞到墙或怪物"""
        if temp_person in wall or temp_person in monster or temp_person < 0:
            return True
        else:
            return False

    def kill_monster(person, monster, time):
        """
        人静止两秒且怪物在攻击范围内才能杀死怪物
        人的攻击范围是:
        :param person:人当前的位置
        :param monster: 怪兽当前的位置
        :return: 返回怪兽坐标, 如果杀死怪兽了返回[-1, -1]
        """
        if time < kill_wait_time:
            # print("time short")A
            # 攻击时间小于两秒直接返回, 杀不死怪兽
            return monster
        attack_area = [person-1, person-2, person-3, person, person + 1, person+2, person + 3,\
                   person-13, person-12, person - 11, person - 10, person - 9, person - 8, person -7,\
                   person-23, person-22, person - 21, person - 20, person - 19, person - 18, person -17,\
                   person+13, person+12, person + 11, person + 10, person + 9, person + 8, person + 7]
        if monster[0] in attack_area and monster[1] in attack_area:
            print("kill monster!")
            return [-1, -1]
        else:
            return monster

        # 走一步(机器人实施 action)

    def step(self, action):
        # s状态
        s = self.person

        # 移动机器人, 直接更新下一个state
        if action == 0:  # 上
            s_ = s - 10
            is_collision = self.judge_collision(s_)
            if is_collision:
                s_ = s
        elif action == 1:  # 下
            s_ = s + 10
            is_collision = self.judge_collision(s_)
            if is_collision:
                s_ = s

        elif action == 2:  # 右
            s_ = s + 1
            is_collision = self.judge_collision(s_)
            if is_collision:
                s_ = s

        elif action == 3:  # 左
            s_ = s - 1
            is_collision = self.judge_collision(s_)
            if is_collision:
                s_ = s

        # 奖励机制
        if s_ == target:
            # 通关,奖励为 1
            reward = 1
            done = True
            # 终止
            s_ = 'terminal'
            print("通关,好棒!")
        elif s_ in monster:
            # 碰到障碍物,奖励为 -1
            reward = -1
            done = True
            # 终止
            s_ = 'terminal'
            print("Fight with monster!")
        else:
            # 其他格子,没有奖励
            reward = 0
            # 非终止
            done = False
        return s_, reward, done

界面代码解析

定义一个游戏类,类中包含游戏行为action,游戏窗口大小,游戏方格颜色等参数。

step函数

  • step函数——负责更新状态以及获得奖励。执行action后先判断是否能碰撞,不会碰撞玩家才能进行移动。如果下一个状态s_是目标(绿色格子),获得奖励reward=1。 如果下一个状态s_是障碍物reward = -1,其余状态下reward = 0。

draw_map函数

根据当前人的位置、障碍物、怪兽、目标的位置画出界面。
界面上的每个方格对应了一个数字如图所示,初始化110个格子,当然,由于界面的大小设计的是10*10,因此,没有让100以后的格子显示出来。107设为墙的意思是防止玩家在初始位置就向下移动。
在这里插入图片描述

上述代码中我们定义了一个list用于记录墙的位置,一个list用于记录怪兽的位置:

wall = [107, 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 19, 29, 39, 49, 59, 69, 79, 89, 99, 91, 92, 93, 94, 95, 96, 98]
monster = [33, 37]

总结

本文先讲述了基于pygame的通关游戏界面实现。下文中,我们将介绍采用强化学习Q-learning算法实现AI的自动通关。

  人工智能 最新文章
Convolutional Color Consistency 文献阅读
python 三次样条曲线(cubic)的自己实现
【numpy】【解决】ValueError: axes don‘t
ML-Agents案例之金字塔
asdadf
tensorflow矩阵初始化
torch网络展示
YOLOv2论文笔记
集成学习-stacking
飞桨第一课 7.26 笔记
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:20:38  更:2021-08-08 11:20:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
360图书馆 购物 三丰科技 阅读网 日历 万年历 2021年12日历 -2021/12/4 22:59:36-
图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码