🐟

005 게임판 그리기 및 물고기 생성하기

1. 실행 코드

import pygame as pg import random pg.init() 화면가로길이 = 600 화면세로길이 = 800 화면 = pg.display.set_mode((화면가로길이, 화면세로길이)) pg.display.set_caption("생선잡기 게임") 배경이미지 = pg.image.load("img/배경.png") 배경이미지 = pg.transform.scale(배경이미지, (화면가로길이, 화면세로길이)) 화면.blit(배경이미지, (0, 0)) 물고기1 = pg.image.load("img/물고기1.png") 물고기1 = pg.transform.scale(물고기1, (64, 64)) 물고기2 = pg.image.load("img/물고기2.png") 물고기2 = pg.transform.scale(물고기2, (64, 64)) 스코어바 = pg.image.load("img/스코어바.png") 스코어바 = pg.transform.scale(스코어바, (250, 70)) 시간바 = pg.image.load("img/시간바.png") 시간바 = pg.transform.scale(시간바, (200, 55)) 물고기 = [물고기1, 물고기2] 전체물고기위치 = [] for 가로 in range(70, 520, 90): pg.draw.line(화면, (255, 255, 255), (가로, 370), (가로, 화면세로길이-30), 3) # 아래 for를 중첩하지 않아도 되지만, 물고기의 위치 좌표를 얻기 위해 for를 중첩 for 세로 in range(370, 화면세로길이-30, 80): #화면세로길이 = 800 pg.draw.line(화면, (255, 255, 255), (70, 세로), (520, 세로), 3) 전체물고기위치.append((가로+10, 세로+10)) pg.draw.line(화면, (255, 255, 255), (520, 370), (520, 화면세로길이-30), 3) pg.draw.line(화면, (255, 255, 255), (70, 화면세로길이-30), (520, 화면세로길이-30), 3) 물고기위치 = random.sample(전체물고기위치, 5) for 위치 in range(5): 랜덤물고기 = random.choice(물고기) 물고기좌표 = 랜덤물고기.get_rect(topleft=(물고기위치[위치][0], 물고기위치[위치][1])) 화면.blit(랜덤물고기, 물고기좌표) pg.display.update() 폰트 = pg.font.SysFont("hy얕은샘물m", 30, True) 시작시간 = pg.time.get_ticks() 잡은물고기 = 0 while True: 경과시간 = round((pg.time.get_ticks() - 시작시간) / 1000, 1) 화면.blit(스코어바, (350, 2)) 화면.blit(시간바, (0, 10)) 시간 = 폰트.render(f"{경과시간} 초", True, (0, 0, 0)) 화면.blit(시간, (60, 28)) 물고기점수 = 폰트.render(f"{잡은물고기} 마리", True, (0, 0, 0)) 화면.blit(물고기점수, (450, 28)) pg.display.update() for 이벤트 in pg.event.get(): if 이벤트.type == pg.QUIT: quit()

2. 상세 내용

물고기 = [물고기1, 물고기2] 전체물고기위치 = [] for 가로 in range(70, 520, 90): pg.draw.line(화면, (255, 255, 255), (가로, 370), (가로, 화면세로길이-30), 3) # 아래 for를 중첩하지 않아도 되지만, 물고기의 위치 좌표를 얻기 위해 for를 중첩 for 세로 in range(370, 화면세로길이-30, 80): #화면세로길이 = 800 pg.draw.line(화면, (255, 255, 255), (70, 세로), (520, 세로), 3) 전체물고기위치.append((가로+10, 세로+10)) pg.draw.line(화면, (255, 255, 255), (520, 370), (520, 화면세로길이-30), 3) pg.draw.line(화면, (255, 255, 255), (70, 화면세로길이-30), (520, 화면세로길이-30), 3)
  • 랜덤한 이미지의 물고기를 생성하기위해 앞서 추가한 물고기 이미지들을 리스트에 담습니다.
  • 게임은 전체물고기 위치에 랜덤한 곳에 물고기가 생성됩니다. → 전체물고기위치를 전부 기억하기위해 리스트를 만듭니다.
  • 물고기가 나오는 5X5의 바둑판배열을 만들기 위해 2중첩 for문을 활용하여 선을 그립니다.
  • pg.draw.line(그릴곳,(R,G,B),(X,Y),(width,height))로 화면에 선을 그립니다.
  • for문을 순회하며 전체물고기 좌표를 리스트에 넣습니다.
    • 💡
      가로와 세로에 10을 더해주는 이유는 칸마다 정중앙에 위치시키려 함입니다.
  • 마지막으로 가로끝과 세로끝을 추가하여 바둑판배열을 완성시킵니다.
    • 💡
      for문의 반복을 늘려 바둑판을 그릴 수 있지만 그렇게 하게 된다면 물고기의 위치가 화면을 넘어가기에 그러한 현상을 막기 위해 따로 2줄을 추가한것입니다.
 
물고기위치 = random.sample(전체물고기위치, 5) for 위치 in range(5): 랜덤물고기 = random.choice(물고기) 물고기좌표 = 랜덤물고기.get_rect(topleft=(물고기위치[위치][0], 물고기위치[위치][1])) 화면.blit(랜덤물고기, 물고기좌표)
  • random.sample(리스트,뽑을 횟수) : 리스트내에 중복되지 않는 요소를 뽑을 횟수만큼 추출하여 리스트를 만듭니다. → 전체물고기 위치 리스트에서 5개의 랜덤한 위치를 뽑아 리스트로 만듭니다.
  • for문을 5번 반복합니다. → 게임은 5마리의 물고기를 잡으면 됩니다.
  • random.choice(리스트) : 리스트에서 랜덤하게 1가지 요소를 뽑습니다. → 물고기 이미지를 랜덤하게 뽑습니다.
  • Surface객체.get_rect() : Surface객체를 직사각형 형태로 추출합니다.
    • topleft = 왼쪽 상단부터 위치 (X,Y)를 설정하는 옵션
    • EX)<rect(63, 195, 64, 64)> → X = 63, Y = 195 ,Width = 64,Height = 64 의 형태를 가진 직사각형
  • 화면의 random.sample로 추출한 랜덤한 좌표에 랜덤한 이미지의 물고기를 5번 추가합니다.

3. 실행 결과

notion imagenotion image