SteffenLee

[JAVA]학교 팀 프로젝트 회고 본문

Progamming/Java

[JAVA]학교 팀 프로젝트 회고

SteffenLee 2023. 12. 17. 04:00

100만년만에 글을 쓰러왔다.

이번 학기에는 대학교에 와서 처음으로 프로젝트를 진행했다.

 

우리 팀에서 내가 맡은 역할은 팀장이자, 이번 프로젝트의 메인 기능을 담당하였다.

 

이번 프로젝트에서 주제는 자율 주제였다. 대신 자바의 스레드 기능을 사용해서 프로그램을 구현해야했기에

게임이 적합하다고 생각해서, 회의를 통해 게임을 만들기로 결정했다.

 

1차 회의에서는 게임라는 주제를 정하고, 컨셉을 정했다. 이때 조원 중 한 명이 Tv 프로그램 중 '대탈출' 컨셉의 해리포터 게임을 만들어보자고 했다.

 

그리하여 처음 컨셉은 해리 포터가 금지된 숲에서 길을 잃었고, 호그와트로 돌아가기 위해 금지된 숲을 돌아다니며 호크룩스를 모으고, 볼드모트와 전투를 통해 호그와트로 돌아가는.. 그런 이야기였지만...프로젝트 막판에 전면 수정했다.

(이 슬픈 이야기는 뒤에서 자세하게 이야기하겠다)

 

게임 구성

게임의 전체적인 구성은 하나의 맵이 3x3형태로 있는 형태고 다음 맵으로 이동하기 위해서는 퀴즈나 미니게임을 진행해야한다. 그리고 3,3 맵에 도달하고 오른쪽으로 이동 시 보스전 방이 존재한다.

이 보스전 방에 도달하기 위해서는 '네기니'라는 호크룩스를 먹어야만 보스전이 진행할 수 있다.

 

호크룩스의 역할은 보스전 난이도 조절에 있다. 호크룩스를 먹지 않고 진행할 수 있지만, 어느정도 강제성을 부여하여 네기니를 반드시 수집하도록 만들었다.

 

보스전 진행방식은 정해진 시간 안에 특정 단어들을 입력하는거지만, 언더테일이라는 게임의 전투 방식을 차용하여

게이지 바가 존재하고 특정 영역 안에서만 그 단어를 입력해야 점수가 오르는 방식으로 구현하였다.

 

 

처음에 '흠 이거 이렇게하고 이렇게 하면 금방 만들겠는데?'라 생각했지만, 엄청난 착각이었다.

 

프로그램 소개와 아주 간단하게 코드리뷰를 해보겠다.

 

메인 화면

이 부분은 딱히 어려웠던 것이 없다. ImageIcon으로 이미지 객체를 생성해주고 JLabel에 추가해주고

그 JLabel 객체를 Frame에 붙여주기만하면 되기 때문에 어렵진 않았다.

 

다음 화면으로 넘어갈 때, 새로운 창을 열지 않기위해 Main 클래스에서 Public 형태의 JFrame을 생성해주고

시작화면 클래스로 넘겨주었다.

Main Class

 

Start Frame Class(시작화면)

생성자를 써서 Main Class에서 생성한 main frame을 불러오는 형식으로 코드를 작성하였다.

 

Active Class

Active 라고 명명을 했는데, 이유는 메인 화면에 각종 요소를 추가하는 것을 클래스로 따로 분리하고 싶었고, 그 이유로 Active라고 지었다.

Mouse Listener를 붙이는 작업이나 라벨을 추가해서 프레임에 붙이는 작업등을 수행하는 코드이다.

그리고 잡다한 기능이지만

메인화면에서는 노래도 나오게 했다.

노래를 플레이하는 코드인데외부 라이브러리를 사용하는 방법과 내부 라이브러리를 사용하는 방법이 있지만

이번 프로젝트에선 내부 라이브러리를 쓰는 것을 권장했기에 내부 라이브러리를 사용하였다.

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.io.File;

 

룰을 표시하는 화면

별건 없다. back 버튼을 누르면 다시 메인 화면으로 돌아온다.

 

대망의 게임을 시작했을 때이다.

이런 식으로 화면에 해리와 호크룩스들이 뜨게 된다.

이 장면은 시연의 편리성을 위해 호크룩스를 한 곳으로 모아둔 것 뿐이고, 실제 게임에서는 랜덤한 위치에 존재하게 된다.

 

이제부터 기능 단위로 설명하겠다.

충돌 체크

충돌 체크 부분이다 이 부분에서 구현한 기능들은 케릭터가 호크룩스에 닿는다는 판정과. 맵에 나무 부분에 들어가지 못하게 설정하는 부분 그리고, 다음 맵으로 넘어가기 위해 퀴

우선적으로 해줬던 것은 캐릭터가 나무 영역을 지나지 못하게 충돌 체크를 해줘야했다. 그림판을 통해 직접 좌표를 설정해주고, 그 좌표에 케릭터의 영역이 도달할시 상태를 변화시켜 접근하지 못하게 만들어줬다.

좌표와 라벨 크기 정보를 받아오고, 하드 코딩을 해주었다...

 

 

3x3크기의 배열에 무작위하게 1,2,3 숫자를 집어 넣고 캐릭터가 다음 방으로 이동할 때마다 위치 검증을 통해 그 자리에 호크룩스를 그려넣는 방식으로 진행했다.

호크룩스 그려 넣는 코드

 

3x3 크기의 전체 맵을 돌아다니며 진행하는 형식인데, 각 맵을 이동하기 위해서는 퀴즈나 미니게임을 진행하는 형식이었다.

그러기 위해서 필요한 것은 내가 앞으로 갈 길이 막혀있는 길인지 막혀있지 않은 길인지(퀴즈/미니 게임 진행여부)를 판단하고 이미 지나온 길인지 지나오지 않은 길인지 판단할 배열을 만들어 하드 코딩을 해주었다..(비효율의 끝판왕)

 

호크룩스들의 충돌을 체크해주는 부분이다. 케릭터의 위치, 크기, 호크룩스 이미지의 위치, 크기 등을 받아와 겹치는지를 확인하고 그 값을 리턴한다.

 

맵 관련 코드들

현재 좌표랑 맵의 길 상태 변화 등의 기능을 담당하는 코드들이다.

 

아까 언급했던 문제를 풀기위한 코드들 JOption 페널을 이용해 띄우고 확인을 누르면 문제를 띄우는 형식

 

미니 게임을 고르는 코드

미리 게임을 다 정의해놓고, 랜덤한 번호로 게임 코드를 호출하는 형식이다.

 

키보드 이벤트 -> 케릭터 이동

현재 위치와 OldX, OldY 부분이 있는데, 이 부분은 맵의 밖으로 나갔는지 확인하기 위해 따로 변수를 분리하였다.

그리고 이미지가 그냥 움직이면 심심하기에, 키보드를 꾹 누르고 있으면 지속적으로 이미지를 왼발, 오른발 바꿔주어

조금 더 역동적인 느낌을 줄 수 있게 만들었다.

 

미니 게임 및 보스전 코드는 팀원들이 작성하였기에 미공개하겠다.

 

프로젝트를 진행할 때 이 부분에서 문제가 발생하였다.. 볼드모트의 이미지 비율이 제각각이라, 크기를 조정해줘도

이미지가 바뀔 때 이상한 부분이 생겼다.

이때 비상이 걸렸고, 그래서 스토리를 볼드모트가 금지된 숲에 갇히게 되었고, 해리 포터로 변장해 호크룩스를 모아 힘을 되찾고 탈출하려했다. 하지만 진짜 해리 포터에게 들켰고, 그 과정에서 전투가 발생하게 되는데..

라는 괴상한 스토리로 변경을 진행했다..

 

다시 생각해봐도 이건 좀... 이라는 생각이 많이 들지만, 완성했으니 장땡!.

프로젝트를 마무리하면서..

이번 팀플로 가장 깨달은게 있다면, '내 수준을 잘 알아야한다'이다.

프로젝트를 진행하기 전 기획 단계에서, 금방 구현할 것 같은데?라는 착각에 빠져 난이도를 올리게 되었고

결국 시간에 쫒겨 개발을 발표 직전에 마무리하였다.

 

그리고 팀원들에게 역할 부여를 잘 하는 것이 중요하다는 것을 깨달았다. 특히 나는 짜증내는 것을 싫어하고 상대에게 이걸 시킬 바에 내가 다 하지.라는 마인드였지만, 팀 프로젝트라는 이 대목을 자꾸 잊는 것 같았다.

그래서 팀플에서 협력의 중요성에 대해 잘 알게되었다.

 

추가적으로 프로젝트를 시작할 때 구조도를 먼저 작성하고, 그 구조도를 기반으로 코드를 작성하면 좋겠다는 생각이 들었다. 옛날에는 굳이 디자인 패턴을 배워야하나? / 굳이 이 구조도를 써야하나? 이런 생각이 많았다

하지만 이번 프로젝트를 진행하면서, 클래스가 많아지고 기능을 점점 추가할수록 햇갈리고 내가 컨트롤 할 수 없을 것 같은 기분이 들었다. 그래서 프로젝트 중간에 패키지를 나누고 코드를 정리하는 과정에서 시간이 더 소요됐다.

 

정리하자면 자기 객관화를 잘하자, 팀플이라는 것을 잊지말고 협력하자, 구조도를 작성하거나 디자인 패턴 등을 적용해보자

 

 

 

Comments