当前位置:首页 > 日记 > 正文

利用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分。

二、上代码

<?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

总结

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

相关文章

Word2013怎么样隐藏与显示回车符

Word2013怎么样隐藏与显示回车符

回车符,显示,电脑软件,  在Word中一般会默认显示回车符,但如果我们要将包含很多元素的文档排版排得很漂亮的话,那些回车符就会觉得碍眼了。以下是小编为您带来的关于Word2013隐藏与显示回车符,希望对您有所帮助。Word2013隐藏与显示回车符隐…

关于axios返回空对象的问题解决

关于axios返回空对象的问题解决

对象,电脑软件,axios,在本文开始之前,关于axios基本入门用法可以参考这篇文章,下面来看看本文的详细内容吧。问题描述:使用 axios 请求数据的时候,已经请求成功,返回的参数也正确。但打印出来的时候就变成了空对象。分析原因:返回的参数都是正确…

MySQL在添加购物车时防止重复示例

MySQL在添加购物车时防止重复示例

示例代码,购物车,电脑软件,MySQL,前言 最近,由于工作原因,应用购物车的订单支付了。测试了一个错误。当添加到购物车点的点比较快时,两个相同的商品出现在购物车中。 因为当购物车分为2个步骤,第一步是决定是否将被添加到购物车的货物已经在…

PS制作一张逼真的白纸

PS制作一张逼真的白纸

白纸,逼真,电脑软件,PS,   今天小编教大家用PS制作一张逼真的白纸,废话不说,直接上教程,让我们开始吧 :)PS制作一张逼真的白纸废话不说,直接上教程,让我们开始吧 :)第一步:建立一张1280*1024的白底画布.然后在画布中间用选框工具建立一…

php常用数组array函数实例总结【赋

php常用数组array函数实例总结【赋

计算,合并,拆分,排序,数组,本文实例总结了php常用数组array函数。分享给大家供大家参考,具体如下:array_combine功能:用一个数组的值作为新数组的键名,另一个数组的值作为新数组的值案例:<?php$a = array("one","two","three");$b = array…

word中如何左右分栏word中左右分栏

word中如何左右分栏word中左右分栏

步骤,方法,文字,清除,格式,  分栏,在word的使用中也是非常常见又非常能用到的技能,学会了不仅能让你的文章更美观,也更便于阅读。word中左右分栏的方法步骤Word中,分栏后,默认的是第一栏输入満了,都能进入第二栏的输入,若第一栏没输入満,就无法对…

word2013和2007怎样设置另存命令

word2013和2007怎样设置另存命令

命令,设置,另存,电脑软件,  word在左上方有一些命令快捷键非常方便,如存档、撤销等,但是默认却没有快捷的另存为命令。那么下面就由小编给大家分享下word2013和2007设置另存命令的技巧,希望能帮助到您。本节经验就以Office Word 2013 为例,讲…

php 猴子摘桃的算法

php 猴子摘桃的算法

算法,猴子,电脑软件,php,有一只猴子摘了一堆桃子,当即吃了一半,可是桃子太好吃了,它又多吃了一个,第二天它把第一天剩下的桃子吃了一半,又多吃了一个,就这样到第十天早上它只剩下一个桃子了,问它一共摘了多少个桃子?方法1function taozi($i){ if($i…

js使用generator函数同步执行ajax

js使用generator函数同步执行ajax

执行,函数,同步,电脑软件,js,本文实例为大家分享了js使用generator函数同步执行ajax任务的具体代码,供大家参考,具体内容如下function request(url, callback) { fetch(url, {mode: 'cors', credentials: 'include', headers: new Heade…

MySQL如何查看元数据锁阻塞在哪里

MySQL如何查看元数据锁阻塞在哪里

元数据,电脑软件,MySQL,MySQL如何查看元数据锁阻塞在哪里操作步骤:1、session 1 执行:start transaction; select *from t1;2、session 2 在第1步执行完后执行: drop table t1;此时session 2的drop语句被阻塞。那么怎么分析查看元数据锁呢?…

MySQL数据文件存储位置的查看方法

MySQL数据文件存储位置的查看方法

数据文件存储,方法,位置,电脑软件,MySQL,我们可能会有一个疑惑,那就是:当我们在本地(自己的电脑)安装完 MySQL 之后,也创建了很多的数据库啊、表啊,也存储了很多的数据啊,但是这些内容都存储到哪里了呢?特别是,当我们需要直接操作这些数据文件的时候…

PHP简单实现欧拉函数Euler功能示例

PHP简单实现欧拉函数Euler功能示例

简单实现,函数,示例,功能,欧拉,本文实例讲述了PHP简单实现欧拉函数Euler功能。分享给大家供大家参考,具体如下:欧拉函数ph(n)的意思是所有小于n且与n互质的个数。比如说ph(10) = 4{1,3,7,9与10互质}代码如下:<?phpfunction Euler($x){ $res =…