java/예제&실습
[명품자바] 5장 오픈챌린지
unhyepnhj
2024. 6. 19. 01:50
Bear의 Fish 먹기 게임 만들기
Bear와 Fish 객체
10행 20열의 격자판에서 각각 정해진 규칙에 의해 이동
Bear는 사용자의 키에 의해(wasd) 상하좌우로 한 칸씩 이동
fish는 다섯 번 중 세 번은 제자리에 있고 나머지 두 번은 4가지 방향 중 랜덤한 방향으로 한 칸씩 이동
Bear가 Fish를 먹으면(Fish의 위치로 이동하면) 종료
각 객체의 이동을 정의하는 move()와 각 객체의 모양을 정의하는 getShape()를 추상 메소드로 가진 다음의 추상 클래스 GameObject를 이용
Bear와 Fish는 GameObject를 상속
전체적인 게임을 진행하는 Game 클래스와 main() 메소드를 작성
public 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 y; }
public boolean collide(GameObject p) {
//이 객체가 객체 p와 충돌하면 true 리턴
if(this.x==p.getX()&&this.y==p.getY()) return true;
else return false;
}
protected abstract void move(); //이동 후 새로운 위치로 x, y 변경
protected abstract char getShape(); //객체 모양을 나타내는 문자(B, @) 리턴
}
GameObject 클래스에 switch문을 수행하는 setSwitch() 메소드를 추가했습니다
그리고 Game 클래스를 작성하는 걸 까먹었어요
GetObject 클래스
public 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 y; }
public boolean collide(GameObject p) {
if(this.x==p.getX()&&this.y==p.getY()) return true;
else return false;
}
protected void setSwitch(char input) {
int inX=0, inY=0;
switch(input) {
case 'w': //위
inY--;
break;
case 'a': //왼
inX--;
break;
case 's': //아래
inY++;
break;
case 'd': //오
inX++;
break;
}
move(inX, inY);
}
protected abstract void move(int inX, int inY); //새로운 위치로 x, y 변경
protected abstract char getShape(); //객체 모양 리턴
}
Bear 클래스
public class Bear extends GameObject{
public Bear(int startX, int startY, int distance) {
super(startX, startY, distance);
} //constructor
@Override
protected void move(int inX, int inY) {
if((x+inX)>=0 && (x+inX)<10) x+=inX;
if((y+inY)>=0 && (y+inY)<10) y+=inY;
}
@Override
protected char getShape() { return 'B'; }
}
Fish 클래스
import java.util.Random;
public class Fish extends GameObject{
private int count=0; //Fish 이동 횟수
public Fish(int startX, int startY, int distance) {
super(startX, startY, distance);
}//constructor
public void randomMove() {
if(count<3) { //Fish는 3번까지는 이동x
count++;
return;
}
Random r=new Random();
switch(r.nextInt(4)) { //0~3까지 난수 생성
case 0: //위
setSwitch('w');
break;
case 1: //왼
setSwitch('a');
break;
case 2: //아래
setSwitch('s');
break;
case 3: //오
setSwitch('d');
break;
}//end of switch
count++; //반복 횟수 증가
if(count==5) count=5;
}
@Override
protected void move(int inX, int inY) {
if((x+inX)>=0 && (x+inX)<=9) x+=inX;
if((y+inY)>=0 && (y+inY)<=9) y+=inY;
}
@Override
protected char getShape() { return '@'; }
}
Main
import java.util.*;
public class Main {
public static void main(String[] args) {
System.out.println("** Bear의 Fish 먹기 게임을 시작합니다. **");
Bear bear=new Bear(0, 0, 1);
Fish fish=new Fish(5, 5, 1);
char[][] map=new char[10][20];
while(true) {
for(int i=0; i<10; i++) {
for(int j=0; j<20; j++) {
map[i][j]='~';
if(bear.getX()==j&&bear.getY()==i) map[i][j]=bear.getShape();
else if(fish.getX()==j&&fish.getY()==i) map[i][j]=fish.getShape();
System.out.print(map[i][j]);
}
System.out.println();
}
Scanner scanner=new Scanner(System.in);
System.out.print("이동 방향 선택(wasd) >> ");
char input=scanner.next().charAt(0);
bear.setSwitch(input); //Bear 이동
if(bear.collide(fish)) {
System.out.println("Bear Wins!!");
break;
}
fish.randomMove(); //Fish 이동
} //end of while
}
}
>>실행
길어서 다 못 올리겠는데 대충 이런 식으로 됩니다