티스토리 뷰
우선 마우스 왼쪽 버튼이 어느 위치에서 눌렸는지 확인하는 코드를 작성해야 합니다.
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 |
