CUI 간단한 RPG 게임 만들기 (1)

Kyu·2020년 12월 15일
0

깃헙: https://github.com/kyu-kim-kr/java-simplerpg

이번주 14일부터 18일까지는 코드스쿼드 코코아 과정에서 하지 못했던 초간단 RPG 게임을 만들어보려고 한다. 또 혼자 코딩 연습하는건 어떤지 비교해보고싶다.

요구 사항

  • 11 * 11 배열
  • 화면 중앙에는 캐릭터 위치
  • 임의의 장소에 몬스터 위치
  • 임의의 장소에 1개의 지뢰를 배치한다. 단 지뢰는 플레이어가 밟기 전까지 화면에 표시하지 않는다.
  • 콘솔 입력으로 WASD 중 하나의 키를 입력받고 엔터를 누르면 캐릭터가 상좌하우로 이동함
  • 캐릭터가 지뢰를 밟으면 사망
  • 캐릭터가 몬스터의 위치까지 이동하면 몬스터가 사라지고 정해진 점수 획득
  • 점수 획득시 새로운 몬스터와 지뢰를 배치한다. 단 지뢰의 갯수는 2배 증가시킨다.
  • 매 턴마다 현재 배열의 상태를 화면에 출력. 단 밟지 않은 지뢰는 표시하지 않는다.

개인 목표

  • 메소드 최대한 많이 나누기
  • 전역 변수를 최대한 자제하기

과정

  1. Add: 맵과 플레이어 초기화
    맵처럼 보이기 위해서 11 * 11 배열을 원하는 문자열로 2중 for문을 이용해서 모두 똑같이 선언해줍니다. 그 이후에 플레이어의 문자열P을 선언해줍니다. 그리고 for문을 이용해서 모두 출력합니다. 저같은 경우에는 이 세가지 모두 메소드로 나누었습니다.

  2. Implement: 플레이어의 움직임 구현
    먼저 플레이어P를 배열에서 찾아야합니다. 2중 for문을 이용해서 11 * 11배열에서 플레이어가 어디에 있는지 찾습니다. 찾은 좌표(인덱스)값을 따로 변수에 담아주고, 새로운 배열에 담아서 return합니다. 이때 배열은 길이는 2, 인덱스 0은 x좌표, 인덱스 1은 y좌표가 되겠죠.
    그리고 스캐너로부터 방향키를 받습니다. 받은 방향키를 방향키에 따라서 플레이어를 움직여주는 메소드의 파라미터로 합니다. 아까 return한 x,y좌표를 이용해서 입력받은 방향에 따라서 플레이어P를 움직여줍니다. 움직인 후에 그 전 좌표값을 맵을 표현한 문자열로 바꾸는 것도 잊지않고요.
    while문에 메소드들을 담아서 계속 플레이어를 움직일수 있게 합니다.

  3. Add: 지뢰 랜덤으로 1개 생성
    랜덤 클래스를 이용해서 마인을 생성해줍니다. 플레이어가 있는 자리에는 생기지 않도록 조건문을 만듭니다.
    단계에 따라서 지뢰를 여러개 생성해줘야하는데 애초에 1개 만드는 로직을 만들어서 그런지 나중에 여러개 만들도록 수정할때 고난이 닥칩니다..ㅠ

  4. Add: 지뢰 밟으면 시스템 종료
    2중 for문으로 플레이어와 마인의 좌표를 찾아서 변수에 저장한 후에, 그 변수들이 같은지 비교합니다. 그 변수들이 같은지 물어보는 조건문 안에 시스템 종료 메소드를 넣습니다.

  5. Fix: 지뢰 밟는 기능 동작 안해서 고침
    4번대로하면 지뢰를 밟아도 시스템 종료되지 않고 그냥 먹어버리는 식으로 나옵니다. 그러니까 플레이어가 마인의 좌표로 가면 마인은 없어진 상태로 게임이 계속 진행됩니다. 마인을 생성하는 메소드에서, 마인의 좌표값을 받는 변수가 메소드 안에만 있어서 마인을 밟는 로직에서 애초에 그 좌표값을 받을수가 없는겁니다. 그래서 마인의 좌표값을 받는 변수를 필드변수로 저장해줍니다.

  6. Add: 몬스터 1마리 생성
    마인을 생성하는 방식과 똑같이 몬스터도 생성해줍니다.

그다음은 2편에서...


참고

문자열 찾기: https://coding-factory.tistory.com/534
다중값 리턴: https://qastack.kr/programming/2832472/how-to-return-2-values-from-a-java-method#:~:text=Java%EB%8A%94%20%EB%8B%A4%EC%A4%91%20%EA%B0%92%20%EB%A6%AC%ED%84%B4,%EC%9D%98%20%EB%B0%B0%EC%97%B4%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4.&text=%ED%8A%B9%ED%9E%88%20%EB%91%90%20%EA%B2%B0%EA%B3%BC%20%EA%B0%92%EC%9D%98,%EC%9D%B4%EB%8A%94%20%ED%95%AD%EC%83%81%20%EC%9E%98%EB%AA%BB%EB%90%9C%20%EC%9D%BC%EC%9E%85%EB%8B%88%EB%8B%A4.&text=Pair%20%EB%91%90%20%EA%B0%92%EB%A7%8C%20%EB%B0%98%ED%99%98%ED%95%B4%EC%95%BC%ED%95%9C%EB%8B%A4%EB%A9%B4%20%EC%A0%9C%EB%84%A4%EB%A6%AD%EC%9D%84%20%EA%B5%AC%ED%98%84%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.
for문에서 return: https://www.quora.com/How-do-you-return-value-from-a-for-loop-in-Java
final 자세히: https://blog.lulab.net/programming-java/java-final-when-should-i-use-it/
반복문 안에 변수선언: https://stackoverflow.com/questions/8803674/declaring-variables-inside-or-outside-of-a-loop

profile
TIL 남기는 공간입니다

0개의 댓글