1

击鼓传花游戏

原游戏规则:
班级中玩一个游戏,所有学生围成一圈,从某位同学手里开始向旁边的同学传一束花。
这个时候某个人(比如班长),在击鼓,鼓声停下的一刻,花落在谁手里,谁就出来表演节目

在编程中的游戏规则有一点变化

修改后的游戏规则:
几个朋友一起玩一个游戏,围成一圈,开始数数,数到某个数字的人自动淘汰。
最后剩下的这个人会获得胜利,请问最后剩下的是原来在哪一个位置上的人?

队列的定义

队列是只允许在一端进行插入操作,而另一端进行删除操作的线性表,是一种先进先出的线性表,简称FIFO。允许插入的一段称为队尾,允许删除的一端称为队头。

假设队列是 q=(a1,a2,a3....,an) ,那么 a1 就是队头元素,而 an 就是队尾元素。这样我们删除时,总是从 a1 开始;而插入时,在最后。

这也符合我们通常在生活中一些排队的现象,排在第一个的优先处理,最后来的当然在队伍的最后了。

image
定义队列的方法:

  • enqueue() 入队
  • dequeue() 出队
  • front() 查看队头元素
  • toString() 返回队列中所有的元素
  • length() 返回队列的长度

队列的实现

function Queue() {
                
    this.items = []

    // 将元素加入到队列中
    Queue.prototype.enqueue = function(element) {
        this.items.push(element)
    }

    // 从队列中删除最前端的元素
    Queue.prototype.dequeue = function() {
        return this.items.shift()
    }

    // 查看前端的元素
    Queue.prototype.front = function() {
        return this.items[0]
    }

    // 查看队列是否为空
    Queue.prototype.isEmpty = function() {
        return this.items.length == 0
    }

    // 查看队列中元素的个数
    Queue.prototype.size = function() {
        return this.items.length
    }

    // 展示队列中所有的元素
    Queue.prototype.toString = function() {
        const resultString = ''
        for (let i = 0; i < this.items.length; i++) {
            resultString += this.items[i] + ' '
        }
        return resultString
    }
}

编写击鼓传花的代码

=========

//{Array:参加游戏人员的名字} nameList
//{number:数到这个数字的人就淘汰} number

function passGame(nameList,number) {
    //    创建一个队列
    const queue = new Queue()

    //    将所有人放入到队列中
    for(let i = 0; i < nameList.length; i++) {
        queue.enqueue(nameList[i])
    }
    
    //    当只有一个人的时候终止游戏
    while(queue.size() > 1) {
        for(let i = 0; i < number -1; i++){
            //    把队列的第一个人放入到队尾
            queue.enqueue(queue.dequeue())
        }
        // 直接从队列中删除number对应的这个人,
        queue.dequeue()
    }
    
    return {
        name:queue.front(),                        //    最终获胜的人
        num:nameList.indexOf(queue.front())+1    //    最终获胜人在原来队伍中的第几个
    }
}
测试
//    创建玩游戏的人
const stus = ['胡一菲','曾小贤','吕子乔','陈美嘉','关谷神奇','唐悠悠','陆展博','林宛瑜','张伟','诸葛大力','咖喱酱','赵海棠']

const result = passGame(stus,3)
console.log('获胜人是:' + result.name)   //诸葛大力
console.log('队伍中的第几个:'+result.num)   // 10

lucky_qi
29 声望0 粉丝