diff --git a/Sudoku-main/.idea/.gitignore b/Sudoku-main/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/Sudoku-main/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/Sudoku-main/.idea/.name b/Sudoku-main/.idea/.name new file mode 100644 index 0000000..a55dc4d --- /dev/null +++ b/Sudoku-main/.idea/.name @@ -0,0 +1 @@ +SHUDU.py \ No newline at end of file diff --git a/Sudoku-main/.idea/Sudoku-main.iml b/Sudoku-main/.idea/Sudoku-main.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/Sudoku-main/.idea/Sudoku-main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Sudoku-main/.idea/inspectionProfiles/profiles_settings.xml b/Sudoku-main/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/Sudoku-main/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/Sudoku-main/.idea/misc.xml b/Sudoku-main/.idea/misc.xml new file mode 100644 index 0000000..a971a2c --- /dev/null +++ b/Sudoku-main/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Sudoku-main/.idea/modules.xml b/Sudoku-main/.idea/modules.xml new file mode 100644 index 0000000..377ea3a --- /dev/null +++ b/Sudoku-main/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Sudoku-main/Sudoku-main/README.md b/Sudoku-main/Sudoku-main/README.md new file mode 100644 index 0000000..b14f359 --- /dev/null +++ b/Sudoku-main/Sudoku-main/README.md @@ -0,0 +1,22 @@ +# Sudoku 基于python实现的数独小游戏 +简单的python小游戏,可作为大学本科python课程的课程设计 +环境:python 3.9 +所需的包:tkinter/pygame等,详见requirement.txt文件 + +主体包括:游戏矩阵基于选择难度的随机生成,GUI绘制的游戏界面,游戏规则的判定逻辑,输入设备与图形用户界面的交互。 +存在一些粗糙的bug没有完善,例如 +(1)选择难度后需要关闭选择界面,游戏界面才会出现 +(2)偶发的键盘数字区输入没办法处理,需要使用字母区上面的数字才能输入 +(3)tkinter的界面冲突 +(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 diff --git a/Sudoku-main/Sudoku-main/SHUDU.py b/Sudoku-main/Sudoku-main/SHUDU.py new file mode 100644 index 0000000..39f6c97 --- /dev/null +++ b/Sudoku-main/Sudoku-main/SHUDU.py @@ -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() \ No newline at end of file diff --git a/Sudoku-main/Sudoku-main/requirements.txt b/Sudoku-main/Sudoku-main/requirements.txt new file mode 100644 index 0000000..841c3e7 --- /dev/null +++ b/Sudoku-main/Sudoku-main/requirements.txt @@ -0,0 +1,5 @@ +import random +from tkinter.messagebox import showinfo +import pygame +from pygame.color import THECOLORS as COLORS +from tkinter import *