domino-server/text.txt
2024-07-14 21:41:38 +02:00

206 lines
5.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

To add a player that uses a client connected by a socket in your dominoes game, you'll need to integrate WebSockets or Socket.io to enable real-time communication between the server and the client. This allows players to interact with the game from their web browsers or other client applications.
Heres a step-by-step guide to adding a socket-connected player to your game:
### 1. **Setup Socket.io on the Server**
Socket.io provides a straightforward way to handle real-time communication.
#### **Install Dependencies**
First, install the necessary dependencies:
```bash
npm install express socket.io
```
#### **Server Setup**
Create an Express server and integrate Socket.io.
**server.ts**:
```typescript
import express from 'express';
import http from 'http';
import { Server } from 'socket.io';
import { DominoesGame, Player, AIPlayer } from './dominoes-game'; // Adjust the path as needed
const app = express();
const server = http.createServer(app);
const io = new Server(server);
const port = 3000;
let game: DominoesGame;
app.get('/', (req, res) => {
res.send('Dominoes Game Server');
});
// Start the server
server.listen(port, () => {
console.log(`Server running on http://localhost:${port}`);
});
```
### 2. **Integrate Socket.io into the Game**
Modify the `DominoesGame` class to support socket-connected players.
**dominoes-game.ts**:
```typescript
import { Server } from 'socket.io';
interface Player {
id: string;
name: string;
hand: number[][];
isAI: boolean;
}
class DominoesGame {
players: Player[];
board: number[][];
remainingTiles: number[][];
currentPlayerIndex: number;
gameOver: boolean;
io: Server;
constructor(io: Server) {
this.players = [];
this.board = [];
this.remainingTiles = this.generateTiles();
this.currentPlayerIndex = 0;
this.gameOver = false;
this.io = io;
}
addPlayer(id: string, name: string, isAI: boolean = false) {
const player: Player = { id, name, hand: [], isAI };
this.players.push(player);
this.dealTiles(player);
this.io.emit('playerJoined', player);
}
// Other methods remain the same...
generateTiles(): number[][] {
const tiles: number[][] = [];
for (let i = 0; i <= 6; i++) {
for (let j = i; j <= 6; j++) {
tiles.push([i, j]);
}
}
return this.shuffle(tiles);
}
shuffle(array: any[]): any[] {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
dealTiles(player: Player): void {
const tilesPerPlayer = 7;
for (let i = 0; i < tilesPerPlayer; i++) {
player.hand.push(this.remainingTiles.pop() as number[]);
}
}
}
export { DominoesGame, Player };
```
### 3. **Handle Socket Connections**
Update the server to handle connections and manage player interactions.
**server.ts**:
```typescript
let game = new DominoesGame(io);
io.on('connection', (socket) => {
console.log(`Player connected: ${socket.id}`);
socket.on('joinGame', (name) => {
game.addPlayer(socket.id, name);
io.emit('updateGame', game);
});
socket.on('playTile', (tile) => {
const player = game.players.find(p => p.id === socket.id);
if (player) {
if (game.playTile(game.players.indexOf(player), tile)) {
io.emit('updateGame', game);
} else {
socket.emit('invalidMove', tile);
}
}
});
socket.on('disconnect', () => {
console.log(`Player disconnected: ${socket.id}`);
game.players = game.players.filter(p => p.id !== socket.id);
io.emit('updateGame', game);
});
});
```
### 4. **Client Implementation**
Create a basic client to connect to the server and interact with the game.
**client.html**:
```html
<!DOCTYPE html>
<html>
<head>
<title>Dominoes Game</title>
</head>
<body>
<h1>Dominoes Game</h1>
<div id="game"></div>
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
socket.on('connect', () => {
const name = prompt("Enter your name:");
socket.emit('joinGame', name);
});
socket.on('updateGame', (game) => {
console.log('Game updated:', game);
// Update UI based on game state
});
socket.on('invalidMove', (tile) => {
alert(`Invalid move: ${tile}`);
});
// Example of playing a tile
function playTile(tile) {
socket.emit('playTile', tile);
}
</script>
</body>
</html>
```
### 5. **Testing and Debugging**
1. **Run the Server**: Start your server with `node server.js`.
2. **Access the Game**: Open multiple browser windows and connect to `http://localhost:3000`.
3. **Join Game**: Each client can join the game and start interacting.
4. **Play Tiles**: Test playing tiles and ensure the game state updates correctly for all clients.
### 6. **Enhancements**
1. **Game State Persistence**: Implement game state persistence using a database.
2. **Authentication**: Add user authentication to track player progress.
3. **AI Integration**: Allow the game to mix human and AI players.
By following these steps, you can effectively add a socket-connected player to your dominoes game, enabling real-time multiplayer interaction.