[로데시] 개발
[대학전쟁3] 양면빙고 웹 개발 06 - 직전 타일 이동, 뒤집기 제한 본문
반응형

0️⃣ 지난 번까지..
대학전쟁에 나온 '양면빙고 (double sided bingo)' 게임을 보고 ☰ 양면빙고 (double-sided-bingo) 개발 과정
1️⃣ 타일 개수에 따른 이동, 뒤집기 제한
🌟 App.js 코드const [turnCount, setTurnCount] = useState(0);
const [phase, setPhase] = useState("PLACE");
ㆍturnCount - 빙고판에 올라가있는 타일의 개수를 판단하기 위해 turnCount를 사용한다.
setTurnCount(prev => prev + 1);
Turn이 지날 때마다 turnCount이 1 씩 증가할 수 있도록 코드를 추가한다.
const canMoveOrFlip = (tileKey) => {
if (phase !== "MOVE_FLIP") return false;
if (lastAction && lastAction.tileKey === tileKey) return false;
return true;
};
phase가 PLACE일 경우 착수만, MOVE_FLIP일 경우에 뒤집기, 이동할 수 있도록 코드를 작성한다.
if (fromBoard && !canMoveOrFlip(key)) return;
착수 14번 이하면 뒤집을 수 없도록 코드를 추가한다.
if (!canMoveOrFlip(active.id)) return;
착수 14번 이하면 이동할 수 없도록 코드를 추가한다.
if (!canMoveOrFlip(active.id)) return;
착수 14번 이하면 이동할 수 없도록 코드를 추가한다.
<BingoBoard
boardTiles={boardTiles}
movableCell={movableCell}
onFlip={(key) => handleFlip(key, true)}
isDisabled={canMoveOrFlip} />
BingoTile로 내려주어 실제 동작 차단을 하도록 한다.
2️⃣ 직전 타일 이동, 뒤집기 제한
🌟 App.js 코드setLastAction({ tileKey: key, owner: currentTurn });
마지막 타일을 저장할 수 있는 const를 추가한다.
const canMoveOrFlip = (tileKey) => {
if (phase !== "MOVE_FLIP") return false;
if (!tileKey) return true;
if (lastAction && lastAction.tileKey === tileKey) return false;
return true;
};
직전 턴에 이동/뒤집기한 타일은 다음 턴에 이동/ 뒤집기를 제한하도록 코드를 수정한다.
setLastAction({ tileKey: key, owner: currentTurn });
이번 턴에 뒤집었으면 다음 턴에 같은 타일을 이동/뒤집을 수 없도록 코드를 추가한다.
const activeTileKey = active.data.current?.tileKey ?? active.id;
const tile = myTiles.find(t => t.key === activeTileKey);
setActiveTile(tile ?? null);
이번 턴에 움직였으면 다음 턴에 같은 타일을 이동/뒤집을 수 없도록 코드를 추가한다.
const movedTile = boardTiles[from];
const movedTile = boardTiles[from];
if (movedTile?.key) {
setLastAction({ tileKey: movedTile.key, owner: currentTurn });
} else {
setLastAction({ tileKey: activeTileKey, owner: currentTurn });
}
이번 턴에 움직였으면 다음 턴에 같은 타일을 이동/뒤집을 수 없도록 코드를 추가한다.
3️⃣ 이동 자체도 막음
🌟 BingoTile.js 코드disabled: !!isDisabled,
useDraggable 옵션 중 하나인 disabled를 사용해 props로 받은 isDisabled의 드래그 동작 자체를 비활성화한다.
4️⃣ gray 표시
🌟 BingoTile.js 코드<TileItem showOverlay={isDisabled} />
props로 받은 isDisabled를 TileItem에게도 넘겨준다.
<div className="tile-img-wrap" data-overlay={showOverlay ? "true" : "false"}> </div>
showOverlay 상태값에 따라 서로 다른 CSS 스타일을 적용하기 위해 코드를 작성한다.
.TileItem .tile-img-wrap {
position: relative;
display: block;
width: 100%;
height: 100%;
overflow: hidden;
border-radius: inherit;
}
.tile-img-wrap[data-overlay="true"] .tile-img {
cursor: default; /* 또는 not-allowed */
}
.TileItem .tile-img-wrap[data-overlay="true"]::before {
content: "";
position: absolute;
inset: 0;
background: rgba(0,0,0,0.20);
pointer-events: none;
z-index: 2;
mix-blend-mode: normal;
transition: background .18s ease;
border-radius: inherit;
}
true일 경우 (직전에 착수, 이동, 뒤집은 타일일 경우) 회색처리를 한다.
5️⃣ 앞으로...
이동, 뒤집기를 제한하는 기능을 만들었다.
반응형
'개인 개발 > 대학전쟁' 카테고리의 다른 글
| [대학전쟁3] 양면빙고 웹 개발 08 - 2인 play (0) | 2026.02.08 |
|---|---|
| [대학전쟁3] 양면빙고 웹 개발 07 - timer, highlight, restart (0) | 2026.01.31 |
| [대학전쟁] 양면빙고 웹 개발 05 - 빙고 판단, player 2명 (0) | 2026.01.20 |
| [대학전쟁] 양면빙고 웹 개발 04 - 타일 뒤집기 (flip), 이동 (move) (1) | 2026.01.18 |
| [대학전쟁3] 양면빙고 웹 개발 03 - 타일 착수 (place) (0) | 2026.01.16 |