|
@@ -0,0 +1,101 @@
|
|
|
|
|
+import { useState, useEffect } from "react";
|
|
|
|
|
+const pets = [
|
|
|
|
|
+ '🐶', '🐱', '🐰', '🐭', "🦊", "🐷", "🐔", "🐑", "🐂", "🦁"
|
|
|
|
|
+]
|
|
|
|
|
+const getPetsCard = () => {
|
|
|
|
|
+ const selected = pets.slice(0, 5);
|
|
|
|
|
+ const list = [...selected, ...selected];
|
|
|
|
|
+ return list.sort(() => Math.random() - 0.1)
|
|
|
|
|
+}
|
|
|
|
|
+function Setting() {
|
|
|
|
|
+ // 移动次数
|
|
|
|
|
+ const [moves, setMoves] = useState(0);
|
|
|
|
|
+ // 配对
|
|
|
|
|
+ const [pairing, setPairing] = useState(0);
|
|
|
|
|
+ // 卡片数组
|
|
|
|
|
+ const [cards, setCards] = useState([]);
|
|
|
|
|
+ // 翻开
|
|
|
|
|
+ const [over, setOver] = useState([]);
|
|
|
|
|
+ // 成功
|
|
|
|
|
+ const [success, setSuccess] = useState([]);
|
|
|
|
|
+
|
|
|
|
|
+ useEffect(() => {
|
|
|
|
|
+ const result = getPetsCard();
|
|
|
|
|
+ setCards(result);
|
|
|
|
|
+ console.log(result, result.length)
|
|
|
|
|
+ setPairing(result.length / 2);
|
|
|
|
|
+ }, [])
|
|
|
|
|
+
|
|
|
|
|
+ const handleClick = (index) => {
|
|
|
|
|
+ if (success.includes(index) || over.includes(index) || over.length >= 2) return;
|
|
|
|
|
+ setMoves(prev => prev + 1)
|
|
|
|
|
+ const newOver = [...over, index];
|
|
|
|
|
+ setOver(newOver)
|
|
|
|
|
+ if (newOver.length == 2) {
|
|
|
|
|
+ let [first, second] = newOver;
|
|
|
|
|
+ if (cards[first] === cards[second]) {
|
|
|
|
|
+ // 把相同的内容放到成功数组中
|
|
|
|
|
+ setSuccess(prev => [...prev, first, second]);
|
|
|
|
|
+ setPairing(prev => prev - 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 未成功 把下标从翻开数组清除
|
|
|
|
|
+ setTimeout(() => setOver([]), 1500)
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const handleReset = () => {
|
|
|
|
|
+ const result = getPetsCard();
|
|
|
|
|
+ console.log(result.length, '2')
|
|
|
|
|
+ setCards(result);
|
|
|
|
|
+ setPairing(result.length / 2);
|
|
|
|
|
+ setOver([])
|
|
|
|
|
+ setSuccess([])
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ const accuracy = moves == 0 ? 0 : (success.length / 2 / moves) * 100
|
|
|
|
|
+ return (
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <h1>🐾 宠物配对游戏</h1>
|
|
|
|
|
+ <p>
|
|
|
|
|
+ <span>移动次数:{moves}|</span>
|
|
|
|
|
+ <span>剩余配对:{pairing}|</span>
|
|
|
|
|
+ <span>准确率:{accuracy.toFixed(2)}%</span>
|
|
|
|
|
+ </p>
|
|
|
|
|
+ <div style={{
|
|
|
|
|
+ width: 550,
|
|
|
|
|
+ display: 'grid', gridTemplateColumns: 'auto auto auto auto auto',
|
|
|
|
|
+ gap: 5, margin: '0 auto'
|
|
|
|
|
+ }}>
|
|
|
|
|
+ {
|
|
|
|
|
+ cards.map((item, index) => (
|
|
|
|
|
+ <div key={index} onClick={() => handleClick(index)} style={{
|
|
|
|
|
+ width: 100, height: 100, backgroundColor: success.includes(index) ? '#27Ae60' : '#1A73E8', color: 'white',
|
|
|
|
|
+ display: 'flex', justifyContent: 'center',
|
|
|
|
|
+ alignItems: 'center',
|
|
|
|
|
+ borderRadius: 8,
|
|
|
|
|
+ fontSize: 30,
|
|
|
|
|
+ transition: 'all 0.3s',
|
|
|
|
|
+ transform: success.includes(index) || over.includes(index) ? 'rotateY(-180deg)' : 'rotateY(0)',
|
|
|
|
|
+
|
|
|
|
|
+ }}>
|
|
|
|
|
+ {
|
|
|
|
|
+ success.includes(index) || over.includes(index) ? item : '?'
|
|
|
|
|
+ }
|
|
|
|
|
+ </div>
|
|
|
|
|
+ ))
|
|
|
|
|
+ }
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <button onClick={() => handleReset()} style={{
|
|
|
|
|
+ background: '#27Ae60',
|
|
|
|
|
+ color: '#fff',
|
|
|
|
|
+ textAlign: 'center',
|
|
|
|
|
+ padding: '13px 25px',
|
|
|
|
|
+ border: 'none',
|
|
|
|
|
+ marginTop: '30px',
|
|
|
|
|
+ }}>重新开始</button>
|
|
|
|
|
+ </div >
|
|
|
|
|
+ )
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+export default Setting;
|