핵심 기능
- 플레이어 : 도둑
- 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();
}
}
'JAVA' 카테고리의 다른 글
[Java.6-1] 컬렉션 (0) | 2022.05.25 |
---|---|
[Java-개발해보기.3] WordCount, 단어를 세봅시다 (0) | 2022.05.25 |
[Java-개발해보기.1] 카페 키오스크 (0) | 2022.05.23 |
[Java.5-2] 제네릭 메소드와 와일드 카드 (0) | 2022.05.20 |
[Java.5-1] 제네릭 클래스 (0) | 2022.05.20 |