当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • vue vite+three在线编辑模型导入导出
  • Emacs有什么优点,用Emacs写程序真的比IDE更方便吗?
  • S5730 OSPF: 配置 OSPF 进程和区域
  • 硬盘模式vmd怎么改ahci_电脑vmd改ahci模式详细步骤
  • Visual Studio编译优化选项
  • PPTP、L2TP、IPSec、IPS 有什么区别?
  • 星网安全产品线成立 引领卫星互联网解决方案创新
  • 美团到家平台业务探索
  • [终端安全]-8 隐私保护和隐私计算技术
  • Apache Seata Mac下的Seata Demo环境搭建
  • 华为如何做成数字化转型?
  • 设计模式使用场景实现示例及优缺点(结构型模式——享元模式)
  • 如何成为互联网数据淘金者?爬虫管理平台助您一臂之力
  • 【088】基于SpringBoot+Vue实现高校就业管理系统
  • Linux 忘记root密码,通过单用户模式修改
  • [译]Python中的类属性与实例属性的区别
  • 【Linux系统编程】快速查找errno错误码信息
  • eclipse(luna)创建web工程
  • Github访问慢解决办法
  • JS数组方法汇总
  • Puppeteer:浏览器控制器
  • React-redux的原理以及使用
  • scrapy学习之路4(itemloder的使用)
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 关于 Cirru Editor 存储格式
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 基于游标的分页接口实现
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 学习JavaScript数据结构与算法 — 树
  • 最简单的无缝轮播
  • ​Spring Boot 分片上传文件
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (AngularJS)Angular 控制器之间通信初探
  • (js)循环条件满足时终止循环
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)学习JVM —— 垃圾回收机制
  • (离散数学)逻辑连接词
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)3D模板阴影原理
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转载)(官方)UE4--图像编程----着色器开发
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET 8.0 发布到 IIS
  • .net core Redis 使用有序集合实现延迟队列
  • .Net Core 中间件与过滤器
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net framework4与其client profile版本的区别
  • .net web项目 调用webService
  • .NET大文件上传知识整理
  • .net的socket示例
  • .NET简谈设计模式之(单件模式)