本文主要介绍了关于PHP如何实现我们大家都知道的开心消消乐的算法,分享PHP教程出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
一、需求描述:
1、在一个8*8的矩阵方格中随机出现5种颜色的色块。
2、当有三个或以上色块在横向或纵向上相连,则消除这些色块。
3、色块消除后,上方色块往下平移,并掉下颜色随机的色块填充矩阵空缺。
4、重复2、3步骤。
5、消除3个相同色块加10分,4个加15分,5个加20分,6个加30分,7个加40分,8个加70分,9个加100分,10个加150分,再往后每增加一个就比上一个多加50分。
二、上代码
1 <?php 2 //所有图形初始化数据,key代表位置,value代表颜色 3 $xxl = array( 4 array('', '', '', '', '', '', '', ''), 5 array('', '', '', '', '', '', '', ''), 6 array('', '', '', '', '', '', '', ''), 7 array('', '', '', '', '', '', '', ''), 8 array('', '', '', '', '', '', '', ''), 9 array('', '', '', '', '', '', '', ''), 10 array('', '', '', '', '', '', '', ''), 11 array('', '', '', '', '', '', '', ''), 12 ); 13 $point = play($xxl, $point);//开始游戏 14 echo "\n共获得积分数量:{$point}"; 15 16 /*开始消除 17 *$xxl array 所有图形集合 18 *$point int 获得积分数量 19 */ 20 $bu = 0; 21 function play($xxl, $point){ 22 global $bu; 23 $bu ++; 24 echo '=================================开始第'.$bu.'步=================================='; 25 $color = array(1 => 'red',2 => 'green',3 => 'yellow',4 => 'blue',5 => 'black');//代表5种颜色 26 $samCol = array();//列上相连色块集合 27 $nowCol = array();//列上相连色块指针 28 $samArr = array();//相连色块总集合 29 $group = 1;//组指针 30 31 //随机填充颜色,并获得行上相连色块start 32 foreach($xxl as $k1 => $v1){ 33 $sam = array();//行上相连色块集合 34 $now = 1;//行上相连色块指针 35 foreach($v1 as $k2 => $v2){ 36 if(empty($v2) || $v2 == ' '){ 37 $v2 = $xxl[$k1][$k2] = array_rand($color);//随机填充颜色 38 } 39 if(!isset($nowCol[$k2])){ 40 $nowCol[$k2] = 1; 41 } 42 if($k1 === 0){ 43 $samCol[$k2][$nowCol[$k2]][$k1 .'-'. $k2] = array($k1, $k2, $v2, $k1 .'-'. $k2 .'-'. $v2); 44 }else{ 45 if($v2 != $xxl[$k1-1][$k2]){//同一列上和前一个颜色不一样 46 $nowCol[$k2] ++; 47 } 48 $samCol[$k2][$nowCol[$k2]][$k1 .'-'. $k2] = array($k1, $k2, $v2, $k1 .'-'. $k2 .'-'. $v2); 49 } 50 51 52 if($k2 === 0){ 53 $sam[$now][$k1 .'-'. $k2] = array($k1, $k2, $v2, $k1 .'-'. $k2 .'-'. $v2); 54 }else{ 55 if($v2 != $xxl[$k1][$k2-1]){//同一行上和前一个颜色不一样 56 $now++; 57 } 58 $sam[$now][$k1 .'-'. $k2] = array($k1, $k2, $v2, $k1 .'-'. $k2 .'-'. $v2); 59 } 60 } 61 //获得行上相连色块start 62 foreach($sam as $x => $y){ 63 if(count($y) > 2){ 64 $key = 'R-'.$group; 65 foreach($y as $x2 => $y2){ 66 $y[$x2]['group']['r'] = $key; 67 } 68 $samArr += $y; 69 $group ++; 70 } 71 } 72 //获得行上相连色块end 73 } 74 //随机填充颜色,并获得行上相连色块end 75 76 //获得列上相连色块start 77 $group = 1; 78 foreach($samCol as $k => $v){ 79 foreach($v as $x => $y){ 80 if(count($y) > 2){ 81 $key = 'L-'.$group; 82 foreach($y as $x2 => $y2){ 83 $y[$x2]['group']['l'] = $key; 84 if(isset($samArr[$x2]['group']['r'])){//判断本点是否已出现在横向组里 85 $samArr[$x2]['group']['l'] = $key; 86 } 87 } 88 $samArr += $y; 89 $group ++; 90 } 91 } 92 } 93 //获得列上相连色块end 94 95 //查找相连色块start 96 $res = array();//相连色块集合 97 $hasRes = array(); 98 foreach($samArr as $k => $v){ 99 if(isset($hasRes[$k])){ 100 continue; 101 } 102 $arr = array(); 103 seek($samArr, $v, $arr); 104 $res[] = array_keys($arr); 105 $hasRes += $arr; 106 } 107 //查找相连色块end 108 show($xxl);//打印消除前的图形 109 if(empty($res)){//如果没有相连色块则退出递归 110 echo '=================================消除完