=== 프로그램 디자인 === * 여정(Journey) * 전체 여정이 있다.(JourneyArray, Length) * 다음에 가야 할 방향을 얻을 수 있다.(CurrentPosition, GetNextDirection) * 여정이 끝났는지 확인할 수 있다.(IsFinished) * 판(Board) * 크기가 정해져 있다.(BoardSize) * 자취를 남길 수 있다.(BoardArray, TraceCount, LeaveTrace) * 판의 모든 곳에 자취가 남았는지 확인할 수 있다.(IsAllCellsPassed) * 바퀴벌레(Roach) * 판 위에 올라갈 수 있다.(MyBoard, GoOnBoard) | 판(Board) * 여정이 끝나거나 판의 모든 곳에 자취가 남을때까지 여정에 따라 판 위를 움직일 수 있다.(CurrentLocation, Walk) | 여정(Journey), 판(Board) * 사용자(User) -> 프로그램 사용자와 대응되는 객체 * 판의 크기를 말해줄 수 있다.(GetBoardSize) * 바퀴벌레의 시작위치를 말해줄 수 있다.(GetRoachStartLocation) * 원하는 여정을 만들어 줄 수 있다.(GetJourney) | 여정(Journey) * 판을 볼 수 있다.(PutBoard) | 판(Board) * 진행자(Executor) * 모든것을 진행한다.(Execute) | 사용자(User), 판(Board), 바퀴벌레(Roach), 여정(Journey) 진행자는 사용자에게 진행에 필요한 정보를 요청한다. 사용자는 판 크기, 바퀴벌레의 시작위치를 알려주고 여정을 만들어 준다. 진행자는 정보에 따라 판을 만들고, 바퀴벌레를 만든다. 그리고 나서 바퀴벌레에게 여정을 주며 판 위에 올라가서 판 위를 움직이도록 명령한다. 바퀴벌레는 여정을 참고하여 자취를 남기면서 판 위를 움직이고 여정이 끝나거나 판의 모든 곳에 자취가 남으면 움직이는것을 멈춘다. 바퀴벌레가 멈추면 진행자는 판을 사용자에게 보여준다. http://zeropage.org/~lsk8248/wiki/ScheduledWalk.gif === 프로그램 소스 === {{{~cpp #include #include using namespace std; struct Size { int width; int height; }; struct Location { int x; int y; }; class Journey { public: int *JourneyArray; int Length; int CurrentPosition; Journey(char *str) { Length=strlen(str); JourneyArray=new int[Length]; for(int i=0;iLeaveTrace(startlocation); } void Walk(Journey* journey) { int move[8][2]={ { 0, -1 }, { 1, -1 }, { 1, 0 }, { 1, 1 }, { 0, 1 }, { -1, 1 }, { -1, 0 }, { -1, -1 } }; int direction; while(MyBoard->IsAllCellsPassed()==false || journey->IsFinished()==false) { direction=journey->GetNextDirection(); CurrentLocation.x+=move[direction][0]; CurrentLocation.y+=move[direction][1]; if(CurrentLocation.x==-1) CurrentLocation.x=MyBoard->BoardSize.height-1; if(CurrentLocation.x==MyBoard->BoardSize.height) CurrentLocation.x=0; if(CurrentLocation.y==-1) CurrentLocation.y=MyBoard->BoardSize.width-1; if(CurrentLocation.y==MyBoard->BoardSize.width) CurrentLocation.y=0; MyBoard->LeaveTrace(CurrentLocation); } } }; class User { public: Size GetBoardSize() { Size size; cin >> size.width >> size.height; return size; } Location GetRoachStartLocation() { Location location; cin >> location.x >> location.y; return location; } Journey * GetJourney() { char str[1024]; cin >> str; return new Journey(str); } void PutBoard(Board *board) { cout << "움직인 횟수: " << board->TraceCount-1 <BoardSize.height; h++) { for (int w = 0; w < board->BoardSize.width; w++) cout << board->BoardArray[h][w] << " "; cout << endl; } } }; class Executor { public: void Execute(User *user) { Size boardsize=user->GetBoardSize(); Location startlocation=user->GetRoachStartLocation(); Journey *journey=user->GetJourney(); Board board(boardsize); Roach roach; roach.GoOnBoard(&board,startlocation); roach.Walk(journey); user->PutBoard(&board); delete journey; } }; void main() { Executor executor; User user; executor.Execute(&user); } }}} ---- ["RandomWalk2"]