상세 컨텐츠

본문 제목

[Python 파이썬 독학 활용1편 1-3일차] Quiz

파이썬 스터디/파이썬-Python 활용편1

by 후즈테크 2020. 10. 22. 13:12

본문

반응형

Quiz 1 을 마치며....내가 기본기가 탄탄하구나 라는 착각을 잠시 했다.......ㅋㅋㅋ 

기본편을 공부할 때, 클래스 부분부터 4, 5번을 돌려봤었는데...

퀴즈1 까지는 그냥 음....이건 이렇게 하면 되는거네

누가 이런 함수를 만들어 놧었네 정도만 기억하면 됐었는데........

 

 

그러나...

퀴즈 뒷 부분은 듣다 보니.....어느새 다시... 어???? 라는 상태가 되었다 ㅋㅋ

list 형태로 구성하거나 for 문을 작성하는 것 까지는 아무렇지 않았는데...

어느순간 공을 움직이는 단계에서는 순간 멍해졌다 ㅋㅋ

 

다시 돌려 듣기를 반복할 뿐이고, 코딩은 생각을 구현하는 방법일 뿐이지.....

그 생각을 코딩할 수 있게 수학이나 논리적으로 정의하는건 쉽지 않은 것 같다 ㅋㅋㅋ

 

 

quiz1.zip
0.23MB

 

 실행 시 필요한 그림파일 및 .py 는 quiz1.zip 파일에서 확인하세요.

   - Quiz1.py : Ans1 내가 작성한 코딩 / 일부 조건 추가

   - Quiz1_image : dog, ddong 등의 이미지 파일을 사용한 완성본

   - Quiz1_nadocoding.py : 나도코딩님 작성 코딩 답안

반응형

---------------------------------------------------------------------------------------------------------------

[Quiz 1]

하늘에서 떨어지는 똥 피하기 게임을 만드시오

 

[게임 조건]

1. 캐릭터는 화면 가장 아래에 위치, 좌우로만 이동 가능

2. 똥은 화면 가장 위에서 떨어짐, x 좌표는 매번 랜덤으로 설정

3. 캐릭터가 똥을 피하면 다음 똥이 다시 떨어짐

4. 캐릭터가 똥과 충돌하면 게임 종료

5. FPS는 30으로 고정

 

[게임 이미지]

1. 배경 : 640* 480(세로 가로) - background.png

2. 캐릭터 : 70 * 70 - character.png

3. 똥 : 70 * 70 - enemy.png

-----------------------------------

 

 

 

 

 Ans 1. 내가 작성한 코드

 

 기존 소스에서 크게 차이 나지 않는 내용이라 그랬던지, Quiz가 생각보다 쉽게 풀리고,

 코드 작성 중, 게임이 끝나지 않는 구조라는 걸 알게되어서......

 복습 겸... 몇가지 조건을 추가로 넣어 보았다.

 

[ 추가 조건 ]

 6. 10개의 똥이 떨어지도록 설정

 7. 10개가 다 떨어진 후에는 화면 중앙에 'Mission Clear' 표기

 8. Timer 표시 (30초)........(10개가 30초 전에 떨어져서 시간은 별 의미는 없었다.....ㅋㅋㅋ)

 9. 종료 전 화면 멈춤(delay) 2초

 

import pygame
from random import *

pygame.init() # 초기화 작업(반드시 필요)

# 화면 크기 설정
screen_width = 480 # 가로 크기 픽셀단위
screen_height = 640 # 세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))

# 화면 타이틀 설정
pygame.display.set_caption("WhoseTech Game[Avoid DDONG!!]") #게임 이름

# FPS
clock = pygame.time.Clock()

####################################

# 1. 사용자 게임 초기화 (배경화면, 게임이미지, 좌표, 속도, 폰트 등)

# 배경 만들기
background = pygame.image.load("D:/python/workspace/pygame_basic/background.png") # 이미지 불러오기, 경로 설정시 '\\' 또는 '/' 폴더 위치 표현 가능


# 캐릭터 만들기
character = pygame.image.load("D:/python/workspace/pygame_basic/character.png") # 이미지 불러오기, 경로 설정시 '\\' 또는 '/' 폴더 위치 표현 가능
character_size = character.get_rect().size # rect - 사각형 size, 이미지 크기
character_width = character_size[0] # 캐릭터의 가로 크기
character_height = character_size[1] # 캐릭터의 세로 크기
character_x_pos = (screen_width / 2) - (character_width / 2) # 캐릭터의 가로 위치, 화면 크기의 중앙에 위치
character_y_pos = screen_height - character_height # 캐릭터의 세로 위치, 화면 크기의 가장 아래

# 이동 위치
to_x = 0


# 똥 만들기

# 적 enemy 캐릭터
enemy = pygame.image.load("D:/python/workspace/pygame_basic/enemy.png") # 이미지 불러오기, 경로 설정시 '\\' 또는 '/' 폴더 위치 표현 가능
enemy_size = enemy.get_rect().size # rect - 사각형 size, 이미지 크기
enemy_width = enemy_size[0] # 적군 캐릭터의 가로 크기
enemy_height = enemy_size[1] # 적군 캐릭터의 세로 크기
enemy_x_pos = randrange(0, screen_width-enemy_width)  # 적군 캐릭터의 가로 위치, 화면 크기의 중앙에 위치
enemy_y_pos = 0 # 적군 캐릭터의 세로 위치, 화면 가장 위에서 시작
enemy_speed = 10



# 이동 속도
character_speed = 0.6


# 폰트 정의
game_font = pygame.font.Font(None, 40) # 폰트 객체 생성, 폰트와 크기

# 총 시간
total_time = 30

# 시작 시간 정보
start_ticks = pygame.time.get_ticks() # 현재 tick 값 을 받아옴
enemy_count = 10

# 2. 이벤트 처리(키보드, 마우스 등)
running = True # 게임이 진행중인가?
while running:
    dt = clock.tick(30) # 게임화면의 초당 프레임 수 설정

    for event in pygame.event.get():
        if event.type == pygame.QUIT: # 오른쪽 상단 X 버튼, 창이 닫히는 이벤트가(종료) 가 발생하였는가?
            running = False # 게임이 진행중이 아님

        if event.type == pygame.KEYDOWN: #(KEYDOWN 대문자) , 키가 눌러졌는지 확인
            if event.key == pygame.K_LEFT: # 캐릭터를 왼쪽으로
                to_x -= character_speed 
            elif event.key == pygame.K_RIGHT: # 캐릭터를  오른쪽으로
                to_x += character_speed
            

        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                to_x = 0
        

    # 3 게임 캐릭터의 위치 정의

    character_x_pos += to_x * dt
    enemy_y_pos += enemy_speed
   

    # 가로 경계값 처리
    if character_x_pos <= 0:
        character_x_pos = 0
    elif character_x_pos > screen_width - character_width:
        character_x_pos = screen_width - character_width
    
        
    # 충돌 처리를 위한 rect 정보 업데이트
    character_rect = character.get_rect()
    character_rect.left = character_x_pos
    character_rect.top = character_y_pos

    enemy_rect = enemy.get_rect()
    enemy_rect.left = enemy_x_pos
    enemy_rect.top = enemy_y_pos

    # 적인 남아 있을 때, 아래까지 내려오면 적 감소 후, 다시 시작
    if enemy_count > 1:
        if enemy_y_pos == screen_height:
            enemy_count -= 1
            enemy_x_pos = randrange(0, screen_width - enemy_width)
            enemy_y_pos = 0
            print(enemy_count)


    # 충돌 체크
    if character_rect.colliderect(enemy_rect):
        print("충돌했어요")
        running = False


    # 성공 확인
    if enemy_count == 1 and enemy_y_pos == screen_height :
        print("Mission clear")
        running = False



    # 5 화면에 그리기
    screen.blit(background, (0, 0))  # 배경 그리기 blit 으로 이미지 표시, 튜플 형식으로 표시 위치 설정

    screen.blit(character, (character_x_pos, character_y_pos))
    screen.blit(enemy, (enemy_x_pos, enemy_y_pos)) # 적 그리기

    
    # 타이머 집어넣기
    # 경과 시간 계산
    elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000 # 남은 시간을 역순으로 보여주기 위해 , /1000 -> 기준 값이 ms 이므로 단위를 s 로 변경
    # 경과 시간(ms)을 1000으로 나누어서 초(s) 단위로 표시
    

    timer = game_font.render(str(int(total_time - elapsed_time)), True, (255, 255, 255)) # 남은 시간을 역순으로 보여주기 위해 
    # 출력할 글자(시간), True, 글자 색상

    screen.blit(timer, (10, 10))


    # 남은 enemy 수 확인 및 그리기
    enemy_count_render = game_font.render("Enemy Count : " + str(int(enemy_count -1)), True, (255, 255, 255))
    screen.blit(enemy_count_render, (screen_width - 300, 10))


    # 목표 수량 완료 후, Mission Clear 문구 출력
    if enemy_count == 1 and enemy_y_pos == screen_height :
        mission_clear_render = game_font.render("Mission Clear", True, (255, 255, 255))
        mission_clear_size = mission_clear_render.get_rect().size
        mission_clear_width = mission_clear_size[0]
        screen.blit(mission_clear_render, (screen_width /2 - mission_clear_width /2 , screen_height / 2))
    


    pygame.display.update() # 게임 화면을 다시 그리기!! (반드시 필요)


# 잠시 대기
pygame.time.delay(2000) # 2초 정도 대기 (2000ms)

# pygame 종료
pygame.quit()

 

 

Ans2 . 나도코딩님 답안

import random
import pygame
##############################################################
# 기본 초기화 (반드시 해야 하는 것들)
pygame.init()

# 화면 크기 설정
screen_width = 480 # 가로 크기
screen_height = 640 # 세로 크기
screen = pygame.display.set_mode((screen_width, screen_height))

# 화면 타이틀 설정
pygame.display.set_caption("Quiz")

# FPS
clock = pygame.time.Clock()
##############################################################

# 1. 사용자 게임 초기화 (배경 화면, 게임 이미지, 좌표, 속도, 폰트 등)
# 배경 만들기
background = pygame.image.load("D:\\python\\workspace\\pygame_basic\\background.png")

# 캐릭터 만들기
character = pygame.image.load("D:\\python\\workspace\\pygame_basic\\character.png")
character_size = character.get_rect().size
character_width = character_size[0]
character_height = character_size[1]
character_x_pos = (screen_width / 2) - (character_width / 2)
character_y_pos = screen_height - character_height

# 이동 위치
to_x = 0
character_speed = 10

# 똥 만들기
ddong = pygame.image.load("D:\\python\\workspace\\pygame_basic\\enemy.png")
ddong_size = ddong.get_rect().size
ddong_width = ddong_size[0]
ddong_height = ddong_size[1]
ddong_x_pos = random.randint(0, screen_width - ddong_width)
ddong_y_pos = 0
ddong_speed = 10

running = True
while running:
    dt = clock.tick(30)
    
    # 2. 이벤트 처리 (키보드, 마우스 등)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False 

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                to_x -= character_speed
            elif event.key == pygame.K_RIGHT:
                to_x += character_speed
            
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                to_x = 0

    # 3. 게임 캐릭터 위치 정의
    character_x_pos += to_x

    if character_x_pos < 0:
        character_x_pos = 0
    elif character_x_pos > screen_width - character_width:
        character_x_pos = screen_width - character_width

    ddong_y_pos += ddong_speed

    if ddong_y_pos > screen_height:
        ddong_y_pos = 0
        ddong_x_pos = random.randint(0, screen_width - ddong_width)
    
    # 4. 충돌 처리
    character_rect = character.get_rect()
    character_rect.left = character_x_pos
    character_rect.top = character_y_pos

    ddong_rect = ddong.get_rect()
    ddong_rect.left = ddong_x_pos
    ddong_rect.top = ddong_y_pos

    if character_rect.colliderect(ddong_rect):
        print("충돌했어요")
        running = False

    # 5. 화면에 그리기
    screen.blit(background, (0, 0))
    screen.blit(character, (character_x_pos, character_y_pos))
    screen.blit(ddong, (ddong_x_pos, ddong_y_pos))
    
    pygame.display.update()

pygame.quit()

 

---------------------------------------------------------------------

FeedBack


1. random package import 시에 
  - 후즈테크 : from random import * 을 이용해서 실제 코드 작성시 간략히 사용했고,
  - 나도코딩님 : import random 을 사용했음...
 : 사용법의 차이점은 기본편 9-1일차 정리 내용 참고 링크 : whosetech.tistory.com/15


2. 파일 경로 설정 시, '\\' 으로 표기
  = '\\', '/' 둘다 표기 가능

Final . 사각형은 이제 질렸다.... 이미지도 나도코딩님 처럼 한번 입혀 보겠다...

경로에서 파일명만 변경해주면 퍼펙!!

 

 

반응형

관련글 더보기

댓글 영역