diff --git a/src/components/Info.jsx b/src/components/Info.jsx index 6c985e8..4a1d2bd 100644 --- a/src/components/Info.jsx +++ b/src/components/Info.jsx @@ -4,7 +4,7 @@ import Context from './Context'; import { I } from '@/lib/TetrominoType'; export default function () { - const { gameOver, nextTetromino } = useContext(Context) + const { gameOver, nextTetromino, score, eliminatedLines } = useContext(Context) if (gameOver) return <> @@ -12,12 +12,14 @@ export default function () {
得分 - 100 + {score}
+
消除行 - 20 + {eliminatedLines}
+ {nextTetromino && (
下一个
diff --git a/src/lib/tetris.js b/src/lib/tetris.js index 9030156..c53a2ac 100644 --- a/src/lib/tetris.js +++ b/src/lib/tetris.js @@ -210,10 +210,11 @@ export function moveDownTetromino(tetromino, tetrominoes, onCollise, onGameOver, return moved } - if (eliminateLines(tetromino, tetrominoes, setTetrominoes) == 0 && reachTop) { + const eliminatedLines = eliminateLines(tetromino, tetrominoes, setTetrominoes) + if (eliminatedLines == 0 && reachTop) { onGameOver() } else { - onCollise() + onCollise(eliminatedLines) } return tetromino @@ -245,9 +246,10 @@ export function fallDownTetromino(tetromino, tetrominoes, onCollise, onGameOver, tetromino.y = moved.y - 1 - if (eliminateLines(tetromino, tetrominoes, setTetrominoes) == 0 && result.reachTop) { + const eliminatedLines = eliminateLines(tetromino, tetrominoes, setTetrominoes) + if (eliminatedLines == 0 && result.reachTop) { onGameOver() } else { - onCollise() + onCollise(eliminatedLines) } } \ No newline at end of file diff --git a/src/pages/index.js b/src/pages/index.js index dac980b..5420b1c 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -11,6 +11,8 @@ export default function () { const [tetrominoes, setTetrominoes] = useState([]) const [currentTetromino, setCurrentTetromino] = useState() const [nextTetromino, setNextTetromino] = useState() + const [score, setScore] = useState(0) + const [eliminatedLines, setEliminatedLines] = useState(0) const [gameOver, setGameOver] = useState(true) const mainRef = useRef() @@ -55,12 +57,20 @@ export default function () { setCurrentTetromino(rotateTetromino(currentTetromino, tetrominoes)) } + const onCollise = (elimiLines) => { + if (elimiLines > 0) { + setEliminatedLines(eliminatedLines + elimiLines) + setScore(score + 10 * Math.pow(2, elimiLines)) + } + queueMicrotask(next) + } + const down = () => { setCurrentTetromino( moveDownTetromino( currentTetromino, tetrominoes, - () => queueMicrotask(next), + onCollise, () => setGameOver(true), setTetrominoes) ) @@ -79,7 +89,7 @@ export default function () { fallDownTetromino( currentTetromino, tetrominoes, - () => queueMicrotask(next), + onCollise, () => setGameOver(true), setTetrominoes) } @@ -117,7 +127,7 @@ export default function () { } return ( - +