본문 바로가기
Project/테트리스

[테트리스] 18. 다음 블럭 정하는 난수 수정

by 햄과함께 2020. 8. 16.
320x100

오늘의 이슈. 이제 간단한 건은 없드아.


기존 문제점

중복되는 블럭이 연속으로 많이 나온다.

3개가 연속으로 나온적도 있다.

무작정 랜덤으로 돌리면 안될듯하다.

 

다른 테트리스에서는 어떻게 하고 있는지 구글링을 해봤다.

https://www.quora.com/Do-Tetris-pieces-spawn-randomly

2001년부터 7 System(random bag)이라는 랜덤 블럭 생성 방법을 사용한다는 글을 보았다.

7은 테트리스에서 사용하는 블럭의 수다.

 

https://tetris.fandom.com/wiki/Random_Generator

https://simon.lc/the-history-of-tetris-randomizers

좀 더 상세한 정보를 찾아봤다. (새삼느끼는 인터넷의 위대함)

가방에 7개의 테트리스 블럭을 넣고 무작위로 하나의 블럭을 꺼낸다.

7개의 블럭을 모두 뺐을 때 다시 7개의 블럭을 가방에 넣고 가방이 빌 때까지 블럭을 하나씩 꺼내간다.

이렇게 하면 겹치는 블럭이 연속으로 3개 등장하지 않을 뿐더러 다음에 나올 블럭도 예상할 수 있어 더 전략적으로 플레이 가능하다.


// /js/nextBlock.js

class NextBlock {
    constructor(size) {
        this.typesQ = [];

        // bag 배열에 block 수만큼 인덱스 넣기
        this.bag = [];
        for (var i = 0; i<blockType.length; i++) {
            this.bag.push(i);
        }
        this.nextBlockSize = size;
        this.pushRandom();
    }

    pushRandom() {
        // 설정된 nextBlock type이 nextBlockSize 보다 작거나 같다면
        // 다시 this.nextBlockSize 만큼 값ㅇ르 추가한다.
        if(this.typesQ.length <= this.nextBlockSize) {
            this.bag = shuffle(this.bag); // 다시 섞는다.
            for (var i = 0; i<this.bag.length; i++) {
                this.typesQ.push(this.bag[i]);
            }
        }
    }
    
    // ...
}

NextBlock 클래스의 pushRandom 함수를 수정했다.

bag에 blockType 수(7개) 만큼 0부터 수를 넣는다.

만약 화면에 보여주는 다음에 나올 블럭수보다 현재 세팅된 다음에 등장할 블럭 수가 작다면,

 bag 배열을 셔플한다음 typesQ에 차례대로 넣어준다.


결과

7개씩 세로로 쌓아봤다. 겹치지 않고 순서도 제각각인 블럭이 생성된다.

편안~


깃허브 : use 7-bag random algorithm

320x100

댓글