[지뢰 찾기] 몇 가지 버그...

hzn·2023년 6월 6일
0

PROJECT🏝

목록 보기
24/24
post-thumbnail
post-custom-banner

1. Timer 바로 실행되는 문제 😇

문제 사항

  • 게임 실행 후 완료하지 않고 중간에 다른 난이도로 보드를 생성하게 되면 isRunning 상태가 여전히 true이기 때문에 타이머가 자동으로 실행되는 문제였다.

해결

create_board: (state, action) => {
      const { rowNum, columnNum, mineNum } = action.payload;
      state.boardData = plantMine(rowNum, columnNum, mineNum);
      state.mine = mineNum;
      state.timer = 0;
      state.result = '';
      state.isRunning = false; // 추가
      state.openedCount = 0;
    },
start_game: (state) => {
      state.isRunning = true;
    },
  • create_board에서 state.isRunning = false를 추가해 보드 생성 시마다 isRunning 상태를 비활성화해서 해결

2. 콜 스택 에러🔥

Uncaught RangeError: Maximum call stack size exceeded

문제사항

  • 주변 지뢰 갯수가 0(mindCount === 0)인 셀을 열었을 경우 근처의 주변 지뢰 갯수 0인 셀들을 한 번에 여는 로직에서
  • 이미 오픈된(= checkAround가 실행된) 셀들까지 또다시 checkAround가 실행되면서 콜스택 에러가 발생한다.

해결

  • 이미 오픈된 셀이 아닌 경우에만 checkAround를 실행하도록 조건을 추가해서 해결

추가한 조건

if(boardData[cellIdx[0]][cellIdx[1]] < CODE.OPENED)
  • 오픈된 셀에 대한 값은 모두 CODE.OPENED (= 0)보다 크므로, 이보다 작은 값일 경우에만 실행되도록 조건을 작성한다.
  • !==로 조건 작성할 경우 이미 오픈된 셀에 대한 중복 실행이 일어난다.

before

 near.filter((cellIdx) => ~~~) // 테이블에 해당하는 셀만 filter
	.forEach((cellIdx) => checkAround(cellIdx[0], cellIdx[1]);
            });
          }
      };
  • filter 된 near 배열 중 이미 오픈된 셀도 forEach에 의해 checkAround가 실행되는 상태

After

 near.filter((cellIdx) => ~~~) // 테이블에 해당하는 셀만 filter
	.forEach((cellIdx) => {
              if (boardData[cellIdx[0]][cellIdx[1]] < CODE.OPENED) {
                // 이미 오픈된 셀 아닌 경우에만 실행
                checkAround(cellIdx[0], cellIdx[1]);
              }
            });
        }
      };

3. 콜 스택 에러 II 🚑

문제 사항

  • 재귀로 checkAround를 실행하는게 일정 횟수를 넘어가면 콜 스택 에러가 발생한다.
  • 보드 사이즈가 커져도 지뢰 수가 많은 경우 상대적으로 한 번에 열려야 하는 셀이 적기 때문에 에러가 발생하지 않지만, 보드 사이즈는 크고 지뢰 수가 적은 경우는 재귀 탐색이 많아지기 때문에 에러가 발생한다.
  • 현재 보드 크기가 50x50에 지뢰수가 50 이하면 에러가 발생할 확률이 높은 상태다

해결

  • 보통 setTimeout() 같은 비동기 코드로 감싸주고 백그라운드와 태스크 큐에 할당해서 해결하는 것 같다
  • 해결 중...!
post-custom-banner

0개의 댓글