Upgrade to Pro — share decks privately, control downloads, hide ads and more …

b0129003

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for e743210 e743210
June 19, 2014
120

 b0129003

pygame 黑白棋

Avatar for e743210

e743210

June 19, 2014
Tweet

Transcript

  1. 目前可用函數如下,可以進一步擴充 範圍= range 啟動= pygame.init 鐘類= pygame.time.Clock 幕設大小= pygame.display.set_mode 幕設標題=

    pygame.display.set_caption 字型類= pygame.font.Font 影像下載= pygame.image.load 轉換平滑尺度= pygame.transform.smoothscale 事件取得= pygame.event.get 結束= pygame.quit 離開= sys.exit 隨機選擇= random.choice 畫方形= pygame.draw.rect 事件取得= pygame.event.get 幕更新= pygame.display.update 系統離開= sys.exit 事件張貼= pygame.event.post 時間等待= pygame.time.wait '
  2. 程式解釋 import random, sys, pygame, time, copy from pygame.locals import

    * 畫面更新 = 10 (FPS) 視窗寬度 = 640 (程式視窗大小) 視窗高度 = 480 空間大小 = 50 板寬 = 8 (行列格數) 板高 = 8 白子 = '白子’ 黑子 = '黑子’ 空格 = '空格' (沒有被下子的空格) 提示的子 = ‘提示的子’ (提示後可以下子的空格) 動畫速度 = 25 X軸剩餘邊界 = int((視窗寬度 - (板寬 * 空間大小)) / 2) Y軸剩餘邊界 = int((視窗高度 - (板高 * 空間大小)) / 2) 紅 綠 藍 白 = (255, 255, 255) 黑 = ( 0, 0, 0) 綠 = ( 0, 155, 0) 天藍 = ( 0, 50, 255) 褐 = (174, 94, 0) 背景顏色一 = 天藍 背景顏色二 = 綠 網格線顏色 = 黑 文字顏色 = 白 提示顏色 = 褐
  3. def 主函式(): global 主要時鍾, 版面展示, 字體, 大字體, 背景圖片 (初始化設置) pygame.init()

    主要時鍾 = pygame.time.Clock() 版面展示 = pygame.display.set_mode((視窗寬度, 視窗高度)) pygame.display.set_caption('Flippy') 字體 = pygame.font.Font('freesansbold.ttf', 16) 大字體 = pygame.font.Font('freesansbold.ttf', 32) (設定背景圖片) 板面圖片 = pygame.image.load('flippyboard.png') 板面圖片 = pygame.transform.smoothscale(板面圖片, (板寬 * 空間大小, 板高 * 空間大小)) 矩形板面圖片 = 板面圖片.get_rect() 矩形板面圖片.topleft = (X軸剩餘邊界, Y軸剩餘邊界) 背景圖片 = pygame.image.load(‘flippybackground.png’) 背景圖片 = pygame.transform.smoothscale(背景圖片, (視窗寬度, 視窗高度)) 背景圖片.blit(板面圖片, 矩形板面圖片) (使用smoothscale()平滑尺度stretch) # (開始遊戲) while True: if 開始遊戲() == False: break
  4. def 開始遊戲(): (初始化面版和遊戲) 遊戲面板 = 取得空白面板() 重置面板(遊戲面板) 顯示提示 = False

    輪 = random.choice(['computer', 'player']) (顯示面板讓玩家選顏色) 畫面板(遊戲面板) 玩家棋子, 電腦棋子 = 輸入玩家棋子() 設定“New Game” 和“Hints“ 按鈕) 新遊戲版面 = 字體.render('New Game', True, 文字顏色, 背景顏色二) 新遊戲矩形版面 = 新遊戲版面.get_rect() 新遊戲矩形版面.topright = (視窗寬度 - 8, 10) 提示版面 = 字體.render('Hints', True, 文字顏色, 背景顏色二) 提示矩形版面 = 提示版面.get_rect() 提示矩形版面.topright = (視窗寬度 - 8, 40)
  5. while True: # main game loop if 輪 == 'player':

    (輪到玩家:) if 是有效移動(遊戲面板, 玩家棋子) == []: break (如果玩家不能移動則結束遊戲) 移動xy = None while 移動xy == None: if 顯示提示: 板被畫提示 = 板得到是有效移動的提示(遊戲面板, 玩家棋子) else: 板被畫提示 = 遊戲面板 檢查是否結束() for 事件 in pygame.event.get(): # event handling loop if 事件.type == MOUSEBUTTONUP: (點擊滑鼠) 滑鼠點x, 滑鼠點y = 事件.pos if 新遊戲矩形版面.collidepoint( (滑鼠點x, 滑鼠點y) ): (開始新遊戲) return True elif 提示矩形版面.collidepoint( (滑鼠點x, 滑鼠點y) ): 顯示提示 = not 顯示提示 移動xy = 取得點擊空格(滑鼠點x, 滑鼠點y) if 移動xy != None and not 可以有效移動(遊戲面板, 玩家棋子, 移動xy[0], 移動xy[1]): 移動xy = None (展示遊戲面板) 畫面板(板被畫提示) 畫面板資訊(板被畫提示, 玩家棋子, 電腦棋子, 輪) (展示 “New Game” 和 “Hints“ 按鍵) 版面展示.blit(新遊戲版面, 新遊戲矩形版面) 版面展示.blit(提示版面, 提示矩形版面) 主要時鍾.tick(畫面更新) pygame.display.update() (讓它移動,結束此輪) 讓它移動(遊戲面板, 玩家棋子, 移動xy[0], 移動xy[1], True) if 是有效移動(遊戲面板, 電腦棋子) != []: 輪 = 'computer'
  6. else: (輪到電腦:) if 是有效移動(遊戲面板, 電腦棋子) == []: . (如果電腦不能移動則結束遊戲) break

    畫面板(遊戲面板) 畫面板資訊(遊戲面板, 玩家棋子, 電腦棋子, 輪) 版面展示.blit(新遊戲版面, 新遊戲矩形版面) 版面展示.blit(提示版面, 提示矩形版面) (讓電腦有時間思考) 暫停時間 = time.time() + random.randint(5, 15) * 0.1 while time.time() < 暫停時間: pygame.display.update() x, y = 得電腦移動(遊戲面板, 電腦棋子) 讓它移動(遊戲面板, 電腦棋子, x, y, True) if 是有效移動(遊戲面板, 玩家棋子) != []: # Only set for the player's turn if they can make a move. 輪 = 'player' (展示最後分數) 畫面板(遊戲面板) 得分 = 從板子得分數(遊戲面板)
  7. (決定展示訊息) if 得分[玩家棋子] > 得分[電腦棋子]: 文字 = 'You beat the

    computer by %s points! Congratulations!' % \ (得分[玩家棋子] - 得分[電腦棋子]) elif 得分[玩家棋子] < 得分[電腦棋子]: 文字 = 'You lost. The computer beat you by %s points.' % \ (得分[電腦棋子] - 得分[玩家棋子]) else: 文字 = 'The game was a tie!‘ 文字版面 = 字體.render(文字, True, 文字顏色, 背景顏色一) 文字矩形版面 = 文字版面.get_rect() 文字矩形版面.center = (int(視窗寬度 / 2), int(視窗高度 / 2)) 版面展示.blit(文字版面, 文字矩形版面) ---- 顯示: “Play again?” 和 “Yes”.”No” 按鍵 ---- while True: 檢查是否結束() for 事件 in pygame.event.get(): # event handling loop if 事件.type == MOUSEBUTTONUP: 滑鼠點x, 滑鼠點y = 事件.pos if 文字是矩形版面.collidepoint( (滑鼠點x, 滑鼠點y) ): return True elif 文字否矩形版面.collidepoint( (滑鼠點x, 滑鼠點y) ): return False 版面展示.blit(文字版面, 文字矩形版面) 版面展示.blit(文字版面2, 文字矩形版面2) 版面展示.blit(文字是版面, 文字是矩形版面) 版面展示.blit(文字否版面, 文字否矩形版面) pygame.display.update() 主要時鍾.tick(畫面更新)
  8. def 翻譯面板像素座標(x, y): return X軸剩餘邊界 + x * 空間大小 +

    int(空間大小 / 2), Y軸剩餘邊界 + y * 空間大小 + int(空間大小 / 2) def 改變移動的棋子(翻動棋子, 棋子顏色, 另一棋子): (依黑白棋規則) if 棋子顏色 == 白子: 另一棋子顏色 = 白 else: 另一棋子顏色 = 黑 另一棋子X, 另一棋子Y = 翻譯面板像素座標(另一棋子[0], 另一棋子[1]) pygame.draw.circle(版面展示, 另一棋子顏色, (另一棋子X, 另一棋子Y), int(空間大小 / 2) - 4) pygame.display.update() for rgb值 in range(0, 255, int(動畫速度 * 2.55)): if rgb值 > 255: rgb值 = 255 elif rgb值 < 0: rgb值 = 0 if 棋子顏色 == 白子: color = tuple([rgb值] * 3) # rgb值 goes from 0 to 255 elif 棋子顏色 == 黑子: color = tuple([255 - rgb值] * 3) # rgb值 goes from 255 to 0 for x, y in 翻動棋子: 中心x, 中心y = 翻譯面板像素座標(x, y) pygame.draw.circle(版面展示, color, (中心x, 中心y), int(空間大小 / 2) - 4) pygame.display.update() 主要時鍾.tick(畫面更新) 檢查是否結束()
  9. def 畫面板(板子): (畫出背景圖片) 版面展示.blit(背景圖片, 背景圖片.get_rect()) (畫出格線) for x in range(板寬

    + 1): 開始x = (x * 空間大小) + X軸剩餘邊界 開始y = Y軸剩餘邊界 結束x = (x * 空間大小) + X軸剩餘邊界 結束y = Y軸剩餘邊界 + (板高 * 空間大小) pygame.draw.line(版面展示, 網格線顏色, (開始x, 開始y), (結束x, 結束y)) for y in range(板高 + 1): 開始x = X軸剩餘邊界 開始y = (y * 空間大小) + Y軸剩餘邊界 結束x = X軸剩餘邊界 + (板寬 * 空間大小) 結束y = (y * 空間大小) + Y軸剩餘邊界 pygame.draw.line(版面展示, 網格線顏色, (開始x, 開始y), (結束x, 結束y)) (畫出一開始黑白子和提示的點) for x in range(板寬): for y in range(板高): 中心x, 中心y = 翻譯面板像素座標(x, y) if 板子[x][y] == 白子 or 板子[x][y] == 黑子: if 板子[x][y] == 白子: 棋子顏色 = 白 else: 棋子顏色 = 黑 pygame.draw.circle(版面展示, 棋子顏色, (中心x, 中心y), int(空間大小 / 2) - 4) if 板子[x][y] == 提示的子: pygame.draw.rect(版面展示, 提示顏色, (中心x - 4, 中心y - 4, 8, 8))
  10. def 取得點擊空格(滑鼠點x, 滑鼠點y): 當滑鼠點擊時顯示棋子 def 畫面板資訊(板子, 玩家棋子, 電腦棋子, 輪): 顯示得分和當回合的分數

    def 重置面板(板子): 每當重新開始, 設定成起始的棋子 def 取得空白面板(): 創造一個新的板子 def 可以有效移動(板子, 棋子, x開始, y開始): 當使用者移動到錯的位置時回傳錯誤, 如果移動正確則依規則翻動棋子 def 在板子上(x, y):
  11. def 板得到是有效移動的提示(板子, 棋子): 回傳提示的位置 def 是有效移動(板子, 棋子): 回傳所有有效移動的( x ,

    y ) def 從板子得分數(板子): 計算黑白子累計的分數 def 輸入玩家棋子(): 當玩家決定黑子回傳[ 白子 , 黑子 ],白子則是[ 黑子 , 白子 ] def 讓它移動(板子, 棋子, x開始, y開始, 實際移動=False): 回傳錯誤當它是無效的移動,有效移動則反之 def 是在角落(x, y): 當位置在任一角落回傳正確