简单实现python数独游戏
网上看到一个python写的数独,很好玩,分享给大家。
importrandom
importitertools
fromcopyimportdeepcopy
defmake_board(m=3):
numbers=list(range(1,m**2+1))
board=None
whileboardisNone:
board=attempt_board(m,numbers)
returnboard
defattempt_board(m,numbers):
n=m**2
board=[[Nonefor_inrange(n)]for_inrange(n)]
fori,jinitertools.product(range(n),repeat=2):
i0,j0=i-i%m,j-j%m
random.shuffle(numbers)
forxinnumbers:
if(xnotinboard[i])andall(row[j]!=xforrowinboard)andall(xnotinrow[j0:j0+m]forrowinboard[i0:i]):
board[i][j]=x
break
else:
returnNone
returnboard
defprint_board(board,m=3):
numbers=list(range(1,m**2+1))
omit=5
challange=deepcopy(board)
fori,jinitertools.product(range(omit),range(m**2)):
x=random.choice(numbers)-1
challange[x][j]=None
spacer="++---+---+---++---+---+---++---+---+---++"
print(spacer.replace('-','='))
fori,lineinenumerate(challange):
print("||{0}|{1}|{2}||{3}|{4}|{5}||{6}|{7}|{8}||".format(*(cellor''forcellinline)))
if(i+1)%3==0:
print(spacer.replace('-','='))
else:
print(spacer)
returnchallange
defprint_answer(board):
spacer="++---+---+---++---+---+---++---+---+---++"
print(spacer.replace('-','='))
fori,lineinenumerate(board):
print("||{0}|{1}|{2}||{3}|{4}|{5}||{6}|{7}|{8}||".format(*(cellor''forcellinline)))
if(i+1)%3==0:
print(spacer.replace('-','='))
else:
print(spacer)
defis_full(challange,m=3):
fori,jinitertools.product(range(m**2),repeat=2):
ifchallange[i][j]isNone:
returnFalse
returnTrue
defcal_candidate(challange,x,y,m=3):
candidate=range(1,m**2+1)
foriinrange(m**2):
ifchallange[x][i]incandidate:
candidate.remove(challange[x][i])
ifchallange[i][y]incandidate:
candidate.remove(challange[i][y])
fori,jinitertools.product(range(m),repeat=2):
x0,y0=x-x%m,y-y%m
ifchallange[x0+i][y0+j]incandidate:
candidate.remove(challange[x0+i][y0+j])
returncandidate
defleast_candidate(challange,m=3):
least,x,y=m**2,-1,-1
fori,jinitertools.product(range(m**2),repeat=2):
ifnotchallange[i][j]:
num=len(cal_candidate(challange,i,j))
ifnum
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。