击鼓传花游戏
原游戏规则:
班级中玩一个游戏,所有学生围成一圈,从某位同学手里开始向旁边的同学传一束花。
这个时候某个人(比方班长),在击鼓,鼓声停下的一刻,花落在谁手里,谁就进去表演节目
在编程中的游戏规则有一点变动
批改后的游戏规则:
几个敌人一起玩一个游戏,围成一圈,开始数数,数到某个数字的人主动淘汰。
最初剩下的这个人会获得胜利,请问最初剩下的是原来在哪一个地位上的人?
队列的定义
队列是只容许在一端进行插入操作,而另一端进行删除操作的线性表,是一种先进先出的线性表,简称 FIFO。容许插入的一段称为队尾,容许删除的一端称为队头。
假如队列是
q=(a1,a2,a3....,an)
,那么 a1 就是队头元素,而 an 就是队尾元素。这样咱们删除时,总是从 a1 开始;而插入时,在最初。
这也合乎咱们通常在生活中一些排队的景象,排在第一个的优先解决,最初来的当然在队伍的最初了。
定义队列的办法:
- 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