生成类似Candy-Crush的游戏的初始游戏板

时间:2019-12-05 13:08:02

标签: python algorithm numpy matrix

我需要实现一个功能, 返回满足以下要求的6 x 6矩阵:

  • 黑板上的36个数字必须是9个,9个2、9个三和9个四分
  • 任何行或列都不得包含3个或更多具有相同编号的直接邻居
  • 函数返回值不能为常量
  • 显然,不允许使用预先计算的答案

正确答案:

    [[3, 2, 4, 1, 3, 2],
    [2, 2, 1, 1, 4, 4],
    [4, 4, 1, 3, 3, 2],
    [4, 1, 3, 2, 2, 4],
    [3, 1, 2, 4, 3, 1],
    [3, 3, 1, 1, 2, 4]]

   [[3, 3, 1, 2, 2, 4],
    [1, 1, 3, 3, 2, 4],
    [4, 4, 2, 1, 1, 3],
    [2, 2, 3, 4, 4, 1],
    [4, 4, 1, 1, 2, 2],
    [3, 1, 2, 3, 3, 4]]

错误答案:

    [[3, 3, 3, 2, 2, 4],
    [1, 1, 1, 3, 2, 4],
    [4, 4, 2, 1, 1, 3],
    [2, 2, 3, 4, 4, 1],
    [4, 4, 1, 1, 2, 2],
    [3, 1, 2, 3, 3, 4]]

   [[3, 3, 1, 2, 2, 4],
    [1, 1, 2, 3, 2, 4],
    [4, 4, 1, 1, 2, 3],
    [2, 2, 3, 4, 4, 1],
    [4, 4, 1, 1, 2, 2],
    [3, 1, 2, 3, 3, 4]]

不必太担心学术时间/空间的复杂性。更加关注工程学的观点。有什么好主意吗?

2 个答案:

答案 0 :(得分:1)

这应该有效。请注意,该解决方案只是生成一个随机的棋盘,检查条件是否成立,否则,生成另一个不是最好的解决方案。

代码:

from random import shuffle

def check_board(board):
    for row in board:
        if check_list(row):
            return False
    for i in range(len(board[0])):
        col = [row[i] for row in board]
        if check_list(col):
            return False
    return True

def check_list(lst):
    return any(lst[i]==lst[i+1] and lst[i]==lst[i+2] for i in range(len(lst)-2))

board = [[]]

while check_board(board):
    board = [1,2,3,4]*9
    shuffle(board)
    board = [board[i:i + 6] for i in range(0, len(board), 6)]

print(board)

生成示例板:

[[3, 2, 4, 3, 3, 2],
 [1, 1, 2, 3, 1, 3],
 [1, 3, 3, 2, 2, 2],
 [4, 4, 1, 4, 1, 2],
 [1, 1, 4, 4, 2, 4],
 [2, 4, 4, 3, 3, 1]]

[[2, 3, 4, 1, 4, 1],
 [3, 4, 1, 1, 3, 4],
 [3, 1, 4, 1, 3, 4],
 [3, 4, 2, 4, 2, 1],
 [2, 1, 4, 2, 3, 2],
 [2, 2, 1, 3, 3, 2]]

答案 1 :(得分:0)

  1. 创建一个大小为36的数组,并使用所需的值填充它=> [1,1,1 .... 4,4,4]

  2. 应用Fisher-Yates随机播放以在O(n)中创建该数组的排列

  3. 检查“连续3个”规则,如果需要则交换一个随机值,再次检查直到网格中没有该值。