티스토리 뷰

Game with Python

16퍼즐 제작 - (8)

Conkara 2017. 6. 16. 17:16

우선 마우스 왼쪽 버튼이 어느 위치에서 눌렸는지 확인하는 코드를 작성해야 합니다.




event.pos 의 첫번째 배열에는 x 위치가 두번째는 y 위치가 있는데


이 위치는 이 파이썬 창에서의 위치를 나타냅니다. 모니터에서의 절대 위치가 아닙니다.


이렇게 x 값과 y 값을 받아서 100으로 나누어 주는 이유는 필자의 블럭은 100*100 픽셀이기 때문에 100으로 나누면 이 블럭의 좌표를 구할 수 있기 때문입니다.



이전에 left,right,up,down 은 전혀 필요가 없습니다. 사실 쓸려면 쓸 수는 있지만, 클릭한 블럭의 주변에 0이 있으면 바꾸고 없으면 바꾸지 않는다 라고 하면 move  함수 단 하나가 필요 할 뿐입니다.


그렇게 설계를 하게 되어서 gameBoard.move(x,y) 로 함수를 호출했습니다.



이제 GameBoard 클래스의 move 함수를 살펴봅시다.







네 위와 같은 코드가 move  함수의 본체인데요


눌린 위치를 중심으로 상하 좌우 범위 검사를 해줌과 동시에, 그 칸이 0인지 검사해서 0이라면 바꾸는 과정입니다.



이것처럼 하면 공백과 공백이 아닌 칸이 잘 바뀌는것을 확인 할 수 있습니다.



이제 게임을 완성해 보았는데요, 코드 전문을 올려놓겠습니다.


설명하지 않은 부분이 마지막 4줄이니 마지막 4줄은 주석을 달아놓겠습니다.





import os

import random

import pygame

import sys

from pygame.locals import *


class GameBoard():

    def __init__(self) :

        numberList = [i for i in range(16)]

        random.shuffle(numberList)

        count = 0

        while count<4 :

            self.gameBoard[count]=[numberList[4*count],numberList[4*count+1],numberList[4*count+2],numberList[4*count+3]]

            count+=1


    def move(self,clickX,clickY):

        if clickX>=1 and self.gameBoard[clickY][clickX-1] == 0 :

            self.gameBoard[clickY][clickX-1], self.gameBoard[clickY][clickX] = self.gameBoard[clickY][clickX], self.gameBoard[clickY][clickX-1]

        if clickY>=1 and self.gameBoard[clickY-1][clickX] == 0 :

            self.gameBoard[clickY-1][clickX], self.gameBoard[clickY][clickX] = self.gameBoard[clickY][clickX], self.gameBoard[clickY-1][clickX]

        if clickX<=2 and self.gameBoard[clickY][clickX+1] == 0 :

            self.gameBoard[clickY][clickX+1], self.gameBoard[clickY][clickX] = self.gameBoard[clickY][clickX], self.gameBoard[clickY][clickX+1]

        if clickY<=2 and self.gameBoard[clickY+1][clickX] == 0 :

            self.gameBoard[clickY+1][clickX], self.gameBoard[clickY][clickX] = self.gameBoard[clickY][clickX], self.gameBoard[clickY+1][clickX]


    def complete(self):

        if self.gameBoard == self.completeGameBoard :

            return 1

        else :

            return 0

    gameBoard = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,0]]

    completeGameBoard = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,0]]


    def printGameBoard(self):

        i=0

        while i<4 :

            j=0

            while j<4 :

                screen.blit(img[self.gameBoard[i][j]],(j*100,i*100))

                j+=1

            i+=1

    wrongKey = 0



TARGET_FPS = 30

clock = pygame.time.Clock()

BLUE = (0,0,255)

WHITE = (255,255,255)

BLACK = (0,0,0)

RED = (255,0,0)

GREEN = (0,255,0)

LEFT = 1


pygame.init()

screen = pygame.display.set_mode((400, 400), DOUBLEBUF)

loadImage = 0

img=[]


while loadImage<16 :

    tempImage = pygame.image.load("Image/"+str(loadImage)+".png")

    img.append(tempImage)

    loadImage+=1


gameBoard = GameBoard()

while True :

    if gameBoard.wrongKey == 1 :

        print("제시된 네가지의 방향키중 하나만 눌러주십시오")

        gameBoard.wrongKey=0

    if gameBoard.wrongKey == 2 :

        print("이동불가능한 장소로의 이동입니다.")

        gameBoard.wrongKey=0

    if gameBoard.complete() :

        break;

    for event in pygame.event.get():

        if event.type == QUIT:

            pygame.quit()

            sys.exit()

        elif event.type == MOUSEBUTTONDOWN and event.button == LEFT :

            li = event.pos

            x = li[0]//100

            y = li[1]//100

            gameBoard.move(x,y)


    screen.fill(WHITE)  '''화면의 모든 색깔을 하얀색으로 초기화한다'''

    gameBoard.printGameBoard() '''gameBoard 를 출력한다 blit 은 버퍼에 그립니다.'''

    pygame.display.flip() '''출력된 뒤쪽 버퍼를 모니터로 출력한다'''

    clock.tick(TARGET_FPS) '''목표한 fps 만큼 지연을 준다. 위 코드에서 TARGET_FPS는 30으로 되어있으므로 30fps 보다 빠르다면 지연을 줍니다'''




위와같이 게임을 완성해보았습니다. 아직 완성이라고는 할 단계는 아니죠. 다음 강의가 16퍼즐의 마지막이 되겠네요.




승리시 안내 문구와, 클리어 할 수 없는 게임판, 지속가능한 게임이란것 에 관해서 고찰하고 


그 다음 게임은 국민 게임 제작... 테트리스를 조금씩 만들어 보도록 합시다.(사실 잘 할수 있을지 잘 모르겠음)







'Game with Python' 카테고리의 다른 글

테트리스 제작 - (1)  (0) 2017.06.26
16퍼즐 제작 - (9)  (1) 2017.06.18
16퍼즐 제작 - (7)  (0) 2017.06.16
pygame에 대해서 간단히 알아봅시다. -(2)  (0) 2017.06.16
pygame에 대해서 간단히 알아봅시다. -(1)  (0) 2017.06.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함