ToyProject

노건우·2023년 7월 28일
0

묵찌빠 구현 프로젝트

하게된 이유

처음에는 조금 어렵고 재밌는 야구게임이나 축구 페널티킥 게임을 구현해보려 했다. 하지만 그러한 게임은 내가 아직 잘 다루지 못하는 기술이 많아 제대로 동작하지 않을 것 같았고, 일단 내가 할 수 있는 부분부터 차근차근 해보는 것이 나을 것 같다는 생각을 했다. 그렇기 때문에 다들 알고 있는 게임인 묵찌빠 게임을 골랐다. do while문, switch문을 제대로 활용할 수 있을 것이라 생각도 해서 더더욱 이 주제를 선정하게 되었다.

알고리즘 순서

  1. 사용자에게 게임시작인지 종료인지 scanner를 생성해 입력받는다.
  2. 1일경우 게임스타트 메서드 호출, 아니라면 게임종료를 리턴
    3.compare로 넘어가 정의해둔 win, draw, lose메서드를 호출. switch문을 이용해 상황에 맞는 대답 출력
    4.가위바위보의 결과가 나오면 비기는 경우는 다시 가위바위보, 이기거나 지는 경우는 묵찌빠로 넘어간다. 5. 다시 한번 가위바위보의 결과를 입력받고 종료한다.

사용한 메서드

일단은 가위바위보기 때문에 정말 기본적인 win,draw,lose메서드를 생성해 주었다.
draw

draw 메서드는 Rule클래스의 compare메서드를 통해 비교가 가능한데, draw는 승부가 나지 않았기에 다시 가위바위보를 해야하고, 입력값을 다시 받아야 한다.

public void draw() {
Scanner sc=new Scanner(System.in);
do {
System.out.println("비겼으니 다시 가위바위보!");
System.out.println("1.가위 2.바위 3.보");
System.out.print("입력");
int num = sc.nextInt();
switch(num) {
case 1 : System.out.println("가위");r.compare(1);return;
case 2 : System.out.println("바위");r.compare(2);return;
case 3 : System.out.println("보");r.compare(3);return;
}
}while(true);

win

win메서드는 묵찌빠라는 단어를 출력한다. 묵찌빠라는 건 총 2번 중에 한번의 승부가 났다는 것을 의미하고, 그것을 보이기 위해 가위바위보 -> 묵찌빠로 넘어간다는 의미인 묵찌빠라는 단어를 같이 출력했다. win메서드 또한 compare 메서드를 통해 비교 후 알맞은 결과를 출력하고 다시 최종 승부를 위해 가위바위보를 입력받게 된다.

public void win() {
   Scanner sc=new Scanner(System.in);
   if(winCount==1) {
      System.out.println("플레이어 2연승으로 게임종료");
   
      return;
      
   }
   do {
      if(winCount==0) {
         System.out.println("플레이어 2연승으로 게임종료");
      
         return;
         
      }
      System.out.println("이겼으니 플레이어 공격권");
      System.out.println("플레이어가 입력");
      System.out.println("묵찌빠");
      System.out.print("입력");
      int num = sc.nextInt();
      
      switch(num) {
      
      case 1 : System.out.println("가위");r.compare(1);
      winCount++;
      break;
      
            
      case 2 : System.out.println("바위");r.compare(2);
      winCount++;
      break;
      
      case 3 : System.out.println("보");r.compare(3);
      winCount++;
      break;
      
            
      }
   }while(true);

lose

win메서드와 로직은 완전히 동일하다. 다만 플레이어가 아닌 컴퓨터가 이기는 결과만 다른 것 뿐

다음은 결과값을 도출해내기 위해 필요한 메서드들이다.

math.random()
컴퓨터가 123(가위바위보)중 하나의 숫자를 임의로 내야 하기에 랜덤 메서드를 이용했다.

compare

결과값을 비교하기 위해 생성한 메서드이다.

public void compare(int me) {
			rock_scissor_paper rsc = new rock_scissor_paper();
			num = Random();
			
			if(me == 1)//가위
			{
				switch (num) {
				case 1:System.out.println("나 : 가위, 컴퓨터: 가위 = 비김");rsc.draw();return;
				case 2:System.out.println("나 : 가위, 컴퓨터: 바위 = 짐");rsc.lose();return;
				case 3:System.out.println("나 : 가위, 컴퓨터: 보 = 이김");rsc.win();return;
				}
			}if(me == 2)//바위
			{
				switch (num) {
				case 1:System.out.println("나 : 바위, 컴퓨터: 가위 = 이김");rsc.win();return;
				case 2:System.out.println("나 : 바위, 컴퓨터: 바위 = 비김");rsc.draw();return;
				case 3:System.out.println("나 : 바위, 컴퓨터: 보 = 짐");rsc.lose();return;
				}
			}
			if(me == 3)//보
			{
				switch (num) {
				case 1:System.out.println("나 : 보, 컴퓨터: 가위 = 짐");rsc.lose();return;
				case 2:System.out.println("나 : 보, 컴퓨터: 바위 = 이김");rsc.win();return;
				case 3:System.out.println("나 : 보, 컴퓨터: 보 = 비김");rsc.draw();return;
				}
			}

코드를 보면 알겠지만, 가위,바위보의 이기는 조건을 하나하나 지정해주었다. 결과값이 나오면 win,draw,lose중 하나의 메서드를 호출해주고 결과값을 리턴한다.

rock_scissor_paper

사실 제일 먼저 나왔어야할 메서드인데 다른 메서드들을 설명하다 게임스타트인데 늦게 등장했다.

이렇게 게임시작을 위해 1을 누르면 gamestart메서드를 호출해준다. 그게 아니라면 게임종료를 출력하고 종료된다.

gamestart


여기서 주목해야할 부분은 아무래도 nextint가 아닐까 싶다. 사용자가 입력한 정수값을 반환해주기에 사용했다.

do while

내가 가장 힘들었던 부분이고 아직 해결이 되지 않은 부분이다. 묵찌빠의 특성인데, 만일 내가 한번 이긴 상태에서 가위바위보를 또 했을 땐 내가 한번만 더 이겨도 게임은 끝나야 한다. 하지만 wincount,losecount를 지정하여 각각의 count가 2가 되는 시점에는 종료하게 만들어 놓았는데도 무한루프에 빠지는 오류가 일어나고 있다. 그래서 확인해 보기 위해 count를 0으로 잡아놓으면 문제없이 바로 종료된다. switch문을 안 도는 것은 아니지만 왜 종료가 되지 않는지는 gpt에 물어봐도 잘 모르겠다.
예시로 결과값을 첨부한다.

먼저 두 번 이겼을 경우이다.

두 번을 이겼는데도 불구, 끝나지 않는다.

그래서 이번엔 wincount를 0으로 둬 보았다.


이 코드를 보면 적어도 두 번 졌기에 switch문을 두번 돌았다는 사실은 확인 할 수 있다. 하지만 왜 바로 2번 졌을 때 컴퓨터 2연승으로 게임종료가 안 뜨는 지는 더 많은 공부가 필요할 것 같다.

프로젝트 구현하면서 느꼈던 어려운 점 및 소감

위에도 말했지만 잘 구현이 안되는 부분이 제일 힘들다. 그리고 처음에는 묵찌빠는 그냥 반복문 두번이면 되지않나라고 크게 복잡하게 생각하지 않고 개발에 들어갔다. 하지만 비기고 다시 이겼을 때의 경우, 졌을 때의 경우, 비긴 후의 결과 값 초기화등 개발을 들어가니 생각보다 많은 오류에 직면했다. 이러한 어려운 부분도 헤쳐나가는 것이 개발자의 숙명이겠지만, 우선은 c언어를 통한 절차 지향만을 아는 상태에서 객체 지향 설계를 어느 정도 했다는 점은 고무적이라고 생각한다. 다음에는 진짜로 야구 게임이나 축구 게임을 구현해 만들어보고 싶다. 자바를 공부하며 느끼는 점이지만, c언어가 아닌 자바로 자료구조를 배웠다면 어땠을까 라는 느낌이 들었다. 과거 c로 자료구조를 배울 땐 이진트리, 연결리스트 등을 공부하며 굉장히 로직이 복잡하다고 느꼈는데, 자바는 그러한 느낌보다는 로직 자체는 복잡하지 않은데 전체적인 틀이 잘 안 떠오르는 부분이 힘든 것 같다. 메서드 사용이 더 익숙해지면 c로 짰던 내용을 다시 짰을때 큰 도움이 되지 않을까 싶다. 그럼 이번 프로젝트는 직접 만든 다는 것에 의미를 두고, 더더욱 정진해서 실력있는 개발자가 되어 velog에 이런 글을 썼을 때 사람들이 스크랩도 많이 하는 수요 있는 개발자가 되었으면 좋겠다. 이제 do while문 다시 고치러 가야겠다. 고치면 다시 수정해 업로드 할 것

profile
초보 개발자 이야기

0개의 댓글