当前位置: 首页 > 知识库问答 >
问题:

使用随机文本文件中的字典链接房间-冒险游戏

梁新觉
2023-03-14

我目前正在创建一个冒险游戏,你通过输入命令(北,南)通过一个地牢的房间移动。所以我试图用字典把每个房间连接在一起,这样我就可以用“北”、“南”等键来移动这些房间。但我似乎不明白。有什么想法吗?

共有1个答案

罗祺
2023-03-14

你的想法有几个优点和缺点:

如果你想要一个经典的“类似流氓的”移动(在一个带有某种瓦片的2d网格中),你将在图形地牢表示方面遇到很多问题(实际上你现在正在使用图形)。让我们看看这个地牢:

ROOM1 > ROOM2 > NORTH
ROOM2 > ROOM3 > NORTH
ROOM3 > ROOM1 > NORTH

你会有一个房间戒指。它不好,但你可以做类似的事情:

ROOM1 > ROOM2 > NORTH
ROOM1 > ROOM2 > SOUTH

这真的很让人困惑,因为你可以朝不同的方向移动,去一个房间。为了通过设计防止这些情况,您可以将您的地下城表示为一个公平的二维网格,如下所示:

rooms_mask = [
    [0,1,0,0,1],
    [1,1,1,0,1],
    [0,0,1,1,1],
    [1,1,1,0,0],
    [1,0,0,0,0]
]

您的操作将仅从当前位置的x或y坐标添加或细分1。下面是简单的示例代码:

class Room(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __str__(self):
        if self.y < 3:
            return 'It is a dark and gloomy room: ({}, {})'.format(self.x, self.y)
        else:
            return 'It is a light and shining room: ({}, {})'.format(self.x, self.y)

rooms_mask = [
    [0,1,0,0,1],
    [1,1,1,0,1],
    [0,0,1,1,1],
    [1,1,1,0,0],
    [1,0,0,0,0]
]

rooms = [[Room(j, i) for j, _ in enumerate(rm)] for i, rm in enumerate(rooms_mask)]

x = 2
y = 2

while True:
    action = input()
    if action == 'q':
        break
    elif action == 'n':
        if y > 0 and rooms_mask[y-1][x] == 1:
            y -= 1
            print(rooms[y][x])
    elif action == 's':
        if y < len(rooms_mask) - 1 and rooms_mask[y+1][x] == 1:
            y += 1
            print(rooms[y][x])
    elif action == 'e':
        if x < len(rooms[0]) - 1 and rooms_mask[y][x+1] == 1:
            x += 1
            print(rooms[y][x])
    elif action == 'w':
        if x > 0 and rooms_mask[y][x-1] == 1:
            x -= 1
            print(rooms[y][x])

但是如果你真的想把你的地下城表示成图形,你可以使用下面的代码:

from collections import defaultdict

raw_rooms = [
    [1,2,'n'],
    [2,3,'w'],
    [1,4,'s']
]

rooms = defaultdict(list)

for source, target, direction in raw_rooms:
    rooms[source].append([target, direction])

current_room = 1

while True:
    action = input()
    if action == 'q':
        break
    else:
        for target, direction in rooms[current_room]:
            if direction == action:
                print('I am in room {}'.format(target))
                current_room = target

代码使用defaultdicts存储房间图形。您还可以使用networkx使用真实图形并使用它们。

 类似资料:
  • 在我的游戏中有几个类我写过,包括房间,灯,胸,爪哇,玩家,钥匙和地图。这些都经过了测试,并且是正确的,所以现在我正在编写我的adventure类,它是程序的驱动程序。我需要设置球员的房间位置[0][0],但我不知道怎么做。这是我到目前为止在我的房间和冒险课。

  • 我正在为一个C项目做一个冒险游戏。目标基本上是拥有一组由类定义的房间。然后使用地图将它们链接在一起。除了检查是否没有房间和确保没有为空房间接受输入之外,我的一切都正常工作。例如,它会说“那里什么都没有”,然后重新提示用户移动的方向。当前,如果某个方向上没有空间,并且选择了该方向,我的程序就会崩溃。我现在已经设置好了它,至少确保输入了一个有效的方向(北、南、东或西),但它没有检查这个方向是否可用。有

  • 所以我是Java编码的新手,我对C#有很好的经验,我知道它们非常相似。我目前正在通过创建一个文本冒险游戏来处理Java,游戏使用案例(案例1、案例2、默认等),目前我正在开发一个保存和加载功能,但我不知道如何保存一个使用案例来进一步编码的分支游戏,有人有什么想法吗?

  • 问题内容: 我对Java中的一些中间概念还很陌生。最近,我制作了一款名为DazzleQuest的文字冒险游戏,该游戏完全在开发者控制台/终端中运行。它以我的朋友为角色,因此我想向他们展示它,并通过将命令行和控制台的输出功能转移到一个简单的Swing界面(包括一个用于显示游戏输出的a和一个带有,处理来自用户的命令。 我的主类包含名为和的方法,我认为我需要将其与我的类及其子类[扩展] 集成在一起。 总

  • 我正在Java制作一个基于文本的冒险游戏。我需要让用户能够拿起物品并将其放入库存中,但我不确定如何做到! 这是我的项目当前的设置方式: 我需要能够在某些房间里有特定的物品。有人有什么建议吗?

  • 您好,我是新来的编码和创建一个基于文本的游戏在python中。我正在写代码从一个房间搬到另一个房间。我需要一些人帮我清理目前为止所做的事情。我运行了一个即时反馈程序,得到了以下提示,但不确定如何纠正: 大厅字符串是主字典中的一个关键字。修改代码,使其不是主字典中的关键字。 它说它不能分类我的代码(不确定那是什么意思) 将多个打印命令合并到一个函数中 使用非复杂条件使条件更简单 更好地练习在True