내일배움캠프 AI - 8일차 TIL, 2022.04.27

Dongwoo Kim·2022년 4월 27일
0

TIL / WIL

목록 보기
9/113

스파르타 코딩클럽

내일배움캠프 AI 웹개발자양성과정 2회차

2022.04.27. 8일차- TIL

1. python 퀴즈

09:00-11:00 퀴즈 및 해설

오늘은 줌에 모여서 python 퀴즈를 진행했다. 성적을 매기는 용도보다는 아마도 캠프 참가자들의 python 숙련도를 체크하기 위한 것 같았다. 문제는 사용 구간 별 가격이 다른 전기 요금 표에 따른 총 전기 요금을 측정하는 것이 었다.

가장 먼저 생각난 방법은 나누기였다. 전기 요금은 100단위로 사용할 수록 가격이 증가하기 때문에 총 사용량을 100으로 나눠서 몫과 나머지에 따라 총 전기 요금을 측정하면 되지 않을까 싶었다.

우선 전기 요금을 측정하는 cost(amount) 함수를 만들어 보았다. amount라는 전기 사용량을 매개변수로 받았다. 전기 요금 표는 추가적으로 요금표가 변경되거나 요금 구간이 늘어날 수 있기 때문에 튜플이 아닌 리스트 costs로 함수 내 지역 변수로 선언하고 amount를 100으로 나눈 몫과 나머지를 구하여 1부터 몫의 값까지 for문을 돌려 전기 요금표에서 100만큼 곱한 값을 총 전기 요금에 더했고 마지막으로 나머지만큼을 계산해서 최종 총 전기 요금값을 구하여 해당 함수의 return 값으로 반환했다.

다음은 결과를 출력해주는 함수 print_cost(amounts)를 구현했다. 출력 함수는 간단했다. amounts라는 사용량들이이 들어있는 리스트를 순회하면서 각각의 요소를 cost() 함수의 매개변수로 넣어 값을 구하고 출력하면 끝이었다.

문제자체는 어렵지않았고 처음 생각했던 구상대로 구현이 되었지만 약간 헷갈리는 부분이 있었다면 cost() 함수에서 몫값에 따라 for문을 돌리는 부분이었다. 실제 몫과 costs의 인덱스값에는 차이가 있어서 -1씩 보정을 해줘야했다.

  • 코드 구현 부분
# 전기 요금 계산 함수
# amount : 전기 사용량
# return : amount에 따른 총 전기 요금
def cost(amount):
    # 저압의 경우 100kWh 이하는 kWh당 60.7원, 100kWh 초과는 125.9원, 
    # 200kWh 초과는 187.9원, 300kWh 초과는 280.6원, 400kWh 초과는 417.7원, 
    # 500kWh초과는 670.6원의 전력량 요금을 내야한다.

    # 전기 사용량에 따른 요금 리스트
    costs = [60.7, 125.9, 187.9, 280.6, 417.7, 670.6]

    # 전기 사용량을 100 단위로 나눈 몫과 나머지
    div_1 = amount // 100
    div_2 = amount % 100

    # 총 요금을 담을 변수
    total_cost = 0

    # 요금 계산
    for i in range(1, div_1+1):
        if i >= len(costs):
            index = len(costs) - 1
        else:
            index = i - 1
        total_cost += 100 * costs[index]
        
    total_cost += div_2 * costs[div_1]

    return total_cost
    
    
# 전기 사용량에 따른 비용을 출력해주는 함수 
def print_cost(amounts):
    print('=========================')
    print('주택용 전기요금(저압) 계산기')
    print('=========================')
    
    for i in amounts:
        print(f'{i}kWh의 전기요금은 {cost(i)}원 입니다.')


amounts = [99, 150]

print_cost(amounts)
  • 출력 부분
=========================
주택용 전기요금(저압) 계산기
=========================
99kWh의 전기요금은 6009.3원 입니다.
150kWh의 전기요금은 12365.0원 입니다.

2. 생각보다 늦게 끝난 오전 일정

11:00-12:00 점심시간
12:00-16:00 개인 프로젝트 마무리

일단 생각보다 오전 일정이 늦게 끝난 것이 변수였다. 10시면 끝날 줄 알았는데 11시에나 끝났고 4시부터는 프로젝트 발표가 있었기 때문에 남은 시간이 얼마 남지 않았었다.

때문에 일단 기본 설계 내용까지는 구현을 목표로 하고 진행했지만 여유가 되면 추가하려고 했던 내용들은 만들 수 없었다. 일단 오늘 추가한 내용은 궁극기, 시작메뉴 및 인트로, 캐릭터 충돌 구현 등 이다.

궁극기 구현 부분은 타격,피격,수비 시에 궁극기 에너지를 채워야하는데 어느 시점에 판단해서 에너지를 추가할지가 주 고민거리였다. 타격과 피격은 정확하게 한 시점에 판단이 되기 때문에 작성이 어렵지 않았지만 수비는 지속적인 상태이기 때문에 수비성공 판정이 계속일어나서 에너지가 한번에 가득차는 현상이 발생했다. 때문에 수비가 성공하는 시점이 아니라 성공이 끝나는 시점을 잡아 궁극기 에너지를 채워주도록 했다.

            # 수비 그리기
            # 공격 중이 아닐 때, 점프 중이 아닐 때만 가능
            elif self.attack_mode == 0 and self.defend_mode != 0:
            	...
                if self.effect_bool:
                    defend_time = (pygame.time.get_ticks() - self.effect_ticks) / 1000
                    if defend_time < self.effect_delay:
                    	...
                  	else:
                        self.energy += 20
                        if self.energy > 100:
                            self.energy = 100
                            ...
                    

캐릭터 충돌 부분은 생각보다 까다로웠다. 그저 rect1.collidrect(rect2) 과 같이 충돌 판정 함수를 사용하면 되겠지라고 생각했는데 충돌 판정이 중요한 것이아니라 캐릭터별 좌표를 설정해줘야해서 애매했다. 이 부분은 고민을 해봐도 딱히 방법이 떠오르지않아서 일단 시간관계상 position(캐릭터별 상대적 위치 - 왼쪽/ 오른쪽) 특성을 이용해 왼쪽일 경우와 오른쪽일 경우로 나눠서 판단하도록 했다. 해당 게임은 2d 횡스크롤 게임이라 x좌표만 생각하면 되기때문에 이 방법이 통했지만 좋은 방법이라고는 느껴지지않아서 하면서도 찝찝한 기분이 들었다.

    # 캐릭터 이동
    # screen_height : 화면 높이
    # screen_width : 화면 너비
    # stage_height : 스테이지 높이
    # dt : 이동 프레임 수
    def move_char(self, screen_height, screen_width, stage_height, dt, enermy):
    	...
        # 적을 넘어갈 수 없음
        if self.position == -1:
            if self.x_pos + self.width > enermy.x_pos:
                self.x_pos = enermy.x_pos - self.width
        else:
            if self.x_pos < enermy.x_pos + enermy.width:
                self.x_pos = enermy.x_pos + enermy.width

시작메뉴와 인트로부분은 크게 어렵지는 않았지만 마감시간이 다가와서 시간에 쫓기며 만들었던 것 같다. 구현 방법은
flow라는 현재 진행 상태를 담은 변수에 따라 while running: 반복분 안에서 제어문을 만들어 그리는 부분을 달리 했다. 다만 하나 고려해야할 점은 이벤트 발생 체크 제어문은 그리는 부분의 제어문 밖에 미리 선언을 해야 작동하는 것이었다.

# 이벤트 루프
running = True   # 게임 진행 변수
while running:
    dt = clock.tick(120) # 초당 프레임수

    for event in pygame.event.get():
        if event.type == pygame.QUIT:  # 종료 이벤트
            running = False
        elif flow == flows[0]:
            ...
        elif flow == flows[1]:
           	...
    # 시작 메뉴
    if flow == flows[0]:
		...       
    # 게임 설명
    elif flow == flows[1]:
    	...
    # 게임 시작
    elif flow == flows[2]:
    	...

3. 발표

16:00-17:00

발표는 지원자를 받아서 진행했는데 나는 지원을 해서 2번째 순서였다. 코드도 시간에 쫓기면서 완성한 터라 발표자료가 있을리 전무했고 첫날 작성했던 프로젝트 설계 글을 보며 발표를 했다. 5분이라는 짧은 시간에 모든 걸 설명할 순 없었지만 이 프로젝트의 목적이 무엇인지 그리고 내가 어떻게 구현했는지 보여주고 다른 사람들에게 설명할 수 있는 경험이 의미있었다고 생각한다.

4. git 강의

17:00-18:00 저녁시간
18:00-20:30 git 강의

오후에 git 강의 일정이 있어서 오늘 저녁시간도 앞당겨졌다. git강의는 오시영 튜터님께서 진행했는데 나름 괜찮았던 것 같다. git을 한번도 사용해보지 않은 사람들을 대상으로 하는 강의여서 대부분의 내용은 이미 알고 있거나 사용하고있는 기능들이었다. 다만 신기했던 것은 local repository와 remote repository를 연결하는 방법을 따로 찾아보적없이 내가 sourcetree를 하면서 터특한 방법과 같아서 내가 잘하고 있었구나 싶은 생각이 들었다.

5. 추가 질의응답

20:30-21:00

강의 이후 따로 게더에서 튜터님과 질의응답시간을 가졌다. 나뿐만 아니라 다른 사람들이 궁금해하던 부분도 공유해서 들을 수 있었고 나도 궁금했던 점을 물어볼 수 있어서 좋았다. 내가 물어봤던 부분은 github에서의 projects와 wiki의 역할과 쓰임새였는데 정확하게 딱 이거다 라는 답변보다는 그 궁금증을 어떻게 서치해서 찾아볼 수 있는지 알려주셨다. 다른 사람들의 질문 중 기억에 남는 것은 코드를 작성하는데 있어서 어떻게 잘 작성할 것인지에 대해 추상적인 방법을 물어보는 것보다 직접 자신의 코드를 들고가서 피드백 받는 것이 좋다는 답변이 있었다.

6. 개인 프로젝트 총평

우선 나는 이 프로젝트에서 두가지 목적을 두고 진행했다. 내가 직접 게임을 설계해보는 것, 설계한 내용대로 구현해보는 것. 둘다 모두 적절하게 이룬 것 같아 만족하지만 시간이 여유롭지않아 추가적인 기능을 구현하지 못한 것은 아쉽긴하다. 그리고 생각보다 게임을 만들 때 고려해야할 점이 많다는 것을 느껴서 지나쳐가며 보았던 별거 아닌 듯한 게임들이 매우 대단해보였다.

profile
kimphysicsman

2개의 댓글

comment-user-thumbnail
2022년 4월 28일

고생 많으셨습니다 :)

아쉬운 만큼 더 열심히 노력하고 계신다는 것이니
오히려 다행입니다 ㅎㅎ

이 기세몰아 알고리즘 이란 것도 한번 검색을 ..? ㅎㅎ

이렇게 공부를 열심히 하신 만큼 다음 프로젝트도 잘 해내실 수 있을것 입니다.

마지막으로 웹으로 게임을 만든다 하면 어떻게 할 수 있을지 고민해보세요 :)

답글 달기
comment-user-thumbnail
2022년 4월 28일

게임 개발전 설계사항 잘 정리하고 개발하고 readme에 정리하셔서 스트리트파이트와 비슷한 게임 구현 잘 해주셨습니다.
상단 중단 하단 공격과 궁극기, 방어까지 구현하셨고 에너지바도 잘표현해주셨습니다.
케릭터는 클래스로 잘구현해주셨고 이후 게임진행 부분도 클래스로 리팩토링 해보시면 좋을것 같습니다.
git에 올려서 버전관리 하시면서 케릭터 공격방어도 Sprite 이미지로 동작을 구현해보시면 좀더 완성있는 게임이 되지않을까 싶습니다.
짧은기간 동안 구현하시느라 수고하셨습니다!

답글 달기