日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

150行Python代碼實現帶界面的數獨游戲

瀏覽:105日期:2022-07-31 08:52:25

今天閑著沒事干,以前做過html+js版的數獨,這次做個python版本的,界面由pygame完成,數獨生成由遞歸算法實現,由shuffle保證每次游戲都是不一樣的情況,have fun;

功能列表:

圖形化的數獨游戲; python實現,依賴pygame庫; 隨機生成游戲,每次運行都不一樣; 數字填入后的正確性判斷以及顏色提示; 顯示剩余需填入的空格,已經操作的次數; 難度可選,通過修改需要填入的空的數量;

游戲界面

初始界面

150行Python代碼實現帶界面的數獨游戲

過程中界面

150行Python代碼實現帶界面的數獨游戲

運行方式

python main.py 15

這里的15表示需要填入的空格數量為15,理論上這個值越大,難度就越高,大家可以隨機調整,或者設置容易、簡單、困難、地獄等對應不同的值即可,很方便修改;

程序分析

界面部分

這部分很簡單的通過pygame來實現,主要使用了其中的主循環、鼠標鍵盤監聽、畫矩形線條、字體、顏色控制等,理解起來很容易,對于這部分不太熟悉的同學,這樣理解就好: pygame的主循環中一方面負責接收用戶輸入,一般就是鼠標和鍵盤,另一方面負責實時更新界面顯示內容 ;

對于界面上各部分內容的繪制的函數封裝

# 繪制背景部分,這里就是9*9的九宮格def draw_background(): # white background screen.fill(COLORS[’white’]) # draw game board pygame.draw.rect(screen,COLORS[’black’],(0,0,300,900),5) pygame.draw.rect(screen,COLORS[’black’],(300,0,300,900),5) pygame.draw.rect(screen,COLORS[’black’],(600,0,300,900),5) pygame.draw.rect(screen,COLORS[’black’],(0,0,900,300),5) pygame.draw.rect(screen,COLORS[’black’],(0,300,900,300),5) pygame.draw.rect(screen,COLORS[’black’],(0,600,900,300),5)# 將用戶選中的各自背景改為藍色塊表示選中def draw_choose(): pygame.draw.rect(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 = font80.render(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 = font100.render(’Blank:’+str(cur_blank_size)+’ Change:’+str(cur_change_size),True,COLORS[’black’]) x,y = 10,900 screen.blit(txt,(x,y))

主循環中對上述函數的調用以及鼠標鍵盤事件處理

# 主循環,負責監聽鼠標鍵盤時間,以及刷新界面內容,以及檢查是否贏得了游戲running = Truewhile running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False break elif event.type == pygame.MOUSEBUTTONDOWN: cur_j,cur_i = int(event.pos[0]/100),int(event.pos[1]/100) elif event.type == event.type == 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!!!’) breakpygame.quit()

生成表示數獨的二維數組

相對于界面部分,這部分在邏輯上要難一些,思路以遞歸為核心,輔以隨機性,得到一個每次生成都不一致的數獨游戲,生成思路簡單描述如下:

遍歷每個空格,填入目前為止合法的數字; 如果有數字可以填入,則繼續向下一個空格; 如果沒有數字可以填入,表示之前的數字有問題,則結束遞歸; 當遞歸到最后一個格子的下一個時,表示已經生成完畢,返回即可; 這個過程中對1~9這九個數字的遍歷數字會經過shuffle處理,保證隨機性而不是每次都得到同一個合法的數獨數組;

生成過程代碼

遞歸的一個優勢是通常代碼都很短,當然閱讀性不強,歡迎大佬們改為循環;

def shuffle_number(_list): random.shuffle(_list) return _listdef 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 Truedef 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): __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個位置

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: set_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)) matrix_blank[i][j] = 0 return matrix_all,matrix_blank,blank_ij

最后附上全部代碼

大家也可以直接從我的 Github倉庫 fork下來直接運行;

main.py:主流程+界面+執行

import sysimport pygamefrom pygame.color import THECOLORS as COLORSfrom build import print_matrix,give_me_a_game,checkdef draw_background(): # white background screen.fill(COLORS[’white’]) # draw game board pygame.draw.rect(screen,COLORS[’black’],(0,0,300,900),5) pygame.draw.rect(screen,COLORS[’black’],(300,0,300,900),5) pygame.draw.rect(screen,COLORS[’black’],(600,0,300,900),5) pygame.draw.rect(screen,COLORS[’black’],(0,0,900,300),5) pygame.draw.rect(screen,COLORS[’black’],(0,300,900,300),5) pygame.draw.rect(screen,COLORS[’black’],(0,600,900,300),5)def draw_choose(): pygame.draw.rect(screen,COLORS[’blue’],(cur_j*100+5,cur_i*100+5,100-10,100-10),0)def check_win(matrix_all,matrix): if matrix_all == matrix: return True return Falsedef check_color(matrix,i,j): _matrix = [[col for col in row]for row in matrix] _matrix[i][j] = 0 if check(_matrix,i,j,matrix[i][j]): return COLORS[’green’] return COLORS[’red’]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 = font80.render(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 = font100.render(’Blank:’+str(cur_blank_size)+’ Change:’+str(cur_change_size),True,COLORS[’black’]) x,y = 10,900 screen.blit(txt,(x,y))if __name__ == '__main__': # init pygame pygame.init() # contant SIZE = [900,1000] font80 = pygame.font.SysFont(’Times’, 80) font100 = pygame.font.SysFont(’Times’, 90) # create screen 500*500 screen = pygame.display.set_mode(SIZE) # variable parameter cur_i, cur_j = 0,0 cur_blank_size = int(sys.argv[1]) cur_change_size = 0 # matrix abount MATRIX_ANSWER,MATRIX,BLANK_IJ = give_me_a_game(blank_size=cur_blank_size) print(BLANK_IJ) print_matrix(MATRIX) # main loop running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT:running = Falsebreak elif event.type == pygame.MOUSEBUTTONDOWN:cur_j,cur_i = int(event.pos[0]/100),int(event.pos[1]/100) elif event.type == event.type == 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()

build.py:生成數獨數組部分

import randomdef print_matrix(matrix): print(’—’*19) for row in matrix: print(’|’+’ ’.join([str(col) for col in row])+’|’) print(’—’*19)def shuffle_number(_list): random.shuffle(_list) return _listdef 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 Truedef 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): #_matrixs.append(build_game(_matrix,next_i,next_j,_number)) __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 _matrixs return Nonedef 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: set_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)) matrix_blank[i][j] = 0 return matrix_all,matrix_blank,blank_ijnumber_list = [1,2,3,4,5,6,7,8,9]matrix = [([0]*9) for i in range(9)]if __name__ == '__main__': print_matrix(build_game(matrix,0,0,random.choice(number_list)))

總結

如果刻意減少代碼的話,實際應該控制在100行以內,這也充分表達了python的強大,確實可以在很短的時間內完成一些看似復雜的工作,這個例子供一些同學上手python個人覺得還是不錯的,沒有太復雜的用法,對界面開發有一點點了解,對遞歸有一些理解基本就能完全掌握這份代碼,希望大家玩的開心,挑戰一下50個空格唄,哈哈,反正我沒通過,太難了。。。。

最后

大家可以到我的Github上看看有沒有其他需要的東西,目前主要是自己做的機器學習項目、Python各種腳本工具、有意思的小項目以及Follow的大佬、Fork的項目等:

https://github.com/NemoHoHaloAi

到此這篇關于150行Python代碼實現帶界面的數獨游戲的文章就介紹到這了,更多相關Python 數獨游戲內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

作者:Ho LoongGithub:https://github.com/NemoHoHaloAiKaggle:https://www.kaggle.com/holoong9291

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美精品三级在线| 亚洲天堂资源| 正在播放日韩精品| 999久久久亚洲| 免费成人性网站| 日韩欧美久久| 亚洲专区欧美专区| 国产亚洲永久域名| 蜜臀久久99精品久久久久宅男| 男女激情视频一区| 亚洲资源网站| 国产精品一区二区美女视频免费看| 精品欧美日韩精品| 国产精品大片免费观看| 欧美激情91| 亚洲二区三区不卡| 蜜臀av一区二区三区| 午夜天堂精品久久久久| 天堂日韩电影| 日韩中出av| 麻豆91精品| 久久精品 人人爱| 国产成人久久| 久久国产中文字幕| 中文字幕乱码亚洲无线精品一区| 日韩精品成人| 韩国久久久久久| 免费精品视频| 日韩欧美久久| 国产在线观看www| 日韩视频免费| 亚洲精品欧美| 国产精品国产一区| 蜜臀精品一区二区三区在线观看| 久久不卡日韩美女| 日韩视频在线一区二区三区| 欧美国产免费| 日韩精品一区第一页| 精品视频久久| 日产欧产美韩系列久久99| 电影亚洲精品噜噜在线观看 | 久久精品福利| 日韩中文字幕91| 国产成人77亚洲精品www| 美女日韩在线中文字幕| 国产福利一区二区精品秒拍| 九一国产精品| 国产精品99一区二区三| 丝袜美腿亚洲一区二区图片| 国产精品不卡| 国产精品一区二区三区四区在线观看| 高清av一区| 国产乱论精品| 蜜臀久久99精品久久久画质超高清 | 最新国产拍偷乱拍精品| 国产在线不卡一区二区三区| 日本伊人午夜精品| 日韩制服丝袜先锋影音| 婷婷成人基地| 久久美女性网| 日韩在线免费| 黄毛片在线观看| 国产伊人久久| www.九色在线| 日韩毛片视频| 伊人久久视频| 日韩精品1区| 精品91福利视频| 麻豆免费精品视频| 久久一区欧美| 精品国产一区二| 国产日产一区| 国产毛片精品| 国产精品红桃| 97精品一区二区| 日韩欧美一区免费| 久久久国产精品入口麻豆| 午夜免费一区| 黄色日韩在线| 国产欧美日韩视频在线| 国产色噜噜噜91在线精品| 在线日韩成人| 欧美精品国产一区| 国产欧美一区二区三区精品观看| 青青草91视频| 国产成人精品一区二区三区视频 | 午夜av成人| 日韩一区二区久久| 日韩av一区二区在线影视| 欧美亚洲人成在线| 激情国产在线| 亚洲激精日韩激精欧美精品| 久久国产精品久久w女人spa| 亚洲ww精品| 久久狠狠婷婷| 91伊人久久| 福利一区二区免费视频| 夜夜精品视频| 久久字幕精品一区| 视频一区欧美精品| 精品欧美视频| 亚州精品视频| 午夜久久久久| 麻豆91小视频| 免费在线成人网| 日本在线啊啊| 国产极品模特精品一二| 亚洲在线国产日韩欧美| 国产在线|日韩| 免费在线亚洲| 日韩高清一区二区| 亚洲综合激情在线| 婷婷综合激情| 国产成人精品一区二区三区免费| 免费在线观看精品| 久久精品高清| 色婷婷久久久| 精品三级在线| 国产日韩高清一区二区三区在线 | 国产免费av一区二区三区| 伊人精品视频| 国产99精品一区| 蜜桃av.网站在线观看| 国产精品视频一区二区三区综合 | 精品视频网站| 欧美激情福利| 国产福利一区二区精品秒拍 | 国产一区二区三区久久| 日韩精品1区2区3区| 亚洲一区二区网站| 一区在线免费| 亚洲欧美日韩视频二区| 在线日韩中文| 国产理论在线| 香蕉成人av| 新版的欧美在线视频| 欧美激情麻豆| 桃色av一区二区| 精品久久久网| av免费不卡国产观看| 亚洲黄色免费看| 亚洲性图久久| 视频一区视频二区中文字幕| 综合国产精品| 国产亚洲高清在线观看| 精品资源在线| 美女毛片一区二区三区四区| 国产精品中文| 国产精品三p一区二区| 国产日韩一区| 国产成人77亚洲精品www| 久久久精品网| 一区二区三区四区日韩| 中文字幕中文字幕精品| 91在线成人| 精品成人免费一区二区在线播放| 久久精品播放| 日本午夜免费一区二区| 在线人成日本视频| 婷婷综合五月| 欧美欧美黄在线二区| 一区二区三区四区日本视频| 天使萌一区二区三区免费观看| 日韩精品欧美成人高清一区二区| 国产精品久久久久久久久免费高清 | 国产美女久久| 99精品网站| 在线观看一区| 中文字幕在线高清| 亚洲精品美女91| 日韩精品久久久久久久电影99爱| 日韩一区二区三区高清在线观看| 高清日韩欧美| 日本视频一区二区| 香蕉国产精品| 国产v日韩v欧美v| 综合一区二区三区| 久久精品一区二区不卡| 国产精品视频一区视频二区| 午夜久久美女| 福利视频一区| 欧美亚洲tv| 亚洲我射av| 亚洲欧美日韩国产一区二区| 午夜欧美巨大性欧美巨大| 国产精品传媒麻豆hd| 日本不卡中文字幕| 综合激情视频| 免费精品视频| 国产亚洲欧洲| 九一精品国产| 高清一区二区三区av| 国产精品久久久久久久久免费高清 | 激情综合在线| 免费观看不卡av| 欧美一级精品| 在线成人动漫av| 午夜国产一区二区| 婷婷丁香综合| 亚洲欧美日本日韩|