React官网入门项目井字棋游戏

2023-11-12

        React官网里有很详细的教程 ,也有在线沙盒,但是写的东一榔头西一棒槌的,不适合新手入门,所以我还是建议大家可以先去看看阮一峰大神的React博客或者某硅谷的网课,这个网课讲的很详细,甚至详细到有些啰嗦,我大概是用20天把网课看完,然后再看的官方文档,把这个小游戏做一下,我这里是采用在本地完成这个项目。

游戏预览:

准备工作:

npx create-react-app my-app
  • 删除掉新项目中 src/ 文件夹下的所有文件。

注意:

不要删除整个 src 文件夹,删除里面的源文件。我们会在接下来的步骤中使用示例代码替换默认源文件。

       

  1. 在 src/ 文件夹中创建一个名为 index.css 的文件,并拷贝
    body {
      font: 14px "Century Gothic", Futura, sans-serif;
      margin: 20px;
    }
    
    ol,
    ul {
      padding-left: 30px;
    }
    
    .board-row:after {
      clear: both;
      content: "";
      display: table;
    }
    
    .status {
      margin-bottom: 10px;
    }
    
    .square {
      background: #fff;
      border: 1px solid #999;
      float: left;
      font-size: 24px;
      font-weight: bold;
      line-height: 34px;
      height: 34px;
      margin-right: -1px;
      margin-top: -1px;
      padding: 0;
      text-align: center;
      width: 34px;
    }
    
    .square:focus {
      outline: none;
    }
    
    .kbd-navigation .square:focus {
      background: #ddd;
    }
    
    .game {
      display: flex;
      flex-direction: row;
    }
    
    .game-info {
      margin-left: 20px;
    }
    
  2. 在 src/ 文件夹下创建一个名为 index.js 的文件,并拷贝
    import React from "react";
    import ReactDOM from "react-dom";
    import "./index.css";
    
    //每个小方块组件 点击显示棋子
    function Square(props) {
      return (
        <button className="square" onClick={props.onClick}>
          {props.value}
        </button>
      );
    }
    //大方块组件
    class Board extends React.Component {
      renderSquare(i) {
        return (
          <Square
            value={this.props.squares[i]}
            onClick={() => this.props.onClick(i)}
          />
        );
      }
    
      render() {
        return (
          <div>
            <div className="board-row">
              {this.renderSquare(0)}
              {this.renderSquare(1)}
              {this.renderSquare(2)}
            </div>
            <div className="board-row">
              {this.renderSquare(3)}
              {this.renderSquare(4)}
              {this.renderSquare(5)}
            </div>
            <div className="board-row">
              {this.renderSquare(6)}
              {this.renderSquare(7)}
              {this.renderSquare(8)}
            </div>
          </div>
        );
      }
    }
    
    //整个游戏组件
    class Game extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          //初始化历史记录 棋盘上都是空的
          history: [
            {
              squares: Array(9).fill(null),
            },
          ],
          stepNumber: 0, //游戏最开始步数为0
          xIsNext: true, //判断下一个落子是O还是X
        };
      }
    
      handleClick(i) {
        const history = this.state.history.slice(0, this.state.stepNumber + 1);
        //使当前落子始终是最新落子
        const current = history[history.length - 1];
        const squares = current.squares.slice();
        //当有玩家胜出时,或者某个 Square 已经被填充时该函数不做任何处理直接返回
        if (calculateWinner(squares) || squares[i]) {
          return;
        }
        squares[i] = this.state.xIsNext ? "X" : "O";
        this.setState({
          //将新的落子情况加到历史记录数组中
          history: history.concat([
            {
              squares: squares,
            },
          ]),
          stepNumber: history.length,
          xIsNext: !this.state.xIsNext,
        });
      }
      //跳转
      jumpTo(step) {
        this.setState({
          stepNumber: step,
          xIsNext: step % 2 === 0,
        });
      }
    
      render() {
        const history = this.state.history;
        const current = history[this.state.stepNumber];
        const winner = calculateWinner(current.squares);
        //map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值
        const moves = history.map((step, move) => {
          //这里的move是索引值
          const desc = move ? "Go to move #" + move : "Go to game start";
          return (
            <li key={move}>
              <button onClick={() => this.jumpTo(move)}>{desc}</button>
            </li>
          );
        });
    
        let status;
        if (winner) {
          status = "Winner: " + winner;
        } else {
          status = "Next player: " + (this.state.xIsNext ? "X" : "O");
        }
    
        return (
          <div className="game">
            <div className="game-board">
              <Board
                squares={current.squares}
                onClick={(i) => this.handleClick(i)}
              />
            </div>
            <div className="game-info">
              <div>{status}</div>
              <ol>{moves}</ol>
            </div>
          </div>
        );
      }
    }
    
    // ========================================
    
    ReactDOM.render(<Game />, document.getElementById("root"));
    
    //判断Winner
    function calculateWinner(squares) {
      const lines = [
        [0, 1, 2],
        [3, 4, 5],
        [6, 7, 8],
        [0, 3, 6],
        [1, 4, 7],
        [2, 5, 8],
        [0, 4, 8],
        [2, 4, 6],
      ];
      for (let i = 0; i < lines.length; i++) {
        const [a, b, c] = lines[i];
        if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
          return squares[a];
        }
      }
      return null;
    }
    
  3. 拷贝以下三行代码到 src/ 文件夹下的 index.js 文件的顶部:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';

        现在,在项目文件夹下执行 npm start 命令,然后在浏览器访问 http://localhost:3000。这样你就可以在浏览器中看见一个空的井字棋的棋盘了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React官网入门项目井字棋游戏 的相关文章

随机推荐

  • 用C语言输出各种三角形

    用C语言输出各种三角形 三角形类型 用C语言输出各种三角形 1 直角在左下角的三角形 2 直角在左上角的三角形 3 直角在右下角的三角形 4 直角在右上角的三角形 5 正三角形 金字塔 倒三角形 1 直角在左下角的三角形 代码 includ
  • Python使用selenium设置无浏览器(界面)运行

    设置无界面 浏览器 运行代码 from selenium import webdriver from selenium webdriver import ChromeOptions from selenium webdriver suppo
  • HDR dump失败解决办法

    运行脚本 进HDR拍照 一般在 sdcard Android data com oplus camera files spdebug hdrdump 目录下 可以生成dump 若没有生成dump 清除相机缓存 重新运行脚本 重启手机即可 脚
  • Apache Solr入门教程(初学者之旅)

    Apache Solr入门教程 初学者之旅 写在前面 本文涉及solr入门的各方面 建议边思考边实践 相信能帮助你对solr有个清晰全面的了解并能简单实用 在Apache Solr初学者教程的这个例子中 我们将讨论有关如何安装最新版本的Ap
  • 0-1分布的方差和期望

    最后欢迎大家访问我的个人网站 1024s
  • CentOS7.4下C++开源日志库easyloggingpp的使用

    CentOS7 4下C 开源日志库easyloggingpp的使用 一 简单示例 二 多线程支持 Linux后台开发过程中经常需要日志记录一些运行信息 网上找到easyloggingpp只需要包含头文件和实现文件即可 使用很方便 现整理如下
  • vue:结合elementUI设计网站登录页

    这次主要是记录三个重点 1 组件间通信的方法 其一 2 脚手架搭建的vue工程的组件调用 3 elementUI 的轮播图与模态框的设计 先看效果图 简单的就做了这四个页面 总共四个组件实现这些效果 这个小网站需要的组件也挺多的 当然不止这
  • Pandas——读/写不同数据源的数据

    Pandas 读 写不同数据源的数据 一 读 写数据库数据 1 SQLAlchemy连接MySQL数据库 2 使用 read sql query read sql table read sql 函数 读 取数据库数据 3 使用 to sql
  • 全面总结机器学习超参数调优(附代码)

    公众号 尤而小屋作者 Peter编辑 Peter 大家好 我是Peter 本文的主题 机器学习建模的超参数调优 开局一张图 文章很长 建议直接收藏 一 什么是机器学习超参数 机器学习超参数是在开始学习过程之前设置值的参数 而不是通过训练得到
  • 导入elementui组件库

    1 在终端输入 vue add element 回车 选择按需加载 输入yes 回车 选择zh CN 回车 2 在plugins里面有一个element js 我们先去elementui官网看到快速上手 就可以看到按需引入 复制代码放到el
  • 搭建 react+ts+less+Antd 项目

    搭建 react ts less Antd 项目 一 文章目录 搭建 react ts less Antd 项目 一 前言 项目搭建流程 1 新建项目 2 暴露配置 3 支持less 4 支持ts 前言 项目搭建流程 1 新建项目 npx
  • 谷粒商城-分布式高级篇[商城业务-检索服务]

    谷粒商城 分布式基础篇 环境准备 谷粒商城 分布式基础 业务编写 谷粒商城 分布式高级篇 业务编写 持续更新 谷粒商城 分布式高级篇 ElasticSearch 谷粒商城 分布式高级篇 分布式锁与缓存 项目托管于gitee 一 商城业务 检
  • ckplayer html播放本地,vue中使用ckplayer播放器

    请选择视频源 获取视频中 请稍等 export default name components props sourceUrl type String default height type String default 550px dat
  • python统计套利_基于python的统计套利实战(二)之协整检验

    协整关系协整 Cointegration 理论是恩格尔 Engle 和格兰杰 Granger 在1978年提出的 平稳性是进行时间序列分析的一个很重要的前提 很多模型都是基于平稳下进行的 而现实中 很多时间序列都是非平稳的 所以协整是从分析
  • 智能优化算法改进-K-means聚类种群初始化附Matlab代码

    目录 0引言 一 K means聚类原理 二 K Means聚类算法步骤 三 K Means聚类原理图 编辑 四 K means聚类改进智能优化算法种群初始化效果图 4 1 初始种群数据图 4 2 K means聚类结果图 4 2 1 根据
  • VM虚拟机下 Ubuntu下摄像头显示安装

    安装 可通过PPA进行安装 ffmpeg sudo add apt repository ppa kirillshkrogalev ffmpeg next sudo apt get update sudo apt get install f
  • 浅谈Router和Route

    router 和 route 是在前端框架中用于管理和处理路由的两个关键概念 这两者之间的关系可以通过具体的代码来解释 在本示例中 我将使用 React 和 React Router 来说明它们之间的关系 Router 路由器 Router
  • DataPipeline丨DataOps的技术考量

    作者 DataPipeline CEO 陈诚 从 数据的资产负债表与现状 到 DataOps理念与设计原则 直至 DataOps的组织架构与挑战 我们对于DataOps的讨论已经进行了三周 不难发现 在此期间 我们探讨的话题始终围绕在上层建
  • SSR、SSE、SST、R2

    在MATLAB中 计算回归问题的拟合优度 或判定系数 可用 B BINT R RINT STATS regress Y X 指令 其中的STATS的第一个返回值即为R2 R2约接近于1 拟合效果越好 SSR为回归平方和 SSE为残差平方和
  • React官网入门项目井字棋游戏

    React官网里有很详细的教程 也有在线沙盒 但是写的东一榔头西一棒槌的 不适合新手入门 所以我还是建议大家可以先去看看阮一峰大神的React博客或者某硅谷的网课 这个网课讲的很详细 甚至详细到有些啰嗦 我大概是用20天把网课看完 然后再看