<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 国产成人精品日本亚洲专区6| 日本免费精品一区二区三区 | 国产成人精品高清在线观看93 | 久久精品水蜜桃av综合天堂 | 亚洲精品国产成人专区| 精品视频午夜一区二区| 一本色道久久88亚洲精品综合| 亚洲AV无码国产精品色午友在线| 国产精品1024视频| 在线亚洲精品视频| 999国内精品永久免费观看| 日韩精品系列产品| 中文字幕日韩精品无码内射| 九九免费精品视频在这里| 麻豆精品国产免费观看| 8AV国产精品爽爽ⅴa在线观看| 99精品视频在线在线视频观看 | 无码精品一区二区三区| 久久66热人妻偷产精品9| 国产精品综合色区在线观看| 国产精品原创巨作?v网站| 国产精品久久久久影院| 夜夜精品视频一区二区| 色哟哟精品视频在线观看| 久久这里只精品99re66| 久久久精品久久久久三级| 96免费精品视频在线观看| 色久综合网精品一区二区| 久草精品视频在线播放| 国产精品扒开腿做爽爽爽视频| 99久久国产宗和精品1上映| 在线精品动漫一区二区无广告| 久久精品中文字幕一区| 精品97国产免费人成视频| 国产色婷婷精品综合在线| 亚洲精品无码AV中文字幕电影网站 | 一本色道久久综合亚洲精品高清 | 国产精品高清在线观看地址| 成人精品一区二区户外勾搭野战| 亚洲国产精品综合福利专区| 五月天婷婷精品视频|