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

318 阅读2分钟

队列是什么

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

栈是什么

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

游戏规则

星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。假如游戏开始时,小哼手中有 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 + '回合');