【问题标题】:Python Adding Unknown Values to ListsPython 向列表中添加未知值
【发布时间】:2017-02-07 18:34:15
【问题描述】:

我做了一个寻宝游戏,我需要它,以便一旦一个包含宝箱的方格被访问 3 次,它就会变成一个“强盗”。 为了计算一个宝箱被访问的次数,我在 TreasureChestCoordinates 列表中添加了另外很多相同的坐标。然后我计划有一个 if 语句,这样如果任何坐标被写入 3 次,所有 3 个将被删除并放入“强盗”列表中。 这是该部分的代码草案:

            # Treasure Chests Collecting Coins #
        if (x,y) in TreasureCoords[0:(TCNumber -1)]:
            print("You have landed on a treasure chest! You can visit it 2 more times before it becomes a bandit.")
            CoinCollection = CoinCollection + 10
            TreasureCoords.append(x,y)

        #if TreasureCoords.count(any item) > 3:
            #remove all copies of item from list
            #add item to bandit list

x,y 表示用户当前所在的坐标。CoinCollection 是一个单独的变量,当用户降落在宝箱或强盗上时会发生变化。顺便说一下,坐标的数量是无限的,因为用户之前就已经决定了在游戏里。 那么,我怎样才能复制我的坐标列表,一旦它们在列表中 3 次就删除它们并将它们放入新列表中?我想这是最简单的方法来“计算”用户在一个方格上的次数,并将宝箱变成一个强盗。

【问题讨论】:

  • 不,这听起来像是一种不必要的复杂方式。只保留从坐标到访问次数的映射会更简单。
  • 另外,您在列表中拥有的坐标数量不能是“无限的”,因为您没有无限的内存......
  • 抱歉只是想说明我的观点 - 你可能会说我不是一个特别高级的编码器......你的解决方案如何工作?

标签: python list


【解决方案1】:

首先...您不需要在列表中搜索 任何 坐标存在三次。那很浪费。如果一旦发生这种情况就删除它们,那么唯一可能出现 3 次的坐标就是您刚刚访问过的坐标。

如果您真的想要按照您的问题所示进行操作,只需执行while (x,y) in TreasureCoords: TreasureCoords.remove((x,y)) 之类的操作即可。但是,使用dict 可能会更容易。您甚至可以避免使用单独的变量。假设ItemCoords 最初填充了代表未访问过的宝箱的坐标:

ItemCoords[(x,y)] = 0 # add a treasure

...那么你可以看看宝藏被访问了多少次:

visits = ItemCoords.get((x,y), None)
if visits is None:
    pass # nothing there
else if visits > 3:
    fightBandit() # ...or whatever
else:
    print("You have landed on a treasure chest! You can visit it %i more times before it becomes a bandit." % (2 - visits))
    CoinCollection += 10
    ItemCoords[(x,y)] += 1

这仍然很简单。正如 Christian 所暗示的,您可能想要一种更加面向对象的方法:

class Treasure:
    def __init__(x,y):
        self.x = x
        self.y = y
        self.visits = 0

    def visit():
        print("You have landed on a treasure chest! You can visit it %i more times before it becomes a bandit." % (2 - visits))    
        CoinCollection += 10

        if visits == 3:
            world[(self.x, self.y)] = Bandit(self.x, self.y)

class Bandit:
    def __init__(x,y):
        self.x = x
        self.y = y

    def visit():
        # Replace this with whatever happens when the player meets a bandit
        print("You have been eaten by a grue.")
        sys.exit(0)

# Initialize the world
for n in range(NumberOfTreasure):
    # get x,y somehow, e.g. random
    world[(x,y)] = Treasure(x,y)

# ...code for player wandering around...
here = world.get((x,y), None)
if here is not None:
    here.visit()

【讨论】:

  • 我实现了您的第一个代码,并将 itemCoords 更改为 TreasureCoords,这是存储所有宝箱坐标的列表名称。但是当我玩游戏时,出现了这个错误“TreasureCoords[(x,y)] = 0 TypeError: list indices must be integers, not tuple”你能帮忙/你知道这是什么意思吗?
  • 您可能已将TreasureCoords 初始化为= [],这使其成为list。我修改后的代码使用了dict,所以你需要像= {}= dict()一样初始化它。
  • 好的。这是否意味着我也需要将所有其他列表更改为字典?我是否需要更改其他任何内容,或者使用字典是否一切都一样?
  • 这取决于你如何使用它们; list 是……嗯,一个列表。它有项目,它们按某种顺序排列,您可以通过索引访问它们。 dict 是一张地图。一般来说,地图可能会也可能不会按任何特定顺序显示它们的项目,但每个项目都有一个关联的键,您可以通过键查找项目。在这种情况下,关键是项目在世界中的位置。
  • 目前,我的 TreasureCoords 和 BanditCoords 是列表,因为它们都有“A”个 X 坐标值和“B”个 Y 坐标值来确定它们的位置。通过将它们更改为字典,我认为这不会有好处,因为我必须确定一个键 - 并且由于(当前)列表中的值的数量是由用户设置的,这可能非常复杂。你有什么建议?您的第二个代码将很难实现到我当前的代码中,所以我宁愿不使用它。
【解决方案2】:

我认为这是一个对象将是有益的情况 - 与其使用关于同一事物的事实来跟踪单独的列表,不如使用存储所有相关信息的对象列表。

可能是这样的:

class Monster(object):
    #define like you like it
    pass

class Treasure(object):
   def init(x, y):
      self.x = x
      self.y = y
      self.visits = 0

    def visit():
        self.visits += 1

        if self.visits >= 3:
            return Monster()
        else:
            return 10


calling code:
    treasure = Treasure(1,1)
    rv = treasure.visit()
    if isinstance(rv, Monster):
        # lets the monster rip him to shreds
    else:
        CoinCollection +=treasure.visit()

【讨论】:

  • 在不知道有多少宝箱的情况下,我还能使用那个代码吗?用户在代码的其他地方设置宝箱的数量。
  • 当然 - 您必须创建一个类似长度的珍宝列表。老实说,这是你的软件课程试图教给你的关键技能——如何构建一个由模块化部件组成的大型程序,这些模块协同工作以实现目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
相关资源
最近更新 更多