python+pygame 그림퍼즐

Python 2019. 8. 17. 17:21
반응형
# 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()
반응형
Posted by kev1n
,