React 实现井字棋的示例代码

 更新时间:2024年07月09日 08:34:37   作者:卡卡舅舅  
本文主要介绍了React 实现井字棋,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、简介

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

二、效果演示

三、技术实现

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内容,更新次数。

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

3.判断游戏是否结束

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

 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])

到此这篇关于React 实现井字棋的文章就介绍到这了,更多相关React 井字棋内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:

相关文章

  • 一文带你搞懂useCallback的使用方法

    一文带你搞懂useCallback的使用方法

    useCallback是用来帮忙缓存函数的,当依赖项没有发生变化时,返回缓存的指针,而props涉及到复杂对象类型都是通过指针来传递到,下面这篇文章主要给大家介绍了关于useCallback使用的相关资料,需要的朋友可以参考下
    2023-02-02
  • 示例详解react中useState的用法

    示例详解react中useState的用法

    useState 通过在函数组件里调用它来给组件添加一些内部 state,React 会在重复渲染时保留这个 state,接下来通过一个示例来看看怎么使用 useState吧
    2021-06-06
  • React虚拟渲染实现50个或者一百个图表渲染

    React虚拟渲染实现50个或者一百个图表渲染

    这篇文章主要为大家介绍了React虚拟渲染实现50个或者100个图表渲染的实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 基于React.js实现简单的文字跑马灯效果

    基于React.js实现简单的文字跑马灯效果

    刚好手上有一个要实现文字跑马灯的react项目,然后ant-design上面没有这个组件,于是只能自己手撸一个,文中的实现方法讲解详细,希望对大家有所帮助
    2023-01-01
  • React搭配TypeScript使用教程及实战案例

    React搭配TypeScript使用教程及实战案例

    本文主要介绍了React搭配TypeScript使用教程及实战案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-02-02
  • 深入理解React Native原生模块与JS模块通信的几种方式

    深入理解React Native原生模块与JS模块通信的几种方式

    本篇文章主要介绍了深入理解React Native原生模块与JS模块通信的几种方式,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • React Immutable使用方法详细介绍

    React Immutable使用方法详细介绍

    Immutable.js出自Facebook,是最流行的不可变数据结构的实现之一。它实现了完全的持久化数据结构,使用结构共享。所有的更新操作都会返回新的值,但是在内部结构是共享的,来减少内存占用
    2022-09-09
  • React为什么需要Scheduler调度器原理详解

    React为什么需要Scheduler调度器原理详解

    这篇文章主要为大家介绍了React为什么需要Scheduler调度器原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • react合成事件与原生事件的相关理解

    react合成事件与原生事件的相关理解

    本文主要介绍了react合成事件与原生事件的相关概念,帮助大家区分这两种事件,学习react的同学不妨了解下
    2021-05-05
  • react中的useImperativeHandle()和forwardRef()用法

    react中的useImperativeHandle()和forwardRef()用法

    这篇文章主要介绍了react中的useImperativeHandle()和forwardRef()用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08

最新评论