프로그래밍 언어/javastudy

명품 자바 에센셜 5단원/ Bear와 Fish 먹기 게임

fladi 2021. 7. 13. 16:51
728x90

교재: 명품 Java Essential

 

 

 

<Open Challenge>

 

 

 

1. Bear클래스

 

public Bear(int distance) 생성자는 distance만 받고, bear의 위치는 0,0으로 자동으로 설정됩니다.
private char inputdirection() bear가 이동할 위치를 입력받는 메소드. 클래스 내에서만 사용할거라 private로 만들었습니다.
@Override
public void move()
inputdirection()메소드를 통해 입력받은 값으로 bear의 위치를 이동시킵니다.
@Override
public char getShape()
bear가 화면에 출력될 모양을 반환하는 메소드입니다. B

 

 

2. Fish클래스

 

static private int step Fish클래스의 move가 출력될 때마다 1씩 증가하는 static 변수. step이 1, 2, 3일 땐 움직이지 않고 4, 5가 되면 랜덤한 방향으로 이동합니다.
public Fish(int distance) 생성자는 가로, 세로값을 랜덤하게 설정해주고 distance를 입력받아 초기화해줍니다.
@Override
public void move()
step이 4, 5일 때만 fish가 이동합니다.
@Override
public char getShape()
Fish객체가 화면에 출력될 모양을 반환하는 메소드입니다. @

 

 

3. public클래스

 

static void print(Bear bear, Fish fish) Bear객체, Fish객체를 입력받아 화면에 출력하는 함수. 
static void bearfish_move(Bear bear, Fish fish) Bear객체와 Fish객체를 이동시키는 함수.(main을 간결하게 만들기 위해 만듦)
static int restart() 게임이 끝난 후 다시 시작할 지 물어보는 함수. 1을 입력 시 다시시작, 0 입력시 종료.
public static void main(String args[]) main함수.

 

 

 

■ main 코드 분석

 

public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		boolean restart;

		while (true) {
			System.out.println("** Bear의 Fish 먹기 게임을 시작힙니다. **");
			Bear bear = new Bear(1); // 1칸씩 이동
			Fish fish = new Fish(1);

			print(bear, fish);

			while (true) {	// 게임진행
				bearfish_move(bear, fish);
				print(bear, fish);

				if (bear.collide(fish))
					break;
			}

			System.out.println("Bear Wins!!");

			restart = restart();
			if (!restart)
				break;

			System.out.println();
		}

		System.out.println("** 게임이 종료되었습니다. **");

		scanner.close();
	}

 

- restart변수로 게임 다시시작을 결정합니다.

- 첫 while문 안이 게임 한 판을 진행하는 곳입니다.

- 두 번째 while문은 bear와 fish를 이동시키고 화면에 출력하는 동작을 반복합니다. 만약 bear와 fish가 부딪친다면 collide함수에서 true가 출력되며 while문을 빠져나오게 됩니다.

- restart()함수로 재시작을 입력받아 restart변수로 받아줍니다. 

 

 

 

 

~전체코드~

 

import java.util.InputMismatchException;
import java.util.Scanner;

abstract class GameObject {
	protected int distance;
	protected int x, y;

	public GameObject(int startX, int startY, int distance) {
		this.x = startX;
		this.y = startY;
		this.distance = distance;
	}

	public int getX() { return x; }
	public int getY() { return x; }

	public boolean collide(GameObject p) {
		if (this.x == p.getX() && this.y == p.getY())
			return true;
		else
			return false;
	}

	protected abstract void move();
	protected abstract char getShape();
}

class Bear extends GameObject {
	public Bear(int distance) {
		super(0, 0, distance);
	}

	private char inputdirection() {
		Scanner scanner = new Scanner(System.in);
		char input;

		while (true) {
			System.out.print("왼쪽(a), 아래(s), 위(d), 오른쪽(f) >> ");
			input = scanner.next().charAt(0);

			if (input != 'a' && input != 's' && input != 'd' && input != 'f') 
				continue;
			else
				break;
		}

		return input;
	}

	@Override
	public void move() {
		char input = inputdirection();

		switch (input) {
		case 'a':
			if (x >= distance)
				x -= distance;
			break;
		case 's':
			if (y <= 9 - distance)
				y += distance;
			break;
		case 'd':
			if (y >= distance)
				y -= distance;
			break;
		case 'f':
			if (x <= 19 - distance)
				x += distance;
			break;
		}
	}

	@Override
	public char getShape() {
		return 'B';
	}
}

class Fish extends GameObject {
	static private int step = 0;

	public Fish(int distance) {
		super((int) (Math.random() * 18) + 1, (int) (Math.random() * 8) + 1, distance);
	}

	@Override
	public void move() {
		step++;

		if (step > 3) {
			int go = (int) (Math.random() * 4);
			boolean re_input = true;

			while (true) {
				switch (go) {
				case 0:
					if (x <= 19 - distance) {
						x += distance;
						re_input = false;
					}
					break;
				case 1:
					if (x >= distance) {
						x -= distance;
						re_input = false;
					}
					break;
				case 2:
					if (y <= 9 - distance) {
						y += distance;
						re_input = false;
					}
					break;
				case 3:
					if (y >= distance) {
						y -= distance;
						re_input = false;
					}
					break;
				}

				if (!re_input)
					break;
			}
		}

		if (step == 5)
			step = 0;
	}

	@Override
	public char getShape() {
		return '@';
	}
}

public class Game {
	static void print(Bear bear, Fish fish) {
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 20; j++) {
				if (bear.getX() == j && bear.getY() == i)
					System.out.print(bear.getShape());
				else if (fish.getX() == j && fish.getY() == i)
					System.out.print(fish.getShape());
				else
					System.out.print('-');
			}
			System.out.println();
		}
	}

	static void bearfish_move(Bear bear, Fish fish) {
		bear.move();
		fish.move();
	}

	static boolean restart() {
		Scanner scanner = new Scanner(System.in);
		int go;

		while (true) {
			System.out.print("게임을 다시 하시겠습니까?(네:1, 아니오:0) >> ");

			try {
				go = scanner.nextInt();
				break;
			} catch (InputMismatchException e) {
				System.out.println("입력 오류! 다시 입력해주세요!");
				scanner.next();
				continue;
			}
		}
		
		if (go == 1)
			return true;
		else
			return false;
	}

	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in);
		boolean restart;

		while (true) {
			System.out.println("** Bear의 Fish 먹기 게임을 시작힙니다. **");
			Bear bear = new Bear(1); // 1칸씩 이동
			Fish fish = new Fish(1);

			print(bear, fish);

			while (true) {	// 게임진행
				bearfish_move(bear, fish);
				print(bear, fish);

				if (bear.collide(fish))
					break;
			}

			System.out.println("Bear Wins!!");

			restart = restart();
			if (!restart)
				break;

			System.out.println();
		}

		System.out.println("** 게임이 종료되었습니다. **");
        
		scanner.close();
	}
}

 

오류처리 열심히 해줬습니다 ㅎㅎ

헷갈리는 부분도 많았지만 재밌었던 것 같습니다~

728x90