问题描述:n个人排成一圈。从某个人开始,依次报数,数到m的人被杀死。下一个人重新从1开始报数,数到m的人被杀死。直到剩下最后一个人。

解决思路:从数学角度去看,每一次报数决定谁去死是一个n、m的求余数过程。从程序角度看,玩家和编号一一对应,每一次报数玩家减少一个,编号重新排列。

程序:

1.首先声明相关变量

$childAmount = 6; //总人数
$endNumber = rand(1,6); //死亡编号取随机值
$gameNumber = 0;//游戏次数
$childArray = array('a','b','c','d','e','f');//玩家姓名数组
$playArray = array();//编号姓名对应关系数组
$killArray = array();//死亡顺序名单数组
//初始化
shuffle($childArray);//取随机排序

2.游戏开始前数组准备

//初始化
shuffle($childArray);//取随机排序
//构建关联数组
for($i=0;$i<count($childArray);$i++){
$playArray[$i+1] = $childArray[$i];
}
echo '<pre>';
echo "玩家数:".$childAmount."死亡编号:".$endNumber."<br>";
echo "这是初始游戏编号:";
print_r($playArray);
echo '</pre>';

3.游戏开始

//死亡循环
while($childAmount > 1){//判断人数是否大于1,决定游戏是否结束
$number = $endNumber % $childAmount;//求取余数
//当余数为0时,死亡的是编号最大的人
if($number == 0){
$killArray[] = $playArray[$childAmount];//加入死亡名单
unset($playArray[$childAmount]);//该玩家死亡
$childAmount -= 1;//游戏人数减一
$gameNumber += 1;//死亡循环次数加一
}else{//余数不为0,死亡的是编号等于余数的人
$temp = array();
$killArray[] = $playArray[$number];
unset($playArray[$number]);
//规律:余数不为0,大于以及小于该余数的编号之后的人编号从1开始重新排列。大于该编号的人编号为(本身编号-死亡编号),小于该编号的人编号为(本身编号+当前最大编号-死亡编号)
foreach($playArray as $key => $value){
if($key > $number){
$temp[$key-$number] = $value;
}else{
$temp[$key+$childAmount-$number] = $value;
}
}
ksort($temp);//按键名排序
$playArray = $temp;
$childAmount -= 1;
$gameNumber += 1;
}
if($childAmount == 1){
echo '<pre>';
echo '幸存者是:';
print_r($playArray);
echo '</pre>'; }
}
echo '<pre>';
echo "死亡顺序:";
print_r($killArray);
echo '</pre>';

最新文章

  1. 分布式中使用Redis实现Session共享(二)
  2. SSIS的CheckPoint用法
  3. UnityShader:HSV(色相,饱和度,亮度)转换
  4. Scala 深入浅出实战经典 第61讲:Scala中隐式参数与隐式转换的联合使用实战详解及其在Spark中的应用源码解析
  5. Apache+PHP+MySql 的安装及配置
  6. 安卓开发21:深入理解Handler
  7. 嵌入式linux内核制作
  8. Android中G-Sensor相关流程
  9. MySQL查询结果复制到新表(更新、插入)
  10. 基于jq的表单填充
  11. VTK显示mhd,mha格式文件
  12. Java基础知识回顾之三 ----- 封装、继承和多态
  13. MongoDB设置
  14. Qt shortcuts
  15. node 学习系列-hello world
  16. iptables报错:Couldn&#39;t load target `accept&#39;:/lib64/iptables/libipt_accept.so: cannot open shared object file: No such file or directory
  17. 665. Non-decreasing Array
  18. 使用.net的跟踪诊断来记录wcf消息
  19. java版云笔记(六)之AOP
  20. Struts2 中#、@、%和$符号的用途

热门文章

  1. 【转】ORACLE的REDO与UNDO
  2. 卡特兰数(Catalan)
  3. [恶趣味]搞了下局域网内的arp网络欺骗
  4. The difference between QA, QC, and Test Engineering
  5. 重建索引提高SQL Server性能
  6. vim /vi中对字符串的查找并替换
  7. quickSort算法导论版实现
  8. 分布式之ZookeeperMac安装
  9. MFC操作注册表
  10. 将做好的py文件打包成模块,供别人安装调用