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
'프로그래밍 언어 > javastudy' 카테고리의 다른 글
명품 Java Essential 5단원 실습문제 #2 (0) | 2021.07.14 |
---|---|
명품 Java Essential 5단원 실습문제 #1 (0) | 2021.07.14 |
명품 Java Essential 4단원 실습문제 #2 (0) | 2021.07.12 |
명품 Java Essential 4단원 실습문제 #1 (0) | 2021.07.11 |
명품 Java Essential 4단원 끝말잇기 게임/ scanner에서 NoSuchElementException 예외발생 대처 (0) | 2021.07.10 |