本篇文章给大家带来的内容是关于PHP约瑟夫小游戏的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
30 个人在一条船上,超载,需要 15 人下船。于是人们排成一队,排队的位置即为他们的编号。报数,从 1 开始,数到 9 的人下船。如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢?
/**
* 调用运算方法
* */
public function test(){
//游戏的人
$players = [];
//选取30人
for ($i = 1; $i <= 30; $i++) {
$players[] = $i;
}
//需要淘汰人数 达到淘汰人数15 游戏结束
$Eliminate = 15;
//读到数字9的玩家淘汰
$num = 9;
//开始数字
$begin_num = 1;
//返回淘汰人数
$result = $this->_josephGame($players, $num, $begin_num, $Eliminate);
return dump($result);
}
/**
* 约瑟夫游戏
* @param $arr 游戏总人数
* @param $number 淘汰的数字
* @param $i 开始数字
* @param $unset_number 淘汰人数
* @param array $arr_unset 淘汰的人集合
* @return array 返回淘汰人数
*/
public function _josephGame($arr,$number,$i,$unset_number,$arr_unset = [])
{
//$n 记录当前循环次数
$n = 0;
//$arr_count 当前还在游戏内的人数
$arr_count = count($arr);
foreach ($arr as $k => $v){
//循环次数 +1
$n++;
// 判断是否数到了需要淘汰的数字(默认数字9)
if($i == $number){
//统计淘汰的人
$arr_unset[] = $arr[$k];
//删除淘汰的人
unset($arr[$k]);
//判断是否达到了淘汰人数(默认15人)
if(count($arr_unset) >= $unset_number) break;
//数字到9了之后 重新开始计数
$i = 0;
}
//数字默认 +1
$i++;
//判断是否已经已经走完了一轮 走完了重新开始
if($arr_count == $n) $this->_josephGame($arr,$number,$i,$unset_number,$arr_unset);
}
return $arr_unset;
}