【2022】人工智能——Wumpus世界(py3.7: pygame实现)

慈云数据 1年前 (2024-03-31) 技术支持 80 0

目录

一、Wumpus世界简介

1. Wumpus世界

2. 问题定义

a. 性能度量

b. 环境

c. 执行器

d. 传感器

3. 环境情况

4. 主要困难

5. Agent对环境的探索过程

 二、Wumpus世界设计原理

1. 实验环境

2. 设计思想

① 单人游戏部分采用pygame模块:

计算机自行游戏采用强化学习DQN算法

3. 操作说明

键盘

鼠标

4. 游戏特色

三、Wumpus世界实验代码

1. world.py

Object类 

Room类

World类

get_random_location()函数

2. env1.0.py

四、Wumpus世界游戏过程视频展示


一、Wumpus世界简介

1. Wumpus世界

Wumpus世界是由多个房间组成并相连接起来的山洞;

  •         某处隐藏着一只Wumpus怪兽,会吃掉进入它房间的任何人;
  •         Agent可以射杀Wumpus,但只有一支箭;
  •         某些房间是无底洞,任何人进入这些房间会被无底洞吞噬;

    生活在该环境的唯一希望是发现一堆金子。

    2. 问题定义

    a. 性能度量

            带着金子爬出洞口+1000;掉入无底洞或被Wumpus吃掉-1000;采取一个行动-1;用掉箭-10;Agent死亡或Agent出洞,游戏结束。

    b. 环境

            4*4的房间网格。Agent从(1,1)出发,面向右方。金子和Wumpus、无底洞随机选择在除了起始方格的任一方格;

    c. 执行器

            Agent可以向前、左转、右转。可以捡起所处方格内的物体;可以向正对方向射箭;箭向前运动直到击中Wumpus;Agent只能从(1,1)中爬出。

    d. 传感器

            有5个传感器[臭气,微风,金光,撞击,嚎叫]

    3. 环境情况

            离散的、静态的、单个Agent、部分可观察的

    4. 主要困难

            需要找出无底洞和Wumpus,需要推理

    5. Agent对环境的探索过程

    可以参考:

    【互动游戏】通过你缜密的推理,你能完成恶魔的游戏获得新生吗?_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV147411u7So/?spm_id_from=333.337.search-card.all.click&vd_source=d77c96856e5ee7c666f69b5d4c4b6df0

     二、Wumpus世界设计原理

    1. 实验环境

    • IDE: Pycharm + anaconda
    • python:3. 7.12
    • 所需的库及版本:

      pytorch

      1.13.0

      pygame

      2.1.2

      numpy

      1.18.5

      2. 设计思想

      ① 单人游戏部分采用pygame模块:

              World.py包含房间的各种操作,其中无底洞、黄金、怪兽位置随机生成且不在入口处;        

              Env.py(调用World.py)为游戏的整体架构,包含各种游戏操作函数。

      ② 计算机自行游戏采用强化学习DQN算法

              强化学习DQN算法奖励机制设计:

      采取一个行动    -1
      带着金子爬出洞口+1000

      掉入无底洞、Wumpus吃掉-1000

      射箭                                             

        -10

              注:为了节省计算资源,加快训练速度,不将图片输入到网络,只将位置信息(hero、PIT、GOLD、WUMPUS),即输入层共(1+PIT_COUNT +GOLD_COUNT+ WUMPUS_COUNT)神经元

      3. 操作说明

      键盘

              向上箭头:向上移动                      W:向上射箭

              向下箭头:向下移动                      S:向下射箭

              向左箭头:向左移动                      A:向左射箭

              向右箭头:向右移动                      D:向右射箭

      鼠标

              点击洞穴(0,0)位置退出洞穴

      4. 游戏特色

      • 具有游戏难度选择功能,设置了四个难度等级
      • 可以自定义房间、怪兽、金堆、无底洞的数量
      • 具有修改游戏界面以及怪兽、英雄皮肤功能

        三、Wumpus世界实验代码

        1. world.py

        Object类 

                怪兽、金堆等游戏元素的可视化图片。它包含了加载图片、修改尺寸和设置位置等功能。

        class Object(pygame.sprite.Sprite):  # 怪兽、金堆、无底洞等各种可视化图片
            def __init__(self, filename, location, size=150):
                # 调父类来初始化子类
                pygame.sprite.Sprite.__init__(self)
                # 加载图片并修改尺寸为size*size
                self.image = pygame.image.load(filename).convert()
                self.image = pygame.transform.smoothscale(self.image, (size, size))
                self.rect = self.image.get_rect()       # 获取图片位置
                self.rect.topleft = location            # 设置位置

        Room类

                代表迷宫的房间,具有不同的状态,如臭气、微风、无底洞、金堆和怪兽等。通过设置不同的状态,可以改变房间的显示。

        World类

                主要逻辑部分:它定义了迷宫的大小、无底洞、金堆、怪兽和箭的数量。通过调用set()函数,可以设置不同位置的无底洞、金堆和怪兽。shoot()函数用于射杀怪兽。set_breeze_around()和set_stench_around()函数分别用于设置周围房间的微风和臭气状态。

        get_random_location()函数

              生成随机的位置坐标。它确保生成的位置不会重复,并且不会生成在迷宫入口处(0,0)。返回包含指定数量的不重复随机位置列表:

        def get_random_location(screen_width, screen_height, size, count=1):  # 返回不重复、随机的二维数据列表, 且不包含(0 ,0),共count个元组
            # random.randrange(self, start, self.stop=None, step=1, _int=int)从指定范围内按指定基数递增的集合中获取一个随机数
            loc_list = []
            while len(loc_list)  
         
        

        2. env1.0.py

        待补充

        四、Wumpus世界游戏过程视频展示

        Wumpus World游戏操作展示

微信扫一扫加客服

微信扫一扫加客服