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초 동안 게임이 딜레이 즉, 멈춥니다.
3. 실행 결과