클래스와 배열을 활용하여 게임 만들기
예제로 만들어 본 게임에 이어서 각자 자유 주제로 만들어 본 게임이다.
배운 것들을 최대한 활용하는 의미로 추상클래스, 상속, 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) 좌표가 일치하면 게임 종료, 아니면 일치할 때까지 반복
}
}
}
Author And Source
이 문제에 관하여(클래스와 배열을 활용하여 게임 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@irisblossom/배운-것들을-활용하여-게임-만들기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)