사실,모든것들이게임같아보이진않는다.이제,이프로그램에규칙을추가하려한다.그러면,이프로그램은게임이된다.규칙은간단하다:5x5 2차원배열에서빨간블록,검은블록의수를세고,더많은색상의블록을고르는것이다!정답이라면HP는증가하고오답이라면、HP는감소한다。그다음다음문제를위한새로운2차원배열이그려진다!대단히단순하지만이튜토리얼내에서만들어질수있는게임이다.우선,2차원배열을만들고출력해야한다.어떻게?우리는정수데이터(0차원배열과같음)나두버튼(1차원배열과같음)을출력하는법을알고있다2个차원배열은요소하나만더추가되면된다。

../../../../_images/AdvancedOutputAlpha11.gif
 1import sys, pygame
 2pygame.init()
 3
 4size = width, height = 320, 240
 5speed = [2, 2]
 6black = 0, 0, 0
 7
 8screen = pygame.display.set_mode(size)
 9
10ball = pygame.image.load("AdvancedOutputAlpha1.gif")
11ballrect = ball.get_rect()
12
13while True:
14    for event in pygame.event.get():
15        if event.type == pygame.QUIT: sys.exit()
16
17    ballrect = ballrect.move(speed)
18    if ballrect.left < 0 or ballrect.right > width:
19        speed[0] = -speed[0]
20    if ballrect.top < 0 or ballrect.bottom > height:
21        speed[1] = -speed[1]
22
23    screen.fill(black)
24    screen.blit(ball, ballrect)
25    pygame.display.flip()
../../../../_images/AdvancedOutputAlpha21.gif
 1import sys, pygame
 2pygame.init()
 3
 4size = width, height = 320, 240
 5speed = [2, 2]
 6black = 0, 0, 0
 7
 8screen = pygame.display.set_mode(size)
 9
10ball = pygame.image.load("AdvancedOutputAlpha2.gif")
11ballrect = ball.get_rect()
12
13while True:
14    for event in pygame.event.get():
15        if event.type == pygame.QUIT: sys.exit()
16
17    ballrect = ballrect.move(speed)
18    if ballrect.left < 0 or ballrect.right > width:
19        speed[0] = -speed[0]
20    if ballrect.top < 0 or ballrect.bottom > height:
21        speed[1] = -speed[1]
22
23    screen.fill(black)
24    screen.blit(ball, ballrect)
25    pygame.display.flip()
../../../../_images/AdvancedOutputAlpha31.gif
 1import sys, pygame
 2pygame.init()
 3
 4size = width, height = 320, 240
 5speed = [2, 2]
 6black = 0, 0, 0
 7
 8screen = pygame.display.set_mode(size)
 9
10ball = pygame.image.load("AdvancedOutputAlpha3.gif")
11ballrect = ball.get_rect()
12
13while True:
14    for event in pygame.event.get():
15        if event.type == pygame.QUIT: sys.exit()
16
17    ballrect = ballrect.move(speed)
18    if ballrect.left < 0 or ballrect.right > width:
19        speed[0] = -speed[0]
20    if ballrect.top < 0 or ballrect.bottom > height:
21        speed[1] = -speed[1]
22
23    screen.fill(black)
24    screen.blit(ball, ballrect)
25    pygame.display.flip()

生成板함수는무작위로만들어진2차원배열과빨간블록,검은블록의개수를반환한다。설명할필요없다.또한,Printboard함수는1차원배열처럼2차눵배열을출력한다。출력색상은板 [i] [j] 가1인지아닌지에따라달라진다.이게임판은단순히출력용이다.테두리를처리하려면부분의크기를가지고전체크기를계산해야해서짜증날수있다.이것은프롤로그에서언급한대로,파이게임갖는특성(실행결과는图形用户界面이지만코드작성은Ci)때문이다.

사실,이구현한게임은개선의여지가많다.버튼을이미지파일로바꾸면?정답이거나오답일때효과음을넣으면?시간제한을넣으면?정답이거나오답일때시각적효과를넣으면?게임판을더크게하고색상을더다양히넣는다면?이인터페이스를가지고Flood-It을구현한다면?구현한게임이단순하기때문에선택지는많다.

<참고코드>::

import pygame, sys, random
from pygame.locals import*

maxHP = 10
white = (255,255,255)
gray = (127,127,127)
black = (0,0,0)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
pygame.init()
pygame.display.set_caption("Red or Black Project")
width = 640
height = 480
myScreen = pygame.display.set_mode((width, height))
myTextFont = pygame.font.Font("HoonWhitecatR.ttf", 32)
myText = myTextFont.render((str(maxHP) + "/" + str(maxHP)), True, red, gray)
myTextArea = myText.get_rect()
myTextArea.center = (width/2, height/2)
fpsClock = pygame.time.Clock()

def main():
    HP = 5
    board, b_red, b_black = generateBoard(5,5) #1

    while True:
        myText = myTextFont.render((str(HP) + "/" + str(maxHP)), True, red, gray)

        myScreen.fill(gray)

        myScreen.blit(myText, myTextArea)
        drawHP(HP)
        drawButtons()
        drawBoard(board) #2

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

            elif event.type == KEYDOWN:
                if event.key == K_UP:
                    if HP != 10:
                        HP = HP + 1
                elif event.key == K_DOWN:
                    if HP != 0:
                        HP = HP - 1
            elif event.type == MOUSEBUTTONUP:
                x, y = event.pos

                if pygame.Rect(270, 425, 45, 45).collidepoint(x, y): #3
                    if b_red >= b_black:
                        if HP != 10:
                            HP = HP + 1
                        board, b_red, b_black = generateBoard(5,5)
                    elif b_red < b_black:
                        if HP != 0:
                            HP = HP - 1
                        board, b_red, b_black = generateBoard(5,5)

                elif pygame.Rect(325, 425, 45, 45).collidepoint(x, y): #4
                    if b_red <= b_black:
                        if HP != 10:
                            HP = HP + 1
                        board, b_red, b_black = generateBoard(5,5)
                    elif b_red > b_black:
                        if HP != 0:
                            HP = HP - 1
                        board, b_red, b_black = generateBoard(5,5)

        pygame.display.update()
        fpsClock.tick(60)

def drawHP(HP):
    r = int((height - 40) / maxHP)

    pygame.draw.rect(myScreen, gray, (20, 20, 20, 20 + ((maxHP - 0.5) * r)))

    for i in range(maxHP):
        if HP >= (maxHP - i):
            pygame.draw.rect(myScreen, blue, (20, 20 + (i * r), 20, r))
        pygame.draw.rect(myScreen, white, (20, 20 + (i * r), 20, r), 1)

    return

def drawButtons():
    r = 45
    r_margin = 10
    colors = [red, black]

    num = 2
    margin = int((width - ((r * num) + (r_margin * (num - 1)))) / 2)

    for i in range(0, num):
        left = margin + (i * r) + (i * r_margin)
        up = height - r - 10
        pygame.draw.rect(myScreen, colors[i], (left, up, r, r))
        pygame.draw.rect(myScreen, gray, (left + 2, up + 2, r - 4, r - 4), 2)

def generateBoard(width, height): #5
    board = []
    b_red = 0
    b_black = 0

    for x in range(width):
        column = []
        for y in range(height):
            column.append(random.randint(0, 1))
        board.append(column)

    for x in range(width):
        for y in range(height):
            if(board[x][y] == 1):
                 b_red = b_red + 1
            elif(board[x][y] == 0):
                b_black = b_black + 1

    return board, b_red, b_black

def drawBoard(board): #6
    r = 50
    b_width = 5
    b_height = 5
    l_margin = int((width - (b_width * r)) / 2)
    u_margin = int((height - (b_height * r)) / 2)

    for x in range(5):
        for y in range(5):
            left = x * r + l_margin
            up = y * r + u_margin
            if board[x][y] == 1:
                color = red;
            elif board[x][y] == 0:
                color = black
            pygame.draw.rect(myScreen, color, (left, up, r, r))

    left = l_margin
    up = u_margin
    pygame.draw.rect(myScreen, white, (left-1, up-1, r * 5 + 1, r * b_height + 1), 1)

if __name__ == '__main__':
    main()



Edit on GitHub