【问题标题】:How do I randomly generate an element across a 5x10 grid of arrays in Python?如何在 Python 中的 5x10 数组网格中随机生成一个元素?
【发布时间】:2022-01-10 15:14:21
【问题描述】:

所以我正在开发一个类似于 pacman 的简单的基于文本的游戏,其中字母“c”充当玩家使用用户输入控制的角色。在 5x10 网格中,应在全板上随机生成 10 个由“o”表示的“硬币”。另一方面,网格由符号“-”组成。

玩家图标和硬币应该是随机生成的。

我为一行代码编写了一个简单的解决方案,我从列表中随机弹出一个元素,并采用相同的索引并插入一个硬币。代码如下:

array=['-','-','-','-','-','-','-','-','-','-',]
separator = ' '

def pop():
    pos = random.randint(0,9)
    return pos

array.pop(pop())
array.insert(pop(), 'o')
print (separator.join(array))

现在我只需要把它做成一个 5x10 的网格。问题是,我不知道如何在 5 行数组中随机插入 11 个元素(10 个硬币和玩家图标)。救命!

【问题讨论】:

    标签: python arrays


    【解决方案1】:

    所以,首先我们将使用宽度为 5 和高度为 10 的列表生成一个二维数组:

    import random
    
    w, h = 5, 10
    two_d_array = [['-' for x in range(w)] for y in range(h)]
    

    接下来,因为您希望随机放置这些项目而不选择两次相同的位置,所以我们希望生成一个没有重复值的随机样本:

    samples = random.sample(range(w * h), 10)
    

    然后,对于这些样本值中的每一个,我们将取样本值的整数值除以宽度,并通过将样本的余数除以宽度来获得列值。并替换为您想要的值。

    for s in samples:
        row = int(s/w)
        column = s % w
        two_d_array[row][column] = 'o'
    

    【讨论】:

    • 您好,感谢您的回答!这很好用!虽然它有 TypeError: expected str instance, list 在尝试打印 two_d_array 时首先找到,所以我这样做了:for grid in two_d_array: print(separator.join(grid))
    【解决方案2】:

    而不是使用您的自定义 pop() 函数两次:

    array.pop(pop()) 
    array.insert(pop(), 'o')
    

    你可以使用:

    index = pop()
    array.pop(index)
    array.insert(index, 'o')
    

    或者更好的解决方案是:

    index = pop()
    array[index] = 'o'
    

    random.sample()

    import numpy as np
    from random import sample
    
    indexes = list(range(50))
    chosen = sample(indexes, k=11)
    
    grid = np.array(["-"] * 50)
    
    grid[chosen[0]] = "c"
    for i in range(10):
        grid[chosen[i+1]] = "o"
    
    grid = grid.reshape((5, 10))
    print(grid)
    

    k=11 表示 1 个字符 (c) 和 10 个硬币 (o)

    【讨论】:

    • 感谢您的回答!!!我怎样才能在 5 个数组中应用它?
    • 我首先想到的是使用 random.sample ,它为您提供列表中的样本并保证样本的所有元素都是不同的。我将使用代码编辑我的答案。
    • 效果很好,谢谢!不过,我想索引所有单个硬币和角色。这是因为我希望玩家能够移动角色并抓住每个单独的硬币。我正在考虑弹出每个单独的硬币,但我不知道如何索引每个打印的硬币元素。
    • 字符和硬币的索引在chosen。但如果你想要坐标,你可以使用除法和模运算,如Troy D's answer中所示
    猜你喜欢
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2016-04-27
    相关资源
    最近更新 更多