- 인수군의 Random Walk - 아 심심해--;
- 헤더
~cpp
#ifndef _BOARD_H_
#define _BOARD_H_
class RandomWalkBoard
{
private:
int _nRow;
int _nCol;
int** _nBlockFrequency;
int _nCurRow;
int _nCurCol;
int _nTotalMovement;
public:
RandomWalkBoard(int& nRow, int& nCol, int& nCurRow, int& nCurCol);
~RandomWalkBoard();
void BoardAllocate();
void BoardFree();
void AddVisitCount();
void ShowBoardStatus() const;
bool CheckCompletelyPatrol() const;
void SetArrayAsZero(int& nCurRow);
void StartMovement();
int GetRandomDirection() const;
bool CheckCorrectCoordinate(int& nDelRow, int& nDelCol) const;
void AddTotalCount();
};
#endif
~cpp
#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
#include "RandomWalkBoard.h"
//// 생성자와 소멸자 ////
RandomWalkBoard::RandomWalkBoard(int& nRow, int& nCol, int& nCurRow, int& nCurCol)
{
_nRow = nRow;
_nCol = nCol;
_nCurRow = nCurRow;
_nCurCol = nCurCol;
_nTotalMovement = 0;
srand(time(0));
BoardAllocate();
}
void RandomWalkBoard::BoardAllocate()
{
_nBlockFrequency = new int*[_nRow];
for(int i = 0 ; i < _nRow ; i ++)
{
_nBlockFrequency[i] = new int[_nCol];
SetArrayAsZero(i);
}
}
void RandomWalkBoard::SetArrayAsZero(int& nCurRow)
{
for(int i = 0 ; i < _nCol ; i ++)
{
_nBlockFrequency[nCurRow][i] = 0;
}
}
RandomWalkBoard::~RandomWalkBoard()
{
BoardFree();
}
void RandomWalkBoard::BoardFree()
{
if(_nBlockFrequency)
{
for(int i = 0 ; i < _nRow ; i ++)
{
if(_nBlockFrequency[i])
delete [] _nBlockFrequency[i];
}
delete [] _nBlockFrequency;
}
}
////////////////////////
//// 본 프로그램 ////
bool RandomWalkBoard::CheckCompletelyPatrol() const
{
for(int i = 0 ; i < _nRow ; i ++)
{
for(int j = 0 ; j < _nCol ; j++)
{
if(_nBlockFrequency[i][j] == 0)
return false;
}
}
return true;
}
void RandomWalkBoard::ShowBoardStatus() const
{
for(int i = 0 ; i < _nRow ; i ++)
{
for(int j = 0 ; j < _nCol ; j++)
{
cout << _nBlockFrequency[i][j] << " ";
}
cout << endl;
}
cout << "현재 행 : " << _nCurRow << endl;
cout << "현재 열 : " << _nCurCol << endl;
cout << "총 이동량 : " << _nTotalMovement << endl;
}
void RandomWalkBoard::AddVisitCount()
{
_nBlockFrequency[_nCurRow][_nCurCol]++;
}
void RandomWalkBoard::StartMovement()
{
int DelRow = 0;
int DelCol = 0;
while(!CheckCompletelyPatrol())
{
DelRow = GetRandomDirection();
DelCol = GetRandomDirection();
if(CheckCorrectCoordinate(DelRow, DelCol))
{
_nCurRow += DelRow;
_nCurCol += DelCol;
AddVisitCount();
AddTotalCount();
}
}
}
int RandomWalkBoard::GetRandomDirection() const
{
return (rand()%3) - 1;
}
bool RandomWalkBoard::CheckCorrectCoordinate(int& nDelRow, int& nDelCol) const
{
if(_nCurRow + nDelRow < 0 || _nCurRow + nDelRow > _nRow - 1)
return false;
if(_nCurCol + nDelCol < 0 || _nCurCol + nDelCol > _nCol - 1)
return false;
return true;
}
void RandomWalkBoard::AddTotalCount()
{
_nTotalMovement++;
}
~cpp
#include <iostream>
using namespace std;
#include "RandomWalkBoard.h"
void AskInitData(int& nRow, int& nCol, int& nCurRow, int& nCurCol);
int main()
{
int nRow, nCol, nCurRow, nCurCol;
AskInitData(nRow, nCol, nCurRow, nCurCol);
RandomWalkBoard Test(nRow, nCol, nCurRow, nCurCol);
Test.StartMovement();
Test.ShowBoardStatus();
return 0;
}
void AskInitData(int& nRow, int& nCol, int& nCurRow, int& nCurCol)
{
cout << "\n행을 입력하세요 : ";
cin >> nRow;
cout << "\n열을 입력하세요 : ";
cin >> nCol;
cout << "\n현재 바퀴벌레의 행을 입력하세요(0 ~ 행-1) : ";
cin >> nCurRow;
cout << "\n현재 바퀴벌레의 열을 입력하세요(0 ~ 열-1) : ";
cin >> nCurCol;
}
- 간단한걸 너무 복잡하게 짠건 아닌가 하는 생각이 든다.. 제길 -- 인수
- 근데 리팩토링 책 보면 메소드는 최대한 짧고 간결하게 끊으라 그래서--; -- 인수
- 소스가 좀 길어지긴 해도 확실히 알아보긴 편한것 같다. -- 인수
- 이걸 왜 했냐면, 그냥 심심해서..--; 나두 데블스 캠프 가고 싶당.. 쩝.. -- 인수
DeleteMe ) 누가 작성했나요?