강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

해콩순이님의 프로필 이미지
해콩순이

작성한 질문수

PyGame 어드벤쳐 : 위니브 월드를 수복하라!

002. 요리하기

코드_질문드립니다.

작성

·

250

0

002_요리하기 코드를 실행하면

1. 다음 오류가 뜨며 창이 강제종료 되는데, 어떤 것이 문제인지 잘 모르겠습니다. [] => {} 라고 바꿔도 그대로 오류가 생깁니다.

    자바독이미지딕셔너리[요리] = []

TypeError: 'pygame.Surface' object does not support item assignment

2.  코드에서 어떤 부분은

예시로 '전' 으로 작은따옴표가 쓰일 때가 있고 "전"이라고 큰따옴표가 쓰일 때도 있는데 어떤 차이인지 질문드립니다.

퀴즈

Pygame에서 스프라이트(Sprite)를 사용하는 주된 목적은 무엇일까요?

게임 배경 음악을 재생하기 위해서입니다.

게임 내 시각적 요소와 관련 속성을 객체로 묶어 관리하기 위해서입니다.

게임의 전체 실행 속도를 제어하기 위해서입니다.

플레이어의 점수를 계산하고 저장하기 위해서입니다.

답변 1

0

Hojun Lee님의 프로필 이미지
Hojun Lee
지식공유자

1. 이건 앞뒤로 코드를 모두 봐야 할 것 같습니다.

2. 주로 Python에서는 작은 따옴표를 많이 사용해요. 차이는 없습니다. 다만 회사에서는 아래와 같은 컨벤션이 있을 수 있어요. 그 규칙에 따라 코딩하시면 됩니다. 회사가 아니시라면 작은 따옴표를 권해드려요. :)

참고 링크 : https://brownbears.tistory.com/291

해콩순이님의 프로필 이미지
해콩순이
질문자

전체 코드입니다.

동족이미지 크기 및 위치는 제 pc 화면에 맞춰 일부 조정하였습니다!

그 이외에 바꾼 부분은 없습니다!!

import pygame as pg

def 스프라이트생성(이미지,위치):
    스프라이트=pg.sprite.Sprite()
    스프라이트.image=이미지
    스프라이트.rect=스프라이트.image.get_rect()
    스프라이트.rect.x, 스프라이트.rect.y=위치[0],위치[1]
    return 스프라이트

pg.init()

실행여부=True
화면가로길이, 화면세로길이= 874,650
화면=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 #이미지움직임 시간 관련, for 자연스러움 움직임
자바독움직임흐름=1
현재요리="사료"
현재요리상태="전"

요리초기위치=[424,248]
요리위치=[요리초기위치[0]-53, 요리초기위치[1]-30]

손님가로숫자=4
요리상태리스트=['전','후']
요리리스트=['사료','뼈다귀','물']

배경이미지= pg.image.load('C:\\Users\\강혜빈\\Desktop\\대학교\\대외활동\\제주코딩베이스캠프_2기\\PyGame\\My_PyGame\\003 부족들의 마음을 요리로 사로잡아라!_마인드 스톤\\img\\배경.png')
배경이미지=pg.transform.scale(배경이미지,(화면가로길이,화면세로길이))

챕터바이미지크기=(358,61)
챕터바이미지= pg.image.load('C:\\Users\\강혜빈\\Desktop\\대학교\\대외활동\\제주코딩베이스캠프_2기\\PyGame\\My_PyGame\\003 부족들의 마음을 요리로 사로잡아라!_마인드 스톤\\img\\챕터바.png')
챕터바이미지=pg.transform.scale(챕터바이미지,(챕터바이미지크기))

자바독이미지크기=(238,238)
자바독이미지딕셔너리={}
자바독이미지딕셔너리['기본자세']= pg.image.load('C:\\Users\\강혜빈\\Desktop\\대학교\\대외활동\\제주코딩베이스캠프_2기\\PyGame\\My_PyGame\\003 부족들의 마음을 요리로 사로잡아라!_마인드 스톤\\img\\자바독_기본자세.png')
자바독이미지딕셔너리=pg.transform.scale(자바독이미지딕셔너리['기본자세'],(자바독이미지크기))

#해당하는 요리이미지들을 딕셔너리에 넣는 코드
for 요리 in 요리리스트:
    자바독이미지딕셔너리[요리] = []
    for 인덱스 in range(3):
        자바독요리중이미지=pg.image.load(f'C:\\Users\\강혜빈\\Desktop\\대학교\\대외활동\\제주코딩베이스캠프_2기\\PyGame\\My_PyGame\\003 부족들의 마음을 요리로 사로잡아라!_마인드 스톤\\img\\자바독_{요리}_요리중_{인덱스+1}.png')
        자바독요리중이미지=pg.transform.scale(자바독요리중이미지,자바독이미지크기)
        자바독이미지딕셔너리[요리].append(자바독요리중이미지)

주방테이블이미지크기=(668,173)
주방테이블이미지= pg.image.load('C:\\Users\\강혜빈\\Desktop\\대학교\\대외활동\\제주코딩베이스캠프_2기\\PyGame\\My_PyGame\\003 부족들의 마음을 요리로 사로잡아라!_마인드 스톤\\img\\주방-테이블.png')
주방테이블이미지=pg.transform.scale(주방테이블이미지,(주방테이블이미지크기))

요리이미지크기딕셔너리= {'사료':(106,61),'뼈다귀':(106,61),'물':(106,61)}

#요리재료에 따른 완성된 요리 저장 딕셔너리
요리이미지딕셔너리={}
for 요리상태 in 요리상태리스트:
    요리이미지딕셔너리[요리상태]={} 
    #요리이미지딕셔너리 내 또 다른 딕셔너리
    for 요리 in 요리리스트:
        요리이미지딕셔너리[요리상태][요리]=pg.image.load(f'C:\\Users\\강혜빈\\Desktop\\대학교\\대외활동\\제주코딩베이스캠프_2기\\PyGame\\My_PyGame\\003 부족들의 마음을 요리로 사로잡아라!_마인드 스톤\\img\\{요리}_요리{요리상태}.png')
        #키=밸류
        요리이미지딕셔너리[요리상태][요리]=pg.transform.scale(요리이미지딕셔너리[요리상태][요리],요리이미지크기딕셔너리[요리])

요리스프라이트=스프라이트생성(요리이미지딕셔너리['전'][현재요리],요리위치)

동족이미지크기=1
동족음식생각중이미지=pg.image.load('C:\\Users\\강혜빈\\Desktop\\대학교\\대외활동\\제주코딩베이스캠프_2기\\PyGame\\My_PyGame\\003 부족들의 마음을 요리로 사로잡아라!_마인드 스톤\\img\\동족_음식-생각-중.png')

동족스프라이트리스트=[스프라이트생성(동족음식생각중이미지,(i*200+동족이미지크기,300*동족이미지크기)) for i 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()))

        요리스프라이트.image = 요리이미지딕셔너리[현재요리상태][현재요리]

        요리스프라이트.rect.x, 요리스프라이트.rect.y=요리위치[0],요리위치[1]
        화면.blit(요리스프라이트.image,요리스프라이트.rect)

    else:
        화면.fill(흰색)

    pg.display.update()

    for 이벤트 in pg.event.get():
        if 이벤트.type ==pg.QUIT:
            실행여부=False
    
    keys=pg.key.get_pressed()
    
    if keys[pg.K_SPACE]:
        if 자바독상태=='기본자세':
            자바독상태=현재요리
        else:
            이미지움직임시간+=흐른시간
            if 이미지움직임시간>= 이미지움직임최대시간:
                이미지움직임시간=0
                자바독인덱스+=자바독움직임흐름
                if 자바독인덱스==0 or 자바독인덱스==len(자바독이미지딕셔너리[자바독상태])-1:
                    자바독움직임흐름*=-1
                    움직임횟수+=1
                    if 움직임횟수 >=움직임최대횟수:
                        현재요리상태='후'
                    
    else:
        이미지움직임시간=0
        자바독상태='기본자세'
        자바독인덱스=0
        자바독움직임흐름=1
        움직임횟수=0

pg.display.quit()
해콩순이님의 프로필 이미지
해콩순이

작성한 질문수

질문하기