主要設(shè)計
主要內(nèi)容是設(shè)計開發(fā)一個趣味拼圖游戲,其功能是對加載的圖片進行分割(如分割5×5矩陣或其他類型矩陣),上篇文章講了,具體可看小學生python游戲編程3----拼圖游戲-準備(https://blog.csdn.net/fqfq123456/article/details/127173684),把分隔的圖片加載到游戲界面,隨機打亂順序,用戶使用鼠標點擊圖片框中的圖片,兩次點擊的圖片進行位置互換進行拼圖,系統(tǒng)能夠自動判別拼圖是否成功并進行提示。
應用知識點
1、python知識點
1.1 函數(shù)定義與使用
函數(shù)是組織好的,可重復使用的,用來實現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。函數(shù)能提高應用的模塊性,和代碼的重復利用率。
定義一個函數(shù),你可以定義一個由自己想要功能的函數(shù),以下是簡單的規(guī)則:
函數(shù)代碼塊以 def 關(guān)鍵詞開頭,后接函數(shù)標識符名稱和圓括號()。
任何傳入?yún)?shù)和自變量必須放在圓括號中間。圓括號之間可以用于定義參數(shù)。
函數(shù)的第一行語句可以選擇性地使用文檔字符串—用于存放函數(shù)說明。
函數(shù)內(nèi)容以冒號起始,并且縮進。
return [表達式] 結(jié)束函數(shù),選擇性地返回一個值給調(diào)用方。不帶表達式的return相當于返回 None。
現(xiàn)在學習以下函數(shù),實現(xiàn)兩個小拼圖塊位置的交換
def jiaohuanFk(a, b):
# i,j為要交換的兩個小拼圖塊的序號
# 以下利用tempPos中間變量,實現(xiàn)兩個小拼圖塊位置的交換
tempPos = grid[a].pos
grid[a].pos = grid[b].pos
grid[b].pos = tempPos
在隨機打亂圖片時多次調(diào)用,重復隨機交換多次小拼圖的位置
import random
for k in range(xy-1):
i = random.randint(0, xy-1) # 第一個小拼圖塊的序號
j = random.randint(0, x*y-1) # 第二個小拼圖塊的序號
jiaohuanFk(i, j) # 調(diào)用函數(shù)交換兩個小拼圖塊的位置
1.2 random
在Python中可以用于隨機數(shù)生成的有兩種主要途徑,一是random模塊,另一個是numpy庫中random函數(shù)。在我們?nèi)粘J褂弥?,如果是為了得到隨機的單個數(shù),多考慮random模塊;
random模塊中約7個函數(shù)都是可以用來生成隨機數(shù)的:
1、random.random():隨機生成一個 [0,1) 的浮點數(shù)
2、random.uniform(a,b):隨機生成一個 [a,b) 的浮點數(shù)
3、random.randint(a,b):隨機生成一個 [a,b] 的整數(shù),本練習中主要用此函數(shù)
4、random.choice(sequence):從列表,元組,字符串(可用于for循環(huán)的數(shù)據(jù)類型)中隨機選擇一個元素
5、random.randrange(a,b,step):在生成的<以a為始,每step遞增,以b為終>這樣的一個整數(shù)序列中隨機選擇一個數(shù)
6、random.shuffle(a):打亂一個列表的元素順序
7、random.sample(self, population, k):從序列population中隨機取出k個數(shù);population的類型可以是列表、元組、集合、字符串
2、pygamezero知識點
2.1 基本框架,取上節(jié)中講到的分隔的一個小方塊
通過此基本框架,開啟我們拼圖游戲的第一步
效果:
代碼:
import pgzrun # 導入游戲庫
from pgzero.actor import Actor
from pgzero.screen import Screen
screen: Screen # 類型標注
fangkuai_SIZE_w = 124 # 小圖塊的寬
fangkuai_SIZE_h = 87 # 小圖塊的高
WIDTH = 5*fangkuai_SIZE_w # 設(shè)置窗口的寬度
HEIGHT = 5*fangkuai_SIZE_h # 設(shè)置窗口的高度
fangkuai = Actor('fenge\\df-10') # 導入拼圖方塊圖片
fangkuai.x = WIDTH/2 # 拼圖方塊圖片的x坐標
fangkuai.y = HEIGHT/2 # 拼圖方塊圖片的y坐標
def draw(): # 繪制模塊,每幀重復執(zhí)行
screen.clear() # 每幀清除屏幕,便于重新繪制
fangkuai.draw() # 繪制小拼圖塊
pgzrun.go() # 開始執(zhí)行游戲
2.1 拼滿游戲界面
效果:
代碼:
import pgzrun # 導入游戲庫
from pgzero.actor import Actor
from pgzero.screen import Screen
screen: Screen # 類型標注
TILE_SIZE_w = 124 # 小圖塊的寬
TILE_SIZE_h = 87 # 小圖塊的高
x = 5 # 橫向方塊數(shù)
y = 5 # 縱向方塊數(shù)
WIDTH = x*TILE_SIZE_w # 設(shè)置窗口的寬度
HEIGHT = y*TILE_SIZE_h # 設(shè)置窗口的高度
**grid = [] # 列表,用來存放最終所有拼圖信息
for i in range(x): # 對行循環(huán)
for j in range(y): # 對列循環(huán)
fangkuai = Actor('fenge\\df-10') # 導入拼圖方塊圖片
fangkuai.left = j * TILE_SIZE_w # 拼圖方塊圖片最左邊的x坐標
fangkuai.top = i * TILE_SIZE_h # 拼圖方塊圖片最頂部的y坐標
grid.append(fangkuai) # 將當前拼圖加入到列表中**
def draw(): # 繪制模塊,每幀重復執(zhí)行
screen.clear() # 每幀清除屏幕,便于重新繪制
for fk in grid:
fk.draw() # 繪制小拼圖塊
pgzrun.go() # 開始執(zhí)行游戲
2.3 拼正確,把小圖利用代碼貼完整
效果:
代碼:
import pgzrun # 導入游戲庫
from pgzero.actor import Actor
from pgzero.screen import Screen
screen: Screen # 類型標注
TILE_SIZE_w = 124 # 根據(jù)小圖塊的寬設(shè)置
TILE_SIZE_h = 87 # 根據(jù)小圖塊的高設(shè)置
x = 5 # 橫向方塊數(shù)
y = 5 # 縱向方塊數(shù)
WIDTH = x*TILE_SIZE_w # 設(shè)置窗口的寬度
HEIGHT = y*TILE_SIZE_h # 設(shè)置窗口的高度
TITLE = '拼圖小游戲'
**fk_list =[]
for i in range(1,x*y+1):
fk_list.append(Actor('fenge\\df-'+str(i)))**
grid = [] # 列表,用來存放最終所有拼圖信息
for i in range(x): # 對行循環(huán)
for j in range(y): # 對列循環(huán)
print(i*x+j)
fangkuai = fk_list[i*x+j] # 導入拼圖方塊圖片
fangkuai.left = j * TILE_SIZE_w # 拼圖方塊圖片最左邊的x坐標
fangkuai.top = i * TILE_SIZE_h # 拼圖方塊圖片最頂部的y坐標
grid.append(fangkuai) # 將當前拼圖加入到列表中
def draw(): # 繪制模塊,每幀重復執(zhí)行
screen.clear() # 每幀清除屏幕,便于重新繪制
for fk in grid:
fk.draw() # 繪制小拼圖塊
pgzrun.go() # 開始執(zhí)行游戲
2.4 兩小方塊互換位置
效果:你可以先想想如何實現(xiàn),看看效果后結(jié)合上一節(jié)自己先試著改改,多改也是一種好的學習踐方法
代碼:
import pgzrun # 導入游戲庫
from pgzero.actor import Actor
from pgzero.screen import Screen
screen: Screen # 類型標注
TILE_SIZE_w = 124 # 根據(jù)小圖塊的寬設(shè)置
TILE_SIZE_h = 87 # 根據(jù)小圖塊的高設(shè)置
x = 5 # 橫向方塊數(shù)
y = 5 # 縱向方塊數(shù)
WIDTH = x*TILE_SIZE_w # 設(shè)置窗口的寬度
HEIGHT = y*TILE_SIZE_h # 設(shè)置窗口的高度
TITLE = '拼圖小游戲'
fk_list =[]
for i in range(1,x*y+1):
fk_list.append(Actor('fenge\\df-'+str(i)))
grid = [] # 列表,用來存放最終所有拼圖信息
for i in range(x): # 對行循環(huán)
for j in range(y): # 對列循環(huán)
print(i*x+j)
fangkuai = fk_list[i*x+j] # 導入拼圖方塊圖片
fangkuai.left = j * TILE_SIZE_w # 拼圖方塊圖片最左邊的x坐標
fangkuai.top = i * TILE_SIZE_h # 拼圖方塊圖片最頂部的y坐標
grid.append(fangkuai) # 將當前拼圖加入到列表中
# 以下實現(xiàn)兩個小拼圖塊位置的交換
a = 0 # 第一個小拼圖塊的序號
b = 12 # 第二個小拼圖塊的序號
# 以下利用tempPos中間變量,實現(xiàn)兩個小拼圖塊位置的交換
tempPos = grid[a].pos
grid[a].pos = grid[b].pos
grid[b].pos = tempPos
def draw(): # 繪制模塊,每幀重復執(zhí)行
screen.clear() # 每幀清除屏幕,便于重新繪制
for fk in grid:
fk.draw() # 繪制小拼圖塊
pgzrun.go() # 開始執(zhí)行游戲
2.5 把互換方塊的代碼轉(zhuǎn)成函數(shù)
# 以下實現(xiàn)兩個小拼圖塊位置的交換
a = 0 # 第一個小拼圖塊的序號
b = 12 # 第二個小拼圖塊的序號
# 以下利用tempPos中間變量,實現(xiàn)兩個小拼圖塊位置的交換
tempPos = grid[a].pos
grid[a].pos = grid[b].pos
grid[b].pos = tempPos
上面的代碼換成下面的代碼,為以后的隨機打亂做好準備,此處想想為什么要定義個交換方塊的函數(shù)?
運行效果如2.4沒變
# 以下函數(shù)實現(xiàn)兩個小拼圖塊位置的交換
def jiaohuanFk(a, b):
# i,j為要交換的兩個小拼圖塊的序號
# 以下利用tempPos中間變量,實現(xiàn)兩個小拼圖塊位置的交換
tempPos = grid[a].pos
grid[a].pos = grid[b].pos
grid[b].pos = tempPos
jiaohuanFk(0,12)
2.6 隨機多次打亂,成我們常見拼圖狀
效果:
代碼:
import pgzrun # 導入游戲庫
from pgzero.actor import Actor
from pgzero.screen import Screen
screen: Screen # 類型標注
TILE_SIZE_w = 124 # 根據(jù)小圖塊的寬設(shè)置
TILE_SIZE_h = 87 # 根據(jù)小圖塊的高設(shè)置
x = 5 # 橫向方塊數(shù)
y = 5 # 縱向方塊數(shù)
WIDTH = x*TILE_SIZE_w # 設(shè)置窗口的寬度
HEIGHT = y*TILE_SIZE_h # 設(shè)置窗口的高度
TITLE = '拼圖小游戲'
fk_list =[]
for i in range(1,x*y+1):
fk_list.append(Actor('fenge\\df-'+str(i)))
grid = [] # 列表,用來存放最終所有拼圖信息
for i in range(x): # 對行循環(huán)
for j in range(y): # 對列循環(huán)
# print(i*x+j)
fangkuai = fk_list[i*x+j] # 導入拼圖方塊圖片
fangkuai.left = j * TILE_SIZE_w # 拼圖方塊圖片最左邊的x坐標
fangkuai.top = i * TILE_SIZE_h # 拼圖方塊圖片最頂部的y坐標
grid.append(fangkuai) # 將當前拼圖加入到列表中
# 以下函數(shù)實現(xiàn)兩個小拼圖塊位置的交換
def jiaohuanFk(a, b):
# i,j為要交換的兩個小拼圖塊的序號
# 以下利用tempPos中間變量,實現(xiàn)兩個小拼圖塊位置的交換
tempPos = grid[a].pos
grid[a].pos = grid[b].pos
grid[b].pos = tempPos
import random
# 重復隨機交換多次小拼圖的位置
for k in range(x*y-1):
i = random.randint(0, x*y-1) # 第一個小拼圖塊的序號
j = random.randint(0, x*y-1) # 第二個小拼圖塊的序號
jiaohuanFk(i, j) # 調(diào)用函數(shù)交換兩個小拼圖塊的位置
def draw(): # 繪制模塊,每幀重復執(zhí)行
screen.clear() # 每幀清除屏幕,便于重新繪制
for fk in grid:
fk.draw() # 繪制小拼圖塊
pgzrun.go() # 開始執(zhí)行游戲
未完,下次接著分析,輸贏及得分問題
總結(jié)
通過此次的《拼圖小游戲》游戲?qū)崿F(xiàn),讓我對pgzero處理圖片的相關(guān)知識有了進一步的了解,對函數(shù)比以前更深刻的認識。
源碼獲取
可關(guān)注博主后,私聊博主免費獲取
需要技術(shù)指導,育娃新思考,企業(yè)軟件合作等更多服務(wù)請聯(lián)系博主文章來源:http://www.zghlxwxcb.cn/news/detail-409138.html
今天是以此模板持續(xù)更新此育兒專欄的第 4 /50次。
可以關(guān)注我,點贊我、評論我、收藏我啦。文章來源地址http://www.zghlxwxcb.cn/news/detail-409138.html
到了這里,關(guān)于小學生python游戲編程4----拼圖游戲的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!