first commit

main
debuling 6 months ago
parent bdaee88f4c
commit de899c50f2

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

@ -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,22 @@
# Sudoku 基于python实现的数独小游戏
简单的python小游戏可作为大学本科python课程的课程设计
环境python 3.9
所需的包tkinter/pygame等详见requirement.txt文件
主体包括游戏矩阵基于选择难度的随机生成GUI绘制的游戏界面游戏规则的判定逻辑输入设备与图形用户界面的交互。
存在一些粗糙的bug没有完善例如
1选择难度后需要关闭选择界面游戏界面才会出现
2偶发的键盘数字区输入没办法处理需要使用字母区上面的数字才能输入
3tkinter的界面冲突
4选择大师难度后极偶发的游戏无解状况
A simple python game that can be used as a course design for undergraduate python courses
Environment: python 3.9
Required packages: tkinter/pygame, etc., see requirement.txt file for details
The main body includes: the random generation of the game matrix based on the selected difficulty, the game interface drawn by the GUI, the decision logic of the game rules, and the interaction between the input device and the graphical user interface.
There are some rough bugs that are not perfected, such as
(1) After selecting the difficulty, you need to close the selection interface, and the game interface will appear
(2) The occasional input in the numeric area of the keyboard cannot be handled, and you need to use the numbers on the alphabet area to enter
(3) tkinter interface conflict
(4) The very occasional game unsolvable situation after selecting the master difficulty

@ -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…
Cancel
Save