首页 > 解决方案 > 如何使用 PySimpleGUI 将值随机放入 100 个按钮中的 10 个?

问题描述

所以我目前正在尝试创建一个简单的游戏,但我无法提出解决方案。游戏设置就像扫雷一样。它有 10 行和 10 列,所以有 100 个块(按钮)。现在,当您使用 PySimpleGUI 运行此程序时,板会出现,但是当您单击一个正方形时,该正方形上会显示 1 或 0。

你可以对板上的每个盒子都这样做,它会给你一个 1 或 0。

我一直试图让它随机选择网格上的 10 个按钮,并在 10 个“选择的正方形”中随机划分 1000 个点(一个正方形可能有 3 个点,另一个可能有 700 个点)。

我正在尝试创建一个简单的小“彩票”游戏,并使其成为玩家获得 10 次选秀权以找到尽可能多的积分的地方。

我不知道这是否有意义,但如果是这样,任何建议将不胜感激!如果您需要更多信息,请告诉我。

MAX_ROWS = MAX_COL = 10

board = [[randint(0,1) for j in range(MAX_COL)] for i in range(MAX_ROWS)]

layout = [[sg.Button('#', size=(4,2), key=(i,j)) for j in range(MAX_COL)] for i in range(MAX_ROWS)]

window = sg.Window('Mining GUI', layout)

# create the event loop: 

while True: 
    event, values = window.read()
        if event in (sg.WIN_CLOSED, 'Exit'):
            break
    
        


# window[(row, col)].update('New Text') # to change a button's text, use this pattern
# for this example, change the text of the button to the board's value and turn color black
window[event].update(board[event[0]][event[1]], button_color=('white', 'black')) window.close()

标签: pythonpysimplegui

解决方案


要在 10 个值之间随机分配 1000 个点,您可以执行以下操作:

这种方法很简单,但在统计上并不正确(第一个生成的值可能非常大,剩下的 9 个将留下很少的分数)。

bank = 1000
n_chosen = 10
chosen_scores = []
for i in range(bank):
    chosen_scores.append(randint(0, bank))
    bank -= chose_scores[-1]

这种方法更公平

bank = 1000
n_chosen = 10
bank_indices = list(range(bank+1))
chosen_indices = random.choices(bank_indices, k=n_chosen)
chosen_indices.sort()
chosen_scores = [chosen_indices[0]]
for i in range(1, n_chosen):
    chosen_scores.append(chosen_scores[i] - chose_scores[i - 1])

之后chosen_scores,您需要指定哪些按钮将获得相应的分数。我会做最简单的,但可以做得更好

board_indices = [(i, j) for i in range(MAX_COL) for j in range(MAX_ROWS)]
chosen_button_indices = random.choices(board_indices , k=n_chosen)
for i in range(n_chosen):
    window[chosen_button_indices[i]].update(str(chosen_scores[i]))

我无法测试这一切是否有效,但这就是想法


推荐阅读