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

b0129003

e743210
June 19, 2014
84

 b0129003

pygame 黑白棋

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): 當位置在任一角落回傳正確