ChatGTP - 使用js实现掼蛋游戏

发布时间 2023-08-15 16:03:19作者: kitty20180903suzhou

实现一个完整而复杂的掼蛋游戏涉及到许多方面,包括玩家互动、游戏状态管理、游戏规则和逻辑等等。下面是一个较为简化的掼蛋游戏的代码示例:

// 定义一副扑克牌
const SUITS = ['♠', '♥', '♦', '♣'];
const RANKS = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'];
const CARDS = [];

// 初始化牌组
for (let suit of SUITS) {
  for (let rank of RANKS) {
    CARDS.push(rank + suit);
  }
}

// 洗牌函数
function shuffle(deck) {
  for (let i = deck.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [deck[i], deck[j]] = [deck[j], deck[i]];
  }
  return deck;
}

// 游戏状态枚举
const GameState = {
  NOT_STARTED: 'NOT_STARTED',
  DEALING: 'DEALING',
  PLAYING: 'PLAYING',
  END: 'END'
};

class Player {
  constructor(name) {
    this.name = name;
    this.hand = [];
    this.score = 0;
  }
}

class Game {
  constructor(numPlayers, numCards) {
    this.numPlayers = numPlayers;
    this.numCards = numCards;
    this.players = [];
    this.deck = shuffle([...CARDS]);
    this.state = GameState.NOT_STARTED;
    this.currentPlayerIndex = 0;
  }

  // 开始游戏
  start() {
    if (this.state !== GameState.NOT_STARTED) {
      console.log('游戏已经开始!');
      return;
    }

    this.dealCards();
    this.state = GameState.DEALING;
    console.log('游戏开始!');
    console.log('正在发牌...');
  }

  // 发牌
  dealCards() {
    for (let i = 0; i < this.numPlayers; i++) {
      const player = new Player(`Player ${i + 1}`);
      for (let j = 0; j < this.numCards; j++) {
        player.hand.push(this.deck.pop());
      }
      this.players.push(player);
    }
  }

  // 当前玩家出牌
  playCard(card) {
    if (this.state !== GameState.PLAYING) {
      console.log('请等待...');
      return;
    }

    const currentPlayer = this.players[this.currentPlayerIndex];
    const cardIndex = currentPlayer.hand.indexOf(card);

    if (cardIndex === -1) {
      console.log('你没有这张牌!');
      return;
    }

    const playedCard = currentPlayer.hand.splice(cardIndex, 1)[0];
    console.log(`${currentPlayer.name} 出牌:${playedCard}`);
    this.currentPlayerIndex = (this.currentPlayerIndex + 1) % this.numPlayers;

    // 检查是否结束游戏
    if (currentPlayer.hand.length === 0) {
      this.state = GameState.END;
      console.log(`${currentPlayer.name} 获胜!`);
      this.calculateScores();
    } else {
      console.log('请等待下一位玩家出牌...');
    }
  }

  // 计算分数
  calculateScores() {
    let highestScore = -Infinity;
    let winner = null;

    for (let player of this.players) {
      player.score = player.hand.reduce((score, card) => score + getCardValue(card), 0);
      console.log(`${player.name} 的分数:${player.score}`);

      if (player.score > highestScore) {
        highestScore = player.score;
        winner = player.name;
      }
    }

    console.log(`最终胜利者是 ${winner}!`);
  }
}

// 点数转换函数
function getCardValue(card) {
  const rank = card.slice(0, -1);
  switch (rank) {
    case 'A':
      return 14;
    case 'K':
      return 13;
    case 'Q':
      return 12;
    case 'J':
      return 11;
    default:
      return parseInt(rank);
  }
}

// 运行游戏
const game = new Game(4, 13);
game.start();
game.playCard('2♥');
game.playCard('3♥');
game.playCard('4♥');
game.playCard('5♥');

这个代码示例中使用了面向对象的方式来实现掼蛋游戏。游戏通过Game类来管理游戏状态、玩家信息、牌组等,并提供开始游戏、发牌、玩家出牌等功能。每个玩家通过Player类来表示,包含姓名、手牌和分数属性。游戏过程中,可以调用start方法开始游戏,然后逐个玩家出牌,直到某个玩家手牌为空,游戏结束。最后会计算各玩家的分数,并输出最终胜利者。你可以根据游戏规则和需求来修改和扩展代码,以实现更复杂的掼蛋游戏。