프로그래밍 언어 복습/JAVA

#42 JAVA 원숭이 5마리 물건 돌리기 클래스화 문제

사재원 교수 2022. 5. 27. 18:49

문제를 잘 이해를 못했는데 내가 이해한게 맞다면 이것이 맞을것이다 !

오른쪽으로 이동되는건 잘 되는데 왼쪽으로 이동되는게 안되서 어젯밤 1시간반가량동안 머리를 쥐어뜯었다.

결국 강사님께 이메일로 질문을 드렸는데 진짜 바보...... 왼쪽 인덱스로 갈려면 마이너스(-)를 해줬어야했는데 플러스(+)를 해주어서 계속 이상하게 이동됬던 것 이었다.

이렇게 간단한 문제를 못 찾다니 ..... 강사님이 보시고 피드백을 해주시면 항상 바보가 되는 기분이다 ㅠㅠ

쨌든 정답 코드 공개 !

package NewProject;

import java.util.Random;
import java.util.Scanner;

class Monkey{
	String color;
	int bomul;
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public int getBomul() {
		return bomul;
	}
	public void setBomul(int bomul) {
		this.bomul = bomul;
	}
	//원숭이가 말하기
	public void print() {
		if(bomul==1) {
			System.out.println(getColor() + " 원숭이가 물건을 가지고 있습니다.");
		}else {
			System.out.println(getColor() + " 원숭이가 물건을 가지고 있지 않습니다.");
		}
	}
}

class GameStart{
	Random r = new Random();
	

	Monkey[] mk = new Monkey[5]; 
	String[] color = {"빨강","노랑","파랑","초록","검정"};
	int[] num = {1,0,0,0,0}; //1이란 숫자를 상자로 간주함
	GameStart() {
		//5마리의 원숭이 객체를 만들어주고 각각 색과 상자를 넣어줌 
		for(int i=0;i<mk.length;i++) {
			//원숭이 객체 5개 만들기
			mk[i] = new Monkey(); 
			//원숭이 객체에 순서대로 색깔과 상자여부를 넣어줌
			mk[i].setColor(color[i]); 
			mk[i].setBomul(num[i]);
		}
	}

	public void give() {
		Scanner sc = new Scanner(System.in);
		int start = 0; //시작 인덱스 (빨간원숭이)

		while(true) {
			System.out.println("물건 돌리기 시작(1) 종료(2)");
			int start2 = sc.nextInt();
			int index = 0;
			
			if(start2 == 1) {
				
				int a = r.nextInt(2); // 1(우), 0(좌)
				int b = r.nextInt(5)+1; //1 ~ 5 이동거리

				System.out.println(a);
				System.out.println(b);

				if(a == 1) { //오른쪽으로 이동
					System.out.println("오른쪽으로 이동");
					if(start+b > 4) { //오른쪽으로 이동때 인덱스 4를 초과했을경우
						index = (start + b - 4) -1; //초과한 값만큼을 추출하여 거기서 -1

						int first = mk[start].bomul;
						int second = mk[index].bomul;

						mk[start].setBomul(second);
						mk[index].setBomul(first);

					}else {
						index = start + b;

						int first = mk[start].bomul;
						int second = mk[index].bomul;

						mk[start].setBomul(second);
						mk[index].setBomul(first);


					}
				}else if(a == 0){//왼쪽으로 이동
					System.out.println("왼쪽으로 이동");
					if(start-b < 0) { //오른쪽으로 이동때 인덱스 0를 미만했을 경우
						index = (4-start-b) +1; //미만한 값만큼을 추출하여 거기서 +1

						int first = mk[start].bomul;
						int second = mk[index].bomul;

						mk[start].setBomul(second);
						mk[index].setBomul(first);

					}else {
						index = start - b;

						int first = mk[start].bomul;
						int second = mk[index].bomul;

						mk[start].setBomul(second);
						mk[index].setBomul(first);

					}

				}
				int j = 0;
				for(int i=0;i<mk.length;i++) {
					mk[i].print();
					if(mk[i].bomul == 1) {
						j = i;
					}
				}
				
				start = j; //상자가 있는 위치에 인덱스 값을 start 지점으로 놓아줌.
			}else if(start2 == 2) {
				System.out.println("프로그램 종료");
				break;
			}else {
				System.out.println("다시 입력");
			}
		}
	}
}




public class Start {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);


		GameStart gs = new GameStart();
		System.out.println("-----원래 위치-----");

		for(int i=0;i<gs.mk.length;i++) {
			gs.mk[i].print();
		}

		gs.give();




	}
}

원숭이 클래스 하나를 만들어서 원숭이 클래스를 배열로 5마리를 만들었고 각각 색깔과 물건을 지정해주었다.

물건을 돌리는 클래스를 또 만들어서 메인문에서 원할때까지 돌리게끔 하였다. 

종료하고 싶을때는 2번(종료)를 입력해서 프로그램을 종료(break)하게끔 하였다.

 

감사합니다.