如何使用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()

我通过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()

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

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

最新更新