日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Pygame小游戏】这款休闲游戏你肯定了解过《开心消消乐》更新版本上线,好土好喜欢

發(fā)布時間:2025/3/21 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Pygame小游戏】这款休闲游戏你肯定了解过《开心消消乐》更新版本上线,好土好喜欢 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

大家好!我是梨子同學!

希望大家多多支持我!哈哈

為了感謝每一個關注我的小可愛:💓每篇文章的項目源碼都是無償分享滴💓👇👇👇👇

點這里藍色這行字體自取,需要什么源碼記得說標題名字哈!私信我也可!

小編也一直在學習編程,如果代碼小程序出現(xiàn)錯誤歡迎大家評論區(qū)留言哈!

最后——如果文章有幫助到你,記得“關注”、“點贊”、“評論”三連哦~

正文

環(huán)境安裝——

1)準備好相應的素材圖片,這里是隨機到網(wǎng)上尋找的素材圖片,記得設置好小程序的屏幕

大小跟素材大小,想做成什么樣子的就找什么圖片,比如修改下圖片就是其他消消樂了!

這里找的是手機游戲開心消消樂的同款圖片!

2)環(huán)境安裝準備好Python版本基本上都可以、小編用的Python3.7、Pycharm2021的,然后寫游

戲的話基本上用的都是Pygame專屬游戲模塊寫的,然后一些自帶的不用管 直接導入即可。

安裝模塊也就是第三方模塊的小編經(jīng)常用的方法是:pip install +模塊名或者提速需要用到鏡像源,

百度下或者csdn搜下就會出來很多安裝模塊的鏡像源這里就不一一介紹了!

代碼演示——

消消樂的構成主要包括三部分:游戲主體、計分器、計時器,下面來看一下具體實現(xiàn)。

導入模塊:

import os import sys import time import pygame import random

定義一些常量,比如:窗口寬高、網(wǎng)格行列數(shù)等,代碼如下:

WIDTH = 400 HEIGHT = 400 NUMGRID = 8 GRIDSIZE = 36 XMARGIN = (WIDTH - GRIDSIZE * NUMGRID) // 2 YMARGIN = (HEIGHT - GRIDSIZE * NUMGRID) // 2 ROOTDIR = os.getcwd() FPS = 30

接著創(chuàng)建一個主窗口,代碼如下:

pygame.init() screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption('開心消消樂')

再接著在窗口中畫一個 8 x 8 的網(wǎng)格,代碼如下:

screen.fill((255, 255, 220)) # 游戲界面的網(wǎng)格繪制 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)

再接著在網(wǎng)格中隨機放入各種拼圖塊,代碼如下:

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('分數(shù):'+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()

說完了游戲圖形化界面相關的部分,我們再看一下游戲的主要處理邏輯。

我們通過鼠標來操縱拼圖塊,因此程序需要檢查有無拼圖塊被選中,代碼實現(xiàn)如下:

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

我們需要將鼠標連續(xù)選擇的拼圖塊進行位置交換,代碼實現(xiàn)如下:

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

每一次交換拼圖塊時,我們需要判斷是否有連續(xù)一樣的三個及以上拼圖塊,代碼實現(xiàn)如下:

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]

當出現(xiàn)三個及以上拼圖塊時,需要將這些拼圖塊消除,代碼實現(xiàn)如下:

def removeMatched(self, res_match):if res_match[0] > 0:self.generateNewGems(res_match)self.score += self.rewardreturn self.rewardreturn 0

將匹配的拼圖塊消除之后,我們還需要隨機生成新的拼圖塊,代碼實現(xiàn)如下:

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

之后反復執(zhí)行這個過程,直至耗盡游戲時間,游戲結束。

效果展示——

?總結

話不多說,趕緊去玩吧!!!

關注小編獲取更多精彩內(nèi)容!

?制作不易,記得一鍵三連哦!!?如需打包好的源碼+素材免費分享滴!傳送門

總結

以上是生活随笔為你收集整理的【Pygame小游戏】这款休闲游戏你肯定了解过《开心消消乐》更新版本上线,好土好喜欢的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。