React を使用してマルチプレイヤー チェス ゲームを構築する方法を学ぶ
こんにちは、ようこそ! ??
今日は、SuperViz を使用してマルチプレイヤー チェス ゲームを構築する方法を説明するチュートリアルをお届けします。マルチプレイヤー ゲームはリアルタイムの同期とプレイヤー間の対話を必要とします。そのため、SuperViz の機能にとって理想的なアプリケーションとなります。
このチュートリアルでは、2 人のプレーヤーがリアルタイムで対戦し、互いの動きをリアルタイムで確認できるチェス ゲームの作成方法を説明します。
react-chessboard ライブラリを使用してチェス盤をセットアップし、chess.js でゲーム状態を管理し、SuperViz でプレイヤーの動きを同期する方法を示します。この設定により、複数の参加者がチェス ゲームに参加し、手を動かし、シームレスでインタラクティブなチェス ゲーム環境を体験できるようになります。 始めましょう!
前提条件
このチュートリアルに従うには、SuperViz アカウントと開発者トークンが必要です。すでにアカウントと開発者トークンをお持ちの場合は、次のステップに進むことができます。
アカウントを作成する
アカウントを作成するには、SuperViz 登録に移動し、Google または電子メール/パスワードを使用してアカウントを作成します。メール/パスワードを使用する場合は、アカウントを確認するためにクリックする必要がある確認リンクを受け取ることに注意することが重要です。
開発者トークンの取得
SDK を使用するには、開発者トークンを提供する必要があります。このトークンは、SDK リクエストをアカウントに関連付けるために不可欠です。開発用と運用用の両方の SuperViz トークンをダッシュボードから取得できます。このチュートリアルの次のステップで必要になるため、開発者トークンをコピーして保存します。
ステップ 1: React アプリケーションをセットアップする
まず、SuperViz を統合する新しい React プロジェクトをセットアップする必要があります。
1. 新しい React プロジェクトを作成する
まず、Create React App with TypeScript を使用して新しい React アプリケーションを作成します。
npm create vite@latest chess-game -- --template react-ts cd chess-game
2. 必要なライブラリをインストールする
次に、プロジェクトに必要なライブラリをインストールします。
npm install @superviz/sdk react-chessboard chess.js uuid
- @superviz/sdk: 同期を含むリアルタイム コラボレーション機能を統合するための SDK。
- react-chessboard: React アプリケーションでチェス盤をレンダリングするためのライブラリ。
- chess.js: チェスのゲームのロジックとルールを管理するためのライブラリです。
- uuid: 一意の参加者 ID の作成に役立つ一意の識別子を生成するライブラリ。
3.追い風の設定
このチュートリアルでは、Tailwind CSS フレームワークを使用します。まず、tailwind パッケージをインストールします。
npm install -D tailwindcss postcss autoprefixer npx tailwindcss init -p
次に、テンプレートのパスを構成する必要があります。プロジェクトのルートにある tailwind.config.js を開き、次のコードを挿入します。
/** @type {import('tailwindcss').Config} */ export default { content: [ "./index.html", "./src/**/*.{js,ts,jsx,tsx}", ], theme: { extend: {}, }, plugins: [], }
次に、tailwind ディレクティブをグローバル CSS ファイルに追加する必要があります。 (src/index.css)
@tailwind base; @tailwind components; @tailwind utilities;
4. 環境変数の設定
プロジェクト ルートに .env ファイルを作成し、SuperViz 開発者キーを追加します。このキーは、SuperViz サービスでアプリケーションを認証するために使用されます。
VITE_SUPERVIZ_API_KEY=YOUR_SUPERVIZ_DEVELOPER_KEY
ステップ 2: メイン アプリケーションを実装する
このステップでは、SuperViz を初期化し、リアルタイムのチェスの手を処理するためのメイン アプリケーション ロジックを実装します。
1. アプリコンポーネントを実装する
src/App.tsx を開き、SuperViz を使用してメイン アプリケーション コンポーネントをセットアップし、共同作業環境を管理します。
import { v4 as generateId } from 'uuid'; import { useCallback, useEffect, useRef, useState } from "react"; import SuperVizRoom, { Realtime, RealtimeComponentEvent, RealtimeMessage, WhoIsOnline } from '@superviz/sdk'; import { Chessboard } from "react-chessboard"; import { Chess, Square } from 'chess.js';
説明:
- インポート: 状態の管理、SuperViz の初期化、チェス盤のレンダリング、一意の識別子の生成に必要なコンポーネントを React、SuperViz SDK、react-chessboard、chess.js、および UUID からインポートします。
2. 定数の定義
API キー、ルーム ID、およびプレーヤー ID の定数を定義します。
const apiKey = import.meta.env.VITE_SUPERVIZ_API_KEY as string; const ROOM_ID = 'chess-game'; const PLAYER_ID = generateId();
説明:
- apiKey: 環境変数から SuperViz API キーを取得します。
- ROOM_ID: SuperViz セッションのルーム ID を定義します。
- PLAYER_ID: uuid ライブラリを使用して一意のプレーヤー ID を生成します。
3. チェスのメッセージ タイプを定義する
チェスの移動メッセージを処理するためのタイプを作成します。
type ChessMessageUpdate = RealtimeMessage & { data: { sourceSquare: Square; targetSquare: Square; }; };
説明:
- ChessMessageUpdate: RealtimeMessage を拡張して、チェスの動きのソース マスとターゲット マスを含めます。
4. アプリコンポーネントを作成する
メインのアプリコンポーネントを設定し、状態変数を初期化します。
export default function App() { const [initialized, setInitialized] = useState(false); const [gameState, setGameState] = useState<Chess>(new Chess()); const [gameFen, setGameFen] = useState<string>(gameState.fen()); const channel = useRef<any | null>(null);
説明:
- initialized: A state variable to track whether the SuperViz environment has been set up.
- gameState: A state variable to manage the chess game state using the chess.js library.
- gameFen: A state variable to store the FEN (Forsyth-Edwards Notation) string representing the current game position.
- channel: A ref to store the real-time communication channel.
5. Initialize SuperViz and Real-Time Components
Create an initialize function to set up the SuperViz environment and configure real-time synchronization.
const initialize = useCallback(async () => { if (initialized) return; const superviz = await SuperVizRoom(apiKey, { roomId: ROOM_ID, participant: { id: PLAYER_ID, name: 'player-name', }, group: { id: 'chess-game', name: 'chess-game', } }); const realtime = new Realtime(); const whoIsOnline = new WhoIsOnline(); superviz.addComponent(realtime); superviz.addComponent(whoIsOnline); setInitialized(true); realtime.subscribe(RealtimeComponentEvent.REALTIME_STATE_CHANGED, () => { channel.current = realtime.connect('move-topic'); channel.current.subscribe('new-move', handleRealtimeMessage); }); }, [handleRealtimeMessage, initialized]);
Explanation:
- initialize: An asynchronous function that initializes the SuperViz room and checks if it's already initialized to prevent duplicate setups.
- SuperVizRoom: Configures the room, participant, and group details for the session.
- Realtime Subscription: Connects to the move-topic channel and listens for new moves, updating the local state accordingly.
6. Handle Chess Moves
Create a function to handle chess moves and update the game state.
const makeMove = useCallback((sourceSquare: Square, targetSquare: Square) => { try { const gameCopy = gameState; gameCopy.move({ from: sourceSquare, to: targetSquare, promotion: 'q' }); setGameState(gameCopy); setGameFen(gameCopy.fen()); return true; } catch (error) { console.log('Invalid Move', error); return false; } }, [gameState]);
Explanation:
- makeMove: Attempts to make a move on the chessboard, updating the game state and FEN string if the move is valid.
- Promotion: Automatically promotes a pawn to a queen if it reaches the last rank.
7. Handle Piece Drop
Create a function to handle piece drop events on the chessboard.
const onPieceDrop = (sourceSquare: Square, targetSquare: Square) => { const result = makeMove(sourceSquare, targetSquare); if (result) { channel.current.publish('new-move', { sourceSquare, targetSquare, }); } return result; };
Explanation:
- onPieceDrop: Handles the logic for when a piece is dropped on a new square, making the move and publishing it to the SuperViz channel if valid.
8. Handle Real-Time Messages
Create a function to handle incoming real-time messages for moves made by other players.
const handleRealtimeMessage = useCallback((message: ChessMessageUpdate) => { if (message.participantId === PLAYER_ID) return; const { sourceSquare, targetSquare } = message.data; makeMove(sourceSquare, targetSquare); }, [makeMove]);
Explanation:
- handleRealtimeMessage: Listens for incoming move messages and updates the game state if the move was made by another participant.
9. Use Effect Hook for Initialization
Use the useEffect hook to trigger the initialize function on component mount.
useEffect(() => { initialize(); }, [initialize]);
Explanation:
- useEffect: Calls the initialize function once when the component mounts, setting up the SuperViz environment and real-time synchronization.
10. Render the Application
Return the JSX structure for rendering the application, including the chessboard and collaboration features.
return ( <div className='w-full h-full bg-gray-200 flex items-center justify-center flex-col'> <header className='w-full p-5 bg-purple-400 flex items-center justify-between'> <h1 className='text-white text-2xl font-bold'>SuperViz Chess Game</h1> </header> <main className='w-full h-full flex items-center justify-center'> <div className='w-[500px] h-[500px] shadow-sm border-2 border-gray-300 rounded-md'> <Chessboard position={gameFen} onPieceDrop={onPieceDrop} /> <div className='w-[500px] h-[50px] bg-gray-300 flex items-center justify-center'> <p className='text-gray-800 text-2xl font-bold'>Turn: {gameState.turn() === 'b' ? 'Black' : 'White'}</p> </div> </div> </main> </div> );
Explanation:
- Header: Displays the title of the application.
- Chessboard: Renders the chessboard using the Chessboard component, with gameFen as the position and onPieceDrop as the event handler for piece drops.
- Turn Indicator: Displays the current player's turn (Black or White).
Step 3: Understanding the Project Structure
Here's a quick overview of how the project structure supports a multiplayer chess game:
- App.tsx
- Initializes the SuperViz environment.
- Sets up participant information and room details.
- Handles real-time synchronization for chess moves.
- Chessboard
- Displays the chessboard and manages piece movements.
- Integrates real-time communication to synchronize moves between players.
- Chess Logic
- Uses chess.js to manage game rules and validate moves.
- Updates the game state and FEN string to reflect the current board position.
Step 4: Running the Application
1. Start the React Application
To run your application, use the following command in your project directory:
npm run dev
This command will start the development server and open your application in the default web browser. You can interact with the chessboard and see moves in real-time as other participants join the session.
2. アプリケーションをテストする
- リアルタイムのチェスの動き: 複数のブラウザ ウィンドウまたはタブでアプリケーションを開き、複数の参加者をシミュレートし、1 人のプレイヤーが行った手がリアルタイムで他のプレイヤーに反映されることを確認します。
- 共同インタラクション: 動きを出し、すべての参加者に対してゲームの状態がどのように更新されるかを観察することで、アプリケーションの応答性をテストします。
まとめ
このチュートリアルでは、リアルタイム同期に SuperViz を使用してマルチプレイヤー チェス ゲームを構築しました。チェスの手を処理するように React アプリケーションを構成し、複数のプレーヤーが共有チェス盤上でシームレスに共同作業できるようにしました。このセットアップは、ゲーム インタラクションが必要なさまざまなシナリオに合わせて拡張およびカスタマイズできます。
詳細については、GitHub リポジトリにある完全なコードとその他の例を自由に調べてください。
以上がReact を使用してマルチプレイヤー チェス ゲームを構築する方法を学ぶの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。
