분류 전체보기 1092

[테트리스] 설계 방향 변경

▷ 설계 방향 변경 일단 여기까지 구현을 하고 생각을 해보니, 전체적인 구조에 대해서 조금 다르게 접근할 필요를 느끼게 되었다. 왜냐하면, 지금은 임의의 블록을 하나 생성하고, 블록의 높이가 470을 넘으면 멈추도록 설정을 했는데. 이렇게 하면 다른 블록과의 상호작용을 고려하기가 어렵다. 또, 블록을 멈춰둔 뒤 새로운 블록을 계속 만들어야하는데, 그러면 테트리스의 특성 상 블록을 적어도 50개는 만들어야 충분하지 않을까 싶다. 그런데 다른 사람들의 코드를 잠깐 살펴보니, 그 방법은 아닌 것 같다. 그래서 이 문제를 어떻게 해결할까 생각을 해보다가, 그래픽을 조금 더 나중에 구현을 하고 일단은 뼈대에 집중하자는 생각을 했다. 전체 맵을 0으로 된 2차원 배열로 담고, 여기에 블록을 1로 표현해서 담아야겠다..

[테트리스] 첫번째 블록이 땅에 닿으면 멈추도록

▷ 미션 1. 블록이 땅에 닿으면 멈춰야함 도넛 먹기 게임에서는 도넛이 바닥을 지나면, 다시 위에서 새로 생성된다. 근데, 테트리스는 블록이 바닥에 닿으면 멈춰야함. 더보기 # 테트리스 import pygame import random import sys # 초기화 & 기능 사용 시작을 알림 pygame.init() # 전체 스크린의 가로, 세로 설정 screen_width = 480 screen_height = 640 # FPS clock = pygame.time.Clock() # 컬러셋팅 white = (255,255,255) black = (0,0,0) organe = (255,204,153) green = (204,255,229) blue = (204,229,255) pink = (255,204,..

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

# 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에서도..