본문 바로가기

coding/Java

[Java] 배열(2) - 실습

배열(Array)을 구현해보자.

[Java]배열(1)에서는 배열의 기본적인 구성과 사용법에 대해서 배워보았다. 사실 배열은 반복문이랑 한 몸이라고 해도 과언이 아니다. 배열의 각 인덱스를 순차적으로 접근하려면 for문을 꼭! 써야하기 때문.

수업시간에 제출했던 과제를 좀 더 다듬었다. 점수는 이미 깎여있지만... 어쨌든 제대로 다시 해보기만 하면 된거 아니겠어^^(흐르는 눈물을 닦는다)

 

 

주제: 클래스와 배열로 구현하는 주사위 게임
  • 최대 5명의 사용자가 주사위를 굴려 전진하는 프로그램
  • 하나의 사용자가 하나의 인스턴스를 가질 수 있게 함
  • 주사위는 모두 컴퓨터가 임의의 수를 정해줌
  • 목표위치를 먼저 넘기는 사용자가 "승리하였습니다" 출력
  • [2.찬스 굴리기]는 주사위 눈이 6이 나올 시 12칸 전진, 나머지의 경우 해당 숫자의 칸만큼 후진한다.

 

나는 클래스 하나로 다 해결해야 되는줄 알았는데 그게 아니네... 플레이어의 정보를 담고 있는 DicePlayer 클래스와, 게임에 관한 정보를 담고 있는 DiceGame 클래스를 따로따로 생성한다. DicePlayer 클래스의 경우 배열로 플레이어를 차례차례 담기 때문에 매개변수 인자로 전달할 때 DicePlayer[] player로 해야되는거 잊지말기!

 

랜덤 숫자는 Random 클래스를 통해서도 발생시킬 수 있지만 Math 클래스도 사용 가능하다. 여기선 Random 클래스 사용함.

 

Random rand = new Random();

rand.nextInt(최대값) + (증감값);

 

 

<소스코드>

import java.util.*;

//게임하는 사용자의 정보를 입력받는 클래스
class DicePlayer {
	private String player;
	private int position;
	
	public DicePlayer(String name) {
		player = name;
		position = 0;
	}
	
	public String toString() {
        return player;
    }
	public int getPosition() {
		return position;
	}
	public void addPosition(int num, boolean c) {
		if (c == false)
			position -= num;
		else 
			position += num;
	}
}

//실제로 게임하는데 쓰이는 클래스
class DiceGame {
	public static int dest;
	public static int round;
	public static Random rand;
	
	public DiceGame(int d){
		dest = d;
		round = 1;
		rand = new Random(System.currentTimeMillis());
	}
	public static int rollDice() {
		return rand.nextInt(6) + 1; //1에서 6까지의 랜덤숫자
	}
	public static boolean is_playing(DicePlayer[] player) {
		boolean contin = true;
		for(int i = 0; i < player.length; i++) 
			if(player[i].getPosition() >= dest)
				contin = false;
		if(contin == true)
			return true;
		System.out.println("게임이 끝났습니다.");
		for(int i = 0; i < player.length; i++) 
			if(player[i].getPosition() >= dest)
				System.out.println(i+"번 (" + player[i] + ") 플레이어가 승리하였습니다.");
		return false;
	}
}

public class ExampleCode {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int option, max, num, dest;
		Scanner inputInt = new Scanner(System.in);    //이걸 원래
		Scanner inputString = new Scanner(System.in); //이렇게 나누나? ㅈㄴ신기
		
		System.out.println("*** 주사위 전진 게임 ***");
		do {
			System.out.print("플레이 할 사용자 수: ");
			max = inputInt.nextInt();
			} while (max < 1 || max >5);
		
		DicePlayer[] ar = new DicePlayer[max];
		for (int i = 0; i < ar.length; i++) {
			System.out.print(i + "번 플레이어 이름: ");
			String name = inputString.nextLine();
			ar[i] = new DicePlayer(name);
		}
		System.out.print("목표 위치: ");
		dest = inputInt.nextInt();
		DiceGame game = new DiceGame(dest);
		
		while(true) {
			System.out.print(DiceGame.round+"라운드(위치:");
			for(int i = 0; i < ar.length; i++) {
				System.out.print(i+"번("+ar[i]+")="+ar[i].getPosition());
				if(i == ar.length - 1)
					System.out.println(")"); //만약 배열의 마지막 원소라면
				else
					System.out.print(", ");
			}
			if (DiceGame.is_playing(ar) == false)
				break;
			for(int i = 0; i < ar.length; i++) {
				do {
					System.out.print("  ["+i+"번 플레이어 1.주사위굴리기 2.찬스로 굴리기 0.포기]:");
					option = inputInt.nextInt();
					if (option == 1) {
						int d = DiceGame.rollDice();
						System.out.println("  "+i+"번 플레이어가 주사위를 굴렸습니다." + d + " 이(가) 나왔습니다.");
						ar[i].addPosition(d, true);
					}
					else if(option == 2) {
						int d = DiceGame.rollDice();
						System.out.print("  "+i+"번 플레이어가 찬스로 주사위를 굴렸습니다." + d + " 이(가) 나왔습니다. ");
						if (d == 6) {
							System.out.println(d*2 + "칸 전진");
							ar[i].addPosition(d*2, true);
						}
						else {
							System.out.println(d + "칸 후진");
							ar[i].addPosition(d, false);
						}
					}
				} while(option < 0 || option > 2);
			}
			DiceGame.round++;
			System.out.println("\n");
		}
	}
}

 

 

<결과 창>

 

 

생각해보니까 [0.포기]를 구현 안했네ㅋㅋㅋㅋ근데 샘플 답안에도 구현 안되어있는거 보니까 교수님도 까먹으신듯^^!