我想要创建一个图形用户界面使用pySimpleGUI,类似于杀手数独游戏。对于那些不熟悉Killer sudoku的人来说,它类似于普通的Sudoku,但也有一种额外的复杂性,即不仅有9个3x3框,其中数字1-9必须在每帧、列和行中精确地使用一次,而且还有笼子。这些笼子有一个数字,指定笼子里所有的数字必须加在一起。在笼子里也不能重复任何数字。下面是一个例子,说明其中一个板是什么样子。
正如你所看到的,我不仅需要一个框架来勾勒每一个3x3,还需要一个框架为每个笼子在板上。当笼子同时处于列和行(L形)时,问题就出现了。pySimpleGUI有能力像这款sudoku游戏所需要的那样,设计出异常的形状吗?
谢谢你的帮助
发布于 2021-12-29 04:31:36
演示如何在下面的示例脚本中在sg.Graph上绘制板,当然,这里绘制的不是所有
还有很多工作要做,以实现您的杀手数独游戏。
import PySimpleGUI as sg
class Sudoku():
def __init__(self):
# Use monospaced font here
self.columns = 9
self.blocks = 3
self.bg = 'green'
self.line_width = (1, 3, 6)
self.line_color = ("black", "black", 'grey')
self.number_color = ("white", "yellow")
self.font0 = ("Courier New", 20, 'bold')
self.font1 = ("Courier New", 12)
self.w0, self.h0 = self.char_size(self.font0)
self.w1, self.h1 = self.char_size(self.font1)
self.pad = 8
w = self.w0 + 2 * (self.w1 + 2 * self.pad)
h = self.h0 + 2 * self.pad
self.cell_width = max(w, h)
self.width = (self.cell_width * self.columns + 2 * self.line_width[2])
self.size = (self.width, self.width)
self.numbers0, self.numbers1 = [], []
def char_size(self, font):
root = sg.tk.Tk()
size = (sg.tk.font.Font(font=font).measure("W"),
sg.tk.font.Font(font=font).metrics('linespace'))
root.destroy()
return size
def draw_board1(self, element):
delta = self.columns * self.cell_width
for i in range(self.columns+1):
x = self.line_width[2] + i * self.cell_width
x0, x1 = self.line_width[2], self.line_width[2] + delta
y = self.line_width[2] + i * self.cell_width
y0, y1 = self.line_width[2], self.line_width[2] + delta
element.draw_line((x0, y), (x1, y), color=self.line_color[0],
width=self.line_width[0])
element.draw_line((x, y0), (x, y1), color=self.line_color[0],
width=self.line_width[0])
def draw_board2(self, element):
delta = self.columns * self.cell_width
for i in range(self.blocks+1):
x = self.line_width[2] + 3 * i * self.cell_width
x0, x1 = self.line_width[2], self.line_width[2] + delta
y = self.line_width[2] + 3 * i * self.cell_width
y0, y1 = self.line_width[2], self.line_width[2] + delta
element.draw_line((x0, y), (x1, y), color=self.line_color[1],
width=self.line_width[1])
element.draw_line((x, y0), (x, y1), color=self.line_color[1],
width=self.line_width[1])
def draw_number0(self, element, data):
if self.numbers0:
element.Widget.delete(*self.numbers)
self.numbers0 = []
offset_x = self.line_width[2] + self.cell_width//2
offset_y = self.cell_width*self.columns + self.line_width[2] - self.cell_width//2
for row in range(self.columns):
for col in range(self.columns):
item = element.draw_text(str(data[row][col]),
(offset_x + self.cell_width * col, offset_y - self.cell_width * row),
font=self.font0, color=self.number_color[0])
self.numbers0.append(item)
def draw_number1(self, element, data):
if self.numbers1:
element.Widget.delete(*self.numbers)
self.numbers1 = []
offset_x = self.line_width[2] + self.pad + self.w1
offset_y = self.cell_width*self.columns + self.line_width[2] - self.pad - self.h1//2
for row, col, number in data:
item = element.draw_text(str(number),
(offset_x + self.cell_width * col, offset_y - self.cell_width * row), font=self.font1,
color=self.number_color[1])
self.numbers1.append(item)
s = Sudoku()
data0 = list(map(list, [
"739541286", "168923457", "245687139", "973862541", "512374968",
"684195372", "421738695", "397256814", "856419723"]))
data1 = [
(0, 0, 11), (0, 2, 17), (0, 3, 9), (0, 5, 3), (0, 7, 19),
(1, 1, 15), (1, 3, 11), (1, 5, 10), (1,6, 10), (1,8, 16),
(2, 0, 16), (2, 3, 14), (2, 4, 16), (2, 7, 8),
(3, 1, 8), (3, 2, 5),
(4, 3, 14), (4, 6, 12), (4, 7, 13), (4, 8, 15),
(5, 0, 16), (5, 2, 12), (5, 3, 13), (5, 5, 13),
(6, 0, 7), (6, 3, 9), (6, 6, 16),
(7, 1, 22), (7, 4, 11), (7, 6, 15), (7, 8, 9),
(8, 2, 10), (8, 4, 10),
]
layout = [
[sg.Graph(s.size, (0, 0), s.size, background_color=s.bg, key='GRAPH',
enable_events=True)],
]
window = sg.Window("Killer Sudoku", layout, margins=(0, 0), finalize=True)
graph = window['GRAPH']
s.draw_board1(graph)
s.draw_board2(graph)
s.draw_number0(graph, data0)
s.draw_number1(graph, data1)
while True:
event, values = window.read()
if event in (sg.WINDOW_CLOSED, 'Exit'):
break
print(event, values)
window.close()

https://stackoverflow.com/questions/70510063
复制相似问题