pygame(十五)拼图游戏
pygame(十五)拼圖游戲
前情提要
本節(jié)提要
內(nèi)容詳情
截取目標(biāo)矩形圖片
上節(jié)課,我們學(xué)到一個(gè)裁剪圖片的方法: chop()
這個(gè)方法是將原截掉一個(gè)十字形的位置,將剩下的四個(gè)矩形合并成一個(gè)新的矩形圖片.這樣非常不利于我們截取圖片.
因此,我們將這個(gè)方法進(jìn)行改進(jìn),變成截取矩形位置的圖片的方法rect_chop()
代碼
def rect_chop(img:pygame.Surface, rect:pygame.Rect):'''截取指定位置的圖形'''result_surface = pygame.transform.chop(img, (0, 0, rect.left, rect.top))rect = pygame.Rect(0, 0, rect.width, rect.height)result_surface = pygame.transform.chop(result_surface, (rect.width, rect.height, result_surface.get_width(), result_surface.get_height()))return result_surface代碼解析
根據(jù)我們chop()方法的邏輯,任何的圖片,都是裁掉一個(gè)十字形的內(nèi)容
因此,根據(jù)這個(gè)邏輯,我們先裁掉上邊與左邊
再將裁取的圖片,再裁掉右邊與下邊
result_surface = pygame.transform.chop(result_surface, (rect.width, rect.height, result_surface.get_width(), result_surface.get_height()))生成子圖片
將一個(gè)游戲圖片,截成九個(gè)子圖片
代碼
def creat_imgs(image):
imgs = []
pos_rects = []
for i in range(3):
for j in range(3):
temp_rect = pygame.Rect(160 * j + 10 * j, 160 * i + 10 * i, 160, 160) # 位置矩形
imgs.append(rect_chop(image, temp_rect)) # 零亂圖
temp_rect.move_ip(0, 120)
pos_rects.append(temp_rect)
return pos_rects, imgs
代碼解析
根據(jù)原始圖片的大小:500 * 500 切割成160 大小的正方形. 多出20 剛好做為圖片與圖片之間的間矩
先生成切割位置矩形
根據(jù)行列關(guān)系確定左上角坐標(biāo)
然后用我們自己定義的切割函數(shù)來(lái)切割,并將結(jié)果加入到列表
imgs.append(rect_chop(image, temp_rect)) # 零亂圖打亂順序
代碼
# 檢測(cè)生成的隨機(jī)序列是否有解 def check_can_do():nums = [x for x in range(1, 9)]while 1:count = 0shuffle(nums)for i in range(8):for j in range(i+1, 8):if nums[j] < nums[i]:count += 1if count % 2 == 0:return nums代碼解析
生成的隨機(jī)序列是不一定有解的.因此要檢測(cè)是否有解.
這里有展開(kāi)討論是否有解的問(wèn)題.給出生成隨機(jī)序列及檢測(cè)是否有解的判斷程序
點(diǎn)擊響應(yīng)
代碼
mouse_key = pygame.mouse.get_pressed()if mouse_key[0]:mouse_pos = pygame.mouse.get_pos()for i in range(9):# 檢測(cè)鼠標(biāo)有沒(méi)有落在矩形內(nèi)if pos_list[i].collidepoint(mouse_pos):# 檢測(cè)該位置有沒(méi)有圖片if not pos_list[i][1]:move(pos_list, i) # 調(diào)用移動(dòng)方法代碼解析
先檢測(cè)是否點(diǎn)擊鼠標(biāo)左鍵
mouse_key = pygame.mouse.get_pressed()if mouse_key[0]:再檢測(cè)點(diǎn)擊位置是否是有效的圖片位置
for i in range(9):# 檢測(cè)鼠標(biāo)有沒(méi)有落在矩形內(nèi)if pos_list[i].collidepoint(mouse_pos):最后調(diào)用移動(dòng)方法
移動(dòng)方法
代碼:
def move(i):l_list = [x for x in range(9) if x % 3 != 0] # 可以左移的位置if i in l_list:if pos_list[i - 1][1] == 0: # 可以左移print(pos_list[i - 1][1], pos_list[i][1])pos_list[i - 1][1] = pos_list[i][1]pos_list[i][1] = 0returnr_list = [x for x in range(9) if x % 3 != 2] # 可能右移0 1 3 4 6 7if i in r_list:if pos_list[i + 1][1] == 0: # 可以右移pos_list[i + 1] [1] = pos_list[i][1]pos_list[i][1] = 0returnu_list = [x for x in range(9) if x > 2] # 可以上移 3,4,5,6,7,8if i in u_list:if pos_list[i - 3][1] == 0: # 可以上移pos_list[i - 3][1] = pos_list[i][1]pos_list[i][1] = 0returnd_list = [x for x in range(9) if x < 6] # 可以下移 0,1,2,3,4,5if i in d_list:if pos_list[i + 3][1] == 0: # 可以下移pos_list[i + 3] [1] = pos_list[i][1]pos_list[i][1] = 0return分四個(gè)方向來(lái)檢測(cè)
看點(diǎn)的位置否可移.
如:2號(hào)位,只能進(jìn)行左下兩個(gè)方向的移動(dòng)
能左移的位置有:1,2,4,5, 7,8
能下移的位置有0,1,2,3,4,5
能右移的位置有0,1,3,4,6,7
能上移的位置有:3,4,5,6,7,8
顯然2號(hào)位只能左移和下移
然后相應(yīng)的方向只需要要檢測(cè)相應(yīng)的位置上是否是空的,如果是空的就移動(dòng)去,且將原來(lái)的位置設(shè)置為0
判斷勝利
代碼
def check_game():for i in range(9):if pos_list[i][1] != i:return Falsereturn True代碼解析
只要pos_list的序列按0-8排列,說(shuō)明拼圖成功
畫圖程序
代碼
def draw():screen.fill((0, 0, 0))screen.blit(result_img, (200, 10))for i in range(9):nums = pos_list[i][1]if nums:screen.blit(img_list[nums], (pos_list[i][0].left, pos_list[i][0].top))pygame.display.update()代碼分析::
這里就簡(jiǎn)了.只需要畫兩個(gè)圖:一個(gè)是參考圖,一個(gè)是正在游戲中的八個(gè)子圖即可
后記
拼圖游戲是一個(gè)小游戲.曾經(jīng)最早出現(xiàn)的時(shí)候,還不是電子游戲,而是用一個(gè)板子,里面裝了8個(gè)小方塊來(lái)實(shí)現(xiàn)的游戲.
現(xiàn)在市面上已經(jīng)很少見(jiàn)了.
但是小游戲卻充滿大智慧,想要將這個(gè)游戲玩好,還是非常考驗(yàn)一個(gè)人的隨機(jī)應(yīng)變能力,觀察能力及總結(jié)能力的.
因此,可以考慮加入競(jìng)速模式,也可以考慮加入計(jì)步模式.
請(qǐng)各位自行發(fā)揮吧
總結(jié)
以上是生活随笔為你收集整理的pygame(十五)拼图游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: xz压缩文件的解压缩过程
- 下一篇: Audirvana Plus for M