如何使用 PySimpleGUI 将值随机放入 100 个按钮中的 10 个?

How do I randomly place value into 10 buttons out of 100 using PySimpleGUI?

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

你可以对棋盘上的每个方块都这样做,它会给你一个 1 或 0。

我一直在尝试让它随机 select 网格上的 10 个按钮,并在 10 个“选择的方块”中随机分配 1,000 点(一个方块可能有 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()

要在 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]))

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

我通过 sampleshufflerandom 做到了。

from random import sample, shuffle
import PySimpleGUI as sg

def generate_data(rows, cols):
    v = sorted(sample(list(range(1, 1000)), 9))+[1000]
    data = [v[0]] + [v[i]-v[i-1] for i in range(1, 10)]+[0]*(rows*cols-10)
    shuffle(data)
    return data

sg.theme("DarkBlue3")
sg.set_options(font=("Courier New", 12))

MAX_ROWS = MAX_COL = 10
data = generate_data(MAX_ROWS, MAX_COL)
layout = [
    [sg.Button(' ', size=(4,2), key=(i,j)) for j in range(MAX_COL)] for i in range(MAX_ROWS)] + [
    [sg.Text(f"Total {0:>4d}", size=(10, 1), key='SUM')]]
window = sg.Window('Mining GUI', layout)
count = 0
selected = set()
total = 0
while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED:
        break
    elif isinstance(event, tuple):
        if event in selected:
            continue
        selected.add(event)
        i, j = event
        v = data[i*MAX_ROWS+j]
        window[event].update(text=str(v), button_color=('white', 'black'))
        count += 1
        total += v
        window['SUM'].update(value=f"Total {total:>4d}")

window.close()