React入门8:实现文本

首先

我想以复习和备忘录的意义,通过多篇文章使用React来开发井字棋游戏(三目並べ)。

    • React

 

    • CodeSandbox(公式)

 

    CodeSandbox(非公式)

系列列表

    1. React入门1:环境搭建 [在线版本]

 

    1. React入门1.5:环境搭建 [本地版本 – 外传]

 

    1. React入门2:棋盘创建

 

    1. React入门3:交互实现

 

    1. React入门4:重构 [提升编辑]

 

    1. React入门5:重构 [交互编辑]

 

    1. React入门6:回合制实现

 

    1. React入门7:游戏胜利判定

 

    1. React入门8:文本实现(本节)

 

    1. React入门9:时间旅行(1)

 

    1. React入门10:时间旅行(2)

 

    React入门11:时间旅行(3)

关于目的

所有人的目标

我们将在 React 公式教程中发布的井字游戏中实现一个3×3的棋盘。

 

这次的目的是什么?

我们将实现显示游戏状态的文本。另外,我们将使用上次创建的 calculateWinner() 函数,以便在有结果时也能显示获胜者。

文本的实施

您可以在下一页上查看上次的源文件。

 

    前回の内容はコチラから!

 

显示文本

让我们在App.js中的Board组件的return语句中添加

元素,以在棋盘上显示文本。让我们尝试编写代码以满足以下要求。

    • 盤面の上に文字を表示するには return 文のどこに
要素を加えればよいか
「 ゲームの状況 」というテキストを表示する
export default function Board() {

  /* 省略 */

  return (
    <>
      <div>ゲームの状況</div>
      <div className="board-row">
        <Square value={squares[0]} onSquareClick={() => handleClick(0)} />
        <Square value={squares[1]} onSquareClick={() => handleClick(1)} />
        <Square value={squares[2]} onSquareClick={() => handleClick(2)} />
      </div>
      <div className="board-row">
        <Square value={squares[3]} onSquareClick={() => handleClick(3)} />
        <Square value={squares[4]} onSquareClick={() => handleClick(4)} />
        <Square value={squares[5]} onSquareClick={() => handleClick(5)} />
      </div>
      <div className="board-row">
        <Square value={squares[6]} onSquareClick={() => handleClick(6)} />
        <Square value={squares[7]} onSquareClick={() => handleClick(7)} />
        <Square value={squares[8]} onSquareClick={() => handleClick(8)} />
      </div>
    </>
  );
}

下面将展示动作结果。现在我们可以在棋盘上显示“游戏状况”的文本。

image.png

显示轮到的玩家

通过文本显示当前玩家是“X”还是“O”。

使用第6篇文章中定义的用于管理回合顺序的状态类型变量xIsNext,来获取当前的玩家。该变量表示为true时代表玩家“X”,表示为false时代表玩家“O”。

因此,控制文本(状态变量)如下所示,可以表示正在操作的玩家。

  let status = "プレイヤー: ";

  if (xIsNext) {
    status += "X";
  } else {
    status += "O";
  }

现在让我们对 App.js 中的 Board() 组件进行如下更改。

    • 手番を表示するテキストの制御するプログラムを実装する

ゲームの状況を文字列で示す status 変数を宣言する

status 変数の内容を手番 (xIsNext 変数) に応じて更新する

return 文にある

要素で手番を表示させる

JSX の文法に注意しましょう

export default function Board() {
  /* 省略 */
  let status = "プレイヤー: ";

  if (xIsNext) {
    status += "X";
  } else {
    status += "O";
  }

  return (
    <>
      <div>{status}</div>

      <div className="board-row">
      /* 省略 */
      </div>
    </>
  );

以下是动作结果。现在,在点击空白格之后,文本将会发生变化。

output_video.gif

使用三个条件运算符

以下是关于JavaScript语法的内容。由于不涉及操作结果的更改,可以跳过显示胜者的部分而不会有问题。

我们将之前的代码使用条件(三元)运算符进行简化。首先,我们展示熟悉的if-else语句的语法。

if (条件) {
  真のときに実行する処理;
} else {
  偽のときに実行する処理;
}

如果用条件(三元)运算符来表示这个,那么它的语法将变为下面这样。

条件 ? 真のときに返す値 : 偽のときに返す値;

如果您想查阅更详细的内容,请查看以下参考资料。

 

因此,我们可以用以下代码来控制显示回合的文字信息。

  let status = "プレイヤー: " + (xIsNext ? "X" : "O");

闲谈一下,据说将代码省略成这样就叫做“快捷方式”。

胜者的展示

为了在游戏结束时能够显示出胜利者,让我们对App.js文件中的Board组件进行以下更改。

    • 勝者を示す winner 変数を宣言する

初期値を勝利判定 (calculateWinner() 関数) の結果とする

勝利判定の結果に応じてテキストの内容を変更する

勝者がいる場合は、その印を表示する

「X」が勝ったとき、「勝者: X」
「O」が勝ったとき、「勝者: O」

勝者が決まっていない場合は、次のプレイヤーを表示する

import { useState } from "react";
import "./styles.css";

function Square({ value, onSquareClick }) {
  return (
    <button className="square" onClick={onSquareClick}>
      {value}
    </button>
  );
}

export default function Board() {
  const [squares, setSquares] = useState(Array(9).fill(null));
  const [xIsNext, setXIsNext] = useState(true);

  const winner = calculateWinner(squares);
  let status;

  if (winner) {
    status = "勝者: " + winner;
  } else {
    status = "プレイヤー: " + (xIsNext ? "X" : "O");
  }

  function handleClick(i) {
    if (squares[i]) {
      return;
    }

    const nextSquares = squares.slice();

    if (xIsNext) {
      nextSquares[i] = "X";
    } else {
      nextSquares[i] = "O";
    }
    setSquares(nextSquares);
    setXIsNext(!xIsNext);
  }

  return (
    <>
      <div>{status}</div>
      <div className="board-row">
        <Square value={squares[0]} onSquareClick={() => handleClick(0)} />
        <Square value={squares[1]} onSquareClick={() => handleClick(1)} />
        <Square value={squares[2]} onSquareClick={() => handleClick(2)} />
      </div>
      <div className="board-row">
        <Square value={squares[3]} onSquareClick={() => handleClick(3)} />
        <Square value={squares[4]} onSquareClick={() => handleClick(4)} />
        <Square value={squares[5]} onSquareClick={() => handleClick(5)} />
      </div>
      <div className="board-row">
        <Square value={squares[6]} onSquareClick={() => handleClick(6)} />
        <Square value={squares[7]} onSquareClick={() => handleClick(7)} />
        <Square value={squares[8]} onSquareClick={() => handleClick(8)} />
      </div>
    </>
  );
}

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 = lines[i][0];
    const b = lines[i][1];
    const c = lines[i][2];

    if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
      return squares[a];
    }
  }
  return null;
}

下面将展示动作的结果。这样,不仅可以显示操作玩家,还可以显示获胜者。

勝者の判定.gif

这样游戏系统就完成了!

最后

这次我们实现了一个用于显示游戏状态的文本。通过这个功能,井字游戏的主要功能已经完成了!辛苦了。下一页将展示源代码文件。

 

关于未来
我们已经开发了井字棋游戏,但还有很多可以添加的功能。例如,官方教程还有后续内容,并介绍了关于回到过去的功能。如果您有兴趣,请修改上述源文件并参考下一页。(我也可能会在以后的文章中进行总结… ← 我已将其总结在第九篇及以后的文章中)教程:三子棋 – React [添加时间旅行]

从下一次开始,我们将逐步添加时间旅行功能到游戏中。

 

广告
将在 10 秒后关闭
bannerAds