消消乐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分。
二、上代码
//所有图形初始化数据,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源码,利用PHP实现开心消消乐的算法示例相关推荐
- cocos creator3.3.0休闲游戏(云浮消消乐)源码H5+安卓+IOS三端源码
cocos creator3.3.0休闲游戏(云浮消消乐)源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator3.X版本,完整的源码可直接运营. ...
- 基于Unity3D经典消消乐游戏源码,代码详细注释,c#版方块消消乐源代码
使用Unity2017开发,实现功能有: 基本消除功能 UI动画以及代码控制动画 消除动画以及手势识别 消除判定.连续消除判定 UI是自己独立完成比较简单,打包平台我设置的是webGL平台,有需要改成 ...
- (含源码)利用NVIDIA VPI之透视变换
(含源码)利用NVIDIA VPI之透视变换 更多精彩内容: https://www.nvidia.cn/gtc-global/?ncid=ref-dev-876561 文章目录 (含源码)利用NVI ...
- 直播带货系统源码利用FloatingActionButton实现 展开/折叠多级悬浮菜单
直播带货系统源码利用FloatingActionButton实现 展开/折叠多级悬浮菜单的相关代码 1.大家看一下,我们最终提供出来的调用的示例: //初始化2个Item弹出菜单 val expand ...
- 数据结构源码笔记(C语言):置换-选择算法
//实现置换-选择算法#include<stdio.h> #include<malloc.h> #include<string.h> #include<std ...
- wordpress最新Justnews主题源码6.0.1开心版+社交问答插件2.3.1+附教程
最新Justnews主题源码6.0.1开心版+社交问答插件2.3.1,附教程.JustNews是一款专为博客.自媒体.资讯类的网站设计开发的WordPress主题,JustNews主题支持自主研发的前 ...
- 最新Justnews主题源码6.0.1开心版+社交问答插件2.3.1+附教程
正文: 最新Justnews主题源码6.0.1开心版+社交问答插件2.3.1+附教程, 更新历史6.0.1: 优化快讯功能样式 优化修复上一版本用户反馈的问题 优化与QAPress插件4.0.0版本兼 ...
- Justnews主题源码V6.0.1开心版+社交问答插件/附教程
正文: Justnews主题源码6.0.1开心版+社交问答插件2.3.1+附教程,不要用Wordpress最新的5.9.3版本,亲测安装后前台空白,试了好几个版本5.6一下的都可以正常使用. 我用的是 ...
- 消消乐php源码,PHP实现开心消消乐的算法示例分享
开心消消乐应该对大家来说都不陌生吧,本文主要给大家介绍关于如何利用PHP实现开心消消乐算法的相关资料,文中将需求和示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随 ...
最新文章
- 给django视图类添加装饰器
- 爬虫 wordcloud操作
- 决策树准确率低原因_智能质检优化实践:召回率和准确率,哪个更重要?
- 使用jMeter的regular expression extract提取SSO form的XSRF protection token
- 安装 Power BI 报表服务器
- 计算机基础知识总结论文,大学计算机基础总结论文
- centos php 绑定域名,centos如何绑定域名?
- 附录-实模式下1M内存
- 医学数字成像设备中计算机系统的作用包括,医学影像实用技术教程全部习题答案...
- 【英宝通Unity4.0公开课学习 】(六)76讲到90讲
- 合理使用Blob/Clob
- actions vuex 请求_vuex中actions请求的数据提交给mutations,组件中获取到参数如何根据参数操作下面...
- 伺服驱动器,方案迈信ep100 成熟方案STM32源代码原理图,包含原理图,pcb图,源码
- matlab catia程序,利用VBA进行CATIA二次开发的基本流程 | 坐倚北风
- 四川大学计算机在线作业,四川大学计算机操作系统试题
- php dwg转pdf文件怎么打开,CAD转PDF怎么转为黑白的PDF文件
- cad lisp 画梯形_Lisp自动画梯形_CAD lisp 求助一段代码实现自动画弧!
- 计算机管理禁用usb,电脑如何禁用U盘、怎样禁用USB存储工具,防止USB端口泄密?...
- centos-ssh-channel is not opened.
- grafan 6.3.x pannel研究
热门文章
- 飞鱼48小时游戏创作嘉年华_厦门Pitch Time总结与收获
- 模拟登陆广西科技大学正方教务系统
- 下一代5G网络:比4G快1000倍 普及至少需8年
- 区块链到底是不是骗局
- 创建学生表,(sno,name,score,class),求每个班级中低于最高成绩的那些人
- magnifierrentgen(放大镜)插件的使用
- React系列(一) -邂逅React开发
- C语言的指针符号到底靠近变量类型还是变量名?
- mysql数据库in函数查询是否走索引
- 四、SLAM学习笔记—— Ubuntu18.04交叉编译OpenCV4.5.5至ARM64位平台firefly-RK3566