<sup id="m40ya"></sup>
  • 
    
  • <kbd id="m40ya"></kbd>
    <samp id="m40ya"></samp>
    <ul id="m40ya"></ul>
  • 更多精彩內容,歡迎關注:

    視頻號
    視頻號

    抖音
    抖音

    快手
    快手

    微博
    微博

    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 亚洲精品视频在线看| 91精品国产高清| 国产成人精品福利网站人| 91精品国产福利在线观看麻豆| 久久九九久精品国产免费直播| 精品国产AV色欲果冻传媒| 亚洲欧洲日本精品| 亚洲AV无码精品无码麻豆| 久久se精品一区精品二区国产| 国产精品特级露脸AV毛片| 亚洲精品国产日韩| 亚洲精品自在线拍| 久久精品亚洲日本佐佐木明希| 中日韩精品电影推荐网站| 少妇亚洲免费精品| 国产精品深夜福利免费观看| 久久久久无码精品国产app| 久久精品免费一区二区| 亚洲av日韩av天堂影片精品 | 国产亚洲精品仙踪林在线播放| 亚洲熟女精品中文字幕| 国产精品久久久久久麻豆一区| 久久99精品国产自在现线小黄鸭| 亚洲处破女AV日韩精品| 一本一本久久A久久综合精品| 久久99精品九九九久久婷婷| 8x福利精品第一导航| 日韩一区二区精品观看| 国产精品久久久小说| 国产精品电影久久久久电影网| 精品极品三级久久久久| 无码人妻精品一二三区免费| 久久无码av亚洲精品色午夜| 亚洲精品无码久久久久APP| 99久久99久久久精品齐齐| 国产精品大bbwbbwbbw| 精品久久久久久婷婷| 8090成人午夜精品| www.国产精品.com| 精品视频国产狼友视频| 国产精品美女一区二区|