最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

實現(xiàn)

消消樂的構成主要包括三部分:游戲主體、計分器、計時器,下面來看一下具體實現(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('分數(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 = 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()

看一下效果:

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

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

當出現(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

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

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

總結

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

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

相關文章

  • 關于python線程池的四種實現(xiàn)方式

    關于python線程池的四種實現(xiàn)方式

    這篇文章主要介紹了關于python線程池的四種實現(xiàn)方式,一個程序運行起來后,一定有一個執(zhí)行代碼的東西,這個東西就是線程,需要的朋友可以參考下
    2023-04-04
  • Python 根據(jù)日志級別打印不同顏色的日志的方法示例

    Python 根據(jù)日志級別打印不同顏色的日志的方法示例

    這篇文章主要介紹了Python 根據(jù)日志級別打印不同顏色的日志的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • 基于Python實現(xiàn)敲擊木魚積累功德效果

    基于Python實現(xiàn)敲擊木魚積累功德效果

    最近大家都很流行用手機敲擊電子木魚積累功德,這在很多短視頻中也常常見到。本文將用Python語言實現(xiàn)這一效果,感興趣的小伙伴開業(yè)了解一下
    2022-11-11
  • python?-?sqlachemy另類用法思路詳解

    python?-?sqlachemy另類用法思路詳解

    這篇文章主要介紹了python?-?sqlachemy另類用法,本文結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Python對圖像進行灰度處理的代碼介紹

    Python對圖像進行灰度處理的代碼介紹

    這篇文章主要給大家介紹了關于Python對圖像進行灰度處理的相關資料,圖像灰度化是將一幅彩色圖像轉換為灰度化圖像的過程,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • Python?pandas?DataFrame基礎運算及空值填充詳解

    Python?pandas?DataFrame基礎運算及空值填充詳解

    pandas除了可以drop含有空值的數(shù)據(jù)之外,當然也可以用來填充空值,下面這篇文章主要給大家介紹了關于Python?pandas?DataFrame基礎運算及空值填充的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • Python+OpenCV實現(xiàn)相機標定的方法詳解

    Python+OpenCV實現(xiàn)相機標定的方法詳解

    opencv中內置了張正友的棋盤格標定法,通過一些姿態(tài)各異的棋盤格圖像,可以標定相機的內外參數(shù),本文為大家介紹OpenCV進行相機標定的具體方法,希望對大家有所幫助
    2023-05-05
  • 使用Pytorch訓練two-head網(wǎng)絡的操作

    使用Pytorch訓練two-head網(wǎng)絡的操作

    這篇文章主要介紹了使用Pytorch訓練two-head網(wǎng)絡的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python爬蟲基礎之urllib的使用

    python爬蟲基礎之urllib的使用

    這篇文章主要介紹了python爬蟲基礎之urllib的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • python實現(xiàn)apahce網(wǎng)站日志分析示例

    python實現(xiàn)apahce網(wǎng)站日志分析示例

    這篇文章主要介紹了python實現(xiàn)apahce網(wǎng)站日志分析示例,需要的朋友可以參考下
    2014-04-04

最新評論

杂多县| 洛阳市| 新蔡县| 寿宁县| 玉门市| 准格尔旗| 泗水县| 子长县| 托克托县| 宜春市| 万年县| 岱山县| 锡林郭勒盟| 高密市| 界首市| 兴海县| 禄丰县| 南城县| 临西县| 汝阳县| 夏河县| 三台县| 南汇区| 凯里市| 治多县| 灵丘县| 玉山县| 洛扎县| 苏州市| 天门市| 麟游县| 绥中县| 潜山县| 义马市| 雷山县| 丘北县| 弥勒县| 筠连县| 辽阳市| 建湖县| 辽源市|