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

二、上代码

 <?php
//所有图形初始化数据,key代表位置,value代表颜色
$xxl = array(
array('', '', '', '', '', '', '', ''),
array('', '', '', '', '', '', '', ''),
array('', '', '', '', '', '', '', ''),
array('', '', '', '', '', '', '', ''),
array('', '', '', '', '', '', '', ''),
array('', '', '', '', '', '', '', ''),
array('', '', '', '', '', '', '', ''),
array('', '', '', '', '', '', '', ''),
);
$point = play($xxl, $point);//开始游戏
echo "\n共获得积分数量:{$point}"; /*开始消除
*$xxl array 所有图形集合
*$point int 获得积分数量
*/
$bu = 0;
function play($xxl, $point){
global $bu;
$bu ++;
echo '=================================开始第'.$bu.'步==================================';
$color = array(1 => '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

PHP实现开心消消乐的算法示例的更多相关文章

  1. 教你用Vue写一个开心消消乐

    之前做过一个算法题,算法要求就是写一个开心消消乐的逻辑算法,当时也是考虑了一段时间才做出来.后来想了想,既然核心算法都有了,能不能实现一个开心消消乐的小游戏呢,于是花了两天时间做了一个小游戏出来. 效 ...

  2. ACM_开心消消乐

    开心消消乐 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大白最近喜欢上了开心消消乐,于是英语基础好的他准备让课文中英语句子也来 ...

  3. 热门游戏&lt;开心消消乐&gt;的“加壳”诡计!!

    好久没搞游戏了,前几天看了又又一次看了看<开心消消乐>的1.29最新版..于是故事開始了: 1.反编译分析 首先使用Androidkiller进行反编译,得到两个Smali代码目录:mal ...

  4. Unity3D_(游戏)甜品消消乐02_游戏核心算法

    甜品消消乐01_游戏基础界面 传送门 甜品消消乐02_游戏核心算法 传送门 甜品消消乐03_游戏UI设计    传送门 GameManager脚本上修改Fill Time可以改变消消乐移动速度 实现过 ...

  5. 用Python写个开心消消乐小游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受 ...

  6. net.sz.framework 框架 ORM 消消乐超过亿条数据排行榜分析 天王盖地虎

    序言 天王盖地虎, 老婆马上生孩子了,在家待产,老婆喜欢玩消消乐类似的休闲游戏,闲置状态,无聊的分析一下消消乐游戏的一些技术问题: 由于我主要是服务器研发,客户端属于半吊子,所以就分析一下消消乐排行榜 ...

  7. Unity3D_(游戏)甜品消消乐03_游戏UI设计

    甜品消消乐01_游戏基础界面 传送门 甜品消消乐02_游戏核心算法 传送门 甜品消消乐03_游戏UI设计    传送门 (源码在文章最下面~) 实现过程 游戏界面UI 分数与时间的UI显示 有关游戏U ...

  8. Unity3D_(游戏)甜品消消乐01_游戏基础界面

    甜品消消乐游戏 (脚本源码在游戏UI设计最下方) 三消游戏,存在L型消除有一点小Bug,当甜品在饼干附近消除时会清除饼干 饼干作为游戏障碍物时不可移动的,多块饼干并排时会挡住甜品掉落 发现消除类游戏的 ...

  9. 用 Python 写个消消乐小游戏

    提到开心消消乐这款小游戏,相信大家都不陌生,其曾在 2015 年获得过玩家最喜爱的移动单机游戏奖,受欢迎程度可见一斑,本文我们使用 Python 来做个简单的消消乐小游戏. 很多人学习python,不 ...

随机推荐

  1. 微信小程序开发小结

    1.点击按钮分享功能: 使用Button组件,设置open-type="share",然后在js文件的onShareAppMessage方法中设置如下: onShareAppMes ...

  2. 第二周 IP通信基础回顾

    这周我们学习了OSI参考模型,了解局域网的分层为接入层,汇聚层,核心层.网络划分为通信直网,资源直网.osi模型概述在主动间数据传输为应用层,表示层,会话层:底层数据l流为传输层,网络层,数据链路层, ...

  3. 利用U盘安装win2008r2系统的步骤

    我们在公司或者家里,经常要安装各种系统,最近公司需要重新安装win2008r2系统.折腾了一天的时间,终于把系统装好了.将安装的步骤记录下来,方便大家查看,自己也做个记录. 1 准备win2008r2 ...

  4. Zabbix Server端配置文件说明

    zabbix作为运维邻域不可缺少的一员,它的各种文档可是数不胜数啊,但是关于配置文件的解释与说明就有点少.这里列出zabbix配置文件篇之zabbix_server. Zabbix Server端配置 ...

  5. 『Kruscal重构树 Exkruscal』

    新增一道例题及讲解 Exkruscal \(Exkruscal\)又称\(Kruscal\)重构树,是一种利用经典算法\(Kruscal\)来实现的构造算法,可以将一张无向图重构为一棵具有\(2n-1 ...

  6. WebApi系列~不支持put和delete请求的解决方法

    回到目录 原因 由于安装了webDAV模块引起的,在web.config里的system.webserver节点,将webdav模块移动 将http请求的权限开放 实现 <system.webS ...

  7. HBase学习——3.HBase表设计

    1.建表高级属性 建表过程中常用的shell命令 1.1 BLOOMFILTER 默认是 NONE 是否使用布隆过虑及使用何种方式,布隆过滤可以每列族单独启用 使用HColumnDescriptor. ...

  8. leetcode — remove-duplicates-from-sorted-list

    /** * Source : https://oj.leetcode.com/problems/remove-duplicates-from-sorted-list/ * * * Given a so ...

  9. 深度学习入门实战(一):像Prisma一样算法生成梵高风格画像

    本文由云+社区发表 作者:董超 导语:现在人工智能是个大热点,而人工智能离不开机器学习,机器学习中深度学习又是比较热门的方向,本系列文章就从实战出发,介绍下如何使用MXnet进行深度学习~ 既然是实战 ...

  10. 阿里巴巴的26款超神Java开源项目!

    来源:https://segmentfault.com/a/1190000017346799 1.分布式应用服务开发的一站式解决方案 Spring Cloud Alibaba Spring Cloud ...