- 음... 우선 도스창에서 입력받아서 이동시키는 것만 빼면 다 했습니다. 그 입력이 C처럼 만만하지가 않더군요... 입력 하나 받는데 뭘 그렇게 많이 써야 하는지...
- 우선 상민이형이 써 주신 것에서 1번을 해 보았습니다.(버그 수정 완료)...이제 2번 할 차례...그리고 어쩌다가 count변수가 다시 필요해져서 다시 넣었습니다.
3번째의 코드는 comment solving을 보인거니 감안하십시오. 3번을 그대로 한다면, 입력 데이터와, Bug 사이의 인터페이스를 맞추는 함수가 필요할것입니다.
사소한 것이지만 지적한다면 class main 의 이름을 Main 으로 바꾸시기를 강력(?) 추천합니다. Java 에는 지켜야하는 규칙인 문법외에 코딩 약속을 추천하고 있씁니다. 과거 MS라면 헝가리안표기법 이겠지요? 현재의 .net 에서 헝가리안표기법은 없어졌습니다. --neocoin
Class main
~cpp import java.util.*; public class main{ public static void main(String[] args) { Bug bug1=new Bug(); System.out.println("RandomWalk"); bug1.journey[0]='0'; bug1.journey[1]='0'; bug1.journey[2]='4'; for(int i=0;bug1.journey[i]!='\0';i++) bug1.move(bug1.journey[i]); } }Class Bug
~cpp public class Bug{ public int x=0; public int y=0; public int count=0; public char journey[]={'\0','\0','\0','\0','\0'}; Board aboard=new Board(); public void move(char way) { if(count==0) aboard.board[0][0]++; if(way=='0')//북 x=x-1; else if(way=='1')//북동 { x=x-1; y=y+1; } else if(way=='2')//동 y=y+1; else if(way=='3')//남동 { x=x+1; y=y+1; } else if(way=='4')//남 x=x+1; else if(way=='5')//남서 { x=x+1; y=y-1; } else if(way=='6')//서 y=y-1; else if(way=='7')//북서 { x=x-1; y=y-1; } if(x>=aboard.board.length) x=0; if(x<0) x=aboard.board.length-1; if(y>=aboard.board[0].length) y=0; if(y<0) y=aboard.board[0].length-1; aboard.board[x][y]++; aboard.exhibit(); System.out.print("\n"); count++; } }Class Board
~cpp public class Board{ public int board[][]={ {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0}, {0,0,0,0,0} }; public void exhibit(){ for(int i=0;i<board.length;i++) { for(int j=0;j<board.length;j++){ System.out.print(board[i][j]); System.out.print("\t"); } System.out.print("\n"); } } }
1차로 참고 ¶
- 변경사항은 각 주석에서 설명합니다.
- word rap 하는 부분의 중복을 제거 했습니다.
- 안쓰이는 Board.count 인자 제거
~cpp public class Board { public char journey[] = { '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' }; public int x = 0; public int y = 0; public int board[][] = { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }; public void move(char way) { if (way == '0') //북 { x = x - 1; } else if (way == '1') //북동 { x = x - 1; y = y + 1; } else if (way == '2') //동 { y = y + 1; } else if (way == '3') //남동 { y = y + 1; x = x + 1; } else if (way == '4') //남 { x = x + 1; } else if (way == '5') //남서 { y = y - 1; x = x + 1; } else if (way == '6') //서 { y = y - 1; } else if (way == '7') //북서 { y = y - 1; x = x - 1; } // WordRap 을 여기에서 수행 if (x >= board.length) x = 0; if (y >= board[0].length) y = 0; if (x < 0) x = board.length - 1; if (y < 0) y = board[0].length - 1; board[x][y]++; exhibit(); System.out.println(); } public void exhibit() { // Magic Number 제거 for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[i].length; j++) { System.out.print(board[i][j] + "\t"); } System.out.println(); } } public static void main(String[] args) { Board aboard = new Board(); System.out.println("RandomWalk"); aboard.board[0][0]++; aboard.journey[0] = '0'; aboard.journey[1] = '3'; for (int i = 0; aboard.journey[i] != '\0'; i++) aboard.move(aboard.journey[i]); } }
2차 참고 ¶
- HashMap 을 이용해서 방향값에 대한 값의 변화량을 넣습니다. 이전에 배열로 구현하여 코드를 짧게 하는 것과 같은 목적입니다.
~cpp import java.util.HashMap; public class Board { public char journey[] = { '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' }; public int x = 0; public int y = 0; public int board[][] = { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }; class 방향값 { 방향값(int x, int y) { this.x = x; this.y = y; } int x; int y; } public void move(char way) { // HashMap 을 이용해서 변화량만을 추가 HashMap directionMap = new HashMap(); directionMap.put("0", new 방향값(-1, 0)); // 북 directionMap.put("1", new 방향값(-1, 1)); // 북동 directionMap.put("2", new 방향값(0, 1)); // 동 directionMap.put("3", new 방향값(1, 1)); // 남동 directionMap.put("4", new 방향값(1, 0)); // 남 directionMap.put("5", new 방향값(1, -1)); // 남서 directionMap.put("6", new 방향값(0, -1)); // 서 directionMap.put("7", new 방향값(-1, -1)); // 북서 // primitive type 을 String(Object) 으로 변경하는 꽁수 // HashMap 에 입력된 방향 델타 값을 얻어내어 x,y 더함 방향값 delta = (방향값) directionMap.get("" + way); x += delta.x; y += delta.y; // Wordrap 코드 수정 x = (x >= board.length) ? 0 : x; y = (y >= board[0].length) ? 0 : y; x = (x < 0) ? board.length - 1 : x; y = (y < 0) ? board[0].length - 1 : y; board[x][y]++; // exhibit -> printBoard 로 rename printBoard(); System.out.println(); } public void printBoard() { // Magic Number 제거 for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[i].length; j++) { System.out.print(board[i][j] + "\t"); } System.out.println(); } } public static void main(String[] args) { Board aboard = new Board(); System.out.println("RandomWalk"); aboard.board[0][0]++; aboard.journey[0] = '0'; aboard.journey[1] = '3'; for (int i = 0; aboard.journey[i] != '\0'; i++) aboard.move(aboard.journey[i]); } }
3차 참고 ¶
- char jouney -> ArrayList 로 대체
- x, y -> nowX, nowY 로 rename : 의미상으로 currentXPos가 적당하겠지요.
- 방향을 표현하는 Magic number 제거, 여정인 Board.jouney 가 ArrayList 이므로, String을 넣습니다. 일종의 comment mixing이 되겠지요.
~cpp import java.util.ArrayList; import java.util.HashMap; public class Board { // char jouney -> ArrayList 로 대체 protected ArrayList jouney = new ArrayList(); // x -> nowX public int nowX = 0; // y -> nowY public int nowY = 0; public int board[][] = { { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0 } }; class 방향값 { 방향값(int x, int y) { this.x = x; this.y = y; } int x; int y; } public void move(String way) { // HashMap 을 이용해서 변화량만을 추가 HashMap directionMap = new HashMap(); // 방향에 있는 Magic number 제거 directionMap.put("북", new 방향값(-1, 0)); directionMap.put("북동", new 방향값(-1, 1)); directionMap.put("동", new 방향값(0, 1)); directionMap.put("남동", new 방향값(1, 1)); directionMap.put("남", new 방향값(1, 0)); directionMap.put("남서", new 방향값(1, -1)); directionMap.put("서", new 방향값(0, -1)); directionMap.put("북서", new 방향값(-1, -1)); // primitive type 을 String(Object) 으로 변경하는 꽁수 // HashMap 에 입력된 방향 델타 값을 얻어냅니다. 방향값 delta = (방향값) directionMap.get("" + way); nowX += delta.x; nowY += delta.y; // Wordrap 코드 수정 nowX = (nowX >= board.length) ? 0 : nowX; nowY = (nowY >= board[0].length) ? 0 : nowY; nowX = (nowX < 0) ? board.length - 1 : nowX; nowY = (nowY < 0) ? board[0].length - 1 : nowY; board[nowX][nowY]++; printBoard(); System.out.println(); } public void printBoard() { // Magic Number 제거 for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[i].length; j++) { System.out.print(board[i][j] + "\t"); } System.out.println(); } } public ArrayList getJouney() { return jouney; } public static void main(String[] args) { Board aboard = new Board(); System.out.println("RandomWalk"); aboard.board[0][0]++; // jouney getter로 jouney 의 참조를 얻습니다. // jouney 는 aboard가 가지고 있는 것입니다. ArrayList jouney = aboard.getJouney(); jouney.add("북"); jouney.add("남동"); // 출력부분 ArrayList 로 따른 변경 for (int i = 0; i < jouney.size(); i++) aboard.move((String) jouney.get(i)); } }