利用Python寫個開心消消樂小遊戲,並沒有想象中的複雜
提到開心消消樂這款小遊戲,相信大家都不陌生,其曾在 2015 年獲得過玩家最喜愛的移動單機遊戲獎,受歡迎程度可見一斑,本文我們使用 Python 來做個簡單的消消樂小遊戲。
很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!??¤
QQ群:828010317
實現
消消樂的構成主要包括三部分:遊戲主體、計分器、計時器,下面來看一下具體實現。
先來看一下游戲所需 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 < 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.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指令碼遊戲
- 【Pygame實戰】開心——消消樂,你樂,我樂,大家樂~GAM
- Java轉python機器學習,並沒有大家想象的那麼美好!JavaPython機器學習
- 用PHP實現開心消消樂演算法PHP演算法
- 想拿到BAT的前端開發崗offer,並沒有想象中的那麼難!BAT前端
- 用python寫小遊戲,沒有學過python的也會這個打程式碼Python遊戲
- 全球“萬人迷”MySQL或許並沒有想象中的那麼“香”MySql
- 開源:比想象中大,也沒想象中重要
- [譯] 為 Django Framework 貢獻你的力量並沒有想象中的那麼難DjangoFramework
- 消消樂
- Unity 消消樂開發思路Unity
- 復刻或重製老遊戲,可能並沒有想象中那麼簡單遊戲
- 微信小程式也能玩《開心消消樂》了?長青IP再掀熱潮!微信小程式
- CocosCreator 開發facebook小遊戲,呼叫排行榜的api並沒有執行遊戲API
- Python創始人訪談:Python沒想象中的那麼慢Python
- 還記得月入1.9億的《開心消消樂》嗎?解鎖中老年遊戲產業掘金新姿勢遊戲產業
- BBIN波音館開心消消樂簡單又易懂的攻略技巧打法分享個人多年的經驗
- Vue 版消消樂小遊戲(pc/手機皆可線上體驗,附原始碼)Vue遊戲原始碼
- 2017年《開心消消樂》開發商營收近23億元 淨利潤7.65億元營收
- 3000關get√ “治癒系消除手遊”《開心消消樂》為何始終令人著迷?
- 消消樂對戰PK模式開發介紹模式
- 遊戲公司是如何搞定音樂授權的?音樂版權到底有多複雜?遊戲
- 相親原始碼中移動支付的實現,沒有想象中那麼難原始碼
- Python寫個“點球大戰”小遊戲Python遊戲
- 智雲通CRM:銷售過程中,沒有關心就沒有關係?
- 從0開始用python寫一個命令列小遊戲(十)Python命令列遊戲
- 從0開始用python寫一個命令列小遊戲(二)Python命令列遊戲
- 從0開始用python寫一個命令列小遊戲(六)Python命令列遊戲
- 【譯】處理 iOS 中複雜的 Table Views 並保持優雅iOSView
- 那些PHP中沒有全稱的簡寫PHP
- 寫一個 iOS 複雜表單的正確姿勢iOS
- 在遊戲裡新增簡單模式,沒有想象中那麼簡單遊戲模式
- Spring Security,沒有看起來那麼複雜(附原始碼)Spring原始碼
- 我只是來寫字的,並沒有什麼技術可言
- 誰還沒有顆少女心~
- 【鴻蒙千帆起】《開心消消樂》完成鴻蒙原生應用開發,創新多端聯動使用者體驗鴻蒙
- 【IT生活】成長,沒有想象的那麼迫切 ——葉紹琛
- 基本型號 14 英寸 MacBook Pro 可能沒有您想象中那麼快Mac