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

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

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

提到開心消消樂這款小游戲,相信大家都不陌生,其曾在 2015 年獲得過玩家最喜愛的移動單機(jī)游戲獎,受歡迎程度可見一斑,本文我們使用 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)格中隨機(jī)放入各種拼圖塊,代碼如下:

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ù)選擇的拼圖塊進(jìn)行位置交換,代碼實現(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

將匹配的拼圖塊消除之后,我們還需要隨機(jī)生成新的拼圖塊,代碼實現(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)了一個簡單的消消樂游戲,有興趣的可以對游戲做進(jìn)一步擴(kuò)展,比如增加關(guān)卡等。

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

    Python對圖像進(jìn)行灰度處理的代碼介紹

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

    Python?pandas?DataFrame基礎(chǔ)運(yùn)算及空值填充詳解

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

    Python+OpenCV實現(xiàn)相機(jī)標(biāo)定的方法詳解

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

    使用Pytorch訓(xùn)練two-head網(wǎng)絡(luò)的操作

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

    python爬蟲基礎(chǔ)之urllib的使用

    這篇文章主要介紹了python爬蟲基礎(chǔ)之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

最新評論

阜宁县| 文水县| 商洛市| 威远县| 贺州市| 尉氏县| 武宁县| 扬州市| 宣汉县| 博罗县| 望城县| 昔阳县| 任丘市| 高雄市| 蓬安县| 阿尔山市| 英吉沙县| 江达县| 开江县| 宝丰县| 遵化市| 水城县| 泽普县| 白玉县| 扬中市| 喜德县| 平江县| 东至县| 崇左市| 邵阳县| 大英县| 定结县| 甘泉县| 东安县| 盐津县| 阳城县| 苏尼特左旗| 广平县| 广灵县| 前郭尔| 五家渠市|