150+⾏Python代码实现带界⾯的数独游戏!益智烧脑了解⼀
下!
150⾏代码实现图形化数独游戏
,欢迎各位⼤佬们fork、star啥的,感谢;
今天闲着没事⼲,以前做过html+js版的数独,这次做个python版本的,界⾯由pygame完成,数独⽣成由递归算法实现,由shuffle保证每次游戏都是不⼀样的情况,have fun;
功能列表:
图形化的数独游戏;
python实现,依赖pygame库;
随机⽣成游戏,每次运⾏都不⼀样;
数字填⼊后的正确性判断以及颜⾊提⽰;
显⽰剩余需填⼊的空格,已经操作的次数;
难度可选,通过修改需要填⼊的空的数量;
游戏界⾯
初始界⾯
过程中界⾯
运⾏⽅式
python main.py 15
gettickcount 溢出这⾥的15表⽰需要填⼊的空格数量为15,理论上这个值越⼤,难度就越⾼,⼤家可以随机调整,或者设置容易、简单、困难、地狱等对应不同的值即可,很⽅便修改;
程序分析
界⾯部分
这部分很简单的通过pygame来实现,主要使⽤了其中的主循环、⿏标键盘监听、画矩形线条、字体、颜⾊控制等,理解起来很容易,对于这部分不太熟悉的同学,这样理解就好: pygame的主循环中⼀⽅⾯负责接收⽤户输⼊,⼀般就是⿏标和键盘,另⼀⽅⾯负责实时更新界⾯显⽰内容;
对于界⾯上各部分内容的绘制的函数封装
# 绘制背景部分,这⾥就是9*9的九宫格
def draw_background():
# white background
screen.fill(COLORS['white'])
# draw game board
(screen,COLORS['black'],(0,0,300,900),5)
(screen,COLORS['black'],(300,0,300,900),5)
(screen,COLORS['black'],(600,0,300,900),5)
(screen,COLORS['black'],(0,0,900,300),5)
(screen,COLORS['black'],(0,300,900,300),5)
(screen,COLORS['black'],(0,600,900,300),5)
# 将⽤户选中的各⾃背景改为蓝⾊块表⽰选中
def draw_choose():
(screen,COLORS['blue'],(cur_j*100+5,cur_i*100+5,100-10,100-10),0)
# 绘制九宫格中的数字,包括本来就有的,以及⽤户填⼊的,本来就在的⽤灰⾊,⽤户填⼊的如何合法则为绿⾊,否则为红⾊,是⼀种提⽰def draw_number():
for i in range(len(MATRIX)):
for j in range(len(MATRIX[0])):
_color = check_color(MATRIX,i,j) if (i,j) in BLANK_IJ else COLORS['gray']
txt = der(str(MATRIX[i][j] if MATRIX[i][j] not in [0,'0'] else ''),True,_color)
x,y = j*100+30,i*100+10
screen.blit(txt,(x,y))
# 绘制最下⽅的当前空格⼦数量以及⽤户的操作数量
def draw_context():
txt = der('Blank:'+str(cur_blank_size)+' Change:'+str(cur_change_size),True,COLORS['black'])
x,y = 10,900
screen.blit(txt,(x,y))
主循环中对上述函数的调⽤以及⿏标键盘事件处理
# 主循环,负责监听⿏标键盘时间,以及刷新界⾯内容,以及检查是否赢得了游戏
running = True
while running:
for event in ():
pe == pygame.QUIT:
running = False
break
pe == pygame.MOUSEBUTTONDOWN:
cur_j,cur_i = int(event.pos[0]/100),int(event.pos[1]/100)
pe == pe == pygame.KEYUP:
if chr(event.key) in ['1','2','3','4','5','6','7','8','9'] and (cur_i,cur_j) in BLANK_IJ:
MATRIX[cur_i][cur_j] = 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
# background
draw_background()
# choose item
draw_choose()
# numbers
draw_number()
# point
draw_context()
# flip
pygame.display.flip()
# check win or not
if check_win(MATRIX_ANSWER,MATRIX):
print('You win, smarty ass')
break
pygame.quit()
⽣成表⽰数独的⼆维数组
相对于界⾯部分,这部分在逻辑上要难⼀些,思路以递归为核⼼,辅以随机性,得到⼀个每次⽣成都不⼀致的数独游戏,⽣成思路简单描述如下:
1. 遍历每个空格,填⼊⽬前为⽌合法的数字;
2. 如果有数字可以填⼊,则继续向下⼀个空格;
3. 如果没有数字可以填⼊,表⽰之前的数字有问题,则结束递归;
4. 当递归到最后⼀个格⼦的下⼀个时,表⽰已经⽣成完毕,返回即可;
5. 这个过程中对1~9这九个数字的遍历数字会经过shuffle处理,保证随机性⽽不是每次都得到同⼀个合法的数独数组;
⽣成过程代码
递归的⼀个优势是通常代码都很短,当然阅读性不强,欢迎⼤佬们改为循环;
def shuffle_number(_list):
cocos2dx tableview滚动事件监听random.shuffle(_list)
return _list
def check(matrix,i,j,number):
if number in matrix[i]:
return False
if number in [row[j] for row in matrix]:
return False
group_i,group_j = int(i/3),int(j/3)
if number in [matrix[i][j] for i in range(group_i*3,(group_i+1)*3) for j in range(group_j*3,(group_j+1)*3)]: return False
return True
def build_game(matrix,i,j,number):
if i>8 or j>8:
return matrix
if check(matrix,i,j,number):
_matrix = [[col for col in row] for row in matrix]
_matrix[i][j] = number
next_i,next_j = (i+1,0) if j==8 else (i,j+1)
for _number in shuffle_number(number_list):
mooc是什么意思__matrix = build_game(_matrix,next_i,next_j,_number)
if __matrix and sum([sum(row) for row in __matrix])==(sum(range(1,10))*9):
return __matrix
return None
随机覆盖数独数组中的N个位置
python基础代码100例matrix_all表⽰整个数独数组
matrix_blank表⽰部分被替换为0的⽤于显⽰的数组
blank_ij表⽰被覆盖位置的i和j
def give_me_a_game(blank_size=9):
matrix_all = build_game(matrix,0,0,random.choice(number_list))
set_ij = set()
while len(list(set_ij))<blank_size:
php如何嵌入到htmlset_ij.add(str(random.choice([0,1,2,3,4,5,6,7,8]))+','+str(random.choice([0,1,2,3,4,5,6,7,8])))
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))
jquery button clickmatrix_blank[i][j] = 0
return matrix_all,matrix_blank,blank_ij
最后附上全部代码
⼤家也可以直接从我的 fork下来直接运⾏;
main.py:主流程+界⾯+执⾏
import sys
import pygame
lor import THECOLORS as COLORS
from build import print_matrix,give_me_a_game,check
def draw_background():
# white background
screen.fill(COLORS['white'])
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论