핵심 기능

  • 플레이어 : 도둑
  • 3X3의 집을 모두 다 털면 승리
  • 털다가 경찰에 피하면 패배

핵심 개발 내용

1 . 경찰 클래스

  • 필드
    • Thief 타입target 객체 : 경찰이 잡아야 할 도둑
    • int 타입 dir 변수 : 경찰의 이동방향

 

  • 메소드
    • 생성자 Police(x, y) : Police 객체를 생성, 경찰의 초기 위치 x, y로 설정
    • boolean 타입 move() : dir 변수의 값에 따라 이동방향 결정 후 이동
    • target이 잡혔으면 true, 못 잡았으면 false 반환
    • dir = 0 : 정지 후 target이 잡혔나 확인 잡히면 true, 못 잡았으면 false 반환
    • dir = 1 : 왼쪽으로 이동, 가장 왼쪽에 있는 경우 가장 오른쪽으로 이동
    • dir = 2 : 오른쪽으로 이동, 가장 오른쪽에 있는 경우 가장 왼쪽으로 이동
    • dir = 3 : 아래로 이동, 가장 아래에 있는 경우 가장 위로 이동
    • dir = 4 : 위로 이동, 가장 위에 있는 경우 가장 아래로 이동
    • 이동 후 target이 잡혔나 확인 잡히면 true, 못 잡았으면 false 반환
    • char 형 getShape() : 경찰 표시 P 반환                 

2. 도둑 클래스

  •  필드
    • char 형 key 변수 : 도둑의 이동 방향

 

  • 메소드
    • 생성자 Thief(x, y) : Thief객체를 생성, 도둑의 초기 위치 x, y로 설정
    • boolean 타입 move() : key 변수의 값에 따라 이동방향 결정 후 이동
    • 해당 위치에서의 집을 털었으면 true, 아니면 false 반환
    • dir = r : 집 털기 true반환
    • dir = a : 왼쪽으로 이동, 가장 왼쪽에 있는 경우 가장 오른쪽으로 이동
    • dir = d : 오른쪽으로 이동, 가장 오른쪽에 있는 경우 가장 왼쪽으로 이동
    • dir = w : 위로 이동, 가장 위에 있는 경우 가장 아래로 이동
    • dir = s : 아래로 이동, 가장 아래에 있는 경우 가장 위로 이동
    • 이동후엔 false 반환
    • char 형 getShape() : 도둑 표시 & 반환

 

3. 게임 클래스

  • village 배열 : 도둑이 털어야 할 집들이 모여 있는 3x3 2차원 배열 (초기값 모든 셀  ‘^’)
  • show 배열 : 집들의 상태와 도둑, 경찰의 위치를 보여주는 3x3 2차원 배열
  • Thief 형 객체 t : 초기 위치 2, 2
  • Police 형 객체 cop : 초기 위치 0, 0 경찰의 target은 Thief형 객체 t
  • 반복문 : 경찰이 도둑을 잡을 때 까지 계속 반복
  • boolean 형 변수 success : 도둑이 집을 다 털었는지 확인하는 변수, 초기값은 true
  • show 배열에 village배열 복사 후 도둑과 경찰의 위치에 도둑, 경찰 표시 표기
  • show 배열 출력, 출력하면서 village에 안 털린 집이 있는지 확인 후 하나라도 있으면
  • success의 값을 false로
  • 경찰의 이동 방향 dir은 랜덤하게 설정, 도둑의 이동 방향key는 입력 받아 설정
  • 도둑이 집을 털었으면 village배열에서의 집의 표시 ‘^’을 ‘–‘로 변환
  • success값이 true면 성공 메시지 출력 후 반복문 정지
  • cop.move()가 true라 반복문이 끝나면 실패 메시지 출력
package TheifGame;

public abstract class GameObject { // 추상 클래스
	protected int x, y; // 현재 위치(화면 맵 상의 위치)
	public GameObject(int x, int y) { // 초기 위치 설정 생성자
		this.x = x; this.y = y;
	}
	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 boolean move(); // 이동한 후의 새로운 위치로 x, y 변경, 도둑질을 했는지 리턴
	protected abstract char getShape(); // 객체의 모양을 나타내는 문자 리턴
}
package TheifGame;

public class Police extends GameObject{
	Thief target;//경찰이 잡아야할 도둑
	public Police(int x, int y) {
		super(x, y);//초기값
	}
	public int dir; //이동방향 변수
	@Override
	public boolean move() {
		if(dir == 0) {//정지
			return collide(target);//잡혔나 확인
		}
		else if(dir == 1) {//왼쪽 으로 이동
			if(x!=0) {//가장 왼쪽에 있는게 아니면 
				x=x-1;//왼쪽으로 이동
			}else x=2;//가장 왼쪽이면 가장 오른쪽으로 이동
		}
		else if(dir == 2) {//오른쪽 으로 이동
			if(x!=2) {//가장 오른쪽에 있는게 아니면
				x=x+1;//오른쪽으로 이동
			}else x=0;//가장 오른쪽이면 가장 왼쪽으로 이동
			
		}
		else if(dir == 3) {//아래로 이동
			if(y!=2) {//가장 아래에 있는게 아니면
				y=y+1;//아래로 이동
			}else x=0;//가장 아래면 가장 위로 이동
		}
		else if(dir == 4) {//위로 이동
			if(y!=0) {//가장 위에 있는게 아니면
				y=y-1;//위로 이동
			}else y=2;//가장 위면 가장 아래로 이동
		}
		return collide(target);//이동 후 잡혔나 확인
	}
	public char getShape() {
		return 'P';//경찰 표시 반환
	}
}
package TheifGame;

public class Thief extends GameObject{
	public char key; //이동방향 값
	public Thief(int x, int y) {
		super(x, y);//초기 위치
		
	}
	
	@Override
	public boolean move() {
		if(key=='r') {//key가 r이면 훔치기
			return true;
		}
		else if(key == 'a') {//key가 a
			if(x!=0) {//가장 왼쪽에 있는게 아니면 
				x=x-1;//왼쪽을 이동
			}
			else x=2;//가장 왼쪽이면 가장 오른쪽으로 이동
		}
		else if(key == 'd') {//key 가 d면 
			if(x!=2) {//가장 오른쪽에 있는게 아니면 
				x=x+1;//오른쪽으로 이동 
			}
			else x=0;//가장 오른쪽이면 가장 왼쪽으로 이동
		}
		else if(key == 'w') {//key가 w면 
			if(y!=0) {//가장 위에 있는게 아니면 
				y=y-1;//위로 이동 
			}
			else y=2;//가장 위면 가장 아래로 이동 
		}
		else if(key == 's') {//key가 s
			if(y!=2) {//가장 아래에 있는게 아니면 
				y=y+1;//아래로 이동 
			}
			else y=0;//가장 아래면 맨 위로 이동
		}
		return false;//이동했으니 훔친게 아님 
	}
	public char getShape() {
		return '&'; //도둑 표시 반환 
	}
}
package TheifGame;

import java.util.Scanner;
public class ThiefGame {
	public static void main(String[] args) {
		Scanner scnr = new Scanner(System.in);
		char village[][] = new char[3][3];//집들이 모여있는 마을 2차원 배열 
		char show[][] = new char[3][3];//집들과 경찰, 도둑의 위치를 보여주는 배열
		for(int i=0;i<3;i++) {
			for(int j=0;j<3;j++) {
				village[i][j]='^';//집들의 초기값 
			}
		}
		Thief t = new Thief(2,2);//도둑 선언과 도둑의 초기 위치 초기화 
		Police cop = new Police(0,0);//경찰 선언과 경찰의 초기 위치 초기화
		cop.target = t;//경찰의 타겟은 도둑 t
		System.out.println("김수환 컴퓨터공학과 12211580");
		while (!cop.move()) {//경찰이 도둑 잡을 때 까지
			boolean success = true;//도둑이 집을 다털었는지 확인하는 변수 선언
			for(int i=0;i<3;i++) {
				for(int j=0;j<3;j++) {
					show[i][j]=village[i][j];//show 각 cell에 village의 각 cell 복사 
				}
			}
			show[t.getY()][t.getX()] = t.getShape();//도둑의 위치에 해당하는 cell show에 반환
			show[cop.getY()][cop.getX()] = cop.getShape();//경찰의 위치에 해당하는 cell show에 반환
			for(int i=0;i<3;i++) {
				for(int j=0;j<3;j++) {
					System.out.print(show[i][j]);//show 배열 출력
					if(village[i][j]=='^') {//마을에 집 하나라도 안털렸으면
						success=false;// success 는 false
					}
				}
				System.out.println();
			}
			cop.dir=(int)(Math.random()*5);//경찰의 이동 방향 랜덤하게 설정
			char key = scnr.next().charAt(0);//도둑의 이동 방향 입력받아 설정
			t.key = key;
			if(t.move()) {//도둑이 집을 털었으면
				village[t.getY()][t.getX()]='-';//도둑의 위치에 해당하는 cell -로
			} 
			if(success) {
				System.out.println("다 털었다!");
				break;//다 털었으면 반복문 정지
			}
		}System.out.println("잡혔다ㅠ");
		scnr.close();
	}

}

+ Recent posts