欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實現(xiàn)消消樂小游戲

 更新時間:2021年12月27日 11:14:05   作者:Python新世界  
本文主要介紹了Python實現(xiàn)消消樂小游戲,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

提到開心消消樂這款小游戲,相信大家都不陌生,其曾在 2015 年獲得過玩家最喜愛的移動單機游戲獎,受歡迎程度可見一斑,本文我們使用 Python 來做個簡單的消消樂小游戲。

實現(xiàn)

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

先來看一下游戲所需 Python 庫。

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('分?jǐn)?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)

看一下效果:

當(dāng)設(shè)置的游戲時間用盡時,我們可以生成一些提示信息,代碼如下:

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()

看一下效果:

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

我們通過鼠標(biāo)來操縱拼圖塊,因此程序需要檢查有無拼圖塊被選中,代碼實現(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

我們需要將鼠標(biāo)連續(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 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

每一次交換拼圖塊時,我們需要判斷是否有連續(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]

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

def removeMatched(self, res_match):
	if res_match[0] > 0:
		self.generateNewGems(res_match)
		self.score += self.reward
		return self.reward
	return 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] = 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

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

最后,我們動態(tài)看一下游戲效果。

總結(jié)

本文我們使用 Python 實現(xiàn)了一個簡單的消消樂游戲,有興趣的可以對游戲做進一步擴展,比如增加關(guān)卡等。

到此這篇關(guān)于Python實現(xiàn)消消樂小游戲的文章就介紹到這了,更多相關(guān)Python 消消樂內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于tf.nn.dynamic_rnn返回值詳解

    關(guān)于tf.nn.dynamic_rnn返回值詳解

    今天小編就為大家分享一篇關(guān)于tf.nn.dynamic_rnn返回值詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • linux環(huán)境下安裝python虛擬環(huán)境及注意事項

    linux環(huán)境下安裝python虛擬環(huán)境及注意事項

    這篇文章主要介紹了linux環(huán)境下安裝python虛擬環(huán)境,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • 關(guān)于Python包導(dǎo)入報錯的問題總結(jié)

    關(guān)于Python包導(dǎo)入報錯的問題總結(jié)

    這篇文章主要介紹了關(guān)于Python包導(dǎo)入報錯的問題總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Tensorflow加載模型實現(xiàn)圖像分類識別流程詳解

    Tensorflow加載模型實現(xiàn)圖像分類識別流程詳解

    在視覺領(lǐng)域可以分為:1、圖像分類 2、語義分割 3、實例分割 4、目標(biāo)檢測(跟蹤) 5、關(guān)鍵點檢測。該篇主要講解利用Tensorflow 對圖像進行圖像分類
    2022-09-09
  • 深度學(xué)習(xí)中shape[0]、shape[1]、shape[2]的區(qū)別詳解

    深度學(xué)習(xí)中shape[0]、shape[1]、shape[2]的區(qū)別詳解

    本文主要介紹了深度學(xué)習(xí)中shape[0]、shape[1]、shape[2]的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 詳談套接字中SO_REUSEPORT和SO_REUSEADDR的區(qū)別

    詳談套接字中SO_REUSEPORT和SO_REUSEADDR的區(qū)別

    下面小編就為大家分享一篇詳談套接字中SO_REUSEPORT和SO_REUSEADDR的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python中3種等待元素出現(xiàn)的方法總結(jié)

    python中3種等待元素出現(xiàn)的方法總結(jié)

    發(fā)現(xiàn)太多人不會用等待了,小編今天實在是忍不住要給大家講講等待的必要性,下面這篇文章主要給大家介紹了關(guān)于python中3種等待元素出現(xiàn)的方法,需要的朋友可以參考下
    2022-03-03
  • Python多線程編程簡單介紹

    Python多線程編程簡單介紹

    這篇文章主要介紹了Python多線程編程簡單介紹,本文講解了創(chuàng)建線程、Thread對象函數(shù)、常用示例等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • pandas如何修改特定的值

    pandas如何修改特定的值

    這篇文章主要介紹了pandas如何修改特定的值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Python決策樹和隨機森林算法實例詳解

    Python決策樹和隨機森林算法實例詳解

    這篇文章主要介紹了Python決策樹和隨機森林算法,集合實例形式詳細(xì)分析了決策樹和隨機森林算法的概念、原理及Python相關(guān)實現(xiàn)技巧與注意事項,需要的朋友可以參考下
    2018-01-01

最新評論