<strike id="cakm0"></strike>
  • <button id="cakm0"><dl id="cakm0"></dl></button>
  • <samp id="cakm0"><tbody id="cakm0"></tbody></samp>
    <samp id="cakm0"><pre id="cakm0"></pre></samp><ul id="cakm0"></ul>
    <strike id="cakm0"></strike>
    <li id="cakm0"></li>
  • <ul id="cakm0"></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久久| 亚洲中文久久精品无码| 国产精品亚洲а∨无码播放不卡 | 日韩精品一区二区三区四区| 国产精品视频2020| 精品国产aⅴ无码一区二区 | 日本aⅴ精品中文字幕| 国产天天综合永久精品日| 无码精品A∨在线观看无广告| 少妇人妻无码精品视频| 久久精品国产99久久久香蕉| 国产精品免费播放| 热久久视久久精品18| 久久99国产综合精品| 久久91精品久久91综合| 久久精品国产亚洲5555| 羞羞色院91精品网站| 久久精品国产亚洲AV电影网| 亚洲精品视频在线观看视频| 久久亚洲精品视频| 91精品国产高清久久久久久io| 国产人妖系列在线精品| 无码人妻精品一区二区三区9厂| 蜜桃麻豆WWW久久囤产精品| 亚洲国产精品无码AAA片| 伊人精品视频一区二区三区| 亚洲国模精品一区| 四虎永久在线精品免费影视| 精品亚洲成a人在线观看| 最新日韩精品中文字幕| 国内精品免费麻豆网站91麻豆| 99re热这里有精品首页视频| 久久国产精品2020盗摄| 久久亚洲精品中文字幕三区| 日韩精品在线视频| 国产AV午夜精品一区二区三区| 国产三级久久久精品麻豆三级|