html制作拼图小游戏(react制作)

本文css使用tailwindcss

Tailwind CSS - 只需书写 HTML 代码,无需书写 CSS,即可快速构建美观的网站。 | TailwindCSS中文文档 | TailwindCSS中文网

规则:在一个(3 * 3)的大正方上被分成个8个(1 * 1)小正方形,剩下的一个是空的,每个小正方形可以移动到空的位置上,若旁边没有空的位置,则无法移动。

实现效果:

点击对应的小正方形,若小正方形四周有空白处,会向空白处移动。

正方形恢复1,2,3,4,5,6,7,8的顺序为过关。

代码中详细分析了实现过程

// 胜利时的正方形模样
const winArr = [[1, 2, 3], [4, 5, 6], [7, 8, 0]]
​
// 正方体的宽
const BLOCK_SIZE = 130
​
// 每个小正方体的颜色
const bgMap: Record<number, string> = {
  1: 'bg-red-300',
  2: 'bg-blue-300',
  3: 'bg-green-300',
  4: 'bg-yellow-300',
  5: 'bg-purple-300',
  6: 'bg-pink-300',
  7: 'bg-orange-300',
  8: 'bg-teal-300',
}
​
// 其中一个小正方体
function YiKuai({ v, currArr, setCurrArr }: { v: number, currArr: number[][], setCurrArr: Function }) {
​
  // 遍历3 * 3的正方体查找数字v的横坐标,纵坐标。
  function findCoor() {
    for (let i = 0; i < 3; i++) {
      for (let j = 0; j < 3; j++) {
        if (currArr[i][j] === v) {
          return [i, j]
        }
      }
    }
    return [-1, -1]
  }
​
  // 点击事件,移动一个正方体,逻辑就是观察四周有没有空的位置,这里假设空的位置是 0
  function moveBlock(i: number, j: number) {
​
    // 对应四个方向分别是——右,左,下,上
    for (let nxArr of [[0, 1], [0, -1], [1, 0], [-1, 0]]) {
      let nx = i + nxArr[0]
      let ny = j + nxArr[1]
      // 如果没有越界,并且找到了0的位置
      if (nx >= 0 && nx < 3 && ny >= 0 && ny < 3 && currArr[nx][ny] === 0) {
        let tmpArr = JSON.parse(JSON.stringify(currArr))
        let tmp = tmpArr[i][j]
        tmpArr[i][j] = tmpArr[nx][ny]
        tmpArr[nx][ny] = tmp
        setCurrArr(tmpArr)
        return
      }
    }
  }
​
  const [x, y] = findCoor()
​
  return (
    /**
     * 这里利用定位,把每个小正方形定位到左上角,再利用transform偏移小正方形的位置。
     * |—— —— —— ——
     * |—— *
     * |
     * |
     * 上面*的位置的下标是(1,2),先竖着,再横着,对应CSS中的transform,水平移动应该看y,竖直移动应该看x。
     */
    <div className={`absolute top-0 left-0 flex justify-center items-center text-base transition-all duration-300
        font-bold cursor-pointer hover:shadow-black hover:shadow-inner w-[130px] h-[130px] ` + (v === 0 ? 'hidden' : '') + ' ' + bgMap[v]}
      style={{ transform: `translate(${y * BLOCK_SIZE}px, ${x * BLOCK_SIZE}px)` }} onClick={() => moveBlock(x, y)}>
      {v}
    </div>
  )
}
​
// 拼图组件
export default function Jigsaw() {
​
  const [currArr, setCurrArr] = useState([[1, 2, 3], [4, 6, 8], [7, 5, 0]])
​
  // currArr和winArr完全一致,游戏胜利!
  const judgeWin = () => {
    for (let i = 0; i < 3; i++) {
      for (let j = 0; j < 3; j++) {
        if (currArr[i][j] !== winArr[i][j]) {
          return false
        }
      }
    }
    return true
  }
​
  useEffect(() => {
    setTimeout(() => {
      if (judgeWin()) {
        alert('You Win!')
      }
    }, 100);
  }, [currArr])
​
  return (
    <div className="w-screen h-screen justify-center items-center flex">
      <div className="w-[394px] h-[394px] border-black border-2 box-border bg-white relative">
        {
          [...currArr.reduce((pre, cur) => [...pre, ...cur], [])]
            .map((v, i) =>
              <YiKuai key={i} v={v} currArr={currArr} setCurrArr={setCurrArr} />
            )
        }
      </div>
    </div>
  )
}
​

制作一个查询表格,可以使用 React 和 Ant Design 的组件库来实现。下面是一个简单的示例: 首先,需要安装 Ant Design 和相关的依赖: ``` npm install antd --save npm install axios --save ``` 接着,创建一个组件 `QueryTable`,它包含一个查询表单和一个数据表格: ``` import React, { useState } from 'react'; import { Table, Form, Input, Button, Space } from 'antd'; import axios from 'axios'; const QueryTable = () => { const [form] = Form.useForm(); const [dataSource, setDataSource] = useState([]); const onFinish = (values) => { axios.get('/api/data', { params: values }) .then((response) => { setDataSource(response.data); }); }; const columns = [ { title: 'Name', dataIndex: 'name', key: 'name', }, { title: 'Age', dataIndex: 'age', key: 'age', }, { title: 'Address', dataIndex: 'address', key: 'address', }, ]; return ( <div> <Form form={form} onFinish={onFinish}> <Space> <Form.Item name="name"> <Input placeholder="Name" /> </Form.Item> <Form.Item name="age"> <Input placeholder="Age" /> </Form.Item> <Form.Item name="address"> <Input placeholder="Address" /> </Form.Item> <Button type="primary" htmlType="submit"> Search </Button> </Space> </Form> <Table dataSource={dataSource} columns={columns} /> </div> ); }; export default QueryTable; ``` 在上面的代码中,使用了 Ant Design 的 `Table`、`Form`、`Input` 和 `Button` 组件。查询表单和数据表格都是通过这些组件来实现的。 在 `onFinish` 函数中,使用 `axios` 库向后台发送查询请求,并更新数据源 `dataSource`。查询结果会通过 `dataSource` 渲染到数据表格中。 最后,将 `QueryTable` 组件渲染到页面中即可: ``` import React from 'react'; import ReactDOM from 'react-dom'; import QueryTable from './QueryTable'; ReactDOM.render(<QueryTable />, document.getElementById('root')); ``` 在这个示例中,假设后台提供了一个 `/api/data` 接口,参数为查询条件,返回值为查询结果。可以根据实际情况修改这部分代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你熬夜了吗?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值