< titlesplit >1、需求说明:1、在一个8*8的矩阵格子中随机出现5个色块。2、当有三个或三个以上的色块横连或竖连时,消除这些色块。3、色块消除后,上方色块下移,随机颜色的色块落下,填补矩阵的空缺。4、重复步骤2、3。5、3个相同色块得10分,4个15分,5个20分,6个30分,7个40分,8个70分,100个9块加10分,10块加150分,每增加一个比上一个加50分。2、以上代码'red',2=>'green',3=>'yellow',4=>'blue',5=>'black');//代表5种颜色$samCol=array();//列上相连色块的集合$nowCol=array();//列上相连色块的指针$samArr=array();//相连色块的总集合$group=1;//分组指针//随机填充颜色并获取行start上相连的色块foreach($xxlas$k1=>$v1){$sam=array();//行上相连色块的集合$now=1;//行上相连色块的指针foreach($v1as$k2=>$v2){if(empty($v2)||$v2==''){$v2=$xxl[$k1][$k2]=array_rand($color);//随机填充颜色}if(!isset($nowCol[$k2])){$nowCol[$k2]=1;}if($k1===0){$samCol[$k2][$nowCol[$k2]][$k1.'-'.$k2]=array($k1,$k2,$v2,$k1.'-'.$k2.'-'.$v2);}else{if($v2!=$xxl[$k1-1][$k2]){//同一列的颜色和前面的不一样$nowCol[$k2]++;$samCol[$k2][$nowCol[$k2]][$k1.'-'.$k2]=array($k1,$k2,$v2,$k1.'-'.$k2.'-'.$v2);}if($k2===0){$sam[$now][$k1.'-'.$k2]=array($k1,$k2,$v2,$k1.'-'.$k2.'-'.$v2);}else{if($v2!=$xxl[$k1][$k2-1]){//同一行的颜色和前面的不一样$now++;$sam[$now][$k1.'-'.$k2]=array($k1,$k2,$v2,$k1.'-'.$k2.'-'.$v2);}}//获取连接的色块开始foreach($samas$x=>$y){if(count($y)>2){$key='R-'.$group;foreach($yas$x2=>$y2){$y[$x2]['group']['r']=$key;}$samArr+=$y;$组++;}}//获取行尾相连的色块}//随机填充颜色,获取行尾相连的色块//获取列相连的色块start$group=1;foreach($samColas$k=>$v){foreach($vas$x=>$y){if(count($y)>2){$key='L-'.$group;foreach($yas$x2=>$y2){$y[$x2]['group']['l']=$key;if(isset($samArr[$x2]['group']['r'])){//判断这个点是否出现在水平组$samArr[$x2]['group']['l']=$键;}}$samArr+=$y;$组++;}}}//得到获取连通色块end//查找连通色块start$res=array();//连通色块集合$hasRes=array();foreach($samArras$k=>$v){if(isset($hasRes[$k])){继续;}$arr=数组();寻找($samArr,$v,$arr);$res[]=array_keys($arr);$hasRes+=$arr;}//查找相连的色块endshow($xxl);//打印消除前的图形if(empty($res)){//如果没有相连的色块则退出递归echo'====================================消除完成!=====================================';返回$点;}$thisPoint=countPoint($res);//计算本次消除的点数$point+=$thisPoint;//累加到总点数//消除相连的色块开始$next=$xxl;foreach($resas$k=>$v){foreach($vas$k2=>$v2){$y=$samArr[$v2][0];$x=$samArr[$v2][1];$xxl[$y][$x]='*';取消设置($next[$y][$x]);}}//消除相连的色块endshow($xxl);//消除时打印图形$next=step($next);show($next);//打印消除后的图形echo"本次消除得到的点数:{$thisPoint}\n";返回播放($下一个,$point);}/*计算得到的点数*$xxl数组是相连颜色块的集合*/functioncountPoint($xxl){//初始化点配置start$config=array(3=>10,4=>15,5=>20,6=>30,7=>40,8=>70,9=>100);对于($i=10;$i<=64;$i++){$config[$i]=100+($i-9)*50;}//初始化点配置end$point=0;foreach($xxlas$v){$key=count($v);$point+=$config[$key];}return$point;}/*消除左移*$xxl数组所有图形集合*/functionstep($xxl){foreach($xxlas$k=>$v){$temp=array_merge($v);$count=count($temp);如果($count==8){继续;}for($i=$count;$i<=7;$i++){$temp[$i]='';}$xxl[$k]=$temp;}return$xxl;}/*找相邻点*$xxl数组连接图形集合*$one数组某个点*$arr数组图形集合中相邻点*/functionseek($xxl,$one,&$arr){//全球$i;$near=数组();$near['up']=($one[0]-1).'-'.$one[1];//上点$near['down']=($one[0]+1).'-'.$one[1];//下点$near['left']=$one[0].'-'.($one[1]-1);//左边点$near['right']=$one[0].'-'.($one[1]+1);//右边的点foreach($nearas$v){if(isset($xxl[$v])&&$xxl[$v][2]==$one[2]){//求相邻点$xj=array_intersect($one['group'],$xxl[$v]['group']);if(empty($xj)){//如果相对的相邻点不在本组中,则跳过继续;}if(isset($arr[$v])){//如果点已遍历,则跳过继续;}$arr[$v]=$xxl[$v];seek($xxl,$xxl[$v],$arr);//继续寻找相邻点}}}/*打印图形*$xxl数组所有图形集合*/functionshow($xxl){//旋转矩阵顺时针开始$arr=array();foreach($xxlas$k=>$v){foreach($vas$k2=>$v2){$arr[7-$k2][$k]=$v2;}}ksort($arr);//顺时针旋转矩阵结束$str='';foreach($arras$v){foreach($vas$v2){$str.=''.$v2;}$海峡。="\n";}echo"\n".$str;}运行结果如下:12345分别代表5种颜色====================================开始第一步======================================33221114434341133141141223431244424222143321231152132145345132333322***443*341*331*114*223*3124442****143321*3115213*1453451323333443233131223144442234214332113115213114534513233消除得到的点数:55=========================================================================================================================================================================================33223324433213333133414223512444422342143321131152131145345132333322332443321***3133414223512***422342143321131152131145345132333322343321313343242351214242234214332113115213114534513233本次淘汰获得的点数:20=====================================开始第3步=====================================3322341343321425313343242351214242234214332113115213114534513233====================================淘汰完成!========================================获得的总点数:75
