<th id="wu2k2"><s id="wu2k2"></s></th> <blockquote id="wu2k2"></blockquote>
  • <tr id="wu2k2"></tr>
  • <samp id="wu2k2"><tbody id="wu2k2"></tbody></samp><samp id="wu2k2"><tbody id="wu2k2"></tbody></samp>
  • 更多精彩內容,歡迎關注:

    視頻號
    視頻號

    抖音
    抖音

    快手
    快手

    微博
    微博

    Python實現消消樂小游戲

    導讀提到開心消消樂這款小游戲,相信大家都不陌生,其曾在2015年獲得過玩家最喜愛的移動單機游戲獎,受歡迎程度可見一斑,本文我們使用Python來做個簡單的消消樂小游戲。
    實現

    消消樂的構成主要包括三部分:游戲主體、計分器、計時器,下面來看一下具體實現。

    先來看一下游戲所需 Python 庫。

    import?os
    import?sys
    import?time
    import?pygame
    import?random

    定義一些常量,比如:窗口寬高、網格行列數等,代碼如下:

    WIDTH?=?400
    HEIGHT?=?400
    NUMGRID?=?8
    GRIDSIZE?=?36
    XMARGIN?=?(WIDTH?-?GRIDSIZE?*?NUMGRID)?//?2
    YMARGIN?=?(HEIGHT?-?GRIDSIZE?*?NUMGRID)?//?2
    ROOTDIR?=?os.getcwd()
    FPS?=?30

    接著創建一個主窗口,代碼如下:

    pygame.init()
    screen?=?pygame.display.set_mode((WIDTH,?HEIGHT))
    pygame.display.set_caption('消消樂')

    看一下效果:

    再接著在窗口中畫一個 8 x 8 的網格,代碼如下:

    screen.fill((255,?255,?220))
    #?游戲界面的網格繪制
    def?drawGrids(self):
    	for?x?in?range(NUMGRID):
    		for?y?in?range(NUMGRID):
    			rect?=?pygame.Rect((XMARGIN+x*GRIDSIZE,?YMARGIN+y*GRIDSIZE,?GRIDSIZE,?GRIDSIZE))
    			self.drawBlock(rect,?color=(255,?165,?0),?size=1
    #?畫矩形?block?框
    def?drawBlock(self,?block,?color=(255,?0,?0),?size=2):
    	pygame.draw.rect(self.screen,?color,?block,?size)

    看一下效果:

    再接著在網格中隨機放入各種拼圖塊,代碼如下:

    while?True:
    	self.all_gems?=?[]
    	self.gems_group?=?pygame.sprite.Group()
    	for?x?in?range(NUMGRID):
    		self.all_gems.append([])
    		for?y?in?range(NUMGRID):
    			gem?=?Puzzle(img_path=random.choice(self.gem_imgs),?size=(GRIDSIZE,?GRIDSIZE),?position=[XMARGIN+x*GRIDSIZE,?YMARGIN+y*GRIDSIZE-NUMGRID*GRIDSIZE],?downlen=NUMGRID*GRIDSIZE)
    			self.all_gems[x].append(gem)
    			self.gems_group.add(gem)
    	if?self.isMatch()[0]?==?0:
    		break

    看一下效果:

    再接著加入計分器和計時器,代碼如下:

    #?顯示得分
    def?drawScore(self):
    	score_render?=?self.font.render('分數:'+str(self.score),?1,?(85,?65,?0))
    	rect?=?score_render.get_rect()
    	rect.left,?rect.top?=?(55,?15)
    	self.screen.blit(score_render,?rect)
    #?顯示加分
    def?drawAddScore(self,?add_score):
    	score_render?=?self.font.render('+'+str(add_score),?1,?(255,?100,?100))
    	rect?=?score_render.get_rect()
    	rect.left,?rect.top?=?(250,?250)
    	self.screen.blit(score_render,?rect)
    #?顯示剩余時間
    def?showRemainingTime(self):
    	remaining_time_render?=?self.font.render('倒計時:?%ss'?%?str(self.remaining_time),?1,?(85,?65,?0))
    	rect?=?remaining_time_render.get_rect()
    	rect.left,?rect.top?=?(WIDTH-190,?15)
    	self.screen.blit(remaining_time_render,?rect)

    看一下效果:

    當設置的游戲時間用盡時,我們可以生成一些提示信息,代碼如下:

    while?True:
    	for?event?in?pygame.event.get():
    		if?event.type?==?pygame.QUIT:
    			pygame.quit()
    			sys.exit()
    		if?event.type?==?pygame.KEYUP?and?event.key?==?pygame.K_r:
    			flag?=?True
    	if?flag:
    		break
    	screen.fill((255,?255,?220))
    	text0?=?'最終得分:?%s'?%?score
    	text1?=?'按?R?鍵重新開始'
    	y?=?140
    	for?idx,?text?in?enumerate([text0,?text1]):
    		text_render?=?font.render(text,?1,?(85,?65,?0))
    		rect?=?text_render.get_rect()
    		if?idx?==?0:
    			rect.left,?rect.top?=?(100,?y)
    		elif?idx?==?1:
    			rect.left,?rect.top?=?(100,?y)
    		y?+=?60
    		screen.blit(text_render,?rect)
    	pygame.display.update()

    看一下效果:

    說完了游戲圖形化界面相關的部分,我們再看一下游戲的主要處理邏輯。

    我們通過鼠標來操縱拼圖塊,因此程序需要檢查有無拼圖塊被選中,代碼實現如下:

    def?checkSelected(self,?position):
    	for?x?in?range(NUMGRID):
    		for?y?in?range(NUMGRID):
    			if?self.getGemByPos(x,?y).rect.collidepoint(*position):
    				return?[x,?y]
    	return?None

    我們需要將鼠標連續選擇的拼圖塊進行位置交換,代碼實現如下:

    def?swapGem(self,?gem1_pos,?gem2_pos):
    	margin?=?gem1_pos[0]?-?gem2_pos[0]?+?gem1_pos[1]?-?gem2_pos[1]
    	if?abs(margin)?!=?1:
    		return?False
    	gem1?=?self.getGemByPos(*gem1_pos)
    	gem2?=?self.getGemByPos(*gem2_pos)
    	if?gem1_pos[0]?-?gem2_pos[0]?==?1:
    		gem1.direction?=?'left'
    		gem2.direction?=?'right'
    	elif?gem1_pos[0]?-?gem2_pos[0]?==?-1:
    		gem2.direction?=?'left'
    		gem1.direction?=?'right'
    	elif?gem1_pos[1]?-?gem2_pos[1]?==?1:
    		gem1.direction?=?'up'
    		gem2.direction?=?'down'
    	elif?gem1_pos[1]?-?gem2_pos[1]?==?-1:
    		gem2.direction?=?'up'
    		gem1.direction?=?'down'
    	gem1.target_x?=?gem2.rect.left
    	gem1.target_y?=?gem2.rect.top
    	gem1.fixed?=?False
    	gem2.target_x?=?gem1.rect.left
    	gem2.target_y?=?gem1.rect.top
    	gem2.fixed?=?False
    	self.all_gems[gem2_pos[0]][gem2_pos[1]]?=?gem1
    	self.all_gems[gem1_pos[0]][gem1_pos[1]]?=?gem2
    	return?True

    每一次交換拼圖塊時,我們需要判斷是否有連續一樣的三個及以上拼圖塊,代碼實現如下:

    def?isMatch(self):
    	for?x?in?range(NUMGRID):
    		for?y?in?range(NUMGRID):
    			if?x?+?2?

    當出現三個及以上拼圖塊時,需要將這些拼圖塊消除,代碼實現如下:

    def?removeMatched(self,?res_match):
    	if?res_match[0]?>?0:
    		self.generateNewGems(res_match)
    		self.score?+=?self.reward
    		return?self.reward
    	return?0

    將匹配的拼圖塊消除之后,我們還需要隨機生成新的拼圖塊,代碼實現如下:

    def?generateNewGems(self,?res_match):
    	if?res_match[0]?==?1:
    		start?=?res_match[2]
    		while?start?>?-2:
    			for?each?in?[res_match[1],?res_match[1]+1,?res_match[1]+2]:
    				gem?=?self.getGemByPos(*[each,?start])
    				if?start?==?res_match[2]:
    					self.gems_group.remove(gem)
    					self.all_gems[each][start]?=?None
    				elif?start?>=?0:
    					gem.target_y?+=?GRIDSIZE
    					gem.fixed?=?False
    					gem.direction?=?'down'
    					self.all_gems[each][start+1]?=?gem
    				else:
    					gem?=?Puzzle(img_path=random.choice(self.gem_imgs),?size=(GRIDSIZE,?GRIDSIZE),?position=[XMARGIN+each*GRIDSIZE,?YMARGIN-GRIDSIZE],?downlen=GRIDSIZE)
    					self.gems_group.add(gem)
    					self.all_gems[each][start+1]?=?gem
    			start?-=?1
    	elif?res_match[0]?==?2:
    		start?=?res_match[2]
    		while?start?>?-4:
    			if?start?==?res_match[2]:
    				for?each?in?range(0,?3):
    					gem?=?self.getGemByPos(*[res_match[1],?start+each])
    					self.gems_group.remove(gem)
    					self.all_gems[res_match[1]][start+each]?=?None
    			elif?start?>=?0:
    				gem?=?self.getGemByPos(*[res_match[1],?start])
    				gem.target_y?+=?GRIDSIZE?*?3
    				gem.fixed?=?False
    				gem.direction?=?'down'
    				self.all_gems[res_match[1]][start+3]?=?gem
    			else:
    				gem?=?Puzzle(img_path=random.choice(self.gem_imgs),?size=(GRIDSIZE,?GRIDSIZE),?position=[XMARGIN+res_match[1]*GRIDSIZE,?YMARGIN+start*GRIDSIZE],?downlen=GRIDSIZE*3)
    				self.gems_group.add(gem)
    				self.all_gems[res_match[1]][start+3]?=?gem
    			start?-=?1

    之后反復執行這個過程,直至耗盡游戲時間,游戲結束。

    最后,我們動態看一下游戲效果。

    總結

    本文我們使用 Python 實現了一個簡單的消消樂游戲,有興趣的可以對游戲做進一步擴展,比如增加關卡等。

    到此這篇關于Python實現消消樂小游戲的文章就介紹到這了,希望大家以后多多支持好二三四!

    為你推薦
    資訊專欄
    熱門視頻
    相關推薦
    學習python的while循環嵌套 提升Python運行速度的5個小技巧 Python按鍵或值對字典進行排序 圖像檢索之基于vlfeat實現SIFT特征 python繪圖中的四個繪圖技巧 js中toString方法3個作用 信息系統項目管理師報考條件 信息系統項目管理師報考時間 信息系統項目管理師報名時間 信息系統項目管理師考試時間 pmp與信息系統項目管理師 信息系統項目管理師報考要求 信息系統項目管理師有效期 信息系統項目管理師考什么論文 信息系統項目管理師是什么類別 軟考信息系統項目管理師怎么備考 備考流程有哪些 考信息系統項目管理師需要考幾門 信息系統項目管理師考試幾門 信息系統項目管理師初中能考嗎 信息系統項目管理師英語簡稱 python實現新年倒計時實例代碼 詳解python的循環 基于Python實現PDF區域文本提取工具 Python數據分析處理(三)--運動員信息的分組與聚合 Python實現城市公交網絡分析與可視化 Python&nbsp;垃圾回收機制詳解 python正則表達式語法學習筆記 一文秒懂python正則表達式常用函數 Python常用的正則表達式處理函數詳解 JS截取字符串的三種方法詳解 PHP遍歷數組的6種方式總結 php兩種基本的輸出方及實例詳解 php生成唯一uid的解決方法詳解 PHP7中對十六進制字符串處理的問題詳解 PHP對接抖音開發平臺接口的詳細教程 php7安裝mysqli實例講解 php去掉一維數組的鍵值的實例方法 PHP中empty()和isset()的區別介紹 PHP實現JWT的Token登錄認證 php判斷時間戳是否為今天實例講解
    Top 久久夜色撩人精品国产| 久久精品天天中文字幕人妻| 国产精品美女午夜爽爽爽免费 | 青春草无码精品视频在线观 | 四虎影院国产精品| 中文字幕无码精品亚洲资源网久久| 久久这里只精品国产免费10| 香港aa三级久久三级老师2021国产三级精品三级在 | 精品国产福利在线观看| 亚洲爆乳精品无码一区二区三区| 国产精品99爱免费视频| 国产精品一区二区无线| 国内精品-bt天堂| 亚洲国产精品网站久久| 无码人妻精品中文字幕免费| 一本色道久久88精品综合| 亚洲精品成a人在线观看| 国产精品美女久久久网站动漫| 九九精品久久久久久噜噜| 精品麻豆丝袜高跟鞋AV| 99国产精品视频免费观看| 久久这里只有精品66re99| 久久国产成人精品麻豆| 国内精品人妻无码久久久影院导航| 日韩亚洲精品福利| 日韩精品中文字幕第2页| 精品无码成人片一区二区| 国产精品自在线拍国产手青青机版| 精品日产卡一卡二卡三入口| 无码精品一区二区三区| 好吊妞视频这里有精品| 国产精品高清在线观看地址| 一区国产传媒国产精品| 国产精品成人免费福利| 国产精品久久久久久搜索| 国产精品久久永久免费| 2020天堂在线亚洲精品专区| 国产成人午夜精品免费视频| 午夜精品久久久久久久99蜜桃| 亚洲日韩一区精品射精| 精品久久久久国产免费 |