69堂国产成人免费视频_亚洲成人999_最新日韩中文字幕_97在线视频免费_91久久国产精品_欧美美女一区二区_亚洲a级在线观看_亚洲最大成人免费视频_av中文字幕不卡_一本色道久久综合亚洲精品按摩

更多精彩內容,歡迎關注:

視頻號
視頻號

抖音
抖音

快手
快手

微博
微博

Python實現消消樂小游戲

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

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

先來看一下游戲所需 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?

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

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的while循環嵌套 提升Python運行速度的5個小技巧 Python按鍵或值對字典進行排序 圖像檢索之基于vlfeat實現SIFT特征 python繪圖中的四個繪圖技巧 js中toString方法3個作用 信息系統項目管理師報考條件 信息系統項目管理師報考時間 信息系統項目管理師報名時間 信息系統項目管理師考試時間 pmp與信息系統項目管理師 信息系統項目管理師報考要求 信息系統項目管理師有效期 信息系統項目管理師考什么論文 信息系統項目管理師是什么類別 軟考信息系統項目管理師怎么備考 備考流程有哪些 考信息系統項目管理師需要考幾門 信息系統項目管理師考試幾門 信息系統項目管理師初中能考嗎 信息系統項目管理師英語簡稱 python實現新年倒計時實例代碼 詳解python的循環 基于Python實現PDF區域文本提取工具 Python數據分析處理(三)--運動員信息的分組與聚合 Python實現城市公交網絡分析與可視化 Python 垃圾回收機制詳解 python正則表達式語法學習筆記 一文秒懂python正則表達式常用函數 Python常用的正則表達式處理函數詳解 JS截取字符串的三種方法詳解 PHP遍歷數組的6種方式總結 php兩種基本的輸出方及實例詳解 php生成唯一uid的解決方法詳解 PHP7中對十六進制字符串處理的問題詳解 PHP對接抖音開發平臺接口的詳細教程 php7安裝mysqli實例講解 php去掉一維數組的鍵值的實例方法 PHP中empty()和isset()的區別介紹 PHP實現JWT的Token登錄認證 php判斷時間戳是否為今天實例講解
Top 69堂国产成人免费视频_亚洲成人999_最新日韩中文字幕_97在线视频免费_91久久国产精品_欧美美女一区二区_亚洲a级在线观看_亚洲最大成人免费视频_av中文字幕不卡_一本色道久久综合亚洲精品按摩
国产福利精品一区| 国产精品资源在线| 亚洲免费观看视频| 国产亚洲欧美在线| 国产精品人成在线观看免费| 久久精品在这里| 国产色产综合产在线视频| 日韩av高清在线观看| 99视频一区二区三区| 成人av网在线| 欧美综合色免费| 欧美日本不卡视频| 久久综合色婷婷| 中文字幕一区二区三区在线播放 | 色综合久久久久久久久| 日本精品一级二级| 日韩一区二区三区四区| 日韩精品中文字幕在线不卡尤物 | 91精品国产综合久久久久| 日韩一级大片在线观看| 中文字幕欧美三区| 五月开心婷婷久久| 国产v综合v亚洲欧| 欧美日韩在线电影| 中文字幕欧美激情| 日韩av一区二区三区四区| 国产乱码一区二区三区| 在线观看av不卡| 久久综合999| 天天操天天干天天综合网| 国产不卡免费视频| 欧美一级艳片视频免费观看| 国产精品理论在线观看| 美女视频网站黄色亚洲| 一本大道久久a久久精二百| 日韩精品影音先锋| 天堂成人免费av电影一区| 久久激五月天综合精品| 91福利在线导航| 欧美高清在线精品一区| 日韩成人精品视频| 欧美午夜精品一区二区蜜桃| 欧美经典一区二区三区| 蜜臀国产一区二区三区在线播放 | 蜜臀av性久久久久蜜臀aⅴ| 色天天综合色天天久久| 国产精品污污网站在线观看| 久久精品国产亚洲一区二区三区| 在线观看亚洲精品| 一区二区成人在线| 欧美在线你懂的| 亚洲激情五月婷婷| 色欧美片视频在线观看| 亚洲人成人一区二区在线观看 | 日韩欧美一二三四区| 亚洲第一av色| 欧美日韩国产在线播放网站| 亚洲精品精品亚洲| 欧美视频完全免费看| 午夜私人影院久久久久| 欧美精品亚洲二区| 毛片基地黄久久久久久天堂| 日韩欧美一级精品久久| 国产一区二区三区久久久| 久久综合九色综合欧美98| 亚洲国产综合视频在线观看| 精品美女在线观看| 国产一区二区福利视频| 欧美国产一区二区在线观看| 成人a级免费电影| 亚洲一区二区av在线| 欧美亚洲日本国产| 免费高清视频精品| 日本一区二区三区四区在线视频| 国产suv精品一区二区三区| 中文字幕一区日韩精品欧美| 色呦呦一区二区三区| 日韩av不卡在线观看| 欧美一卡2卡3卡4卡| 日本欧美一区二区| 久久精品人人爽人人爽| 欧美日韩一级黄| 久久精品国产99久久6| 2024国产精品| 国产91精品免费| 精品国产免费一区二区三区四区 | 欧美高清激情brazzers| 精品视频1区2区3区| 日韩欧美中文字幕公布| 久久精品一区二区三区不卡| 911精品国产一区二区在线| 欧美日本在线观看| 久久综合九色综合欧美就去吻| 午夜影视日本亚洲欧洲精品| 欧美视频在线一区| 欧美日韩综合一区| 亚洲福利视频三区| 欧美tickle裸体挠脚心vk| 亚洲一区二区综合| 成人一区二区三区视频在线观看 | 在线视频欧美精品| 欧美日韩综合色| 久久精品在这里| 亚洲永久免费av| 亚洲一区二区三区四区五区黄 | av在线一区二区| 欧美老年两性高潮| 亚洲免费高清视频在线| 久久久精品蜜桃| 欧美亚洲国产bt| 精品一区二区三区久久久| 欧美一区午夜精品| 国产精品女同互慰在线看| 麻豆成人av在线| 欧美久久一二区| 日韩欧美国产一区二区三区| 福利电影一区二区三区| 亚洲国产精品成人综合色在线婷婷 | 日韩欧美一二区| 欧美色综合网站| 欧美色视频在线观看| 欧美老人xxxx18| 日韩在线卡一卡二| 4438x成人网最大色成网站| 夜夜嗨av一区二区三区| 色综合天天综合色综合av| 色婷婷激情一区二区三区| 中文字幕免费一区| 欧美精品一区二区久久久 | 成人app下载| 国产露脸91国语对白| 国产成人av资源| 蜜桃传媒麻豆第一区在线观看| 国产很黄免费观看久久| 一区二区高清免费观看影视大全| 在线综合+亚洲+欧美中文字幕| 中文字幕日韩av资源站| 97久久超碰国产精品电影| 91免费观看视频在线| 日韩午夜电影在线观看| 91国产免费看| 7777精品伊人久久久大香线蕉 | 美女视频网站黄色亚洲| 国产精品无遮挡| 精品国产1区2区3区| 日韩一区二区三区av| 国产成人一级电影| 亚洲视频在线观看一区| 国产欧美久久久精品影院| 欧美四级电影网| 国产精品99久久久久久宅男| 国产精品超碰97尤物18| 亚洲bt欧美bt精品777| 成人app在线| 成人免费电影视频| 色吊一区二区三区| 欧美精品一级二级| 亚洲乱码日产精品bd| 免费观看在线色综合| 欧美午夜宅男影院| 九色综合狠狠综合久久| 久久久精品黄色| 亚洲成人在线免费| 久久国产欧美日韩精品| eeuss鲁片一区二区三区在线观看| 亚洲午夜免费电影| 精品剧情在线观看| 日韩av在线发布| 色噜噜狠狠色综合欧洲selulu| 自拍偷拍欧美精品| 在线国产亚洲欧美| 99精品1区2区| 91麻豆视频网站| 国产精品成人午夜| 成人av在线网| 亚洲国产成人高清精品| 7777精品伊人久久久大香线蕉经典版下载| 日本欧美一区二区| 欧美国产丝袜视频| 色婷婷精品久久二区二区蜜臂av | 国产美女视频一区| 视频一区欧美日韩| 亚洲va欧美va人人爽| 国产98色在线|日韩| 日韩欧美成人一区二区| 国产精品白丝av| 久久爱另类一区二区小说| 久久精品欧美日韩| 色av一区二区| 91九色02白丝porn| 国产成人在线视频免费播放| 亚洲精品乱码久久久久久黑人| 国产精品伦理在线| 亚洲一区成人在线| 国产精品高潮呻吟久久| 日韩欧美激情在线| 久久综合狠狠综合久久综合88 | 日韩免费视频线观看| 欧美大片在线观看| 国产日韩高清在线|