首页 > php教程 > 正文

php实现开心消消乐的算法的过程分享

原创 2017-10-13 09:38:36 0 209
开心消消乐应该对大家来说都不陌生吧,下面这篇文章主要给大家介绍了关于如何利用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实现开心消消乐的算法的过程分享的详细内容,更多请关注php中文网其它相关文章!

  • 相关标签:PHP 过程 算法
  • 本文原创发布php中文网 ,转载请注明出处,感谢您的尊重!
  • 独孤九贱(4)_PHP视频教程

    江湖传言:PHP是世界上最好的编程语言。真的是这样吗?这个梗究竟是从哪来的?学会本课程,你就会明白了。 PHP中文网出品的PHP入门系统教学视频,完全从初学者的角度出发,绝不玩虚的,一切以实用、有用...

    独孤九贱(5)_ThinkPHP5视频教程

    ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将...

    ThinkPHP5实战之[教学管理系统]

    本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目。

    独孤九贱(1)_HTML5视频教程

    《php.cn原创html5视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。 ...

    PHP入门视频教程之一周学会PHP

    所有计算机语言的学习都要从基础开始,《PHP入门视频教程之一周学会PHP》不仅是PHP的基础部分更主要的是PHP语言的核心技术,是学习PHP必须掌握的内容,任何PHP项目的实现都离不开这部分的内容,通...

    ThinkPHP5快速开发企业站点[全程实录]更新中...

    本课以最新版ThinkPHP5.0.10为基础进行开发,全程实录一个完整企业点,从后台到前台,从控制器到路由的全套完整教程,不论是你是新人,还是有一定开发经验的程序员,都可以从中学到实用的知识~~

    Thinkphp3.2.3个人博客开发

    ThinkPHP是一个快速、开源的轻量级国产PHP开发框架,是业内最流行的PHP框架之一。本课程以博客系统为例,讲述如何使用TP实战开发,从中学习Thinkphp的实践应用。模版下载地址:http:/...

    PHP实战天龙八部之仿爱奇艺电影网站

    本课程是php实战开发课程,以爱奇艺电影网站为蓝本从零开发一个自己的网站。目的是让大家了解真实项目的架构及开发过程

    独孤九贱(8)_php从零开始开发属于自己的php框架

    本课以一个极简的PHP开发框架为案例,向您展示了一个PHP框架应该具有的基本功能,以及具体的实现方法,让您快速对PHP开发框架的底层实现有一个清楚的认识,为以后学习其实的开发框架打下坚实的基础。

    独孤九贱(3)_JavaScript视频教程

    javascript是运行在浏览器上的脚本语言,连续多年,被评为全球最受欢迎的编程语言。是前端开发必备三大法器中,最具杀伤力。如果前端开发是降龙十八掌,好么javascript就是第18掌:亢龙有悔。...

    直播实录:PHP魔鬼训练营[从零开始制作个人博客]

    本站9月直播课已经结束,本套教程是直播实录,没有报上名或者漏听学员福利来了,赶紧看看吧,说不定这里就有你的菜

    2018前端入门_HTML5

    轻松明快,简洁生动,让你快速走入HTML5的世界,体会语义化开发的魅力

    JavaScript极速入门_玉女心经系列

    JavaScript能够称得上是史上使用最广泛的编程语言,也是前端开发必须掌握的三技能之一:描述网页内容的HTML、描述网页样式的CSS以及描述网页行为的JavaScript。本章节将帮助大家迅速掌握...

    独孤九贱(7)_Bootstrap视频教程

    Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。为所有开发者、所有应用场景而设计,它让前端开发更快速、简单,所有开发者都能快速上手...

    PHP用户注册登录系统视频教程

    《php用户注册登录系统》主要介绍网站的登录注册功能,我们会从最简单的实现登录注册功能开始,增加验证码,cookie验证等,丰富网站的登录注册功能

    独孤九贱(2)_CSS视频教程

    《php.cn独孤九贱(2)-css视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了CSS知识...

    PHP学生管理系统视频教程

    《PHP学生管理系统视频教程》主要给大家讲解了HTML,PHP,MySQL之间的相互协作,实现动态的网页显示和获取数据.

    独孤九贱(6)_jQuery视频教程

    jQuery是一个快速、简洁的JavaScript框架。设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的...

    弹指间学会HTML视频教程

    《弹指间学会HTML视频教程》从最基本的概念开始讲起,步步深入,带领大家学习HTML,了解各种常用标签的意义以及基本用法,学习HTML知识为以后的学习打下基础

    最新微信小程序开发视频教程

    《最新微信小程序开发视频教程》本节课程是由微趋道录制,讲述了如何申请一个微信小程序,以及开发中需要使用哪些工具,和需要注意哪些等。

    • 黄舟

      全栈工程师

    • 人生最曼妙的风景,竟是内心的淡定与从容!
    • 12001篇
      文章总数
    • 209
      文章总浏览数

    头条

    推荐视频教程

  • javascript初级视频教程
  • jquery 基础视频教程
  • javascript三级联动视频教程
  • 独孤九贱(3)_JavaScript视频教程
  • 独孤九贱(6)_jQuery视频教程
  • 最新更新