반응형
# pygame 코드 참조 https://riptutorial.com/ko/pygame |
import random |
class KPuzzle: |
def __init__(self,size): |
self.puzzle = None |
self.size = size |
# puzzle 초기화1 * C 스타일 |
def initCStyle(self): |
self.puzzle = [[0 for x in range(self.size)] for y in range(self.size)] |
a = 1 |
for y in range(self.size): |
for x in range(self.size): |
puzzle[y][x] = a |
a = a + 1 |
# puzzle 초기화2 python 스타일 |
def initPyStyle(self): |
self.puzzle = [] |
for i in range(self.size): |
# map(함수, 리스트) |
# lambda 인자: 표현식 |
self.puzzle.append(list(map(lambda x: x, range((i*self.size)+1,(i*self.size)+1+self.size,1)))) |
# 퍼즐 클릭 시 이동가능한지 체크하는 함수 |
def moveCheck(self,sx,sy,dx,dy): |
# 예외처리 1 : 퍼즐 밖으로 나가는지 확인 |
if sx < 0 or sy < 0 or dx < 0 or dy < 0: |
return False |
if sx > self.size-1 or sy > self.size-1 or dx > self.size-1 or dy > self.size-1: |
return False |
# 이동하려는 방향이 비어있는지(SIZE*SIZE) 확인 후 값 교환 |
if self.size*self.size == self.puzzle[dy][dx]: |
self.puzzle[dy][dx] = self.puzzle[sy][sx] |
self.puzzle[sy][sx] = self.size*self.size |
return True |
return False |
# |
def moveCheckAll(self,x,y): |
# 상,하,좌,우 네방향으로 체크하기 |
if True == self.moveCheck(x,y,x-1,y): |
return self.endCheck() |
elif True == self.moveCheck(x,y,x+1,y): |
return self.endCheck() |
elif True == self.moveCheck(x,y,x,y-1): |
return self.endCheck() |
elif True == self.moveCheck(x,y,x,y+1): |
return self.endCheck() |
# 게임 종료 체크 *퍼즐 완성했는지 |
def endCheck(self): |
a = 1 |
for y in range(self.size): |
for x in range(self.size): |
if self.puzzle[y][x] != a: |
return False |
a = a + 1 |
return True |
# 퍼즐 섞기 |
def shake(self): |
if self.puzzle == None: |
print('puzzle is None') |
return |
x = self.size-1 |
y = self.size-1 |
for i in range(10000): |
d = random.randrange(4) |
if 0 == d: |
if True == self.moveCheck(x-1,y,x,y): |
x = x - 1 |
elif 1 == d: |
if True == self.moveCheck(x+1,y,x,y): |
x = x + 1 |
elif 2 == d: |
if True == self.moveCheck(x,y-1,x,y): |
y = y - 1 |
elif 3 == d: |
if True == self.moveCheck(x,y+1,x,y): |
y = y + 1 |
# size |
def setSize(self,size): |
self.size = size |
################# pygame 초기화 ################### |
import pygame |
successes, failures = pygame.init() |
print("{0} successes and {1} failures".format(successes, failures)) |
SCREEN_SIZE = 300 |
screen = pygame.display.set_mode((SCREEN_SIZE, SCREEN_SIZE)) |
pygame.display.set_caption('KPuzzle') |
clock = pygame.time.Clock() |
FPS = 60 |
BLACK = (0, 0, 0) |
WHITE = (255, 255, 255) |
RED = (255, 0, 0) |
GREEN = (0, 255, 0) |
BLUE = (0, 0, 255) |
################################################### |
#################### 퍼즐 준비 #################### |
# puzzle 클래스 객체 생성 |
puzzle = KPuzzle(5) |
# puzzle 초기화 |
puzzle.initPyStyle() |
# puzzle 섞기 |
puzzle.shake() |
print(puzzle.puzzle) |
# font *숫자퍼즐 |
font = pygame.font.SysFont("comicsansms", 72) |
# 그림 퍼즐 |
image = pygame.image.load('mot.jpg') |
################################################### |
while True: |
# Frame per second |
clock.tick(FPS) |
# 이벤트 루프 |
for event in pygame.event.get(): |
if event.type == pygame.QUIT: |
quit() |
#마우스 버튼 클릭 시 |
elif event.type == pygame.MOUSEBUTTONDOWN: |
# 클릭 좌표 |
x, y = pygame.mouse.get_pos() |
# 퍼즐 인덱스로 변환 |
x = x // (SCREEN_SIZE//puzzle.size) |
y = y // (SCREEN_SIZE//puzzle.size) |
# 상,하,좌,우 네방향으로 체크하기 |
if True == puzzle.moveCheckAll(x,y): |
print('GameOver') |
# 화면 채우기 *흰색으로 채우기 |
screen.fill(WHITE) |
# |
# 퍼즐 그리기 |
for y in range(puzzle.size): |
for x in range(puzzle.size): |
l = SCREEN_SIZE // puzzle.size |
# pygame.draw.rect(screen,color,[x,y,w,h],outline) |
# 숫자 퍼즐 |
pygame.draw.rect(screen,BLACK,[x*l,y*l,l,l],1) |
text = font.render(str(puzzle.puzzle[y][x]), True, (0, 128, 0)) |
# SIZE*SIZE 3퍼즐일 경우 9 는 화면에 표시하지 않는다. |
if puzzle.puzzle[y][x] != puzzle.size*puzzle.size: |
# 숫자퍼즐 |
#screen.blit(text,(x*l,y*l)) |
# 그림퍼즐 |
rect=image.get_rect() |
imageRect = rect.w // puzzle.size |
surf = pygame.Surface((l,l)) |
# 숫자에 따라 그림 배열이 바뀌도록 변경해야함* 숙제! |
surf.blit(image,(0,0),(x*imageRect,y*imageRect,l,l)) |
screen.blit(surf,(x*l,y*l)) |
# 화면 갱신하기 |
pygame.display.update() |
반응형
'Python' 카테고리의 다른 글
Virtualenv 의존성 확인 (0) | 2020.02.18 |
---|---|
파이썬 1기 포트폴리오 양식 (0) | 2019.08.17 |
django tutorial 1 - Installation on Windows 10 (0) | 2019.05.30 |
[Nexus] set up a PyPI proxy repository to access a remote package index - Windows 10 (0) | 2019.05.30 |