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

用 React18 构建Tic-Tac-Toe(井字棋)游戏

下面是一个完整的 Tic-Tac-Toe(井字棋)游戏的实现,用 React 构建。包括核心逻辑和组件分离,支持两人对战。

1. 初始化 React 项目:

npx create-react-app tic-tac-toe
cd tic-tac-toe

2.文件结构

src/
├── App.js
├── Board.js
├── Square.js
└── index.js

在这里插入图片描述

Step 1: Square.js - 单个方块组件

import React from 'react';

const Square = ({ value, onClick }) => {
  return (
    <button 
      className="square" 
      onClick={onClick} 
      style={{
        width: '60px',
        height: '60px',
        fontSize: '24px',
        cursor: 'pointer'
      }}
    >
      {value}
    </button>
  );
};

export default Square;

Step 2: Board.js - 棋盘组件

import React from 'react';
import Square from './Square';

const Board = ({ squares, onClick }) => {
  const renderSquare = (i) => {
    return <Square value={squares[i]} onClick={() => onClick(i)} />;
  };

  return (
    <div style={{
      display: 'flex',
      flexDirection: 'column',
      justifyContent: 'center',
      alignItems: 'center',
    }}>
      <div style={{ display: 'flex' }}>
        {renderSquare(0)}{renderSquare(1)}{renderSquare(2)}
      </div>
      <div style={{ display: 'flex' }}>
        {renderSquare(3)}{renderSquare(4)}{renderSquare(5)}
      </div>
      <div style={{ display: 'flex' }}>
        {renderSquare(6)}{renderSquare(7)}{renderSquare(8)}
      </div>
    </div>
  );
};

export default Board;

Step 3: App.js - 游戏逻辑和主组件


import React, { useState } from 'react';
import Board from './Board';


const App = () => {
  const [squares, setSquares] = useState(Array(9).fill(null));
  const [isXNext, setIsXNext] = useState(true);

  const calculateWinner = (squares) => {
    const lines = [
      [0, 1, 2], [3, 4, 5], [6, 7, 8], // Rows
      [0, 3, 6], [1, 4, 7], [2, 5, 8], // Columns
      [0, 4, 8], [2, 4, 6]            // Diagonals
    ];
    for (let [a, b, c] of lines) {
      if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
        return squares[a];
      }
    }
    return null;
  };

  const winner = calculateWinner(squares);
  const handleClick = (i) => {
    if (squares[i] || winner) return; // Ignore if square is already filled or game is won
    const nextSquares = squares.slice();
    nextSquares[i] = isXNext ? 'X' : 'O';
    setSquares(nextSquares);
    setIsXNext(!isXNext);
  };

  const restartGame = () => {
    setSquares(Array(9).fill(null));
    setIsXNext(true);
  };

  const status = winner ? `Winner: ${winner}` : `Next Player: ${isXNext ? 'X' : 'O'}`;

  return (
    <div style={{ textAlign: 'center', marginTop: '50px' }}>
      <h1>Tic-Tac-Toe</h1>
      <Board squares={squares} onClick={handleClick} />
      <h3>{status}</h3>
      <button onClick={restartGame} style={{ padding: '10px 20px', marginTop: '20px' }}>
        Restart
      </button>
    </div>
  );
};

export default App;

Step 4: index.js - 渲染应用

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));

3. 启动应用:

npm start

打开浏览器,访问 http://localhost:3000 即可运行。如图所示:
在这里插入图片描述
希望这些内容对你有所帮助!如果有任何问题,欢迎随时提问。


http://www.kler.cn/a/398842.html

相关文章:

  • 华东师范大学数学分析第五版PDF习题答案上册及下册
  • 【springboot】启动原理
  • 使用 Go 实现将任何网页转化为 PDF
  • Cursor安装Windows / Ubuntu
  • 【MySQL】InnoDB内存结构
  • Cuda和Pytorch的兼容性
  • 数据处理与统计分析——04-Pandas中Series的常用方法、属性、布尔索引、运算操作
  • 阿里斑马智行 2025届秋招 NLP算法工程师
  • The Internals of PostgreSQL 翻译版 持续更新...
  • Java语言在医疗健康小程序开发中的应用研究
  • 机器学习周报(11.11-11.17)
  • 力扣-2175、世界排名的变化
  • mybatis 动态SQL语句
  • CSS预编译器:让样式编写更高效的秘密武器(6)
  • 何为Jenkins
  • React中组件通信的几种方式
  • 微软推出的AI无代码编程微应用平台GitHub Spark和国产AI原生无代码工具CodeFlying比到底咋样?
  • 华为云stack网络服务流量走向
  • 基于Hadoop、hive的数仓搭建实践
  • VUE+SPRINGBOOT实现邮箱注册、重置密码、登录功能
  • react17安装html-react-parser运行报错记录
  • Android Framework PMS面试题及参考答案
  • 【AI图像生成网站Golang】项目架构
  • 电脑长期不用,开不了机怎样解决
  • 【FFmpeg系列】:音频处理
  • 蓝队知识浅谈(上)