我可能会先让网格易于使用。以这段代码为例:
grid_width = 6
grid_height = 6
grid_dimensions_product = (grid_width * grid_height)
if grid_dimensions_product % 2 != 0:
raise ValueError("Product of grid dimensions must be divisible by two!")
number_of_pairs = grid_dimensions_product // 2
print(f"For a {grid_width}x{grid_height} grid, you'll have {number_of_pairs} pairs.")
输出:
For a 6x6 grid, you'll have 18 pairs.
通过这样的设置,我们可以随时更改网格的尺寸,以便为游戏引入更多多样性。对的数量将即时计算,这是可取的,因为我们不喜欢硬编码。但是,网格尺寸必须始终相乘才能产生可被 2 整除的乘积。这是一个要求,因为否则我们可能会得到足够的对(网格上没有匹配对的位置) - 例如,一个 5 x 5 的网格将有 12 个对,所以总共只有 24 个数字。这就是 if 语句存在的原因。这是相同的代码,但网格尺寸无效:
grid_width = 5
grid_height = 5
grid_dimensions_product = (grid_width * grid_height)
if grid_dimensions_product % 2 != 0:
raise ValueError("Product of grid dimensions must be divisible by two!")
number_of_pairs = grid_dimensions_product // 2
print(f"For a {grid_width}x{grid_height} grid, you'll have {number_of_pairs} pairs.")
输出:
ValueError: Product of grid dimensions must be divisible by two!
一旦我们有了number_of_pairs,我们就可以生成一个隐藏数字列表,稍后我们将使用它来填充我们的网格:
hidden_numbers = list(range(1, number_of_pairs + 1)) * 2
print(hidden_numbers)
请记住,range 是专有的。如果我们想要包含 1-18 的数字,我们必须在我们范围的唯一末尾添加 +1。我们将范围变成一个列表,然后将列表乘以 2,这样我们就得到了 1-18 的数字,两次:
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
现在,我们必须洗牌隐藏的数字。在代码的顶部,写:
from random import shuffle
导入shuffle 函数。它接受一个列表作为参数,并在适当的位置打乱其内容。
hidden_numbers = list(range(1, number_of_pairs + 1)) * 2
shuffle(hidden_numbers)
hidden_number_iter = iter(hidden_numbers)
grid = []
# Generate the grid
for y in range(grid_height):
row = [next(hidden_number_iter) for x in range(grid_width)]
grid.append(row)
# Print the grid
for y in range(grid_height):
print(grid[y])
洗牌后,我们创建了 hidden_numbers 列表的迭代器。这将使我们能够轻松地从我们的洗牌列表中获取“下一个”隐藏号码。如果您不熟悉迭代器,这里有一个迭代器行为的简单示例:
>>> my_list = ["A", "B", "C"]
>>> my_list_iterator = iter(my_list)
>>> next(my_list_iterator)
'A'
>>> next(my_list_iterator)
'B'
>>> next(my_list_iterator)
'C'
>>> next(my_list_iterator)
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
next(my_list_iterator)
StopIteration
>>>
当我们最终打印出我们的网格时,它看起来像这样:
[9, 1, 2, 14, 18, 8]
[15, 4, 3, 16, 16, 2]
[12, 11, 6, 1, 17, 13]
[17, 7, 5, 5, 13, 4]
[6, 12, 10, 14, 18, 7]
[3, 15, 10, 9, 11, 8]
每次您重新启动脚本时,您的隐藏号码列表都会以不同的顺序出现。这是整个脚本:
from random import shuffle
grid_width = 6
grid_height = 6
grid_dimensions_product = (grid_width * grid_height)
if grid_dimensions_product % 2 != 0:
raise ValueError("Product of grid dimensions must be divisible by two!")
number_of_pairs = grid_dimensions_product // 2
hidden_numbers = list(range(1, number_of_pairs + 1)) * 2
shuffle(hidden_numbers)
hidden_number_iter = iter(hidden_numbers)
grid = []
# Generate the grid
for y in range(grid_height):
row = [next(hidden_number_iter) for x in range(grid_width)]
grid.append(row)
# Print the grid
for y in range(grid_height):
print(grid[y])