게임을 완성했다.
게임 타이틀은 attaboy와 boo를 합친 AttaBooi
완성했다는 뿌듯함보다는 아쉬움이 많이 남는다. 구현하고 싶은 기능이 정말 많고 아이디어는 많이 떠올랐지만, 짧은 시간 + 실력 부족으로 구현하지 못했기 때문..😔
대신 중간중간 에러를 내 힘으로 해결했을때 희열을 느낄 수 있었고, 확실히 게임을 개발하면서 반복문, 조건문들 python문법에 대해 많이 공부할 수 있었다.
게임을 만들면서 힘들었던 부분이나 유용했던 부분에 대해 정리해본다.
import pygame
favicon = pygame.image.load("data/images/title.png") #favicon 설정
pygame.display.set_icon(favicon)
좌측 상단에 아이콘을 띄우는 favicon기능
굳굳
highscore_value = open("data/serialisation/highscore.csv", "r").readline() ##highscore표시
text_highscore = font.render("Highscore: {}".format(highscore_value), True, (150, 200, 255))
screen.blit(text_highscore, (size[0] - 530, 5))
if SB != 0 or GO ==1:
old_highscore_value = open("data/serialisation/highscore.csv", "r").readline() # highscore를 따로 액셀파일에 저장하고 출력하는 방식으로 구현
try:
if score > int(old_highscore_value):
highscore_value = open("data/serialisation/highscore.csv", "w")
highscore_value.write(str(score))
highscore_value.close()
except:
pass
폴더에 따로 excel파일을 만들어서 자동으로 입력하고 게임내에 출력하는 방식으로 구현했다.
playgameover = True
# 게임오버사운드 한번만 재생하기 위한 메인루프에 playgameover값 True설정
if playgameover:
bgm.stop()
gs = pygame.mixer.Sound("data/sound/smw_lost_a_life.wav")
gs.play(loops=0)
playgameover = False
#값을 바꿔줘야 루프 프레임마다 재생되는 것을 방지할 수 있다.
개인적으로 가장 많이 시간을 소비해서 해결했을때 나도 모르게 박수 친 구간.
기본적으로 게임오버 사운드가 연속으로 재생되는 로직은,
과 같은 로직으로 사운드가 연속 재생된다.
이를 playgameover
변수를 gameover시에 바꿔주면 사운드가 한번만 재생된다.
# boo 생성함수
import random from pygame
b_list = []
if random.random() > 0.98 and score >= -2:
boo = obj()
boo.put_img("data/images/boo.png")
boo.change_size(40, 40)
boo.x = random.randrange(0, size[0] - boo.sx - round(player.sx) / 2)
boo.y = 10
boo.move = 6
b_list.append(boo)
elif random.random() > 0.98 and score >= 15:
booo = obj()
booo.put_img("data/images/booo.png")
booo.change_size(50, 50)
booo.x = random.randrange(0, size[0] - booo.sx - round(player.sx) / 2)
booo.y = 10
booo.move = 10
b_list.append(booo)
angry = pygame.mixer.Sound("data/Sound/Super Mario Fireball.mp3")
angry.play(loops=0).set_volume(0.05)
pygame에서 제공하는 ramdom 라이브러리를 이용해서 random.random() > '값' 을 넣어 객체 생성 확률을 조절할 수 있다.
스코어가 15가 넘어가면 더 빠르고 무서운 boo가 생기도록 설정했다.
def pause(): # 일시정지 기능 만들기
paused = True
while paused:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.MOUSEBUTTONDOWN: #마우스 버튼 클릭시 다시 시작
paused = False
font1 = pygame.font.Font("data/font/AGENCYB.TTF", 100)
text_paused = font1.render("Paused", True, (0, 0, 0))
screen.blit(text_paused, (size[0] / 2 - 130, round(size[1] / 2 - 100)))
font2 = pygame.font.Font("data/font/AGENCYB.TTF", 50)
text_paused = font2.render("continue to click", True, (0, 0, 0))
screen.blit(text_paused, (size[0] / 2 - 150, round(size[1] / 2 )))
pygame.display.update()
clock.tick(5)
def crash(a, b):
if (a.x - b.sx <= b.x) and (b.x <= a.x + a.sx):
if (a.y - b.sy <= b.y) and (b.y <= a.y + a.sy):
return True
else:
return False
else:
return False
사각형의 각 모서리가 닿을 때 충돌한 것으로 보는 함수를 만들어서 구현시켰다.
기본적인 틀을 유투브 영상에서 보고 구현해보고 싶은 기능들은 따로 오픈소스를 보면서 구현하려고 시도했지만, 처음 틀의 코드가 난잡하게 구성되어 있어 적용시키기도 힘들 뿐더러 코드 자체를 이해하기도 버거웠다.
가독성 좋은 코드의 중요성을 느낄 수 있었다.
리펙토링의 중요성..
다음에는 재도전할때는 정말 깔끔하게 코드를 짜서 이것 저것 구현해보고 싶다.
내 게임에 적용하지 못해 이미지와 사운드만 바꿔본 넋두리용 게임,,😂
매우 귀엽다.
위 게임의 요소를 적용시켜서 랜덤하게 떨어지는 유령을 피해서 올라가는 식의 게임을 만들어 보려했었지만 실패. 그치만 다음에 재도전한다면 할 수 있을 것 같다는 생각이 들 정도로 이 게임을 만들면서 많이 배웠다.
다음에는 class와 def만을 이용해서 깔끔하게 코딩을 해보고 싶다.
내가 속한 반이 아닌 다른 반을 관리하고 계신 튜터님께도 상담을 받았다. 머리 속에 들어있는 모든 근심거리 혹은 궁금증을 하나하나 친절하고 자세하게 튜터님의 경험을 바탕으로 말씀해주시고, 앞으로 어떤 방향을 잡으면 더 많은 기회를 얻을 수 있을지 알려주셔서 너무 감사했다. 나에게 프로그램의 가장 큰 장점이 튜터님께 언제든 어떤 질문을 해도 답변해주신다는 점인 것 같다.
호주에서 대학원을 다녀온것이 좋은 기회가 될 수 있을 것 같다고 말씀해주시면서,
불안해하지말고 길게 보고 현재 프로그램에 충실하면 분명 좋은 결과를 얻을 수 있을 것이라고 하셨다.
프로그램을 이어가면서 개인 공부를 해야한다는 말씀은 똑같이 해주셨다.
굉장히 잘 만들어 주셨습니다~
글에 작성해주신 것 처럼 해당 게임의 기능을 다시 한번 정리 하시면서 함수 혹은 클래스로 분류해보세요.
그리고 에러 코드는 완벽하게 잡을 수 없습니다. 그럼 이를 어떻게 막을 수 있을지 고민해보세요.
(예외처리 검색)
마지막으로 게임을 만들게 되면 조건문을 꽤 많이 정의하게 되며 자연스럽게 코드가 약간 지저분해집니다. 이럴때 파이썬에서는 어떻게 코드를 깔끔하게 정리할 수 있는지 검색해보세요 :)
(switch 문법)