코 코스 크 리 에이 터 화 용도 디지털 퍼 즐

6288 단어 Cocos게임.화용도
머리말
화 용 도 는 무엇 입 니까?

이런 디지털 퍼 즐 게임 은 모두 가 해 본 적 이 있 지?그 가 바로 전형 적 인 화 용도 중의 하나 이다.
화 용 도 는 오래된 중국 민간 익 지 게임 으로 변화 가 많 고 백 가지 게임 이 싫 증 이 나 지 않 는 특징 으로 마방,독립 다이아몬드 바둑 과 함께 외국 지적 전문가 에 의 해'지적 게임 계 의 세 가지 불가사의'라 고 불 린 다.
오늘 은 이 화 용 도 를 알 아 보 자.
본문
오늘 우 리 는 주로 3*3 의 구조 로 진행 되 었 습 니 다.초보 자 는 cocos creator 로 간단 한 demo 를 썼 습 니 다.다음은 우리 가 점차적으로 이야기 하 겠 습 니 다.
1.판 넬
우선 우 리 는 랜 덤 으로 판 넬 배열 을 만 듭 니 다.

2.화 용도 구 해
생각:
궁 거 법:모두 가 이런 게임 의 게임 방법 을 알 고 있 습 니 다.그 중에서 미 끄 러 질 수 있 는 사각형 을 미 끄 러 뜨리 고 어 지 러 운 사각형 을 위의 숫자 에 따라 작은 것 부터 큰 것 까지 순서대로 배열 하면 통관 할 수 있 습 니 다.이곳 에서 채소 새 는 궁 거 법 을 이용 해 가능 한 모든 상황 에서 가장 좋 은 방법 을 찾 았 다.
궁 거 법 에서 우리 가 흔히 볼 수 있 는 것 은:
4.567917.넓 은 검색:넓 은 검색 을 우선 하고 모든 방향의 첫 번 째 단 계 를 우선 검색 한 다음 에 모든 가능 한 방향 을 검색 하 는 두 번 째 단 계 를 이 어 유추 합 니 다4.567917.깊이 검색:깊이 우선 검색 은 한 방향 에서 계속 검색 합 니 다.이 길이 통 하지 않 을 때 까지 두 번 째 방향 을 고려 합 니 다여기 서 우리 가 사용 하 는 것 은 광범 위 한 우선 검색 이다.우 리 는 가장 좋 은 것,즉 걸음 수가 가장 적은 것 만 얻 을 수 있다.
구체 적 인 조작 은 그림 과 같다.

우 리 는 예전 에 세 걸음 을 예 로 들 었 다.
4.567917.첫 번 째 단 계 는 세 가지 방법 이 있 습 니 다.4.567918.
4.567917.두 번 째 단 계 는 우 리 는 첫 번 째 단 계 를 바탕 으로 사각형 을 이동 해 야 한다.모든 것 은 더 많은 가능성 을 연장 할 것 이다.4.567918.
우 리 는 모든 가능성 을 저장 해 야 한다.
  • 다음 이동 은 지난 단계 의 모든 가능성 을 바탕 으로 이동 하 는 것 이다
  • 4.567917.세 번 째 단계 에서 우 리 는 중복 되 는 상황 이 발생 할 수 있다 는 것 을 알 게 될 것 이다.모든 우 리 는 지출 을 줄 이 고 중복 되 는 가 지 를 신속하게 처리 해 야 한다.4.567918.
    4.567917.중복 되 는 가 지 를 처 리 했 지만 분기 의 수량 도 배로 증가 할 것 이다.예시 에서 의 배열 을 가지 고 걸음 수가 증가 함 에 따라 분기 의 수량 은 그림 과 같다
    4.567917.일단 지점 이 통관 되 었 음 을 감지 하면 넓 은 검색 이 끝 납 니 다4.567917.최종 적 으로 모든 이동 과정 을 얻 을 수 있 습 니 다
    알 게 되 었 습 니 다.우 리 는 demo 에 응용 하여 통관 여 부 를 검사 할 수 있 습 니 다.
    데모 의 자동 정렬 을 누 르 십시오.

    3.코드
    
    //      
    while (true) {
        let steps: Array<any> = [];
        let lastGrad: Array<any> = this.mMapData[this.mMapData.length - 1];
        console.log(lastGrad.length);
        //               ,     
        for (let i = 0; i < lastGrad.length; i++) {
            let matrix = lastGrad[i]["matrix"];
            let answer = lastGrad[i]["answer"];
            let result: Array<any> = this.move(matrix, answer, steps);
            if (result) {
                console.log("  :", result);
                resolve(result);
                return;
            }
        }
    
        if(steps.length<=0){
            console.log("      ,");
            resolve(null);
            return;
        }
        this.mMapData.push(steps);
    }
    
    private move(matrix: Array<number>, answer: Array<any>, steps: Array<any>): Array<any> {
        for (let i = 0; i < matrix.length; i++) {
            if (matrix[i] != -1) {  //    ,       ,       
                //            ,
                let result0: Array<any> = this.moveUp(i, matrix, answer, steps);
                let result1: Array<any> = this.moveDown(i, matrix, answer, steps);
                let result2: Array<any> = this.moveLeft(i, matrix, answer, steps);
                let result3: Array<any> = this.moveRight(i, matrix, answer, steps);
    
                if (result1) {
                    return result1;
                }
                if (result2) {
                    return result2;
                }
                if (result0) {
                    return result0;
                }
                if (result3) {
                    return result3;
                }
            }
        }
        return null;
    }
    
    private moveRight(i: number, matrix: Array<number>, answer: Array<any>, steps: Array<any>): Array<any> {
        let line: number = i % this.mLine;
        let row: number = Math.floor(i / this.mLine);
        if (line + 1 >= this.mLine) return null;  //    
        let targetIndex: number = row * this.mLine + (line + 1);
        if ( matrix[targetIndex] != -1) return null;  //    
        //  
        //  
        //          
        let newMatrix: Array<number> = JSON.parse(JSON.stringify(matrix));
        let newAnswer: Array<any> = JSON.parse(JSON.stringify(answer));
        //    
        let temp: number = newMatrix[i];
        newMatrix[i] = newMatrix[targetIndex];
        newMatrix[targetIndex] = temp;
        newAnswer.push({ "index": i, "dic": 3 });
    
        if (this.checkIsExist(newMatrix)) {
            return null;
        }
    
        if (this.checkPass(newMatrix)) {
            return newAnswer;
        }
        let step: any = {};
        step["matrix"] = newMatrix;
        step["answer"] = newAnswer;
        steps.push(step);
    }
    /**
     *       
     */
    private checkPass(matrix: Array<number>): boolean {
        if (matrix[this.mRow * this.mLine - 1] != -1) return false;
        for (let i = 0; i < this.mRow * this.mLine - 1; i++) {
            if (matrix[i] != i + 1) {
                return false;
            }
        }
        console.log(matrix)
        return true;
    }
    /**
     *       
     */
    private checkIsExist(matrix): boolean {
        if (this.mMapMatrixS[JSON.stringify(matrix)]) {
            return true;
        }
        this.mMapMatrixS[JSON.stringify(matrix)] ="1";
        return false;
    }
    
    4.주의
    demo 는 3*3 의 배열 로 브 라 우 저 를 사용 하면 결 과 를 겨우 뛰 어 넘 을 수 있 지만 4*4 또는 5*5 는 안 됩 니 다.분기 가 너무 많 기 때 문 입 니 다.나중에 시간 이 있 으 면 초보 자 는 python 스 크 립 트 로 4*4,5*5 이상 의 배열 을 실현 하여 json 관문 정 보 를 내 보 냅 니 다.
    이상 은 바로 CocosCreator 화 용도 디지털 퍼 즐 의 상세 한 내용 입 니 다.CocosCreator 화 용도 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 해 주 십시오!

    좋은 웹페이지 즐겨찾기