侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

利用PHP实现开心消消乐的算法示例

php  /  管理员 发布于 7年前   137

前言

本文主要介绍了关于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分。

二、上代码

 'red',2 => 'green',3 => 'yellow',4 => 'blue',5 => 'black');//代表5种颜色 $samCol = array();//列上相连色块集合 $nowCol = array();//列上相连色块指针 $samArr = array();//相连色块总集合 $group = 1;//组指针 //随机填充颜色,并获得行上相连色块start foreach($xxl as $k1 => $v1){  $sam = array();//行上相连色块集合  $now = 1;//行上相连色块指针  foreach($v1 as $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);   }  }  //获得行上相连色块start  foreach($sam as $x => $y){   if(count($y) > 2){    $key = 'R-'.$group;    foreach($y as $x2 => $y2){     $y[$x2]['group']['r'] = $key;    }    $samArr += $y;    $group ++;   }  }  //获得行上相连色块end } //随机填充颜色,并获得行上相连色块end //获得列上相连色块start $group = 1; foreach($samCol as $k => $v){  foreach($v as $x => $y){   if(count($y) > 2){    $key = 'L-'.$group;    foreach($y as $x2 => $y2){     $y[$x2]['group']['l'] = $key;     if(isset($samArr[$x2]['group']['r'])){//判断本点是否已出现在横向组里      $samArr[$x2]['group']['l'] = $key;     }    }    $samArr += $y;    $group ++;   }  } } //获得列上相连色块end //查找相连色块start $res = array();//相连色块集合 $hasRes = array(); foreach($samArr as $k => $v){  if(isset($hasRes[$k])){   continue;  }  $arr = array();  seek($samArr, $v, $arr);  $res[] = array_keys($arr);  $hasRes += $arr; } //查找相连色块end show($xxl);//打印消除前的图形 if(empty($res)){//如果没有相连色块则退出递归  echo '=================================消除完毕!==================================';  return $point; } $thisPoint = countPoint($res);//计算本次消除获得积分 $point += $thisPoint;//累计到总积分 //消除相连色块start $next = $xxl; foreach($res as $k => $v){  foreach($v as $k2 => $v2){   $y = $samArr[$v2][0];   $x = $samArr[$v2][1];   $xxl[$y][$x] = '*';   unset($next[$y][$x]);  } } //消除相连色块end show($xxl);//打印消除时的图形 $next = step($next); show($next);//打印消除后的图形 echo "本次消除获得积分数量:{$thisPoint}\n"; return play($next, $point);}/*计算获得积分数量 *$xxl  array 相连色块集合 */function countPoint($xxl){ //初始化积分配置start $config = array(3 => 10, 4 => 15, 5 => 20, 6 => 30, 7 => 40, 8 => 70, 9 => 100); for($i = 10; $i <= 64; $i++){  $config[$i] = 100 + ($i - 9) * 50; } //初始化积分配置end $point = 0; foreach($xxl as $v){  $key = count($v);  $point += $config[$key]; } return $point;}/*消掉并左移 *$xxl  array 所有图形集合 */function step($xxl){ foreach($xxl as $k => $v){  $temp = array_merge($v);  $count = count($temp);  if($count == 8){   continue;  }  for($i = $count; $i <= 7; $i++){   $temp[$i] = ' ';  }  $xxl[$k] = $temp; } return $xxl;}/*找相邻点 *$xxl  array 相连图形集合 *$one   array 某一个点 *$arr   array 图形集合里的相邻的点*/function seek($xxl, $one, &$arr){// global $i; $near = array(); $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($near as $v){  if(isset($xxl[$v]) && $xxl[$v][2] == $one[2]){//找到相邻点   $xj = array_intersect($one['group'], $xxl[$v]['group']);   if(empty($xj)){//如果相邻的点不是本组的就跳过    continue;   }   if(isset($arr[$v])){//如果该点已被遍历过则跳过    continue;   }   $arr[$v] = $xxl[$v];   seek($xxl, $xxl[$v], $arr);//继续找相邻的点  } }}/*打印图形 *$xxl  array 所有图形集合 */function show($xxl){ //顺时针旋转矩阵start $arr = array(); foreach($xxl as $k => $v){  foreach($v as $k2 => $v2){   $arr[7-$k2][$k] = $v2;  } } ksort($arr); //顺时针旋转矩阵end $str = ''; foreach($arr as $v){  foreach($v as $v2){   $str .= ' '.$v2;  }  $str .= "\n"; } echo "\n".$str;}

运行结果如下:

12345分别代表5种颜色。

=================================开始第1步================================== 3 3 2 2 1 1 1 4 4 3 4 3 4 1 1 3 3 1 4 1 1 4 1 2 2 3 4 3 1 2 4 4 4 2 4 2 2 2 1 4 3 3 2 1 2 3 1 1 5 2 1 3 2 1 4 5 3 4 5 1 3 2 3 3 3 3 2 2 * * * 4 4 3 * 3 4 1 * 3 3 1 * 1 1 4 * 2 2 3 * 3 1 2 4 4 4 2 * * * * 1 4 3 3 2 1 * 3 1 1 5 2 1 3 * 1 4 5 3 4 5 1 3 2 3 3 3 3   4 4 3 2  3 3 1 3 1 2 2 3 1 4 4 4 4 2 2 3 4 2 1 4 3 3 2 1 1 3 1 1 5 2 1 3 1 1 4 5 3 4 5 1 3 2 3 3本次消除获得积分数量:55=================================开始第2步================================== 3 3 2 2 3 3 2 4 4 3 3 2 1 3 3 3 3 1 3 3 4 1 4 2 2 3 5 1 2 4 4 4 4 2 2 3 4 2 1 4 3 3 2 1 1 3 1 1 5 2 1 3 1 1 4 5 3 4 5 1 3 2 3 3 3 3 2 2 3 3 2 4 4 3 3 2 1 * * * 3 1 3 3 4 1 4 2 2 3 5 1 2 * * * 4 2 2 3 4 2 1 4 3 3 2 1 1 3 1 1 5 2 1 3 1 1 4 5 3 4 5 1 3 2 3 3 3 3 2 2 3   4 3 3 2 1   3 1 3 3 4 3 2 4 2 3 5 1 2 1 4 2 4 2 2 3 4 2 1 4 3 3 2 1 1 3 1 1 5 2 1 3 1 1 4 5 3 4 5 1 3 2 3 3本次消除获得积分数量:20=================================开始第3步================================== 3 3 2 2 3 4 1 3 4 3 3 2 1 4 2 5 3 1 3 3 4 3 2 4 2 3 5 1 2 1 4 2 4 2 2 3 4 2 1 4 3 3 2 1 1 3 1 1 5 2 1 3 1 1 4 5 3 4 5 1 3 2 3 3=================================消除完毕!==================================共获得积分数量:75

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对AIDI的支持。

您可能感兴趣的文章:

  • PHP机器学习库php-ml的简单测试和使用方法
  • PHP实现图的邻接矩阵表示及几种简单遍历算法分析
  • PHP对称加密算法(DES/AES)类的实现代码
  • PHP基于回溯算法解决n皇后问题的方法示例
  • php实现的生成迷宫与迷宫寻址算法完整实例
  • PHP实现的贪婪算法实例
  • PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
  • PHP使用栈解决约瑟夫环问题算法示例
  • PHP基于递归实现的约瑟夫环算法示例
  • PHP实现机器学习之朴素贝叶斯算法详解


  • 上一条:
    如何直接访问php实例对象中的private属性详解
    下一条:
    深入理解PHP中mt_rand()随机数的安全
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客