001 Memory Puzzle - step 5 對(duì)創(chuàng)建好的隨機(jī)圖形組合進(jìn)行繪制

在上一節(jié)中巴元,我們創(chuàng)建了一個(gè)隨機(jī)組合的圖形組, 如何繪制呢?


(1)我們有圖形的行列位置, 有形狀, 有顏色, 首先论矾, 我們需要一個(gè) 函數(shù), 能夠根據(jù)這些信息來(lái)繪制一個(gè)圖形:
def drawIcon(displaysurf, shape, color, boxx, boxy):
    # 根據(jù)位置,形狀沛简,顏色齐鲤,繪制一個(gè)圖形
    quarter = int(BOXSIZE * 0.25)
    half    = int(BOXSIZE * 0.5)
    left, top = leftTopCoordsOfBox(boxx, boxy)
    if shape == DONUT:
        pygame.draw.circle(displaysurf, color, (left+half, top+half), half-5)
        pygame.draw.circle(displaysurf, BGCOLOR, (left+half, top+half), quarter-5)
    elif shape == DIAMOND:
        pygame.draw.polygon(displaysurf, color, ((left+half, top),
                                                 (left+BOXSIZE-1, top+half),
                                                 (left+half, top+BOXSIZE-1),
                                                 (left, top+half)))
    elif shape == SQUARE:
        pygame.draw.rect(displaysurf, color, (left+quarter, top+quarter,
                                              BOXSIZE-half, BOXSIZE-half))
    elif shape == LINES:
        for i in range(0, BOXSIZE, 4):
            pygame.draw.line(displaysurf, color, (left, top+i), (left + i, top))
            pygame.draw.line(displaysurf, color, (left+i, top+BOXSIZE-1),
                             (left+BOXSIZE-1, top+i))
    elif shape == OVAL:
        pygame.draw.ellipse(displaysurf, color, (left, top+quarter, BOXSIZE, half))
(2)然后,再創(chuàng)建一個(gè)函數(shù)椒楣,來(lái)繪制所有的隨機(jī)圖形的組合
def drawBoard(displaysurf, board):
    # 繪制所有的圖形組
    for boxx in range(BOARD_WIDTH):
        for boxy in range(BOARD_HEIGHT):
            shape, color = getShapeAndColor(board, boxx, boxy)
            drawIcon(displaysurf, shape, color, boxx, boxy)
(3)在main函數(shù)中測(cè)試一下功能:
def main():
    pygame.init()
    fpsclock = pygame.time.Clock()
    displaysurf = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption("Memory Game")
    displaysurf.fill(BGCOLOR)
    # 創(chuàng)建圖形組合
    board = getRandomizedBoard()
    while True:
        displaysurf.fill(BGCOLOR)
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        # 繪制圖形組合
        drawBoard(displaysurf, board
        pygame.display.update()
        fpsclock.tick(FPS)
if __name__ == '__main__':
    main()

結(jié)果顯示如下:


ScreenClip.png

下面是到目前為止的完整代碼:

# Memory Puzzle
import random, pygame, sys
from pygame.locals import *

# 配置基礎(chǔ) ------------------------------------------------------------
FPS = 30                    # 設(shè)置幀數(shù)為30
WINDOW_WIDTH = 640          # 窗口寬度640像素
WINDOW_HEIGHT = 480         # 窗口告訴480像素
BOARD_WIDTH = 3             # 每行有3個(gè)圖形
BOARD_HEIGHT = 2            # 每行有2個(gè)圖形
BOXSIZE = 40                # 圖形范圍
GAPSIZE = 10                # 每個(gè)圖形之間的間隔
# 左邊邊緣位置
XMARGIN = int((WINDOW_WIDTH - BOARD_WIDTH*(BOXSIZE+GAPSIZE)) / 2)
# 頂部邊緣位置
YMARGIN = int((WINDOW_HEIGHT - BOARD_HEIGHT*(BOXSIZE+GAPSIZE)) /2 )

# 游戲中需要用到的顏色設(shè)置 -----------------------------------------------
# R G B 顏色
GRAY = (100,100,100)
NAVYBLUE = (60,60,100)
WHITE = (255,255,255)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
YELLOW = (255,255,0)
ORANGE = (255,128,0)
PUPPLE = (255,0,255)
CYAN = (0,255,255)
BGCOLOR = NAVYBLUE # 背景色設(shè)置為navyblue
ALLCOLORS = (RED, GREEN, BLUE, YELLOW, ORANGE, PUPPLE, CYAN)

# 游戲中用到的5種形狀 ---------------------------------------------------
DONUT = 'donut'
SQUARE = 'square'
DIAMOND = 'diamond'
LINES = 'lines'
OVAL = 'oval'
ALLSHAPES = (DONUT, SQUARE, DIAMOND, LINES, OVAL)


# 工具函數(shù) -------------------------------------------------------------

def leftTopCoordsOfBox(boxx, boxy):
    # 將圖形行列位置轉(zhuǎn)換為屏幕上的像素坐標(biāo)
    left = boxx * (BOXSIZE + GAPSIZE) + XMARGIN
    top = boxy * (BOXSIZE + GAPSIZE) + YMARGIN
    return left, top

def getRandomizedBoard():
    # 生成隨機(jī)的圖形顏色組合
    icons = []  # 用列表保存
    for color in ALLCOLORS:
        for shape in ALLSHAPES:
            icons.append((shape, color))

    random.shuffle(icons)  # 打亂序列
    numIconsUsed = int(BOARD_WIDTH * BOARD_HEIGHT / 2)  # 計(jì)算要使用的圖形數(shù)
    icons = icons[:numIconsUsed] * 2  # 根據(jù)要使用的圖形數(shù)截取出來(lái)圖形, 并翻倍配對(duì)
    random.shuffle(icons)  # 再次打亂圖形

    # 將創(chuàng)建好的圖形放入圖形組列表
    board = []
    for x in range(BOARD_WIDTH):
        column = []
        for y in range(BOARD_HEIGHT):
            column.append(icons[0])
            del icons[0]
        board.append(column)
    return board

def getShapeAndColor(board, boxx, boxy):
    # 根據(jù)行列信息返回形狀和顏色
    return board[boxx][boxy][0], board[boxx][boxy][1]

def drawIcon(displaysurf, shape, color, boxx, boxy):
    # 根據(jù)位置佳遂,形狀,顏色撒顿,繪制一個(gè)圖形
    quarter = int(BOXSIZE * 0.25)
    half    = int(BOXSIZE * 0.5)
    left, top = leftTopCoordsOfBox(boxx, boxy)
    if shape == DONUT:
        pygame.draw.circle(displaysurf, color, (left+half, top+half), half-5)
        pygame.draw.circle(displaysurf, BGCOLOR, (left+half, top+half), quarter-5)
    elif shape == DIAMOND:
        pygame.draw.polygon(displaysurf, color, ((left+half, top),
                                                 (left+BOXSIZE-1, top+half),
                                                 (left+half, top+BOXSIZE-1),
                                                 (left, top+half)))
    elif shape == SQUARE:
        pygame.draw.rect(displaysurf, color, (left+quarter, top+quarter,
                                              BOXSIZE-half, BOXSIZE-half))
    elif shape == LINES:
        for i in range(0, BOXSIZE, 4):
            pygame.draw.line(displaysurf, color, (left, top+i), (left + i, top))
            pygame.draw.line(displaysurf, color, (left+i, top+BOXSIZE-1),
                             (left+BOXSIZE-1, top+i))
    elif shape == OVAL:
        pygame.draw.ellipse(displaysurf, color, (left, top+quarter, BOXSIZE, half))

def drawBoard(displaysurf, board):
    # 繪制所有的圖形組
    for boxx in range(BOARD_WIDTH):
        for boxy in range(BOARD_HEIGHT):
            shape, color = getShapeAndColor(board, boxx, boxy)
            drawIcon(displaysurf, shape, color, boxx, boxy)

# 定義main函數(shù) ---------------------------------------------------------
def main():
    pygame.init()                           # pygame初始化
    fpsclock = pygame.time.Clock()
    displaysurf = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    pygame.display.set_caption("Memory Game")   # 設(shè)置窗口標(biāo)題
    displaysurf.fill(BGCOLOR)
    # 創(chuàng)建圖形組合
    board = getRandomizedBoard()

    while True:                                 # 游戲主題循環(huán)
        displaysurf.fill(BGCOLOR)               # 用背景色填充窗口
        for event in pygame.event.get():        # 獲取游戲事件
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        # 繪制圖形組合
        drawBoard(displaysurf, board)

        pygame.display.update()
        fpsclock.tick(FPS)


if __name__ == '__main__':
    main()

Memory Puzzle 下一節(jié):繪制蓋子

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荚板,隨后出現(xiàn)的幾起案子凤壁,更是在濱河造成了極大的恐慌,老刑警劉巖跪另,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拧抖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡免绿,警方通過(guò)查閱死者的電腦和手機(jī)唧席,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人淌哟,你說(shuō)我怎么就攤上這事迹卢。” “怎么了徒仓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵腐碱,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我掉弛,道長(zhǎng)症见,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任殃饿,我火速辦了婚禮谋作,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乎芳。我一直安慰自己遵蚜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布秒咐。 她就那樣靜靜地躺著谬晕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪携取。 梳的紋絲不亂的頭發(fā)上攒钳,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音雷滋,去河邊找鬼不撑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛晤斩,可吹牛的內(nèi)容都是我干的焕檬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼澳泵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼实愚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起兔辅,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤腊敲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后维苔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碰辅,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年介时,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了没宾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凌彬。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖循衰,靈堂內(nèi)的尸體忽然破棺而出铲敛,到底是詐尸還是另有隱情,我是刑警寧澤羹蚣,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布原探,位于F島的核電站,受9級(jí)特大地震影響顽素,放射性物質(zhì)發(fā)生泄漏咽弦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一胁出、第九天 我趴在偏房一處隱蔽的房頂上張望型型。 院中可真熱鬧,春花似錦全蝶、人聲如沸闹蒜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绷落。三九已至,卻和暖如春始苇,著一層夾襖步出監(jiān)牢的瞬間砌烁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工催式, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留函喉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓荣月,卻偏偏與公主長(zhǎng)得像管呵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哺窄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容