电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

150行Python代碼實(shí)現(xiàn)帶界面的數(shù)獨(dú)游戲

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

今天閑著沒(méi)事干,以前做過(guò)html+js版的數(shù)獨(dú),這次做個(gè)python版本的,界面由pygame完成,數(shù)獨(dú)生成由遞歸算法實(shí)現(xiàn),由shuffle保證每次游戲都是不一樣的情況,have fun;

功能列表:

圖形化的數(shù)獨(dú)游戲; python實(shí)現(xiàn),依賴(lài)pygame庫(kù); 隨機(jī)生成游戲,每次運(yùn)行都不一樣; 數(shù)字填入后的正確性判斷以及顏色提示; 顯示剩余需填入的空格,已經(jīng)操作的次數(shù); 難度可選,通過(guò)修改需要填入的空的數(shù)量;

游戲界面

初始界面

150行Python代碼實(shí)現(xiàn)帶界面的數(shù)獨(dú)游戲

過(guò)程中界面

150行Python代碼實(shí)現(xiàn)帶界面的數(shù)獨(dú)游戲

運(yùn)行方式

python main.py 15

這里的15表示需要填入的空格數(shù)量為15,理論上這個(gè)值越大,難度就越高,大家可以隨機(jī)調(diào)整,或者設(shè)置容易、簡(jiǎn)單、困難、地獄等對(duì)應(yīng)不同的值即可,很方便修改;

程序分析

界面部分

這部分很簡(jiǎn)單的通過(guò)pygame來(lái)實(shí)現(xiàn),主要使用了其中的主循環(huán)、鼠標(biāo)鍵盤(pán)監(jiān)聽(tīng)、畫(huà)矩形線條、字體、顏色控制等,理解起來(lái)很容易,對(duì)于這部分不太熟悉的同學(xué),這樣理解就好: pygame的主循環(huán)中一方面負(fù)責(zé)接收用戶輸入,一般就是鼠標(biāo)和鍵盤(pán),另一方面負(fù)責(zé)實(shí)時(shí)更新界面顯示內(nèi)容 ;

對(duì)于界面上各部分內(nèi)容的繪制的函數(shù)封裝

# 繪制背景部分,這里就是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)# 將用戶選中的各自背景改為藍(lán)色塊表示選中def draw_choose(): pygame.draw.rect(screen,COLORS[’blue’],(cur_j*100+5,cur_i*100+5,100-10,100-10),0)# 繪制九宮格中的數(shù)字,包括本來(lái)就有的,以及用戶填入的,本來(lái)就在的用灰色,用戶填入的如何合法則為綠色,否則為紅色,是一種提示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))# 繪制最下方的當(dāng)前空格子數(shù)量以及用戶的操作數(shù)量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))

主循環(huán)中對(duì)上述函數(shù)的調(diào)用以及鼠標(biāo)鍵盤(pán)事件處理

# 主循環(huán),負(fù)責(zé)監(jiān)聽(tīng)鼠標(biāo)鍵盤(pán)時(shí)間,以及刷新界面內(nèi)容,以及檢查是否贏得了游戲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()

生成表示數(shù)獨(dú)的二維數(shù)組

相對(duì)于界面部分,這部分在邏輯上要難一些,思路以遞歸為核心,輔以隨機(jī)性,得到一個(gè)每次生成都不一致的數(shù)獨(dú)游戲,生成思路簡(jiǎn)單描述如下:

遍歷每個(gè)空格,填入目前為止合法的數(shù)字; 如果有數(shù)字可以填入,則繼續(xù)向下一個(gè)空格; 如果沒(méi)有數(shù)字可以填入,表示之前的數(shù)字有問(wèn)題,則結(jié)束遞歸; 當(dāng)遞歸到最后一個(gè)格子的下一個(gè)時(shí),表示已經(jīng)生成完畢,返回即可; 這個(gè)過(guò)程中對(duì)1~9這九個(gè)數(shù)字的遍歷數(shù)字會(huì)經(jīng)過(guò)shuffle處理,保證隨機(jī)性而不是每次都得到同一個(gè)合法的數(shù)獨(dú)數(shù)組;

生成過(guò)程代碼

遞歸的一個(gè)優(yōu)勢(shì)是通常代碼都很短,當(dāng)然閱讀性不強(qiáng),歡迎大佬們改為循環(huán);

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

隨機(jī)覆蓋數(shù)獨(dú)數(shù)組中的N個(gè)位置

matrix_all表示整個(gè)數(shù)獨(dú)數(shù)組 matrix_blank表示部分被替換為0的用于顯示的數(shù)組 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倉(cāng)庫(kù) fork下來(lái)直接運(yùn)行;

main.py:主流程+界面+執(zhí)行

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:生成數(shù)獨(dú)數(shù)組部分

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)))

總結(jié)

如果刻意減少代碼的話,實(shí)際應(yīng)該控制在100行以?xún)?nèi),這也充分表達(dá)了python的強(qiáng)大,確實(shí)可以在很短的時(shí)間內(nèi)完成一些看似復(fù)雜的工作,這個(gè)例子供一些同學(xué)上手python個(gè)人覺(jué)得還是不錯(cuò)的,沒(méi)有太復(fù)雜的用法,對(duì)界面開(kāi)發(fā)有一點(diǎn)點(diǎn)了解,對(duì)遞歸有一些理解基本就能完全掌握這份代碼,希望大家玩的開(kāi)心,挑戰(zhàn)一下50個(gè)空格唄,哈哈,反正我沒(méi)通過(guò),太難了。。。。

最后

大家可以到我的Github上看看有沒(méi)有其他需要的東西,目前主要是自己做的機(jī)器學(xué)習(xí)項(xiàng)目、Python各種腳本工具、有意思的小項(xiàng)目以及Follow的大佬、Fork的項(xiàng)目等:

https://github.com/NemoHoHaloAi

到此這篇關(guān)于150行Python代碼實(shí)現(xiàn)帶界面的數(shù)獨(dú)游戲的文章就介紹到這了,更多相關(guān)Python 數(shù)獨(dú)游戲內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 防腐储罐_塑料储罐_PE储罐厂家_淄博富邦滚塑防腐设备科技有限公司 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 机床主轴维修|刀塔维修|C轴维修-常州翔高精密机械有限公司 | 新型锤式破碎机_新型圆锥式_新型颚式破碎机_反击式打沙机_锤式制砂机_青州建源机械 | 长春网站建设,五合一网站设计制作,免费优化推广-长春网站建设 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 湖南专升本-湖南省专升本报名-湖南统招专升本考试网 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 淋巴细胞分离液_口腔医疗器材-精欣华医疗器械(无锡)有限公司 | 清水-铝合金-建筑模板厂家-木模板价格-铝模板生产「五棵松」品牌 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 京港视通报道-质量走进大江南北-京港视通传媒[北京]有限公司 | 粘弹体防腐胶带,聚丙烯防腐胶带-全民塑胶| 无锡门窗-系统门窗-阳光房-封阳台-断桥铝门窗厂[窗致美] | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 安徽控制器-合肥船用空调控制器-合肥家电控制器-合肥迅驰电子厂 安徽净化板_合肥岩棉板厂家_玻镁板厂家_安徽科艺美洁净科技有限公司 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | 美侍宠物-专注宠物狗及宠物猫训练|喂养|医疗|繁育|品种|价格 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 合肥网络推广_合肥SEO网站优化-安徽沃龙First | 上海洗地机-洗地机厂家-全自动洗地机-手推式洗地机-上海滢皓洗地机 | 真空干燥烘箱_鼓风干燥箱 _高低温恒温恒湿试验箱_光照二氧化碳恒温培养箱-上海航佩仪器 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 精密冲床,高速冲床等冲压设备生产商-常州晋志德压力机厂 | 泰国专线_泰国物流专线_广州到泰国物流公司-泰廊曼国际 | 通辽信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.tlxxg.net | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 热镀锌槽钢|角钢|工字钢|圆钢|H型钢|扁钢|花纹板-天津千百顺钢铁贸易有限公司 | 德州网站制作 - 网站建设设计 - seo排名优化 -「两山建站」 | 不锈钢列管式冷凝器,换热器厂家-无锡飞尔诺环境工程有限公司 | 成都亚克力制品,PVC板,双色板雕刻加工,亚克力门牌,亚克力标牌,水晶字雕刻制作-零贰捌广告 | 设定时间记录电子秤-自动累计储存电子秤-昆山巨天仪器设备有限公司 | 建筑资质代办-建筑资质转让找上海国信启航 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 单电机制砂机,BHS制砂机,制沙机设备,制砂机价格-正升制砂机厂家 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 电脑刺绣_绣花厂家_绣花章仔_织唛厂家-[源欣刺绣]潮牌刺绣打版定制绣花加工厂家 |