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

目录

一、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) < count:
        x, y = 0, 0
        while x == 0 and y == 0:  # 入口(0,0)处不能有任何物体
            x = random.randrange(0, screen_width, size)
            y = random.randrange(0, screen_height, size)
        loc = (x, y)
        if loc not in loc_list:
            loc_list.append(loc)
    return loc_list

2. env1.0.py

待补充

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

Wumpus World游戏操作展示

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
Wumpus 世界是一个经典的 AI 游戏场景,玩家需要控制一个智能体在地图中寻找黄金,同时避免遭遇危险的 Wumpus 和陷阱。下面是一个简单的 Python 代码可以实现 Wumpus 世界的搭建: ```python import random class WumpusWorld: def __init__(self, size=4): self.size = size self.grid = [[0 for j in range(size)] for i in range(size)] self.agent_pos = (0, 0) self.gold_pos = (0, 0) self.wumpus_pos = (0, 0) self.pit_pos = [] # 随机放置黄金、Wumpus 和陷阱 self.place_gold() self.place_wumpus() self.place_pits() def place_gold(self): self.gold_pos = self.random_pos() self.grid[self.gold_pos[0]][self.gold_pos[1]] = 1 def place_wumpus(self): self.wumpus_pos = self.random_pos() self.grid[self.wumpus_pos[0]][self.wumpus_pos[1]] = 2 def place_pits(self): for i in range(self.size): for j in range(self.size): if (i, j) != self.agent_pos and (i, j) != self.gold_pos and (i, j) != self.wumpus_pos: if random.random() < 0.2: self.grid[i][j] = 3 self.pit_pos.append((i, j)) def random_pos(self): return (random.randint(0, self.size-1), random.randint(0, self.size-1)) def move_agent(self, action): if action == "up": if self.agent_pos[0] > 0: self.agent_pos = (self.agent_pos[0]-1, self.agent_pos[1]) elif action == "down": if self.agent_pos[0] < self.size-1: self.agent_pos = (self.agent_pos[0]+1, self.agent_pos[1]) elif action == "left": if self.agent_pos[1] > 0: self.agent_pos = (self.agent_pos[0], self.agent_pos[1]-1) elif action == "right": if self.agent_pos[1] < self.size-1: self.agent_pos = (self.agent_pos[0], self.agent_pos[1]+1) if self.agent_pos == self.wumpus_pos: return -10 # 被 Wumpus 攻击,游戏失败 elif self.agent_pos in self.pit_pos: return -10 # 掉入陷阱,游戏失败 elif self.agent_pos == self.gold_pos: return 10 # 找到黄金,游戏胜利 else: return -1 # 继续探索 def print_world(self): for i in range(self.size): for j in range(self.size): if (i, j) == self.agent_pos: print("A", end=" ") elif (i, j) == self.gold_pos: print("G", end=" ") elif (i, j) == self.wumpus_pos: print("W", end=" ") elif (i, j) in self.pit_pos: print("P", end=" ") else: print("-", end=" ") print() ``` 在这个代码中,我们定义了一个 `WumpusWorld` 类来表示 Wumpus 世界。类中包含了世界的地图信息 `grid`,智能体的位置 `agent_pos`,黄金的位置 `gold_pos`,Wumpus 的位置 `wumpus_pos`,和陷阱的位置 `pit_pos`。在初始化函数中,我们首先创建一个空的地图,然后随机放置黄金、Wumpus 和陷阱。在移动智能体时,我们检查智能体的移动是否合法,并根据移动结果返回相应的奖励值。最后,我们还定义了一个 `print_world()` 函数用于打印地图信息,方便玩家观察游戏状态。 你可以通过以下代码来测试 Wumpus 世界的代码: ```python world = WumpusWorld() world.print_world() while True: action = input("Enter your action (up/down/left/right): ") reward = world.move_agent(action) world.print_world() print("Reward:", reward) if reward == 10 or reward == -10: break ``` 在这个代码中,我们首先创建一个新的 Wumpus 世界,然后开始一个循环,每次循环中等待玩家输入一个移动指令,并根据指令移动智能体,打印地图和奖励,直到游戏结束为止。你可以通过运行这个代码来体验 Wumpus 世界的游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QomolangmaH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值