<address id="zhpbl"></address>
<noframes id="zhpbl">
<address id="zhpbl"><form id="zhpbl"><th id="zhpbl"></th></form></address>

    <em id="zhpbl"></em>

      <address id="zhpbl"><th id="zhpbl"><progress id="zhpbl"></progress></th></address>
      更多精彩內容,歡迎關注:

      視頻號
      視頻號

      抖音
      抖音

      快手
      快手

      微博
      微博

      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 少妇高潮太爽了在线视频