【问题标题】:Insert value at random place in 2D list在二维列表中的随机位置插入值
【发布时间】:2018-10-02 02:47:25
【问题描述】:

我正在尝试使用 python 中的列表制作扫雷游戏。到目前为止我有这个代码:

import random as r
import sys

#dimension of board and number of bombs
width = int(sys.argv[1])
height = int(sys.argv[2])
b = int(sys.argv[3])

#creates the board
board = [[0.0] * width] * height

#places bombs
for i in range(b):
    x = r.randint(0, width - 1)
    y = r.randint(0, height - 1)
    board.insert(x, y, 0.1)

#prints board
for i in range(len(board)):
    for j in range(len(board[i]))
        print(board[i][j], end=" ")

我试图将炸弹放置在板上的随机位置,但insert() 只接受 2 个参数。有没有其他方法可以做到这一点?

我有一个想法,在第 1 行放置一个随机炸弹,然后在第 2 行放置一个随机炸弹,依此类推,一旦它击中第 n 行,它就会循环回到第 1 行,直到放置了足够的炸弹,但我不确定它是否会起作用(而且我无法测试它,因为我也知道如何做到这一点)。我觉得这个解决方案效率很低,所以我也想知道是否有更有效的方法来做到这一点。

【问题讨论】:

    标签: python list 2d minesweeper


    【解决方案1】:

    使用赋值而不是插入: board[x][y] = 0.1.

    另外,请小心初始化您的 2D 板。 board = [[0.0] * width] * height 将创建一个大小为width 的列表,然后将为所有height 复制指向该列表的指针,即如果您将0.1 分配给第一行中的第一个单元格board[0][0] 中的第一项每一行都会被分配,因为它们都是同一个列表。你必须改为使用

       board = [[0.0]*width for _ in range(height)]
    

    【讨论】:

      【解决方案2】:

      您可以只使用board[x][y] = 0.1 来访问您的董事会x 行中的索引y。此外,您不想构建这样的电路板。您这样做的方式实际上只会创建 1 个带有数字的数组。这是您的代码,经过一些修改。

      import random as r
      
      # dimension of board and number of bombs
      # (I'm using hard coded values as an example)
      width = 5
      height = 7
      b = 10
      
      #creates the board
      board = []
      for i in range(height): # create a new array for every row
          board.append([0.0] * width)
      
      #places bombs
      for i in range(b):
          x = r.randint(0, height - 1)
          y = r.randint(0, width - 1)
          board[x][y] = 0.1 # this is how you place a bomb at a random coordinate
      
      #prints board
      for row in board:
          print(row)
      

      我的结果板看起来像:

      [0.0, 0.0, 0.1, 0.0, 0.0]                                                                                                                        
      [0.0, 0.0, 0.0, 0.0, 0.0]                                                                                                                        
      [0.0, 0.0, 0.0, 0.0, 0.0]                                                                                                                        
      [0.1, 0.0, 0.1, 0.0, 0.1]                                                                                                                        
      [0.1, 0.0, 0.0, 0.0, 0.1]                                                                                                                        
      [0.0, 0.1, 0.0, 0.0, 0.1]                                                                                                                        
      [0.0, 0.1, 0.0, 0.0, 0.0]
      

      请注意,如果随机 x 和 y 值重复,您最终可能会得到少于 b 的炸弹。这是接下来要解决的好问题。

      【讨论】:

        【解决方案3】:

        我们正在处理列表列表。如果我们运行你的板初始化代码并修改板值如下:

        >>> width = 2; height = 3
        >>> board = [[0.0] * width] * height
        >>> print board
        [[0.0, 0.0], [0.0, 0.0], [0.0, 0.0]]
        >>> x = 0; y = 1; board[y][x] = 1.1
        >>> print board
        [[1.1, 0.0], [1.1, 0.0], [1.1, 0.0]]
        

        我们看到我们的修改出现在三个地方。这是因为我们放置了相同的列表 ([0.0] * width) height 次。正确执行此操作的一种方法是 board = [[0.0] * width for _ in range(3)]。请参考Two dimensional array in python

        由于我们使用列表的列表,为 x 和 y 插入元素 0.1 的一种方法是使用 insert 将 board[y].insert(x, 0.1)。但我觉得你想做的是 board[y][x]=0.1。

        对于放置炸弹,你描述的可以这样实现:

        n = <the number of bombs>
        for i in xrange(n):
            x = i % width  # x will iterate over 0 to width
            y = r.randint(0, height - 1)
            # insert bomb
        

        干杯,

        【讨论】:

          猜你喜欢
          • 2020-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-28
          • 2014-02-14
          • 1970-01-01
          • 1970-01-01
          • 2014-07-23
          相关资源
          最近更新 更多