전체 글 1090

[테트리스] 블록이 원하는 범위에서 랜덤으로 떨어지도록 지정

# random 모듈 임포트 import random # 0에서 6까지의 범위 안에서 랜덤으로 숫자 생성 block_random_number = random.randint(0, 6) # 120에서 570까지의 범위 안에서 랜덤으로 숫자 생성 block_x_pos = random.randint(120, 570) 블록의 종류를 결정하는 숫자인 block_random_number는 random.randint(0,6)을 이용해서 생성하였습니다. random.randint(시작 숫자, 마지막 숫자) 이렇게 넣어주면 시작 숫자부터 마지막 숫자까지 랜덤으로 수를 생성해서 return해줍니다. block_x_pos의 경우에도 random.randint(120, 570)를 사용했는데, 이것은 화면에서 블록이 생성되는 x..

[테트리스] 전체적인 코드 수정 + 타이머 & 점수판

# 전체 스크린의 가로, 세로 설정 screen_width = 480 screen_height = 640 스크린을 생성하는 데 있어서, 화면 비율도 중요합니다. 일반적인 TV나 모니터의 경우에는 4:3의 비율을 갖기 때문에 여기에 맞춰서 640x480으로 비율을 재조정하였습니다. 추가로 배경화면과 블록을 그리는 코드를 while문 안에 넣었습니다. * 화면 비율 일반적인 TV나 모니터 4:3 = 400x300 / 640x480 / 800x600 / 1024x768 / 1152x864 / 1280x960 DVD 등 16:9 = 760x480 / 1200x900 # 타이머 설정 # 총 시간 total_time = 40 # 시작시간 정보 start_ticks = pygame.time.get_ticks() # ..

[도넛 먹기 게임] 점수가 이상했던 원인 파악 & 해결

▶ 문제 상황 맨 처음에는, 강아지가 도넛과 충돌했을 때, 도넛을 배경색으로 바꾸었다. (눈에는 안보이지만 존재하는 투명도넛의 상태) 그렇게 되니까 while문을 계속 돌면서 도넛 점수가 계속 올라가게 되는 현상이 발생했다. 특히 도넛의 속도가 느린 경우 점수가 더 많이 올라가고 (캐릭터와 닿아있는 시간이 길어지기 때문에) 빠른 경우 점수가 적게 올라가는 문제가 발생했다. # 도넛 먹었을 때 대체할 배경 rep = pygame.image.load("C:/Users/Soyoung/Desktop/pygame/replace0.png") # 도넛 개수가 10개 for i in range(10): # 도넛과 충돌했을 때 if character_rect.colliderect(donut_rect[i]): # 점수 증..

[pygame] 11. 2D 게임의 기본 코드 흐름

대략 이러한 흐름을 따라가면 다양한 2D게임을 만들 수 있다. 전투게임, 테트리스, 물건 피하기, 아이템 먹기 등등 물론 좀 더 복잡한 기능을 구현하고 싶다면, 더 많은 공부가 필요하겠지만~! pygame의 다양한 모듈과 함수 덕분에 조금 더 편하게 게임을 개발할 수 있어서 감사하다. import pygame ############################################################## # 기본 초기화 (반드시 해야 하는 것들) pygame.init() # 화면 크기 설정 screen_width = 480 # 가로 크기 screen_height = 640 # 세로 크기 screen = pygame.display.set_mode((screen_width, screen_he..

[pygame] 10. 타이머 만들기

게임에서 타이머를 잘 만들어야한다. 시간을 측정하면서 경기를 진행하거나 점수를 주는 게임들이 많기 때문이다. 게임을 만들 때 시간을 어떻게 구하는가? 보통은 기준 시간대에서 현재시간을 빼는 방식으로 구하게 된다. 게임에서의 기준 시간은 1970년대를 기준으로 맞춰져있다. (처음 개발한 사람이 그렇게 했나보다) 그리고 보통 time 함수를 많이 쓰는데, 파이게임에서는 시간과 관련된 함수를 제공해주기 때문에, 여기서는 그것을 사용해보도록 하자. 대략 타이머를 만드는 것에 관련된 코드들만 한번 모아두었다. 나는 사용자에게 100초의 시간적 여유를 주고 싶기 때문에, total_time을 100으로 설정했다. 그리고 여기서 흐른 시간 elapsed_time을 뺀 값을 나타냄으로서 타이머를 구현하였다. 또, 여기..

[pygame] 9. 텍스트 글자 삽입

게임을 하다가 글자가 필요할 때가 있다. 여기에서도 "잡았다 피카츄 !"라는 말을 프로그램 실행창 뿐 아니라 게임 화면에도 나타내고 싶은데, 그럴 때는 어떻게 하면 좋을까? (나중에 게임오버 메세지를 출력하거나, 남은 시간, 점수를 표시할 때도 사용될 것이다) 먼저는 글자의 폰트를 정해주는 작업이 필요하다. pygame에서는 font 함수를 제공해주는데, 홈페이지에 찾아보면 다양한 폰트가 있다는 걸 알 수 있다. (그런데 예시 코드를 보면 대부분 그냥 None으로 쓰는듯? 기본 폰트가 괜찮은가보다.) # 폰트 정의 # 폰트 객체 생성 (폰트, 크기) # 디폴트 폰트 사용할 예정이라 그냥 None으로 적었음 game_font = pygame.font.Font(None, 40) https://www.pyga..

[pygame] 8. 간단한 충돌처리

피카츄가 몬스터 볼과 만나면 5초간 잠시 멈춰있다가 프로그램이 꺼지는 코드를 작성해보자. 우선 부딪치는 2개의 물체에 대한 정보를 입력해줘야한다. pygame에서 제공해주는 get_rect() / A_rect.left / A_rect.top 등의 함수를 활용하면 편하다. # 충돌 처리를 위한 character rect 정보 업데이트 # pygame에서 get_rect()는 직사각형에 대한 정보를 가져오는 함수이다. # 그리고 여기서 left와 top 정보를 현 위치로 업데이트 해줘야한다. character_rect = character.get_rect() character_rect.left = character_x_pos character_rect.top = character_y_pos # ball에서도..

[pygame] 7. 충돌 처리를 위한 준비

충돌 처리는 게임을 만드는 것에 있어서 꽤 중요한 부분 중 하나이다. 아무 처리를 하지 않았을때, 캐릭터 그림끼리 서로 겹치기도 하고 그냥 스쳐 지나간다. 그래서 이 캐릭터의 rigid 처리를 해주고, 서로 간의 충돌처리를 해주는 것이 중요하다. 이 파트를 잘 다룰 수 있다면, 벽돌깨기 게임도 만들 수 있고, 적군과 부딪쳤을때 또는 보물상자나 함정에 부딪쳤을 때, 어떤 이벤트를 발생시킬 수 있다. 여기에서는 피카츄가 몬스터볼에 부딪쳤을 때, 충돌처리를 하면서 게임을 종료시키는 작업을 진행해보자. 우선 그 전에 몬스터볼 이미지 파일도 불러오고, 셋팅하는 작업을 해줘야한다. 이것은 예전 캐릭터 셋팅 시 진행했던 작업과 거의 유사하다. * 참고 https://bayleaf07.tistory.com/62 [추억..

[pygame] 6. FPS 설정2

여기서 이제 문제가 뭐냐, FPS가 초당 프레임 수를 의미하는 거라면 FPS = 10이나 FPS = 60이나 화면이 버벅이는 차이만 있어야하지, FPS에 따라서 캐릭터의 속도 자체가 바뀌면 안된다. 근데 지금 그 문제가 일어나고 있음 일단 이 문제를 해결하기 전에 캐릭터 좌표를 변수로 만들어서 먼저 빼보자. # 이동 속도 character_speed = 10 # 원래 5로 적었던 부분을 character_speed라는 변수로 바꾸었음. 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 elif e..