设为首页 加入收藏

TOP

PHP实现开心消消乐的算法示例(一)
2019-08-23 00:41:45 】 浏览:103
Tags:PHP 实现 开心 乐的 算法 示例

本文主要介绍了关于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 '=================================消除完
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇mysql自增id超大问题查询 下一篇php对二维数据排序

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目