🔗 게임 배포 주소 : https://bombyanggang.netlify.app/
🔗 깃 레포지토리 주소: https://github.com/allansad/BombYangGang
- 개요 ⛳️
윈도우 기본게임으로 내장되었던 지뢰찾기 게임을 따라만든 게임입니다. 13주차 브레이크 기간 React, Redux, TailWind를 활용하여 제작하였습니다. 제작 기간은 약 2일 소요되었습니다.
- 참여자 👨🌾
양수보(메인 드라이버), 이주연(설계), 장보경(CSS, 서브 드라이버), 정의성(테스트, 서버)
- 사용스택
- 1인용 (이후 온라인을 통한 다인 대전 고려중)
- 게임시작 ⇒ 전체 맵 셋팅 on. (첫 클릭시 터질 수 있음)
- 난이도 설정 : 폭탄 갯수 (이지: 12%, 노말: 15%, 하드: 20%)
- 가로: min:9 max:30
- 세로: min:9 max:30
- 오로지 폭탄만을 남기고 남은 맵을 모두 개방했을 시 승리합니다.
- 클릭 혹은 자동확장을 통해 폭탄을 개방했을 시, 폭탄이 터지며 실패합니다.
-
클릭 설정
-
좌클릭 : 열기
-
우클릭: 한번→ 깃발, 두번→ ?, 세번→ 해제
[⛳️, ?, 해제]
-
양쪽클릭: 범위 보여주기 (호버)
-
-
상단표시:
- 남은 폭탄 갯수(깃발꽂을때 감소), 시간(플레이타임 기록용)
-
결과창: 성공/실패여부
- 게임 오버시, 실패 안내창 + restart 버튼
- 게임 클리어시, 성공 축하 안내창
-
reset & restart 버튼
- < 주요 사항 >
-
9*9맵 우선 고정(임시), 이후 확장.
-
로직 구분
- 필드 구성
- 매개변수: 가로, 세로, 폭탄%
- 반환값: 2차원 배열 맵
- 자기 주변에 폭탄 갯수를 세는 로직
- 0번 눌렸을 경우 연쇄개방(재귀)
- 필드 구성
-
데이터
- 각 자리가 자기 좌표를 기억해야함 예) (1,1) → id값.
- status:
-
내면상태(under status): 자기가 폭탄인지 숫자인지
-
0 : 빈 칸
1~8: 주변 폭탄 갯수
9: 💣
-
-
표면상태(covered status): 깃발, 물음표, 빈값, 열림(표면인 버튼이 사라지고 내면 보드가 드러남)
-
-
- 🌊 < 플로우 >
-
게임 시작 시, 사용자의 이름과 가로갯수, 세로 갯수, 난이도(폭탄의 비율)을 적습니다. → store에 관리될 데이터
-
게임시작 버튼을 누를 시, 게임 초기셋팅을 진행합니다.
- 데이터를 store에 보냅니다.
- 내면 맵 생성
- 가로*세로 만큼의 1차 배열을 만듭니다.
- 폭탄의 갯수를 계산 (가로세로난이도)하여 위 배열에 랜덤하게 배치합니다.
- 1차배열을 입력한 가로*세로에 맞게 출력할 수 있도록 잘라 2차배열로 생성합니다.
- 각 위치를 돌며 자신을 둘러싼 8개의 위치에 폭탄이 있는지를 확인하고, 그 갯수를 value에 숫자를 기록합니다.
- 표면 맵 생성
- 가로*세로 만큼의 2차원 배열을 생성한후
<button>
으로 내보냅니다.
- 가로*세로 만큼의 2차원 배열을 생성한후
-
게임 플레이 중, 버튼 클릭 액션
좌클릭
- 해당 버튼의 위치를 오픈합니다.
- 오픈후
<button>
→<div>{해당 좌표의 내면값}</div>
- (내면값 === nulll) ⇒ 주변 좌표를 연쇄적으로 개방합니다. 단 , 연쇄중에서도 (내면 상태 === null)을 중심으로 8칸만 해제 합니다.
- (내면값 === 폭탄 갯수) ⇒ 추가 동작 없음
- (내면값 === 폭탄) ⇒ 게임 실패.
우클릭
- 버튼의 표면 상태를 변경합니다.
(”” → “⛳️” → “?” → “”);
- 버튼의 표면 상태를 변경합니다.
우클릭 + 좌클릭
- 선택한 맵 주변의 8개의 칸을 해제합니다. 단, 찾은 폭탄의 갯수 (깃발표시)가 내면 상태의 갯수와 동일할 시 개방합니다.
- (깃발 위치 === 올바른 폭탄 위치) 추가 동작 없이, 맵 개방
- (깃발 위치 === 틀린 폭탄 위치) 폭탄위치를 연것과 동일한 행동으로, 게임실패
- 선택한 맵 주변의 8개의 칸을 해제합니다. 단, 찾은 폭탄의 갯수 (깃발표시)가 내면 상태의 갯수와 동일할 시 개방합니다.
-
승리조건
(열리지 않은 칸의 갯수 === 폭탄 갯수) && ( 열리지 않은 칸의 위치 === 폭탄 위치)일 경우 승리합니다.
-
- Lottie animation(react-lottie)
https://lottiefiles.com/free-animations/property
- “나 이거 솔직히 조금이라도 뿌듯하다!”
- “이것 때문에 🐶같이 고생했다.”
- “이번 구현에서 이게 좀 흥미로웠다!” 하는 점 등등을 남겨주시면 이게 바로 README거리 !
- 테일윈드 grid-templete 의 함정
- 핵심 로직 구현
- 연쇄 개방로직 (재귀 관련)
- 승리, 패배 조건 로직
- 다중 대전
- 트로피 요소
- (최단시간 클리어) 랭킹
- Custom 맵버전과 랭킹버전으로 나누기
- 초급99 중급1616 고급16*30에만 랭킹 존재
- 클리어시 랭킹/리더보드 보여주기
- 초급을 위해 1000ms 단위가 아닌 100ms 10ms단위로 timer 변경?!
- 모바일 대응 화면 UI 개선