基于React 实现井字棋

一、简介

这篇文章会基于React 实现井字棋小游戏功能。

二、效果演示

三、技术实现

javascript 复制代码
import {useEffect, useState} from "react";

export default (props) => {
  return <Board/>
}


const Board = () => {
  let initialState = [['', '', ''], ['', '', ''], ['', '', '']];
  const [squares, setSquares] = useState(initialState);
  const [times, setTimes] = useState(0);
  useEffect(()=>{
      // 判断每行是否相同
      for (let i = 0; i < 3; i++) {
        if (squares[i][0] === squares[i][1] && squares[i][1] === squares[i][2] && squares[i][0] !== '') {
          alert(squares[i][0] + ' win');
          setTimes(0)
          setSquares(initialState)
          return;
        }
      }
      // 判断每列是否相同
      for (let i = 0; i < 3; i++) {
        if (squares[0][i] === squares[1][i] && squares[1][i] === squares[2][i] && squares[0][i] !== '') {
          alert(squares[0][i] + ' win')
          setTimes(0)
          setSquares(initialState)
          return;
        }
      }
      // 判断对角线是否相同
      if (squares[0][0] === squares[1][1] && squares[1][1] === squares[2][2] && squares[0][0] !== '') {
        alert(squares[0][0] + ' win');
        setTimes(0)
        setSquares(initialState)
        return;
      }
      if (squares[0][2] === squares[1][1] && squares[1][1] === squares[2][0] && squares[0][2] !== ''){
        alert(squares[0][2] + ' win');
        setTimes(0)
        setSquares(initialState)
        return;
      }


  },[times])
  return <div style={{width:'130px', margin: '0 auto'}}>
    <table style={{borderCollapse: 'collapse'}}>
      {squares.map((row, rowIdx) => {
        return <tr key={rowIdx}>
          {
            row.map((col, colIdx) => {
                return <td key={rowIdx + '-' + colIdx} style={{border: '1px solid #000', width: '40px', height: '40px'}}>
                  <div style={{width: '40px', height: '40px', textAlign: 'center', lineHeight:'40px'}} onClick={
                    () => {
                      const newSquares = [...squares];
                      if (newSquares[rowIdx][colIdx] !== '') {
                          return;
                      }
                      newSquares[rowIdx][colIdx] = times % 2 === 0 ? 'X' : 'O';
                      setSquares(newSquares);
                      setTimes(times + 1);

                    }
                  }>{col}</div>
                </td>
              }
            )
          }
        </tr>
      })}

    </table>
  </div>
}

1.布局

基于table实现,3行,3列。

2.表格元素点击

更新cell内容,更新次数。

javascript 复制代码
     const newSquares = [...squares];
     if (newSquares[rowIdx][colIdx] !== '') {
         return;
     }
     newSquares[rowIdx][colIdx] = times % 2 === 0 ? 'X' : 'O';
     setSquares(newSquares);
     setTimes(times + 1);

3.判断游戏是否结束

判断每行,每列,斜线是否相等。

javascript 复制代码
 useEffect(()=>{
      // 判断每行是否相同
      for (let i = 0; i < 3; i++) {
        if (squares[i][0] === squares[i][1] && squares[i][1] === squares[i][2] && squares[i][0] !== '') {
          alert(squares[i][0] + ' win');
          setTimes(0)
          setSquares(initialState)
          return;
        }
      }
      // 判断每列是否相同
      for (let i = 0; i < 3; i++) {
        if (squares[0][i] === squares[1][i] && squares[1][i] === squares[2][i] && squares[0][i] !== '') {
          alert(squares[0][i] + ' win')
          setTimes(0)
          setSquares(initialState)
          return;
        }
      }
      // 判断对角线是否相同
      if (squares[0][0] === squares[1][1] && squares[1][1] === squares[2][2] && squares[0][0] !== '') {
        alert(squares[0][0] + ' win');
        setTimes(0)
        setSquares(initialState)
        return;
      }
      if (squares[0][2] === squares[1][1] && squares[1][1] === squares[2][0] && squares[0][2] !== ''){
        alert(squares[0][2] + ' win');
        setTimes(0)
        setSquares(initialState)
        return;
      }


  },[times])
相关推荐
GreenTea1 小时前
从 Claw-Code 看 AI 驱动的大型项目开发:2 人 + 10 个自治 Agent 如何产出 48K 行 Rust 代码
前端·人工智能·后端
渣渣xiong2 小时前
从零开始:前端转型AI agent直到就业第五天-第十一天
前端·人工智能
布局呆星2 小时前
Vue3 | 组件通信学习小结
前端·vue.js
C澒2 小时前
IntelliPro 企业级产研协作平台:前端智能生产模块设计与落地
前端·ai编程
OpenTiny社区3 小时前
重磅预告|OpenTiny 亮相 QCon 北京,共话生成式 UI 最新技术思考
前端·开源·ai编程
前端老实人灬3 小时前
web前端面试题
前端
Moment4 小时前
AI 全栈指南:NestJs 中的 Service Provider 和 Module
前端·后端·面试
IT_陈寒4 小时前
为什么我的JavaScript异步回调总是乱序执行?
前端·人工智能·后端
Moment4 小时前
AI全栈入门指南:NestJs 中的 DTO 和数据校验
前端·后端·面试