js算法之旅:用队列和栈计算出扑克玩:拖板车(小猫钓鱼) 游戏的结果

本文通过一个具体的扑克游戏“小猫钓鱼”来解释队列和栈的概念。游戏中,玩家的牌被看作是两个队列,出牌即从队列头部取出。文章提供了一个JavaScript程序来模拟游戏过程,判断获胜者。程序中,桌上已出的牌形成一个栈,通过查找匹配牌并移除来推进游戏。最终,程序会自动运行并显示获胜者。
摘要由CSDN通过智能技术生成

队列是什么

存储数据的方式,先进先出、后进后出,例如排队买票

栈是什么

存储数据的方式,先进后出、后进先出,例如手枪上膛了,先打出得永远是最后上进去那发子弹

游戏规则

星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。假如游戏开始时,小哼手中有 6 张牌,顺序为 2 4 1 2 5 6,小哈手中也有 6 张牌,顺序为 3 1 3 5 6 4,最终谁会获胜呢?现在你可以拿出纸牌来试一试。接下来请你写一个程序来自动判断谁将获胜。

思路

  1. 将两个人手上的牌想象成两个队列,打出来就是出队列,硬盘就是进队列
class Person {
  constructor(name, arr) {
    this.name = name
    this.arr = arr
  }
  chu () {
    return this.arr.shift()
  }
  jin (arr) {
    for (let i = arr.length - 1; i >= 0; i--) {
      this.arr.push(arr[i])
    }
    console.log(`${this.name}赢牌了${arr}`);
    this.arr.concat(arr)
  }
  life () {
    if (this.arr.length) {
      console.log(`${this.name}手中的牌为${this.arr}`);
      return true
    }
    console.log(`${this.name}没牌了  游戏结束`);
    return false
  }
}

const person1 = new Person('小恒', [2, 4, 1, 2, 5, 6])
const person2 = new Person('小哈', [3, 1, 3, 5, 6, 4])
  1. 将桌上已经出的牌当做一个栈
const arr = []
  1. 定义变量决定谁先出、回合数和获胜条件
let currentRound = 0

let is1Chu = true
while (person1.life() && person2.life()) {
	//xxxx
}

  1. 模拟出两个人出牌的样子
while (person1.life() && person2.life()) {
  currentRound++
  const it = is1Chu ? person1.chu() : person2.chu()
  arr.push(it)
  const findIndex = arr.findIndex((item, index) => (item == it && index !== arr.length - 1))
  if (findIndex != -1) {
    const spliceArr = arr.splice(findIndex)
    is1Chu ? person1.jin(spliceArr) : person2.jin(spliceArr)
  }
  is1Chu = !is1Chu
}
  1. 游戏结束

完整实现代码

class Person {
  constructor(name, arr) {
    this.name = name
    this.arr = arr
  }
  chu () {
    return this.arr.shift()
  }
  jin (arr) {
    for (let i = arr.length - 1; i >= 0; i--) {
      this.arr.push(arr[i])
    }
    console.log(`${this.name}赢牌了${arr}`);
    this.arr.concat(arr)
  }
  life () {
    if (this.arr.length) {
      console.log(`${this.name}手中的牌为${this.arr}`);
      return true
    }
    console.log(`${this.name}没牌了  游戏结束`);
    return false
  }
}

const person1 = new Person('小恒', [2, 4, 1, 2, 5, 6])
const person2 = new Person('小哈', [3, 1, 3, 5, 6, 4])

const arr = []
let currentRound = 0

let is1Chu = true

while (person1.life() && person2.life()) {
  currentRound++
  const it = is1Chu ? person1.chu() : person2.chu()
  arr.push(it)
  const findIndex = arr.findIndex((item, index) => (item == it && index !== arr.length - 1))
  if (findIndex != -1) {
    const spliceArr = arr.splice(findIndex)
    is1Chu ? person1.jin(spliceArr) : person2.jin(spliceArr)
  }
  is1Chu = !is1Chu
}

console.log('进行了' + currentRound + '回合');

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易风有点疯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值