PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
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은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
와후-만세
08/10/30 20:51
수정 아이콘
다른 곳에 문제가 있는건 아닐까요?
어떤 성공하지 않는 퍼즐이 생성되나요?
08/10/30 21:02
수정 아이콘
말 그대로 퍼즐이 완성되지 않는 경우입니다.

1 2 3 이런식으로 완성 되야 하는데
4 5 6
7 8 N

1 2 3 다 맞추고 나면 이렇게 됩니다.
4 5 6
8 7 N

다른곳이라 해도

최초 버튼생성, 직접 퍼즐 풀면서 이동시키는 부분 종료 버튼 눌렀을 때 체크

이 정도밖에 없지만

저 세가지 부분에는 이상이 없고 실제로 버튼 섞는 기능과 연관성이 없습니다.
와후-만세
08/10/30 21:12
수정 아이콘
Random.Next(min,max+1)
호출하실 때,
나오는 값은 min 은 포함됩니다.
08/10/30 21:20
수정 아이콘
...min값을 고치고 나니까 이번엔 제대로 되네요..

제가 그토록 시행착오를 거치면서 저럴것이다 라고 생각했는데[검색으론 못찾아서...ㅠㅠ]

...으헝 ㅠㅠ


..와후만세님 감사합니다...ㅠㅠ
와후-만세
08/10/30 21:21
수정 아이콘
에고,,, 저런 에러는 쓰임새를 잘못 익힌경우엔 디버그를 해보지 않는한 발견하기 힘들어서 ^^;
고생하셨겠습니다.
08/10/30 21:28
수정 아이콘
사실 다 맞는가 검사할때 문제 생기는걸로 한 두어시간 노가다 했고 이번에도 해결안되는 퍼즐때문에 정말 오랜시간 고민했는데 그런 단순한문제 였을줄은..ㅠㅠ

제가 쓴대로 하면 min이 -2까지 되니까 2에 있을땐 0값과 스왑을 할 수 있기 때문에 N 8 7 이런 경우가 생겼다는걸 뼈저리게 느끼고 말았습니다 ㅠㅠ
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
44328 무협(?)소설은 원래 이렇게 읽기 어려운건가요? ㅠㅠ [10] GrayScavenger2165 08/10/31 2165
44326 판, 검사 돈 잘 버나요?? [13] 낭띠4841 08/10/31 4841
44325 컴퓨터를 사려고 합니다. [8] 릴리러쉬1673 08/10/31 1673
44324 노무현 전 대통령에 관한 질문입니다 [8] 헤르젠1932 08/10/31 1932
44323 파이어폭스 [2] 헤르메스2055 08/10/31 2055
44322 오른손 검지 손가락이 계속해서, 저립니다.. [2] Kim_toss2423 08/10/31 2423
44321 괜찮은 커피숍 추천좀해주세요~ [6] 아레스2295 08/10/31 2295
44320 질문이 있습니다(수정) [2] 발그레 아이네1916 08/10/31 1916
44319 Pgr21에서 한때 유명했던 모자 관련 글 [6] 세실2625 08/10/31 2625
44318 static-x 라는 밴드 아세요? [9] buffett1938 08/10/30 1938
44317 이거 뭐죠?? 전화 피싱인가요?? [5] BW_1926 08/10/30 1926
44314 인터넷스크롤이랑 폴더이동하면 물결이칩니다 [3] 잇힝~!2640 08/10/30 2640
44313 질문 하나만 더 합니다. 아무것도 모르는사람이 입문하기좋은 주식 책좀 알려주세요~ [2] 베컴1907 08/10/30 1907
44312 신문 추천좀해주셔요~ 잡지같은것도 괜찮습니다. [13] 베컴1936 08/10/30 1936
44311 북한 수용소 소재로한 만화책이 뭐지요? 모르니~2263 08/10/30 2263
44310 콘서트 진행요원 알바.. [7] Wr.C-YuJI4208 08/10/30 4208
44309 상처에 밴드 붙이는게 나은가요?? [8] 건강이제일6778 08/10/30 6778
44308 램 업그레이드 질문 [4] 치어풀1521 08/10/30 1521
44306 강남역 근처 반찬 살만한 곳? [2] Dave2109 08/10/30 2109
44305 고백후 남자의 자존심을 지킬까요? [10] 바람과쓰러지3330 08/10/30 3330
44304 무르팍 도사 < 황석영 선생님 ) 편 관련 질문입니다 [3] 하얀로나프강2314 08/10/30 2314
44303 공군면접관련 질문입니다. [2] 막나간인생2351 08/10/30 2351
44302 C#질문입니다. [6] EZrock2245 08/10/30 2245
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로