您好,歡迎光臨! ??
今天我帶來了一個教程,指導您使用 SuperViz 建立多人國際象棋遊戲。多人遊戲需要玩家之間的即時同步和互動,這使其成為 SuperViz 功能的理想應用。
本教學將向您展示如何創建一個國際象棋遊戲,讓兩個玩家可以即時對戰,並看到對方的走法。
我們將示範如何使用react-chessboard庫設定棋盤,使用chess.js管理遊戲狀態,以及如何使用SuperViz同步玩家移動。這種設置允許多個參與者加入國際象棋遊戲、走棋並體驗無縫且互動的國際象棋遊戲環境。 讓我們開始吧!
要學習本教學課程,您將需要一個 SuperViz 帳戶和一個開發者代幣。如果您已經擁有帳戶和開發者令牌,則可以繼續下一步。
要建立帳戶,請前往 SuperViz 註冊並使用 Google 或電子郵件/密碼建立帳戶。請務必注意,使用電子郵件/密碼時,您將收到一個確認鏈接,您需要點擊該鏈接來驗證您的帳戶。
要使用 SDK,您需要提供開發者令牌,因為此令牌對於將 SDK 請求與您的帳戶關聯起來至關重要。您可以從儀表板檢索開發和生產 SuperViz 令牌。複製並保存開發者令牌,因為您在本教學的後續步驟中將需要它。
首先,您需要建立一個新的 React 項目,我們將在其中整合 SuperViz。
首先,使用 Create React App with TypeScript 建立一個新的 React 應用程式。
npm create vite@latest chess-game -- --template react-ts cd chess-game
接下來,為我們的專案安裝必要的函式庫:
npm install @superviz/sdk react-chessboard chess.js uuid
在本教程中,我們將使用 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;
在專案根目錄中建立一個 .env 檔案並新增 SuperViz 開發人員金鑰。此金鑰將用於透過 SuperViz 服務驗證您的應用程式。
VITE_SUPERVIZ_API_KEY=YOUR_SUPERVIZ_DEVELOPER_KEY
在這一步驟中,我們將實作主要應用程式邏輯來初始化 SuperViz 並處理即時國際象棋走棋。
開啟 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';
說明:
定義 API 金鑰、房間 ID 和玩家 ID 的常數。
const apiKey = import.meta.env.VITE_SUPERVIZ_API_KEY as string; const ROOM_ID = 'chess-game'; const PLAYER_ID = generateId();
說明:
建立一個用於處理國際象棋走棋訊息的類型。
type ChessMessageUpdate = RealtimeMessage & { data: { sourceSquare: Square; targetSquare: Square; }; };
說明:
設定主 App 元件並初始化狀態變數。
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);
說明:
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:
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:
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:
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:
Use the useEffect hook to trigger the initialize function on component mount.
useEffect(() => { initialize(); }, [initialize]);
Explanation:
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:
Here's a quick overview of how the project structure supports a multiplayer chess game:
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.
在本教程中,我們使用 SuperViz 建立了一個即時同步的多人國際象棋遊戲。我們配置了一個 React 應用程式來處理國際象棋的走棋,使多個玩家能夠在共享棋盤上無縫協作。此設置可以擴展和定制,以適應需要遊戲互動的各種場景。
請隨意探索 GitHub 儲存庫中的完整程式碼和更多範例以了解更多詳細資訊。
以上是了解如何使用 React 建立多人國際象棋遊戲的詳細內容。更多資訊請關注PHP中文網其他相關文章!