🍳

004 손님 생각 및 대기하기

1. 실행 코드

import pygame as pg import random def 스프라이트생성(이미지, 위치, 상태=None, 시간=None): 스프라이트 = pg.sprite.Sprite() 스프라이트.image = 이미지 스프라이트.rect = 스프라이트.image.get_rect() 스프라이트.rect.x, 스프라이트.rect.y = 위치[0], 위치[1] if 상태 != None: 스프라이트.상태 = 상태 if 시간 != None: 스프라이트.시간 = 시간 return 스프라이트 pg.init() 실행여부 = True 화면가로길이, 화면세로길이 = 874, 987 화면 = pg.display.set_mode([화면가로길이, 화면세로길이]) pg.display.set_caption('부족들의 마음을 요리로 사로잡아라!') #색 지정 흰색 = (255, 255, 255) 검은색 = (0, 0, 0) #글꼴 설정 글꼴 = pg.font.SysFont('malgungothic', 25) #게임 요소 초기화 경과시간 = 0 점수 = 0 시계 = pg.time.Clock() 현재챕터 = 1 최종챕터 = 10 자바독상태 = "기본자세" 자바독인덱스 = 0 자바독움직임흐름 = 1 자바독요리가능여부 = True 현재요리 = "사료" 현재요리상태 = "전" 요리움직임여부 = False 이미지마우스위치 = [0, 0] 요리초기위치 = [424, 248] 요리위치 = [요리초기위치[0] - 53, 요리초기위치[1] - 30] 손님가로숫자, 손님세로숫자 = 4, 2 손님생각최대시간 = 5 손님대기최대시간 = 10 요리상태리스트 = ['전', '후'] 요리리스트 = ['사료', '뼈다귀', '물'] 배경이미지 = pg.image.load('img/배경.png') 배경이미지 = pg.transform.scale(배경이미지, (화면가로길이, 화면세로길이)) 챕터바이미지크기 = (358, 61) 챕터바이미지 = pg.image.load('img/챕터바.png') 챕터바이미지 = pg.transform.scale(챕터바이미지, 챕터바이미지크기) 자바독이미지크기 = (238, 238) 자바독이미지딕셔너리 = {} 자바독이미지딕셔너리['기본자세'] = pg.image.load('img/자바독_기본자세.png') 자바독이미지딕셔너리['기본자세'] = pg.transform.scale(자바독이미지딕셔너리['기본자세'], 자바독이미지크기) for 요리 in 요리리스트: 자바독이미지딕셔너리[요리] = [] for 인덱스 in range(3): 자바독요리중이미지 = pg.image.load(f'img/자바독_{요리}_요리중_{인덱스+1}.png') 자바독요리중이미지 = pg.transform.scale(자바독요리중이미지, 자바독이미지크기) 자바독이미지딕셔너리[요리].append(자바독요리중이미지) 주방테이블이미지크기 = (668, 173) 주방테이블이미지 = pg.image.load('img/주방-테이블.png') 주방테이블이미지 = pg.transform.scale(주방테이블이미지, 주방테이블이미지크기) 요리이미지크기딕셔너리 = {'사료':(106, 61), '뼈다귀':(106, 61), '물':(106, 61)} 요리이미지딕셔너리 = {} for 요리상태 in 요리상태리스트: 요리이미지딕셔너리[요리상태] = {} for 요리 in 요리리스트: 요리이미지딕셔너리[요리상태][요리] = pg.image.load(f'img/{요리}_요리{요리상태}.png') 요리이미지딕셔너리[요리상태][요리] = pg.transform.scale(요리이미지딕셔너리[요리상태][요리], 요리이미지크기딕셔너리[요리]) 요리스프라이트 = 스프라이트생성(요리이미지딕셔너리['전'][현재요리], 요리위치) 동족이미지크기 = (196, 314) 동족음식생각중이미지 = pg.image.load('img/동족_음식-생각-중.png') 동족음식생각중이미지 = pg.transform.scale(동족음식생각중이미지, 동족이미지크기) 동족원하는음식을받음이미지 = pg.image.load('img/동족_원하는-음식을-받음.png') 동족원하는음식을받음이미지 = pg.transform.scale(동족원하는음식을받음이미지, 동족이미지크기) 동족원하지않는음식을받음이미지 = pg.image.load('img/동족_원하지-않는-음식을-받음(화남).png') 동족원하지않는음식을받음이미지 = pg.transform.scale(동족원하지않는음식을받음이미지, 동족이미지크기) 동족이미지리스트 = [동족음식생각중이미지, 동족원하는음식을받음이미지, 동족원하지않는음식을받음이미지] 동족스프라이트리스트 = [스프라이트생성(동족이미지리스트[0], (50+동족이미지크기[0]*j, 350+동족이미지크기[1]*i), 0, random.random()*(손님생각최대시간-1)) for i in range(손님세로숫자) for j in range(손님가로숫자)] 이미지움직임최대시간 = 0.2 이미지움직임시간 = 0 움직임최대횟수 = 3 움직임횟수 = 0 while 실행여부: if 현재챕터 <= 최종챕터: 화면.blit(배경이미지, (0, 0)) 흐른시간 = 시계.tick(60) / 1000 경과시간 += 흐른시간 시간문자열 = '%02d:%02d'%(경과시간/60, 경과시간%60) 경과시간글자 = 글꼴.render(시간문자열, True, 검은색) 화면.blit(챕터바이미지, ((화면가로길이 - 챕터바이미지크기[0]) // 2, 7)) 화면.blit(경과시간글자, (20, 20)) 챕터문자열 = f'{현재챕터}챕터' 챕터글자 = 글꼴.render(챕터문자열, True, 흰색) 화면.blit(챕터글자, ((화면가로길이 - 14 * len(챕터문자열)) // 2 - 10, 20)) 점수문자열 = f'{점수}점' 점수글자 = 글꼴.render(점수문자열, True, 검은색) 화면.blit(점수글자, ((화면가로길이 - 14 * len(점수문자열)) - 30, 20)) if 자바독상태 == '기본자세': 화면.blit(자바독이미지딕셔너리[자바독상태], (321, 85)) else: 화면.blit(자바독이미지딕셔너리[자바독상태][자바독인덱스], (321, 85)) 화면.blit(주방테이블이미지, (100, 192)) for 동족스프라이트 in 동족스프라이트리스트: 화면.blit(동족스프라이트.image, 동족스프라이트.rect) 요청요리리스트 = {} for 인덱스, 요리 in enumerate(요리리스트): 요청요리리스트[요리] = 화면.blit(요리이미지딕셔너리['후'][요리], (460 + 90 * 인덱스, 280 - 요리이미지딕셔너리["후"][요리].get_height())) for 동족스프라이트 in 동족스프라이트리스트: 동족스프라이트.시간 -= 흐른시간 if 동족스프라이트.시간 <= 0: if 동족스프라이트.상태 == 0: #생각하는 중 동족스프라이트.상태 = 1 동족스프라이트.시간 = 손님대기최대시간 동족스프라이트.생각음식 = random.choice(요리리스트) elif 동족스프라이트.상태 == 1: #음식을 주문하고 대기하는 중 동족스프라이트.image = 동족이미지리스트[2] 동족스프라이트.상태 = 2 동족스프라이트.시간 = 2 elif 동족스프라이트.상태 == 2: #주문한 음식 동족스프라이트.상태 = 0 동족스프라이트.시간 = 1 + random.random() * (손님생각최대시간-1) 동족스프라이트.image = 동족이미지리스트[0] 화면.blit(동족스프라이트.image, 동족스프라이트.rect) if 동족스프라이트.상태 == 1: 음식크기 = 요리이미지크기딕셔너리[동족스프라이트.생각음식] 음식위치 = [동족스프라이트.rect.x + 100 - (음식크기[0] // 2), 동족스프라이트.rect.y + 60 - (음식크기[1] // 2)] 화면.blit(요리이미지딕셔너리["후"][동족스프라이트.생각음식], 음식위치) 요리스프라이트.image = 요리이미지딕셔너리[현재요리상태][현재요리] if 자바독요리가능여부: 요리위치 = [요리초기위치[0] - 요리스프라이트.image.get_width() // 2, 요리초기위치[1] - 요리스프라이트.image.get_height() // 2 ] 요리스프라이트.rect.x, 요리스프라이트.rect.y = 요리위치[0], 요리위치[1] 진행중인요리 = 화면.blit(요리스프라이트.image, 요리스프라이트.rect) if 요리움직임여부: 마우스위치 = pg.mouse.get_pos() 요리위치 = [마우스위치[0] + 이미지마우스위치[0], 마우스위치[1] + 이미지마우스위치[1]] else: 화면.fill(흰색) pg.display.update() for 이벤트 in pg.event.get(): if 이벤트.type == pg.QUIT: 실행여부 = False elif 이벤트.type == pg.MOUSEBUTTONDOWN: 클릭위치 = pg.mouse.get_pos() if 진행중인요리.collidepoint(클릭위치): 요리움직임여부 = True 자바독요리가능여부 = False 이미지마우스위치 = [요리위치[0] - 클릭위치[0], 요리위치[1] - 클릭위치[1]] for 요리 in 요리리스트: if 요청요리리스트[요리].collidepoint(클릭위치): 현재요리 = 요리 현재요리상태 = '전' 자바독요리가능여부 = True elif 이벤트.type == pg.MOUSEBUTTONUP: 요리움직임여부 = False keys = pg.key.get_pressed() # print(keys) if keys[pg.K_SPACE] and 자바독요리가능여부: if 자바독상태 == "기본자세": 자바독상태 = 현재요리 else: 이미지움직임시간 += 흐른시간 if 이미지움직임시간 >= 이미지움직임최대시간: 이미지움직임시간 = 0 자바독인덱스 += 자바독움직임흐름 if 자바독인덱스 == 0 or 자바독인덱스 == len(자바독이미지딕셔너리[자바독상태]) - 1: 자바독움직임흐름 *= -1 움직임횟수 += 1 if 움직임횟수 >= 움직임최대횟수: 현재요리상태 = '후' else: 이미지움직임시간 = 0 자바독상태 = "기본자세" 자바독인덱스 = 0 자바독움직임흐름 = 1 움직임횟수 = 0 pg.display.quit()
 

2. 상세 내용

손님생각최대시간 = 5 손님대기최대시간 = 10
  • 손님생각최대시간 : 테이블에 있는 동족들이 각자 원하는 음식을 생각할 수 있는 최대시간입니다.
  • 손님대기최대시간 : 동족들이 음식을 주문하고 대기하는 최대시간입니다. 대기최대시간이 지나면 손님이 화를 내고 일정 시간 후 다시 음식을 주문하게 됩니다.
 
# 이미지 초기화 def 스프라이트생성(이미지, 위치, 상태=None, 시간=None): 스프라이트 = pg.sprite.Sprite() 스프라이트.image = 이미지 스프라이트.rect = 스프라이트.image.get_rect() 스프라이트.rect.x, 스프라이트.rect.y = 위치[0], 위치[1] if 상태 != None: 스프라이트.상태 = 상태 if 시간 != None: 스프라이트.시간 = 시간 return 스프라이트
  • 스프라이트생성함수를 다음과 같이 변경합니다.
  • 여기서 상태와 시간은 동족들의 상태(생각, 대기, 결과)와 각 상태의 따른 시간들을 의미합니다.
  • 기본 스프라이트의 속성이 아닌 이번 게임에서 활용되는 속성입니다.
 
동족원하는음식을받음이미지 = pg.image.load('img/동족_원하는-음식을-받음.png') 동족원하는음식을받음이미지 = pg.transform.scale(동족원하는음식을받음이미지, 동족이미지크기) 동족원하지않는음식을받음이미지 = pg.image.load('img/동족_원하지-않는-음식을-받음(화남).png') 동족원하지않는음식을받음이미지 = pg.transform.scale(동족원하지않는음식을받음이미지, 동족이미지크기) 동족이미지리스트 = [동족음식생각중이미지, 동족원하는음식을받음이미지, 동족원하지않는음식을받음이미지] 동족스프라이트리스트 = [스프라이트생성(동족이미지리스트[0], (50+동족이미지크기[0]*j, 350+동족이미지크기[1]*i), 0, random.random()*(손님생각최대시간-1)) for i in range(손님세로숫자) for j in range(손님가로숫자)]
  • 테이블에 있는 동족이미지를 추가합니다.
  • 음식을 받았을 때의 이미지와 음식을 받지 못하거나 원하지 않는 음식을 받았을 때의 이미지를 추가합니다. 이를 효과적으로 관리하기 위해 리스트로 관리합니다.
 
for 동족스프라이트 in 동족스프라이트리스트: 동족스프라이트.시간 -= 흐른시간 if 동족스프라이트.시간 <= 0: if 동족스프라이트.상태 == 0: #생각하는 중 동족스프라이트.상태 = 1 동족스프라이트.시간 = 손님대기최대시간 동족스프라이트.생각음식 = random.choice(요리리스트) elif 동족스프라이트.상태 == 1: #음식을 주문하고 대기하는 중 동족스프라이트.image = 동족이미지리스트[2] 동족스프라이트.상태 = 2 동족스프라이트.시간 = 2 elif 동족스프라이트.상태 == 2: #주문한 음식 동족스프라이트.상태 = 0 동족스프라이트.시간 = 1 + random.random() * (손님생각최대시간-1) 동족스프라이트.image = 동족이미지리스트[0] 화면.blit(동족스프라이트.image, 동족스프라이트.rect) # 생각하는 시간이 끝나고 먹고 싶은 이미지를 표시 if 동족스프라이트.상태 == 1: 음식크기 = 요리이미지크기딕셔너리[동족스프라이트.생각음식] 음식위치 = [동족스프라이트.rect.x + 100 - (음식크기[0] // 2), 동족스프라이트.rect.y + 60 - (음식크기[1] // 2)] 화면.blit(요리이미지딕셔너리["후"][동족스프라이트.생각음식], 음식위치)
  • 여기서 알고리즘은 상태를 먼저 처리한 후 그리는 순서대로 작성하였습니다.
  • 동족의 상태들의 의미는 다음과 같습니다.
    • 0 : 생각하는 중
    • 1 : 음식을 주문하고 대기하는 중
    • 2 : 주문한 음식
  • 어떤 상태든 그 상태의 시간이 0이 되는 것을 기준으로 결정합니다.
    • 0 : 생각하는 시간이 끝났으면 상태를 음식이 주문된 상태로 바꾼 후 주문할 음식을 랜덤으로 고릅니다.
    • 1 : 생각하는 시간이 끝나기 전이면 주문한 동족의 말풍선에 완성된 음식을 그려줍니다.
      • 끝났으면 상태를 완료로 바꾸고 나쁜 표정으로 이미지를 변경합니다.
    • 2 : 감정표현의 시간이 끝나면 손님의 상태를 처음으로 되돌립니다.

3. 실행 결과

notion imagenotion image