首页 > 其他分享 >ChatGTP - 使用js实现掼蛋游戏

ChatGTP - 使用js实现掼蛋游戏

时间:2023-08-15 16:13:32浏览次数:34  
标签:ChatGTP console 游戏 deck js player const log

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

// 定义一副扑克牌
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方法开始游戏,然后逐个玩家出牌,直到某个玩家手牌为空,游戏结束。最后会计算各玩家的分数,并输出最终胜利者。你可以根据游戏规则和需求来修改和扩展代码,以实现更复杂的掼蛋游戏。

标签:ChatGTP,console,游戏,deck,js,player,const,log
From: https://www.cnblogs.com/kitty-blog/p/17631434.html

相关文章

  • ChatGTP - 使用js实现升级游戏
    实现一个完整且复杂的升级游戏涉及到很多方面,包括玩家操作、游戏状态管理、游戏规则和逻辑等等。下面是一个较为简化的升级游戏的代码示例://游戏状态枚举constGameState={NOT_STARTED:'NOT_STARTED',BETTING:'BETTING',PLAYING:'PLAYING',END:'END'};cla......
  • 以对话为场景本质,AIGC 将如何改变游戏规则
    生成式AI公司MosaicML以约13亿美元的价格被大数据巨头Databricks收购,这个发生于6月底的收购事件成为年内AIGC领域最大收购案。关注【融云全球互联网通信云】了解更多全球对人工智能的投资正在迅速增加。01正在构建的游戏规则《时代周刊》文章称,人工智能在许多任务上超......
  • fastjson反序列化 TODO
    参考链接fastjson反序列化入门文章https://tttang.com/archive/1579/https://xz.aliyun.com/t/12096ASM动态加载相关,如何查看内存生成的类的源码https://juejin.cn/post/6974566732224528392#heading-6https://blog.csdn.net/wjy160925/article/details/85288569关闭ASM去......
  • spring mvc 前端返回 js
    @RequestMapping(value="/test",produces="text/html;charset=UTF-8")@ResponseBodypublicStringtest(){Stringurl="";return"<script>window.location.href='"+url+"';</script>"; ......
  • 详细讲解原生js拖拽
    场景描述今天遇见一个问题,那就是产品希望在弹出来的窗口。可以移动这个弹窗的位置增加用户体验,我们直接使用的element-ui中的Dialog对话框我们现在需要拖拽标题,移动元素位置元素拖拽的思路要让元素按下移动,我们需要实现以下几个步骤:1.鼠标按下元素跟随光标移动2.鼠标抬......
  • js 如何调用摄像头拍照
    1.第一种 业务逻辑需要人脸验证,需要通过调用摄像头获取人脸来调用接口做对比,所以学习了一下js关于调用摄像头拍照。主要通过video调用摄像头和canvas截取画面。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible......
  • “优雅”的js
    ......
  • 如何单独在js中引入elementUI的通知组件
    在页面上可以直接使用的通知:open1(){this.$notify({title:'成功',message:'这是一条成功的提示消息',type:'success'});}, 但是在单独的js当中使用时,会提示  .$notify未定义,原因是在单独的js当中未引入el......
  • nodejs的版本管理工具NVM
    nvm(NodeVersionManager)是一个node的版本管理工具,可以快捷的进行node版本的安装、切换、卸载、查看等。它能够在项目开发中根据不同需求轻松切换所依赖不同版本的Node.js,从而让开发者可以在不同的环境之间进行切换,从而更好地保证软件的稳定性运行。1.从官网下载安装包https://g......
  • Python写一个剪刀石头布小游戏
    #导入包importrandom#调用randint()函数,表示随机取其中的任意一个数,左闭右也毕#初始化变量n=0pc=0#表示电脑计分person=0#表示人计分whilen<3:a=random.randint(1,3)#a代表电脑b=int(input('请出拳(1.剪刀,2.石头,3.布):'))#改变变量n+=1#if判断,当电脑出剪刀时:......