이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date |
2008/10/30 20:39:43 |
Name |
EZrock |
Subject |
C#질문입니다. |
3*3퍼즐을 랜덤으로 섞어서 다시 맞추게 하는 문제입니다.
구현은 거의 다 끝났습니다 다만...분명 완성시킨 퍼즐을 섞는것이기 때문에 퍼즐이 다시 원래대로 풀리지 않는 경우는 생길 수 없다고 생각했는데 제 소스에 문제가 있는데
어떨땐 성공하는 퍼즐이 생기고 어떨때는 성공할 수 없는 퍼즐이 생성됩니다.
private void CreateRandomPuzzle()
{
int tx, ty, x, y; // tx는 타겟버튼의 x좌표값 ty는 타겟버튼의 y좌표 x,y는 변경되지 않는 x,y좌표를 사용하는 변수
int k = 0; // 섞는 회수
string Buttontext; // 화면에 표시되는 숫자. 버튼 교환시 내용을 저장할 변수
Random range = new Random(); // 이동범위를 결정하는 랜덤함수
Random HnV = new Random(); // 이동방향을 결정하는 랜덤함수
MyButton EmptyButton = btnArray[2, 2]; // 빈칸의 좌표는 2,2로 고정되어 있으므로 이렇게 배정
MyButton TargetButton = btnArray[0, 0]; // EmptyButton과 교체될 TargetButton 임의로 0,0으로 배정
while (k <= 10000)
{
int rangevalue = range.Next(-2, 2);
if (rangevalue == 0) continue;
int direction = HnV.Next(-1, 2); // random 함수의 범위 결정값을 결정할떄 min,max 는 범위에 포함 되지 않는다.
if (direction == 0) // 0이면 Horizon 수평방향 이동
{
tx = EmptyButton.Idx_X + rangevalue;
y = EmptyButton.Idx_Y;
if (tx < 0 || tx > 2) continue;
else
{
TargetButton = btnArray[tx, y]; // 가로이동한 좌표의 배열위치를 타겟으로 잡고 - 이 버튼이 공백버튼이 된다.
Buttontext = TargetButton.Text; // 화면에 표시되는 숫자(string형)를 변수에 저장
TargetButton.Text = ""; // 공백이 될 타겟은 공백문자열 처리
EmptyButton.Text = Buttontext; // 타겟버튼과 공백버튼은 바뀌었으므로 타겟버튼이 가지고 있던 문자를 공백으로
EmptyButton = TargetButton; // 새로 공백버튼이 된 기존 타켓버튼의 좌표를 공백버튼에 넣는다.
}
}
else if (direction == 1) // 1이면 vertical 수직이동 이하 내용은 동일
{
x = EmptyButton.Idx_X;
ty = EmptyButton.Idx_Y + rangevalue;
if (ty < 0 || ty > 2) continue;
else
{
TargetButton = btnArray[x, ty];
Buttontext = TargetButton.Text;
TargetButton.Text = "";
EmptyButton.Text = Buttontext;
EmptyButton = TargetButton;
}
}
k++;
}
}
이 부분이 핵심함수 인데 버튼 배열을 사용해서 좌우이동과 상하이동 그리고 각 이동시 어느방향으로 움직일지는 랜덤으로 결정했습니다.
나머지는 주석으로 상세히 적은 편인데 역시 주석대로 되짚어 보면 별 문제는 없어 보입니다...만
별 문제 없어보였다고 자부하다가 겪은 실수가 한두개가 아닌지라...분명 실수는 있을것인데 찾을수가 없습니다.
어디가 문제고 어떻게 수정해야 되는지를 좀 알려주셨으면 합니다.
|
통합규정 1.3 이용안내 인용
"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
|