<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實現消消樂小游戲

    文檔

    Python實現消消樂小游戲

    提到開心消消樂這款小游戲,相信大家都不陌生,其曾在2015年獲得過玩家最喜愛的移動單機游戲獎,受歡迎程度可見一斑,本文我們使用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實現消消樂小游戲

    提到開心消消樂這款小游戲,相信大家都不陌生,其曾在2015年獲得過玩家最喜愛的移動單機游戲獎,受歡迎程度可見一斑,本文我們使用Python來做個簡單的消消樂小游戲。
    推薦度:
    為你推薦
    資訊專欄
    熱門視頻
    相關推薦
    分享15個超級好用得Python實用技巧 學習python的while循環嵌套 提升Python運行速度的5個小技巧 Python按鍵或值對字典進行排序 圖像檢索之基于vlfeat實現SIFT特征 python繪圖中的四個繪圖技巧 js中toString方法3個作用 描寫春天花朵的詩句 關于思念的詩句 帶馬字的詩句 牡丹花的詩句 想念的詩句 含雁的詩句 愁的詩句 珍惜時間的名言 清明節的諺語 關于清明的諺語 清明的諺語 冒泡排序算法 選擇排序算法 python實現新年倒計時實例代碼 詳解python的循環 基于Python實現PDF區域文本提取工具 Python數據分析處理(三)--運動員信息的分組與聚合 Python實現城市公交網絡分析與可視化 Python&nbsp;垃圾回收機制詳解 關于樹的詩句 緬懷親人的詩句 春暖花開的詩句 家國情懷的詩句 含有星字的詩句 用來贊美老師的詩句 看破紅塵的經典詩句 長江的詩句 關于傳統節日的詩句 三月桃花的詩句 夕陽的詩句 紀念烈士的詩句 西湖的詩句 贊美虎的詩句
    Top 国产免费阿v精品视频网址 | 伊人久久精品午夜| 九九热在线视频精品| 精品久久久久久亚洲精品 | 国产精品国产自线拍免费软件| 亚洲av日韩av天堂影片精品| 国产精品午夜久久| 在线精品自拍亚洲第一区| 91精品婷婷国产综合久久| 国产精品186在线观看在线播放| 国产成人精品无码专区| 亚洲国产精品无码中文lv| 99久久精品免费精品国产| 国产亚洲美女精品久久久久狼| 男女男精品网站免费观看| 无码精品A∨在线观看无广告| 亚洲AV无码国产精品色| 一区二区三区四区精品视频| 中文字幕精品无码一区二区| 一级A毛片免费观看久久精品| 国产SUV精品一区二区四| 99re6这里有精品热视频| 91综合精品网站久久| 久久国产精品只做精品| 老司机免费午夜精品视频| 苍井空亚洲精品AA片在线播放| 最新 国产 精品 精品 视频| 78成人精品电影在线播放日韩精品电影一区亚洲 | 日本加勒比久久精品| 欧洲精品一卡2卡三卡4卡乱码| 国产69精品久久久久观看软件 | 国产精品成人无码久久久久久 | 亚洲AV永久无码精品一百度影院| 精品国产成人国产在线观看 | 国产精品亚洲αv天堂无码| 精品人妻人人做人人爽夜夜爽 | 精品国产黑色丝袜高跟鞋| 亚洲情侣偷拍精品| 亚洲国产91精品无码专区 | 久久99热精品免费观看牛牛| 国产精品vⅰdeoxxxx国产|