https://github.com/kiya-moon/First-Java-Project.git
GitHub - kiya-moon/First-Java-Project: Room Escape Game
Room Escape Game. Contribute to kiya-moon/First-Java-Project development by creating an account on GitHub.
github.com
약 2주 간의 토이 프로젝트가 끝났다.
주제 선정부터 스토리, 코딩까지 아주 고심했다.
처음으로 내 손으로 만들어보는 프로젝트이니만큼 욕심이 있었달까...
밤 새서 코딩을 짜기도 하고 도저히 에러를 해결할 방법이 생각나지 않아 며칠 방치해두기도 하고...
또 프로젝트 중간에 시험도 있었고 자바 배우고 있는 내용을 블로그에 정리도 해야했고 해서 시간 분배에 멘붕이 오기도 했지만...
재밌었다!
아쉬웠던 점은 크게 3가지가 있는데,
1. 방탈출 지문과 선택지를 위해 부모클래스에 추상화메서드로 만들고 자식클래스에서 상속받게 했는데, 추상화메서드가 아니라 인터페이스로 따로 만든 뒤, 방탈출 지문과 선택지가 없는 다른 클래스들도 부모클래스를 상속받게 했으면 조금 더 코딩이 깔끔해졌겠다 싶은 것
2. 프로젝트 발표 때 시간이 없어서 플레이하듯 발표하지 못하고 쭉쭉 넘어가야했다는 점
3. 이왕 공들여 게임을 만들고 나니 많은 사람이 해봤으면 하는 욕심이 있달까...하하. 스터디 조원들이 재밌게 한 걸로 일단 만족해 보려했으나 좀 아쉽다.
파일 용량에 한계가 있어 github 주소를 공유하니 혹시혹시 필요한 사람이 있으면 참고하시면 됩니다~
아래는 발표 영상인데, 발표하는 목소리가 포함되어 있어 소리에 주의해주세요!
+
아무래도 발표 때는 코드를 어떻게 짰는지에 대한 내용은 알고리즘 외에 거의 말하지 않아서,
핵심 코드 위주로 블로그에 추가적으로 적어볼까 한다.
1. 지문 간 텀 주기
- sleep()를 이용해서 콘솔 재생 시 지문이 텀을 두고 띄워지도록 했다.
2. 창 전환 효과
- 2시간 동안 온갖 방법을 구글링 해서 찾아 적용해보았지만 되지 않아, 결국 가장 무식하게 for로 공백을 주었다.
3. 노이즈 효과
- 틀린 문을 찾았을 때 나오는 노이즈 효과는 아스키아트를 통해서 구현했다.
- 원래 노이즈화면 이미지인데 음, 의도한만큼은 아니지만 어쨌든 게임 진행하다가 갑툭튀하면 깜놀하긴 한다.
(달거북씨는 왜 나올지 알면서도 놀라는 것인가... 의문...)
4. 선택지
- 선택지는 한 번은 무조건 진행하기 위해 do~while문을 사용
- Scanner로 값을 입력받을 때는 입력값에 대한 에러 발생을 줄이기 위해 String 타입을 사용했다. 예를 들어 nextInt()를 사용하게 되면, 숫자가 아닌 값에 대해서는 무조건 에러가 떠서 그를 방지하기 위함이었다.
- 값을 문자로 받았으므로, switch문에서는 다시 Integer로 형변환을 시켜주었다.
- switch문은 전체 try ~ catch 구문에 들어가 있는데, 이 역시 에러 발생시 강제종료가 되지 않게 하기 위한 조치이다. 입력받은 것이 숫자가 아니어서 Integer로 형변환을 하지 못할 경우에 대비한 예외처리 과정이다.
- 정답을 입력받을 시 대소문자에 구애받지 않기 위해 equalsIgnoreCase() 사용
5. 싱글톤 객체 사용
- 원래는 Random() 메서드를 사용했지만, 싱글톤을 배운 후 싱글톤 객체로 Math.random()함수를 사용하는 것이 더 간단한 것 같아 변경했다.
- 네 개의 주사위에 랜덤값을 부여해 배열에 넣어준다. 0~1 인덱스의 주사위를 더해 행운스탯이 되고, 2~3 인덱스의 주사위를 더해 이성스탯 값에 넣어준다.
6. 텍스트 파일에 데이터 저장
- 행운스탯과 이성스탯, 그리고 나중에 문제를 풀고 얻는 열쇠의 개수를 메모장에 저장한다.
- 우선은 세 개의 값을 배열에 넣어주고, String 타입의 data를 만들어 "/" 구분자와 함께 다시 저장한다.
- 값이 입력될 때마다 덮어쓰기가 되도록 코드를 짜주었다.
TMI.
이 부분에서 거의 하루를 막혀있었는데, 하나의 클래스에서 setter를 통해 값을 부모클래스의 변수에 넣어주면 main에서는 잘 가져오지만 다른 자식 클래스에서는 가져올 수가 없었다. 달거북씨는 각 stage 별로 클래스를 만들어놓았고, 따라서 매번 각기 다른 클래스에서 변경되는 스탯이 공유되어야 했다.
방법을 찾다가 어느 한 블로거 분이 게임을 만들면서 유저기록을 메모장에 저장했다가 불러오는 것을 보았고, 이 방법으로 스탯을 저장하면 되겠구나 싶어 이전 자바 수업 때 배운 내용과 구글링을 통해 코드를 만들었다.
7. 데이터 불러오기
- 저장한 스탯을 불러오기 위한 코드- 빈 배열을 만들어 텍스트에 저장되어 있는 값을 "/"을 기준으로 각각 담아준다. 텍스트 문서 상에 30/20/1 이런 식으로 저장되어 있다가 배열에는 {30, 20, 1}로 담긴다.
- arr1 배열은 String 타입이기 때문에 int 타입의 arr2에 담아주는 과정을 한 번 더 거쳐 각각 행운스탯, 이성스탯, 열쇠 개수에 값을 지정한다.
TMI.
사실 데이터 저장과 불러오기도 각각 부모클래스에서 메소드로 만들어 자식클래스에서 사용하도록 시도하였으나, 값이 덮어쓰기가 되지않고 계속 이어 저장이 되어 포기했다.
혹시 이유를 아시는 분??? 엉엉
8. BGM 재생
- 오픈 소스 사용하여 BGM 재생 기능을 만들어 주었다.
- 거의 수정사항이 없어서 저 abc란 메소드명도 그대로 사용했단 걸 이제서 깨닫는다...
- 블로그에서 가져온 코드인데, 다음에 프로젝트 시에는 출처를 좀 저장해놓고 명시해야겠다;ㅅ;
- 참고로 음악은 유튜브 저작권 무료 음악으로 가져왔고, 출처를 명시해두는 것이 조건이어서 위와 같이 코드에 적어두었다.
- loop()는 음악을 몇 번 재생할 지를 정하는 것인데, 문제 풀이에 그렇게 긴 시간을 필요로 하지는 않는 게임이어서 3번 반복으로 설정했다.
9. 플레이 시간 체크
- 본격적인 게임 시작과 함께 플레이 시간이 기록된다.
- 게임을 끝내면 시간 체크를 끝내고 플레이어의 기록을 화면에 띄워준다.
추가로 코드에 대한 궁금증이 있다면 댓글로 물어봐주세요!