如何使用 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]))
我无法测试这一切是否有效,但这就是我的想法
我通过 sample
和 shuffle
从 random
做到了。
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 行和 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]))
我无法测试这一切是否有效,但这就是我的想法
我通过 sample
和 shuffle
从 random
做到了。
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()