Python實現消消樂小遊戲
<link rel="stylesheet" href="https://js.how234.com/559000b9bd/4c9a02a4bec20fc1fc2f0e60a2782b5ffb/4c9715bcbac9/4c8b2fbfaddf.css" type="text/css" /><link rel="stylesheet" href="https://js.how234.com/559000b9bd/4c9a02a4bec20fc1fc2f0e60a2782b5ffb/4c9715bcbac9/4c8b38b8bad702ecfe21037ca964.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><style>pre{overflow-x: auto}</style>
實現
消消樂的構成主要包括三部分:遊戲主體、計分器、計時器,下面來看一下具體實現。
先來看一下游戲所需 Python 庫。
import osimport sysimport timeimport pygameimport random
定義一些常量,比如:窗口寬高、網格行列數等,代碼如下:
WIDTH = 400HEIGHT = 400NUMGRID = 8GRIDSIZE = 36XMARGIN = (WIDTH - GRIDSIZE * NUMGRID) // 2YMARGIN = (HEIGHT - GRIDSIZE * NUMGRID) // 2ROOTDIR = 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 = Trueif flag:breakscreen.fill((255, 255, 220))text0 = '最終得分: %s' % scoretext1 = '按 R 鍵重新開始'y = 140for 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 += 60screen.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 Falsegem1 = 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.leftgem1.target_y = gem2.rect.topgem1.fixed = Falsegem2.target_x = gem1.rect.leftgem2.target_y = gem1.rect.topgem2.fixed = Falseself.all_gems[gem2_pos[0]][gem2_pos[1]] = gem1self.all_gems[gem1_pos[0]][gem1_pos[1]] = gem2return True
每一次交換拼圖塊時,我們需要判斷是否有連續一樣的三個及以上拼圖塊,代碼實現如下:
def isMatch(self):for x in range(NUMGRID):for y in range(NUMGRID):if x + 2 < NUMGRID:if self.getGemByPos(x, y).type == self.getGemByPos(x+1, y).type == self.getGemByPos(x+2, y).type:return [1, x, y]if y + 2 < NUMGRID:if self.getGemByPos(x, y).type == self.getGemByPos(x, y+1).type == self.getGemByPos(x, y+2).type:return [2, x, y]return [0, x, y]
當出現三個及以上拼圖塊時,需要將這些拼圖塊消除,代碼實現如下:
def removeMatched(self, res_match):if res_match[0] > 0:self.generateNewGems(res_match)self.score += self.rewardreturn self.rewardreturn 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] = Noneelif start >= 0:gem.target_y += GRIDSIZEgem.fixed = Falsegem.direction = 'down'self.all_gems[each][start+1] = gemelse: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] = gemstart -= 1elif 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] = Noneelif start >= 0:gem = self.getGemByPos(*[res_match[1], start])gem.target_y += GRIDSIZE * 3gem.fixed = Falsegem.direction = 'down'self.all_gems[res_match[1]][start+3] = gemelse: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] = gemstart -= 1
之後反覆執行這個過程,直至耗盡遊戲時間,遊戲結束。
最後,我們動態看一下游戲效果。
總結
本文我們使用 Python 實現了一個簡單的消消樂遊戲,有興趣的可以對遊戲做進一步擴展,比如增加關卡等。
到此這篇關於Python實現消消樂小遊戲的文章就介紹到這了,希望大家以後多多支持好二三四!
-
酒池肉林的意思,酒池肉林的解釋
1、酒池肉林(拼音:jiǔchíròulín)是一則來源於歷史故事的成語,成語有關典故最早出自於西漢·司馬遷《史記·殷本紀》。2、“酒池肉林”的原義是殷紂以酒爲池,以肉爲林,爲長夜之飲;原指荒淫腐化、極端奢侈的生活,後也形容酒肉極多;在句子中可充當賓語、定語。...
-
用切諫造句子
造句指懂得並使用字詞,按照一定的句法規則造出字詞通順、意思完整、符合邏輯的句子。依據現代語文學科特徵,可延伸爲寫段、作文的基礎,是學生寫好作文的基本功。造句來源清俞樾《春在堂隨筆》卷八:“其用意,其造句,均以纖巧勝。”夏丏尊葉聖陶《文心雕龍》四:“造句也...
-
處置的意思
1、處置是一個漢語詞語,拼音是chǔzhì,意思是分別事理,使各得其所;處罰。2、近義詞:處理、措置、辦理、管理、解決。3、出自《漢書·薛宣傳》:“宣知惠不能,留彭城數日,案行舍中,處置什器,觀視園菜,終不問惠以吏事。”4、造句:等到塵埃落定後,再來處置他也不遲。...
-
癡情是什麼意思,癡情怎麼理解呢
1、釋義是癡迷的愛情。2、癡情,漢語詞彙,拼音是chīqíng。3、出處:清洪昇《長生殿·情悔》:“只有一點那癡情,愛河沉未醒。”4、《孽海花》第八回:“次芳道:‘這小妮子聲價自高,今日見了老前輩,你看她一種癡情,十分流露,倒不要辜負了她。’”5、《花月痕》第一回:“三生冤...