단어 게임-보드 구현?


12

libgdx를 사용하여 Android 용 boggle 유형 게임을 만들고 있습니다. 사용자에게는 4x4 문자 격자가 표시되며 문자 위로 손가락을 드래그하여 단어를 찾아야합니다.

boggle과 달리 사용 된 문자가 사라지기를 원합니다. 남은 글자가 떨어지고 (보드 아래쪽으로 화면 방향이 고정됨) 보드가 위에서 다시 채워집니다. 사용자는 전략적인 단어 선택을 통해 보드를 회전시켜 더 나은 곳에서 글자를 사용하기 어렵게 만들 수 있습니다.

예를 들면 :

d g a o
u o r T
h v R I
d G n a

GRIT이라는 단어를 선택하면 해당 문자가 사라지고 나머지 문자는 쓰러집니다.

d
u g a
h o r o
d v n a

그런 다음 새 문자로 바꿉니다.

d w x y
u g a z
h o r o
d v n a

보드와 타일을 표현하는 방법을 알아 냈습니다.

타일을 선택하고 유효한 움직임과 매트릭스에 저장된 타일을 추적하여 쉽게 매핑 할 수 있도록 보드를 매트릭스로 표현하려고했습니다. 이것은 작동하지만 보드를 회전시키기 위해 복잡한 코드를 작성해야했습니다.

다른 게임은이 문제를 어떻게 처리합니까?

편집 : 그래서 그것에 대해 생각하면 보드 회전에 따라 터치 포인트를 처리해야 셀이 일정하게 유지됩니다. 내가 생각하고있는 이미지를 첨부했습니다.프로세스 화면 터치로 보드 방향이 변경되지 않음


1
문자가 떨어지는 방향은 장치 방향에 따라 다릅니다. "타일을 회전하고 싶을 때 위로 나사로"다 " 라는 의미로 정교하게 설명해 주시겠습니까 ?
Petr Abdulin

나는 회전을 한 후에 보드 위치에서 타일 위치로의 매핑이 매우 복잡하다는 것을 의미했습니다. 그러나 보드가 모든 타일 위치를 변경하는 대신 좌표계의 원점을 중심으로 회전한다고 생각하면이 문제를 해결할 수 있다고 생각합니다.
andy mcevoy

업데이트 해 주셔서 감사합니다. 일반적으로 질문 자체를 업데이트하는 것이 좋습니다. 따라서 다른 사람은 소중한 정보를 얻기 위해 주석을 파헤칠 필요가 없습니다. 회전 수행 방법 (현재), 결과 및 추적이 실제로 어려워지는 방법은 아직 명확하지 않습니다. 전체 보드가 회전했는지 또는 개별 타일인지는 확실하지 않습니다. 일반적으로 코드 조각을 추가하면 문제를 이해하는 데 큰 도움이됩니다.
Petr Abdulin

나는 문제에 대해 잘못 생각하고 있다고 생각합니다. 회전에 따라 사용자 터치 포인트를 처리하면 보드를 정적 객체로 생각할 수 있습니다.
andy mcevoy

문제에 대한 해결책을 찾은 경우이를 답변에 넣고 답변을 수락하십시오. 그렇지 않으면 100 % 확실하지 않은 경우이를 열어 둘 수 있습니다. 제안 된 솔루션을 설명하는 용어는 "공간 변환"입니다. 즉, 화면 공간과 (회전 된) 보드 공간간에 터치 포인트를 변환합니다.
엔지니어

답변:


1

배열을 관리하면 점점 더 복잡해지기 때문에 배열을 전혀 사용하지 않을 것입니다. 이웃에 대한 참조가있는 노드로 사용자 정의 보드 데이터 구조를 만듭니다. 이것은 본질적으로 다차원 LinkedList of Nodes입니다. 이러한 방식으로 노드의 문자가 제거되면 다른 노드가이를 캡슐화 된 방식으로 볼 수 있습니다. 이것은 복잡한 배열 산술을 피합니다. 모든 것을 올바르게 연결하려면 하나의 큰 기능이 필요하지만 일단 연결되면 로직을 훨씬 쉽게 사용할 수 있습니다.

엣지 노드는 이웃이로 설정 null되므로 이웃을 참조 해야하는 Node 클래스의 메소드에서 해당 노드를 처리해야합니다.

Conway의 Game Of Life 를 구현하기 위해이 접근법을 사용 했으며 일단 설정하면 이웃을 기반으로 노드의 상태를 변경하는 논리 추가의 복잡성을 크게 줄입니다.

보드의 노드를 조작하는 방법에 따라 다음 상태 또는 동작을 반복하고 결정하여 각 노드 내에 저장하려면 하나의 보드 방법이 필요할 수 있습니다. 그런 다음 각 노드를 반복하고 새 상태로 커밋하여 수행하십시오. 이렇게하면 이미 변경된 노드를보고 노드가 다음 상태를 판별하지 않아도됩니다.

여기에 이미지 설명을 입력하십시오


-2

예, 해결책은 행렬 또는 배열에서 값을 가져 와서 임시 배열 또는 행렬에 대해 해당 값을 설정 한 다음 거기에서 값을 설정하여 회전 값을 보여줍니다. 나는 아래에 코드를 추가했다.

    int MAX_GRID = 4;
    int[][] main_array = new int[MAX_GRID][MAX_GRID];
    int[][] temp_array = new int[MAX_GRID][MAX_GRID];

    /** This method for clockwise **/
    int mainRow = MAX_GRID - 1;
    for (int c = 0; c < MAX_GRID; c++) {
        for (int r = 0; r < MAX_GRID; r++) {
            temp_array [mainRow][c] = main_array [r][c];
            Log.i("TAG", "R C : [ " + mainRow + " " + c + " ]" + " => [ "
                    + r + " " + c + " ]");
            mainRow--;
        }
    }
    main_array = temp_array;

    /** This method for anti-clockwise **/
    int mainCol = 0;
    for (int c = MAX_GRID - 1; c >= 0; c--) {
        for (int r = MAX_GRID - 1; r >= 0; r--) {
            temp_array [r][mainCol] = main_array [c][r];
            Log.i("TAG", "R C : [ " + r + " " + mainCol + " ]" + " => [ "
                    + c + " " + r + " ]");
        }
        mainCol++;
    }
    main_array = temp_array;

    // Now you can set main_array value then its rotate
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.