JAVA 프로그래밍

문제

WASD키를 이용하여 맵에서 캐릭터를 상하좌우로 이동하는 문제입니다 이를 해결하는 프로그램을 작성하세요 
옷
WASD와[Enter]를 입력하세요: s
옷
WASD와[Enter]를 입력하세요: q

옷
WASD와[Enter]를 입력하세요: a
옷
WASD와[Enter]를 입력하세요: a
옷
WASD와[Enter]를 입력하세요: x

옷
WASD와[Enter]를 입력하세요: s
옷
WASD와[Enter]를 입력하세요: s
옷
WASD와[Enter]를 입력하세요: q

알고리즘 설계

프로그램 시작 
   캐릭터 및 맵 초기화
   캐릭터 이동하기
   캐릭터 및 전체 맵 출력
   캐릭터의 다음 이동 방향 입력 받기
프로그램 종료

맵에 있는 캐릭터 클래스
   캐릭터 이동
      이동 방향 확인
      벽인지 허용 범위인지 확인하고 캐릭터 이동
   캐릭터 및 전체 맵 표현

프로그램 구현

     
 
 ※ 단계별 점검: A키(이전), D키(다음) 
 
	// 파일명 : ./Chapter12/CharacterMovementOnMap.java
	import java.util.Scanner;
	import move.ObjectOnMap;
		  
	public class CharacterMovementOnMap
	{
		// 프로그램 시작 
1		public static void main( String args[] ) {
			Scanner scan = new Scanner( System.in );
		  
			// 캐릭터 및 맵 초기화 
			int[][] map = {
			               { 1,1,1,1,1,1,1,1,1 },
			               { 1,0,0,0,1,0,0,0,1 },
			               { 1,1,1,0,1,0,1,1,1 },
			               { 1,0,0,0,1,0,0,0,1 },
			               { 1,0,1,1,1,1,1,0,1 },
			               { 1,0,0,0,0,0,0,0,1 },
			               { 1,1,1,1,1,1,1,1,1 }
			              } ;
		  
2			ObjectOnMap character =
3			                        new ObjectOnMap( map, 2, 1 );
		  
			char direction='d';
4			do {
				// 캐릭터 이동하기 
5				character.move( direction );
				// 캐릭터 및 전체 맵 출력 
6				System.out.println(
7				                    character );
		  
				// 캐릭터의 다음 이동 방향 입력 받기 
				System.out.print( "WASD와[Enter]를 입력하세요: " );
				direction= scan.nextLine().charAt(0);
8			} while( ( direction == 'W' ) || ( direction == 'A' ) || ( direction == 'S' ) || ( direction == 'D' )
			      || ( direction == 'w' ) || ( direction == 'a' ) || ( direction == 's' ) || ( direction == 'd' ) );
		  
			scan.close();
		// 프로그램 종료 
9		}
	}
		  
	// 파일명 : ./src/move/ObjectOnMap.java
	package move;
		  
	// 맵에 있는 캐릭터 클래스  
	public class ObjectOnMap
	{
		protected int[][] map;
		protected int x, y, minX, minY, maxX, maxY;
		protected final int LEFT = -1, RIGHT = 1, UP = -1, DOWN = 1, STOP = 0;
		protected final int PATH = 0, WALL = 1, CHARACTER = 2;
		protected final String symbol[] = { "  ", "\033[44m   \033[0m", "옷" };
		  
P1b		public ObjectOnMap( int[][] map, int x, int y ) {
			this.map = map;
			this.x = x;
			this.y = y;
			this.minX = 0;
			this.minY = 0;
			this.maxX = ( map == null ) ? 0 : map[0].length-1;
			this.maxY = ( map == null ) ? 0 : map.length-1;
P1e		}
		  
		// 캐릭터 이동 
P2b		public void move( char direction ) {
			// 이동 방향 확인  
			switch( direction ) {
				case 'W' :  case 'w' :
P21					move( STOP, UP );
					break;
				case 'A' :  case 'a' :
P22					move( LEFT, STOP );
					break;
				case 'S' :  case 's' :
P23					move( STOP, DOWN );
					break;
				case 'D' :  case 'd' :
P24					move( RIGHT, STOP );
					break;
			}
P2e		}
		  
		// 벽인지 허용 범위인지 확인하고 캐릭터 이동 
P3b		public void move( int directionX, int directionY ) {
			if( map[this.y+directionY ][this.x+directionX]== WALL )
				return;
		  
			this.x += directionX;
			this.y += directionY;
			this.x = ( this.x <= minX ) ? minX : this.x;
			this.y = ( this.y <= minY ) ? minY : this.y;
			this.x = ( this.x >= maxX ) ? maxX : this.x;
			this.y = ( this.y >= maxY ) ? maxY : this.y;
P3e		}
		  
		// 캐릭터 및 전체 맵 표현 
		@Override
P4b		public String toString() {
			String strMap = "";
			for( int y = minY; y <= maxY; y++ ) {
				for( int x = minX; x <= maxX; x++ ) {
					if ( ( this.x == x ) && ( this.y == y ) )
						strMap += symbol[CHARACTER];
					else
						strMap += symbol[map[y ][x]] ;
				}
				strMap += "\n";
			}
			return strMap;
P4e		}
	}

실행 순서 확인