클래스와 배열을 활용하여 게임 만들기

4808 단어 자바자바

예제로 만들어 본 게임에 이어서 각자 자유 주제로 만들어 본 게임이다.
배운 것들을 최대한 활용하는 의미로 추상클래스, 상속, 2차원 배열을 활용하였다.

public abstract class Object { // 추상클래스

int x, y; // 배열에서 현재 위치를 나타내는 변수

Object(int x, int y) { // 자식클래스에서 super() 생성자를 통해 접근한다.
	this.x = x; // 생성자를 통해 입력받은 x, y값을 변수에 저장한다.
	this.y = y;
}

abstract void move(); // 자식 클래스의 움직임을 결정

abstract char printPosition(); // 자식 클래스의 위치 표시를 결정

int getX() {  // 배열의 행과 열의 위치를 얻는다.
	return x; // board[hunter.getX()][hunter.getY()]와 같은 식으로 사용한다.
}

int getY() {
	return y;
}

boolean positionMatch(Object o) {										
	if (this.x == o.getX() && this.y == o.getY()) {
		// 자식클래스에서 super() 생성자로 멤버변수에 접근 후  파라미터로 입력받는 비교 대상과 x,y값을 비교하여
		// 모두 일치하면 true, 아니면 false를 반환한다.
		// Hunter의 객체가 hunter, Target의 객체가 target 이라면
		// hunter.positionMatch(target) == ? 이 값이 true이면
		// 둘의 좌표가 같다는 것이므로 게임이 끝나게 된다.
		return true;
	} else {
		return false;
	}
}

}

import e_oop.ScanUtil;

public class Hunter extends Object {

Hunter(int x, int y) {
	super(x, y); // 부모클래스의 멤버변수에 접근한다.
}

void move() { // Hunter의 움직임 결정
	System.out.print("상(w), 하(s), 좌(a), 우(d) >> ");
	String hunterMove = ScanUtil.nextLine();

	switch (hunterMove) {
	case "w":
		x--; // w 입력시 위로 이동. 배열은 좌상(0,0)에서 우하(9,19)로 이어지므로
			 // 게임판에서 위로 이동하는 것은 행(x)의 좌표를 거꾸로 하나 줄이는 것을 의미한다.
		if (x < 0) { // 나머지도 모두 동일
			x = 9; // 제일 위(0)에서 위로 이동하면 제일 아래(9)로 이동
		}
		break;

	case "s":
		x++; // s 입력 시 아래로 이동
		if (x > 9) { // 제일 아래(9번)에서 아래로 이동하면 제일 위(0번)로 이동
			x = 0;
		}
		break;

	case "a":
		y--; // a 입력 시 왼쪽으로 이동
		if (y < 0) { // 제일 왼쪽(0번)에서 왼쪽으로 이동하면 제일 오른쪽(19번)으로 이동
			y = 19;
		}
		break;

	case "d":
		y++; // d 입력 시 오른쪽으로 이동
		if (y > 19) { // 제일 오른쪽(19번)에서 오른쪽으로 이동하면 제일 왼쪽(0번)으로 이동
			y = 0;
		}
		break;

	default:
		System.out.println("잘못 입력하였습니다. 다시 입력하세요.");
	}
}

char printPosition() { // Main 클래스에서 Input() 메소드로 출력할 때 Hunter의 위치를 H로 리턴
	return 'H';
}

}

public class Target extends Object {

Target(int x, int y) {
	super(x, y); // 부모클래스의 멤버변수에 접근한다.
}

void move() { // Target의 움직임 결정

	int targetMove = (int) (Math.random() * 11) + 1; // 1 ~ 12 랜덤
													 // 1:상, 2:하, 3:좌, 4:우
													 // 5 ~ 12는 움직이지 않음(33% 확률로 움직임)
	switch (targetMove) {

	case 1: // 1 : 위로 이동
		x--;
		if (x < 0) { // Hunter와 마찬가지로 제일 위(0번)에서 위로 이동하면 제일 아래(9번)로 이동한다.
			x = 9;
		}
		break;

	case 2: // 2 : 아래로 이동
		x++;
		if (x > 9) {
			x = 0;
		}
		break;

	case 3: // 3 : 왼쪽으로 이동
		y--;
		if (y < 0) {
			y = 19;
		}
		break;

	case 4: // 4: 오른쪽으로 이동
		y++;
		if (y > 19) {
			y = 0;
		}
		break;
	}
}

char printPosition() {
	return 'T'; // Main 클래스에서 Input() 메소드로 출력할 때 Target의 위치를 T로 리턴
}

}

public class Main {

final static int X = 10; // 게임 판의 크기 설정 - 고정값이므로 상수로 선언한다.
final static int Y = 20; // 10 * 20

static int r1 = (int) (Math.random() * 9) + 1;  // Target의 시작 위치를 랜덤으로 받기 위한 변수
static int r2 = (int) (Math.random() * 19) + 1; // (1,1) ~ (9,19) 사이의 랜덤한 위치를 받게 된다.
												// Hunter의 위치가 (0,0) 고정이므로 처음부터 겹치는 것을 방지

static Target target = new Target(r1, r2); // 배열의 랜덤한 위치에 Target 클래스 객체 생성
static Hunter hunter = new Hunter(0, 0); // 배열의 (0,0) 위치에 Hunter 클래스 객체 생성

static char board[][] = new char[X][Y]; // 게임판 배열 생성

static void boardReset() {			  // 게임판을 초기화하는 메소드
	for (int i = 0; i < X; i++) {	  // 초기화를 하지 않으면 이전 위치와 현재 위치가 겹쳐서 보이게 된다.
		for (int j = 0; j < Y; j++) { // ex) --HH------
			board[i][j] = '-';
		}
	}
}

static void inputPosition() { // 각 클래스 객체를 이용해 둘의 위치를 저장하는 메서드
	
	board[target.getX()][target.getY()] = target.printPosition(); // 게임판의 (x,y) 위치에 Target의 좌표를 입력
	board[hunter.getX()][hunter.getY()] = hunter.printPosition(); // 게임판의 (x,y) 위치에 Hunter의 좌표를 입력
	
	for (int i = 0; i < X; i++) {	  // 좌표가 입력된 상태로 게임판을 출력한다.
		for (int j = 0; j < Y; j++) { // 초기화가 먼저 실행된 후 좌표가 입력된 화면을 출력한다.
			System.out.print(board[i][j]);
		}
		System.out.println();
	}
}

static void gameClear() {						 // 게임 클리어 조건 : Hunter와 Target의 (x,y) 값을 확인하여 일치하면 게임 클리어
	if (hunter.positionMatch(target) == true) {  // Object 클래스의 positionMatch() 메서드를 통해 일치 여부를 확인한다.
		boardReset();							 // 게임 종료 전 마지막 위치를 보여준다. 보여주기 전 게임판 초기화도 똑같이 해준다.
		inputPosition();						 // Hunter(=Target)의 위치 출력
		System.out.println("* Target 포획 완료 *");
		System.out.println("* 게임을 종료합니다. *");
		System.exit(0);
	}
}


public static void main(String[] args) {

	System.out.println("* 게임 시작 *");

	while (true) {
		boardReset();	 // 게임판 초기화
		inputPosition(); // Target과 Hunter의 좌표 입력 후 출력
		target.move();	 // Target과 Hunter의 움직임 결정
		hunter.move();
		gameClear();	 // 둘의 (x,y) 좌표가 일치하면 게임 종료, 아니면 일치할 때까지 반복
	}

}

}

좋은 웹페이지 즐겨찾기