parent
bdaee88f4c
commit
de899c50f2
@ -0,0 +1,3 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
@ -0,0 +1 @@
|
|||||||
|
SHUDU.py
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="PYTHON_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$" />
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
@ -0,0 +1,6 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<settings>
|
||||||
|
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||||
|
<version value="1.0" />
|
||||||
|
</settings>
|
||||||
|
</component>
|
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" />
|
||||||
|
</project>
|
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/Sudoku-main.iml" filepath="$PROJECT_DIR$/.idea/Sudoku-main.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
@ -0,0 +1,171 @@
|
|||||||
|
import random
|
||||||
|
from tkinter.messagebox import showinfo
|
||||||
|
import pygame
|
||||||
|
from pygame.color import THECOLORS as COLORS
|
||||||
|
from tkinter import *
|
||||||
|
|
||||||
|
|
||||||
|
class BUILAGAME():
|
||||||
|
def __init__(self, matrix):
|
||||||
|
self.matrix = matrix
|
||||||
|
|
||||||
|
def PrintMatrix(matrix):
|
||||||
|
print('—'*19)
|
||||||
|
for row in matrix:
|
||||||
|
print('|'+' '.join([str(col) for col in row])+'|')
|
||||||
|
print('—'*19)
|
||||||
|
|
||||||
|
|
||||||
|
def ShuffleNumber(AnyList):
|
||||||
|
random.shuffle(AnyList)
|
||||||
|
return AnyList
|
||||||
|
|
||||||
|
|
||||||
|
def Check(matrix, i, j, number):
|
||||||
|
if number in matrix[i]:
|
||||||
|
return False
|
||||||
|
if number in [row[j] for row in matrix]:
|
||||||
|
return False
|
||||||
|
pratI, pratJ = int(i/3), int(j/3)
|
||||||
|
if number in [matrix[i][j] for i in range(pratI*3, (pratI+1)*3) for j in range(pratJ*3, (pratJ+1)*3)]:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def BuildMap(matrix, i, j, number):
|
||||||
|
if i > 8 or j > 8:
|
||||||
|
return matrix
|
||||||
|
if BUILAGAME.Check(matrix, i, j, number):
|
||||||
|
mattrix_no1 = [[col for col in row] for row in matrix]
|
||||||
|
mattrix_no1[i][j] = number
|
||||||
|
next_i,next_j = (i+1, 0) if j == 8 else (i, j+1)
|
||||||
|
for number2 in BUILAGAME.ShuffleNumber(number_list):
|
||||||
|
mattrix_no2 = BUILAGAME.BuildMap(mattrix_no1, next_i, next_j, number2)
|
||||||
|
if mattrix_no2 and sum([sum(row) for row in mattrix_no2]) == (sum(range(1, 10))*9):
|
||||||
|
return mattrix_no2
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def PreaGame(blank_size=9):
|
||||||
|
matrix_all = BUILAGAME.BuildMap(matrix, 0, 0, random.choice(number_list))
|
||||||
|
set_ij = set()
|
||||||
|
while len(list(set_ij)) < blank_size:
|
||||||
|
templist = [0, 1, 2, 3, 4, 5, 6, 7, 8]
|
||||||
|
set_ij.add(str(random.choice(templist))+','+str(random.choice(templist)))
|
||||||
|
matrix_blank = [[col for col in row] for row in matrix_all]
|
||||||
|
blank_ij = []
|
||||||
|
for ij in list(set_ij):
|
||||||
|
i,j = int(ij.split(',')[0]),int(ij.split(',')[1])
|
||||||
|
blank_ij.append((i, j))
|
||||||
|
matrix_blank[i][j] = 0
|
||||||
|
return matrix_all, matrix_blank, blank_ij
|
||||||
|
|
||||||
|
|
||||||
|
def DrawBG():
|
||||||
|
BG_COLOR = (40, 40, 60) # 背景色(黑蓝)
|
||||||
|
screen.fill(BG_COLOR)
|
||||||
|
pygame.display.set_caption('数独游戏')
|
||||||
|
pygame.draw.rect(screen, COLORS['black'], (0, 0, 200, 600), 3)#画出九宫格
|
||||||
|
pygame.draw.rect(screen, COLORS['black'], (200, 0, 200, 600), 3)
|
||||||
|
pygame.draw.rect(screen, COLORS['black'], (400, 0, 200, 600), 3)
|
||||||
|
pygame.draw.rect(screen, COLORS['black'], (0, 0, 600, 200), 3)
|
||||||
|
pygame.draw.rect(screen, COLORS['black'], (0, 200, 600, 200), 3)
|
||||||
|
pygame.draw.rect(screen, COLORS['black'], (0, 400, 600, 200), 3)
|
||||||
|
|
||||||
|
|
||||||
|
def DrawChoose():
|
||||||
|
BLOCK_COLOR = (129, 216, 208) #选中方块颜色(蒂凡尼蓝)
|
||||||
|
pygame.draw.rect(screen, BLOCK_COLOR, (curJ * 66 + 5, curI * 66 + 5, 66 - 6, 66 - 6), 0)
|
||||||
|
|
||||||
|
|
||||||
|
def WinorNot(matrix_all, matrix):
|
||||||
|
if matrix_all == matrix:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def CheckColor(matrix, i, j):
|
||||||
|
mattrix_no1 = [[col for col in row] for row in matrix]
|
||||||
|
mattrix_no1[i][j] = 0
|
||||||
|
if BUILAGAME.Check(mattrix_no1, i, j, matrix[i][j]):
|
||||||
|
return COLORS['green']
|
||||||
|
return COLORS['red']
|
||||||
|
|
||||||
|
|
||||||
|
def DrawNum():
|
||||||
|
for i in range(len(MATRIX)):
|
||||||
|
for j in range(len(MATRIX[0])):
|
||||||
|
_color = CheckColor(MATRIX, i, j) if (i, j) in BLANK_IJ else COLORS['gray']
|
||||||
|
txt = font80.render(str(MATRIX[i][j] if MATRIX[i][j] not in [0, '0'] else ''), True, _color)
|
||||||
|
x, y = j * 66 + 20, i * 66 + 6 #字体占据大小
|
||||||
|
screen.blit(txt, (x, y))
|
||||||
|
|
||||||
|
|
||||||
|
def DrawContext():
|
||||||
|
txt = font100.render('Blank:' + str(cur_blank_size) + ' Change:' + str(cur_change_size), True, COLORS['white'])
|
||||||
|
x, y = 10, 600
|
||||||
|
screen.blit(txt, (x, y))
|
||||||
|
|
||||||
|
def level(number):
|
||||||
|
global cur_blank_size
|
||||||
|
cur_blank_size = number
|
||||||
|
return
|
||||||
|
|
||||||
|
def startgame():
|
||||||
|
root = Tk();
|
||||||
|
root.title("数独游戏")
|
||||||
|
Label(root, text="欢迎来到数独游戏,请选择难度").place(x=60, y=1)
|
||||||
|
root.geometry("300x120")
|
||||||
|
button0 = Button(root, text="简单", width=8, command=lambda: level(10))
|
||||||
|
button1 = Button(root, text="一般", width=8, command=lambda: level(25))
|
||||||
|
button2 = Button(root, text="困难", width=8, command=lambda: level(35))
|
||||||
|
button3 = Button(root, text="大师", width=8, command=lambda: level(64))
|
||||||
|
button0.place(x=10, y=40)
|
||||||
|
button1.place(x=80, y=40)
|
||||||
|
button2.place(x=150, y=40)
|
||||||
|
button3.place(x=220, y=40)
|
||||||
|
mainloop()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
pygame.init()
|
||||||
|
cur_blank_size = 10
|
||||||
|
startgame()
|
||||||
|
number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||||
|
matrix = [([0] * 9) for i in range(9)]
|
||||||
|
SIZE = [600, 700]#窗口尺寸
|
||||||
|
font80 = pygame.font.SysFont('Times', 50)#字体大小
|
||||||
|
font100 = pygame.font.SysFont('Times', 50)
|
||||||
|
|
||||||
|
screen = pygame.display.set_mode(SIZE)
|
||||||
|
|
||||||
|
curI, curJ = 0, 0
|
||||||
|
cur_change_size = 0
|
||||||
|
|
||||||
|
# matrix abount
|
||||||
|
MATRIX_ANSWER, MATRIX, BLANK_IJ = BUILAGAME.PreaGame(blank_size=cur_blank_size)
|
||||||
|
print(BLANK_IJ)
|
||||||
|
BUILAGAME.PrintMatrix(MATRIX)
|
||||||
|
|
||||||
|
running = True
|
||||||
|
while running:
|
||||||
|
for event in pygame.event.get():
|
||||||
|
if event.type == pygame.QUIT:
|
||||||
|
running = False
|
||||||
|
break
|
||||||
|
elif event.type == pygame.MOUSEBUTTONDOWN:
|
||||||
|
curJ, curI = int(event.pos[0] / 66), int(event.pos[1] / 66)
|
||||||
|
elif event.type == event.type == pygame.KEYUP:
|
||||||
|
if chr(event.key) in ['1', '2', '3', '4', '5', '6', '7', '8', '9'] and (curI, curJ) in BLANK_IJ:
|
||||||
|
MATRIX[curI][curJ] = int(chr(event.key))
|
||||||
|
cur_blank_size = sum([1 if col == 0 or col == '0' else 0 for row in MATRIX for col in row])
|
||||||
|
cur_change_size += 1
|
||||||
|
DrawBG()
|
||||||
|
DrawChoose()
|
||||||
|
DrawNum()
|
||||||
|
DrawContext()
|
||||||
|
pygame.display.flip()
|
||||||
|
if WinorNot(MATRIX_ANSWER, MATRIX):
|
||||||
|
showinfo(title="Game end", message="You win, well done!")
|
||||||
|
break
|
||||||
|
pygame.quit()
|
@ -0,0 +1,5 @@
|
|||||||
|
import random
|
||||||
|
from tkinter.messagebox import showinfo
|
||||||
|
import pygame
|
||||||
|
from pygame.color import THECOLORS as COLORS
|
||||||
|
from tkinter import *
|
Loading…
Reference in new issue