🐟

006 게임규칙(이벤트) 추가하기 -1

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(랜덤물고기, 물고기좌표) 물고기정답위치.append(물고기좌표) pg.display.update() 폰트 = pg.font.SysFont("hy얕은샘물m", 30, True) 시작시간 = pg.time.get_ticks() 잡은물고기 = 0 while True: 경과시간 = round((pg.time.get_ticks() - 시작시간) / 1000, 1) if 경과시간 >= 10: 화면.blit(배경이미지, (0, 0)) 결과 = 폰트.render(f'총 {잡은물고기} 마리를 잡았습니다!', True, (0, 0, 0)) 게임종료 = 폰트.render(f'게임 종료!', True, (0, 0, 0)) 화면.blit(게임종료, (230, 400)) 화면.blit(결과, (170, 550)) pg.display.update() pg.time.delay(5000) quit() 화면.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() elif 이벤트.type == pg.MOUSEBUTTONDOWN: 마우스 = pg.mouse.get_pos() for 포인트 in 물고기정답위치: if 포인트.collidepoint(마우스): 물고기정답위치.remove(포인트) 잡은물고기 += 1 화면.blit(배경이미지, (0, 0)) for 가로 in range(70, 520, 90): pg.draw.line(화면, (255, 255, 255), (가로, 370), (가로, 화면세로길이-30), 3) for 세로 in range(370, 화면세로길이-30, 80): pg.draw.line(화면, (255, 255, 255), (70, 세로), (520, 세로), 3) pg.draw.line(화면, (255, 255, 255), (520, 370), (520, 화면세로길이-30), 3) pg.draw.line(화면, (255, 255, 255), (70, 화면세로길이-30), (520, 화면세로길이-30), 3) 물고기위치 = random.sample(전체물고기위치, len(물고기정답위치)) 물고기정답위치2 = [] for 위치 in range(len(물고기정답위치)): 랜덤물고기 = random.choice(물고기) 물고기좌표 = 랜덤물고기.get_rect(topleft=(물고기위치[위치][0], 물고기위치[위치][1])) 화면.blit(랜덤물고기, 물고기좌표) 물고기정답위치2.append(물고기좌표) 물고기정답위치 = [] 물고기정답위치.extend(물고기정답위치2) pg.display.update()

2. 상세 내용

물고기정답위치 = [] for 위치 in range(5): 랜덤물고기 = random.choice(물고기) 물고기좌표 = 랜덤물고기.get_rect(topleft=(물고기위치[위치][0], 물고기위치[위치][1])) 화면.blit(랜덤물고기, 물고기좌표) 물고기정답위치.append(물고기좌표)
  • 물고기 이미지를 랜덤으로 가져와 화면에 위치 시킵니다. → 5번 반복
  • 이때, 물고기가 화면의 어떤 좌표에 있는지 기록하기 위해 정답좌표를 리스트에 추가합니다.
 
for 이벤트 in pg.event.get(): if 이벤트.type == pg.QUIT: quit() elif 이벤트.type == pg.MOUSEBUTTONDOWN: 마우스 = pg.mouse.get_pos() for 포인트 in 물고기정답위치: if 포인트.collidepoint(마우스): 물고기정답위치.remove(포인트) 잡은물고기 += 1 화면.blit(배경이미지, (0, 0)) for 가로 in range(70, 520, 90): pg.draw.line(화면, (255, 255, 255), (가로, 370), (가로, 화면세로길이-30), 3) for 세로 in range(370, 화면세로길이-30, 80): pg.draw.line(화면, (255, 255, 255), (70, 세로), (520, 세로), 3) pg.draw.line(화면, (255, 255, 255), (520, 370), (520, 화면세로길이-30), 3) pg.draw.line(화면, (255, 255, 255), (70, 화면세로길이-30), (520, 화면세로길이-30), 3) 물고기위치 = random.sample(전체물고기위치, len(물고기정답위치)) 물고기정답위치2 = [] for 위치 in range(len(물고기정답위치)): 랜덤물고기 = random.choice(물고기) 물고기좌표 = 랜덤물고기.get_rect(topleft=(물고기위치[위치][0], 물고기위치[위치][1])) 화면.blit(랜덤물고기, 물고기좌표) 물고기정답위치2.append(물고기좌표) 물고기정답위치 = [] 물고기정답위치.extend(물고기정답위치2) pg.display.update()
  • pg.event.get()로 이벤트를 입력받습니다. → while내에 위치하기때문에 게임이 계속돌아가면서 입력을 받을 수 있습니다.
  • pg.MOUSEBUTTONDOWN 함수는 마우스 버튼이 클릭이 됐을 때를 말합니다. 즉 → 마우스 버튼이 눌렸다면 하위에 있는 코드들이 실행됩니다.
  • pg.mouse.get_pos() : 마우스의 위치값을 반환합니다.
  • 물고기정답위치 리스트를 반복하면서 collidepoint함수를 통해 클릭된 마우스의 위치값과 물고기의 이미지의 위치가 맞는지 체크합니다.
  • 만약 맞다면 정답위치 리스트에서 클릭된 좌표를 지웁니다.
  • 잡은물고기의 수를 1씩 증가 시키고 배경, 게임판을 추가합니다.
  • len함수를 통해 존재하는 생선의 수만큼 또 다른 좌표를 가진 생선을 화면에 업데이트 합니다.
 
if 경과시간 >= 10: 화면.blit(배경이미지, (0, 0)) 결과 = 폰트.render(f'총 {잡은물고기} 마리를 잡았습니다!', True, (0, 0, 0)) 게임종료 = 폰트.render(f'게임 종료!', True, (0, 0, 0)) 화면.blit(게임종료, (230, 400)) 화면.blit(결과, (170, 550)) pg.display.update() pg.time.delay(5000) quit()
  • 게임은 생성된 물고기 5마리를 10초 안에 클릭하지 못하면 게임이 종료됩니다.
  • 앞서 구한 경과시간 변수를 통해 10초가 되면 배경이미지를 업데이트하고 잡은물고기 변수를 이용해 결과값 텍스트와 게임 종료 텍스트를 화면에 추가합니다.
  • pg.time.delay(밀리초) : 5000값을 준다면 5초 동안 게임이 딜레이 즉, 멈춥니다.
  • 5초의 시간이 지난 후 게임이 종료됩니다.

3. 실행 결과

notion imagenotion image
notion imagenotion image