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
	}
}

 

>>실행

 

길어서 다  못 올리겠는데 대충 이런 식으로 됩니다