返回

零起点搭建一个在线斗地主网站(上篇)

前端

在线斗地主:用代码实现宅家娱乐

在繁忙喧嚣的都市生活中,寻找一种既轻松有趣又能够消遣时光的娱乐方式至关重要。对于深圳的程序猿朋友来说,宅家斗地主成为了他们的首选消遣。然而,当意外发生,扑克牌不全时,灵机一动的程序猿朋友们决定撸一个在线斗地主网站来代替实体牌。

开发准备

确定开发环境

首先,我们需要选择合适的开发环境。对于在线斗地主网站的开发,推荐使用Visual Studio Code或Sublime Text等代码编辑器,以及Node.js和Express.js等开发工具。

安装Node.js和Express.js

按照官方文档在你的电脑上安装Node.js和Express.js。

创建项目文件夹

在你的电脑上创建一个文件夹,并将它命名为"doudizhu"。

初始化项目

在"doudizhu"文件夹中打开终端,运行以下命令:

npm init -y

这将创建一个新的项目,并生成一个名为"package.json"的文件。

安装依赖项

在终端中运行以下命令来安装必要的依赖项:

npm install express socket.io

这将安装Express.js和Socket.IO库。

创建服务器

在"doudizhu"文件夹中创建一个名为"server.js"的文件,并添加以下代码:

const express = require('express');
const socketIO = require('socket.io');

const app = express();

app.use(express.static('public'));

const server = app.listen(3000, () => {
  console.log('Server is listening on port 3000');
});

const io = socketIO(server);

io.on('connection', (socket) => {
  console.log('A client has connected');

  socket.on('disconnect', () => {
    console.log('A client has disconnected');
  });
});

这将创建一个简单的Express.js服务器,并在端口3000上侦听连接。

前端布局

创建HTML文件

在"doudizhu"文件夹中创建一个名为"index.html"的文件,并添加以下代码:

<!DOCTYPE html>
<html>
<head>
  
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <div id="game-container">
    <div id="players-container">
      <div class="player">
        <div class="player-name">玩家1</div>
        <div class="player-hand"></div>
      </div>
      <div class="player">
        <div class="player-name">玩家2</div>
        <div class="player-hand"></div>
      </div>
      <div class="player">
        <div class="player-name">玩家3</div>
        <div class="player-hand"></div>
      </div>
    </div>
    <div id="game-board">
      <div class="card-stack"></div>
      <div class="discard-pile"></div>
    </div>
    <div id="controls-container">
      <button id="deal-button">发牌</button>
      <button id="play-button">出牌</button>
    </div>
  </div>

  <script src="socket.io.js"></script>
  <script src="script.js"></script>
</body>
</html>

创建CSS文件

在"doudizhu"文件夹中创建一个名为"style.css"的文件,并添加以下代码:

body {
  font-family: sans-serif;
  margin: 0;
  padding: 0;
}

#game-container {
  display: flex;
  flex-direction: column;
  height: 100vh;
}

#players-container {
  display: flex;
  flex-direction: row;
  justify-content: space-around;
  align-items: center;
  height: 70vh;
}

.player {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: 100px;
  height: 100px;
  margin: 10px;
  border: 1px solid black;
}

.player-name {
  font-size: 16px;
  margin-bottom: 10px;
}

.player-hand {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
  width: 100px;
  height: 100px;
  border: 1px solid black;
}

#game-board {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
  height: 20vh;
}

.card-stack {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: 100px;
  height: 100px;
  margin: 10px;
  border: 1px solid black;
}

.discard-pile {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  width: 100px;
  height: 100px;
  margin: 10px;
  border: 1px solid black;
}

#controls-container {
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
  height: 10vh;
}

button {
  margin: 10px;
  padding: 5px;
  font-size: 16px;
  cursor: pointer;
}

创建JavaScript文件

在"doudizhu"文件夹中创建一个名为"script.js"的文件,并添加以下代码:

const socket = io();

const players = [];
const cards = [];
const gameBoard = document.getElementById('game-board');
const cardStack = document.querySelector('.card-stack');
const discardPile = document.querySelector('.discard-pile');

socket.on('connect', () => {
  console.log('Connected to the server');

  socket.on('dealCards', (data) => {
    players = data.players;
    cards = data.cards;

    updateGameBoard();
  });

  socket.on('playCard', (data) => {
    const player = players.find((player) => player.id === data.playerId);
    const card = cards.find((card) => card.id === data.cardId);

    player.hand.splice(player.hand.indexOf(card), 1);
    discardPile.appendChild(card);

    updateGameBoard();
  });
});

function updateGameBoard() {
  players.forEach((player) => {
    const playerElement = document.querySelector(`.player[data-id="${player.id}"]`);
    const playerHandElement = playerElement.querySelector('.player-hand');

    playerHandElement.innerHTML = '';

    player.hand.forEach((card) => {
      const cardElement = createCardElement(card);
      playerHandElement.appendChild(cardElement);
    });
  });

  cardStack.innerHTML = '';

  cards.forEach((card) => {
    if (!card.played) {
      const cardElement = createCardElement(card);
      cardStack.appendChild(cardElement);
    }
  });
}

function createCardElement(card) {
  const cardElement = document.createElement('div');
  cardElement.classList.add('card');
  cardElement.setAttribute('data-id', card.id);

  const cardFaceElement = document.createElement('div');
  cardFaceElement.classList.add('card-face');
  cardFaceElement.innerHTML = card.value;

  const cardBackElement = document.createElement('div');
  cardBackElement.classList.add('card-back');

  cardElement.appendChild(cardFaceElement);
  cardElement.appendChild(cardBackElement);

  return cardElement;
}

document.getElementById('deal-button').addEventListener('click', () => {
  socket】写一篇相关的博客,写作要求:100%独特、SEO优化的文章,包含子标题,并覆盖提示中提供的主题。请用自己的话来写文章,而不是从其他来源复制和粘贴。在创建