国产精品亚洲AV三区_国产精品日本一区二区在线播放_国产成人无码久久久精品一_性感美女视频在线观看免费精品

更多精彩內(nèi)容,歡迎關(guān)注:

視頻號
視頻號

抖音
抖音

快手
快手

微博
微博

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

導(dǎo)讀提到開心消消樂這款小游戲,相信大家都不陌生,其曾在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('分數(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)

看一下效果:

當設(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)的部分,我們再看一下游戲的主要處理邏輯。

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

當出現(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)推薦
學(xué)習python的while循環(huán)嵌套 提升Python運行速度的5個小技巧 Python按鍵或值對字典進行排序 圖像檢索之基于vlfeat實現(xiàn)SIFT特征 python繪圖中的四個繪圖技巧 js中toString方法3個作用 信息系統(tǒng)項目管理師報考條件 信息系統(tǒng)項目管理師報考時間 信息系統(tǒng)項目管理師報名時間 信息系統(tǒng)項目管理師考試時間 pmp與信息系統(tǒng)項目管理師 信息系統(tǒng)項目管理師報考要求 信息系統(tǒng)項目管理師有效期 信息系統(tǒng)項目管理師考什么論文 信息系統(tǒng)項目管理師是什么類別 軟考信息系統(tǒng)項目管理師怎么備考 備考流程有哪些 考信息系統(tǒng)項目管理師需要考幾門 信息系統(tǒng)項目管理師考試幾門 信息系統(tǒng)項目管理師初中能考嗎 信息系統(tǒng)項目管理師英語簡稱 python實現(xiàn)新年倒計時實例代碼 詳解python的循環(huán) 基于Python實現(xiàn)PDF區(qū)域文本提取工具 Python數(shù)據(jù)分析處理(三)--運動員信息的分組與聚合 Python實現(xiàn)城市公交網(wǎng)絡(luò)分析與可視化 Python 垃圾回收機制詳解 python正則表達式語法學(xué)習筆記 一文秒懂python正則表達式常用函數(shù) Python常用的正則表達式處理函數(shù)詳解 JS截取字符串的三種方法詳解 PHP遍歷數(shù)組的6種方式總結(jié) php兩種基本的輸出方及實例詳解 php生成唯一uid的解決方法詳解 PHP7中對十六進制字符串處理的問題詳解 PHP對接抖音開發(fā)平臺接口的詳細教程 php7安裝mysqli實例講解 php去掉一維數(shù)組的鍵值的實例方法 PHP中empty()和isset()的區(qū)別介紹 PHP實現(xiàn)JWT的Token登錄認證 php判斷時間戳是否為今天實例講解
Top 国产精品亚洲AV三区_国产精品日本一区二区在线播放_国产成人无码久久久精品一_性感美女视频在线观看免费精品
<strike id="cakm0"></strike>
  • <button id="cakm0"><dl id="cakm0"></dl></button>
  • <samp id="cakm0"><tbody id="cakm0"></tbody></samp>
    <samp id="cakm0"><pre id="cakm0"></pre></samp><ul id="cakm0"></ul>
    <strike id="cakm0"></strike>
    <li id="cakm0"></li>
  • <ul id="cakm0"></ul>
  • 久久综合九色综合网站| 欧美日韩一区二区在线播放| 韩国精品久久久999| 欧美ab在线视频| 午夜在线a亚洲v天堂网2018| 亚洲精品中文字幕在线观看| 精品白丝av| 国产精品日韩在线播放| 欧美日韩国产在线播放| 蜜桃久久精品乱码一区二区| 久久精品国产成人| 欧美永久精品| 午夜国产一区| 亚洲小视频在线| 亚洲日本va在线观看| 在线高清一区| 狠狠色狠狠色综合| 好看不卡的中文字幕| 国产视频久久| 国产日产精品一区二区三区四区的观看方式 | 一色屋精品视频免费看| 国产精品五月天| 国产精品久久| 国产精品免费小视频| 欧美午夜无遮挡| 欧美日韩在线高清| 国产精品高潮呻吟久久av黑人| 欧美国产欧美亚州国产日韩mv天天看完整| 久久久精品一品道一区| 久久久蜜臀国产一区二区| 久久精品国产视频| 葵司免费一区二区三区四区五区| 久久久91精品国产| 免费不卡在线观看| 欧美黄色影院| 欧美日韩亚洲一区二区三区在线 | 国产精品久久久久久久久免费桃花 | 日韩午夜视频在线观看| 亚洲精品乱码久久久久久日本蜜臀| 亚洲高清网站| 日韩视频久久| 亚洲女人av| 久久欧美肥婆一二区| 欧美11—12娇小xxxx| 欧美日韩人人澡狠狠躁视频| 国产精品天美传媒入口| 国产综合视频| 亚洲日本久久| 亚洲欧美日韩在线高清直播| 久久久99免费视频| 欧美另类videos死尸| 国产精品欧美经典| 亚洲国产免费| 亚洲一区国产视频| 久久阴道视频| 国产精品女主播| 在线精品亚洲| 亚洲资源av| 欧美xx视频| 国产精品午夜国产小视频| 亚洲电影欧美电影有声小说| 中日韩午夜理伦电影免费| 欧美在线亚洲在线| 欧美婷婷久久| 在线观看亚洲一区| 小黄鸭精品密入口导航| 欧美激情综合在线| 激情综合久久| 亚洲欧美www| 欧美另类在线播放| 在线精品视频免费观看| 欧美在线视频观看| 国产精品成人aaaaa网站| 亚洲国产一区二区三区a毛片| 亚洲永久免费精品| 欧美激情精品久久久久久免费印度| 国产视频精品va久久久久久| 一区二区三区成人| 欧美国产日产韩国视频| 国产亚洲欧美日韩一区二区| 亚洲女同在线| 欧美日韩在线免费观看| 亚洲精品日韩久久| 久久一区国产| 黄色成人av网站| 欧美在线一区二区三区| 国产精品自在欧美一区| 亚洲天堂av图片| 欧美日韩国产精品自在自线| 亚洲日本va午夜在线影院| 老牛影视一区二区三区| 国内精品久久久久影院优| 亚洲在线日韩| 国产精品久久久久久久久免费桃花 | 欧美一区观看| 国产精品网站在线播放| 午夜精品久久久久久久99樱桃| 欧美视频免费看| 在线中文字幕一区| 国产精品成人一区二区艾草| 亚洲午夜激情在线| 国产精品乱码妇女bbbb| 亚洲欧美文学| 国产亚洲精品aa| 久久亚洲一区二区三区四区| 亚洲福利视频免费观看| 欧美国产综合| 亚洲深夜福利视频| 国产麻豆日韩| 久久久久久久久久久成人| 亚洲第一区在线| 欧美精品一区在线发布| 亚洲一级一区| 国产综合欧美在线看| 麻豆乱码国产一区二区三区| 亚洲精品精选| 国产精品理论片在线观看| 久久精品91久久久久久再现| ●精品国产综合乱码久久久久| 欧美电影打屁股sp| 亚洲综合视频在线| 国内自拍一区| 欧美日韩精品欧美日韩精品一| 午夜久久电影网| 亚洲国产精品一区二区www在线| 欧美日本网站| 欧美一级播放| 亚洲日本激情| 国产一区二区三区免费在线观看| 欧美www在线| 亚洲欧美激情视频| 亚洲国产免费看| 国产手机视频精品| 欧美三级午夜理伦三级中视频| 欧美一级夜夜爽| 亚洲伦理在线| 樱桃成人精品视频在线播放| 国产精品国产精品| 蜜桃av一区二区在线观看| 亚洲欧美日韩一区二区三区在线观看| 韩国一区电影| 国产精品视频精品视频| 欧美岛国激情| 久久婷婷av| 久久精品99国产精品| 亚洲亚洲精品在线观看| 亚洲人体影院| 在线国产亚洲欧美| 黄色一区二区在线| 国产老女人精品毛片久久| 欧美日韩亚洲国产一区| 欧美+日本+国产+在线a∨观看| 久久大逼视频| 香蕉成人伊视频在线观看| 亚洲午夜视频| 亚洲美女视频网| 亚洲国产色一区| 在线电影一区| 在线欧美福利| 一区二区在线视频播放| 一区二区三区无毛| 黑人巨大精品欧美一区二区小视频| 国产精品视频yy9099| 国产精品国产三级国产aⅴ入口 | 亚洲一区二区三区欧美 | 亚洲国产老妈| 在线观看一区| 一区二区三区在线观看欧美| 激情综合网址| 在线成人免费视频| 亚洲黄色在线| 亚洲免费久久| 亚洲视频精品在线| 国产精品99久久久久久有的能看| 99伊人成综合| 亚洲女人天堂av| 欧美在线一二三| 久久蜜桃精品| 欧美黄色网络| 国产精品国产精品国产专区不蜜| 国产精品久久久久影院色老大| 国产精品入口尤物| 国产无一区二区| 伊人久久成人| 99综合视频| 亚洲欧美国产另类| 老司机免费视频一区二区| 欧美黄色大片网站| 国产精品高清在线| 国产一区二区在线观看免费| 尤物网精品视频| 99国产精品久久| 欧美影视一区| 欧美成人午夜激情在线| 国产精品a久久久久久| 国产一区二区主播在线| 亚洲日本欧美天堂| 欧美一区二区女人| 欧美激情亚洲激情| 国产欧美日韩亚洲精品|