国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

利用PHP實現開心消消樂的算法示例

2024-05-04 21:50:06
字體:
來源:轉載
供稿:網友

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

二、上代碼:

  1. <?php 
  2. //所有圖形初始化數據,key代表位置,value代表顏色 
  3. $xxl = array
  4.  array(''''''''''''''''), 
  5.  array(''''''''''''''''), 
  6.  array(''''''''''''''''), 
  7.  array(''''''''''''''''), 
  8.  array(''''''''''''''''), 
  9.  array(''''''''''''''''), 
  10.  array(''''''''''''''''), 
  11.  array(''''''''''''''''), 
  12. ); 
  13. $point = play($xxl$point);//開始游戲 
  14. echo "/n共獲得積分數量:{$point}"
  15.   
  16. /*開始消除 
  17.  *$xxl  array 所有圖形集合 
  18.  *$point int  獲得積分數量 
  19. */ 
  20. $bu = 0; 
  21. function play($xxl$point){ 
  22.  global $bu
  23.  $bu ++; 
  24.  echo '=================================開始第'.$bu.'步=================================='
  25.  $color = array(1 => 'red',2 => 'green',3 => 'yellow',4 => 'blue',5 => 'black');//代表5種顏色 
  26.  $samCol = array();//列上相連色塊集合 
  27.  $nowCol = array();//列上相連色塊指針 
  28.  $samArr = array();//相連色塊總集合 
  29.  $group = 1;//組指針 
  30.   
  31.  //隨機填充顏色,并獲得行上相連色塊start 
  32.  foreach($xxl as $k1 => $v1){ 
  33.   $sam = array();//行上相連色塊集合 
  34.   $now = 1;//行上相連色塊指針 
  35.   foreach($v1 as $k2 => $v2){ 
  36.    if(emptyempty($v2) || $v2 == ' '){ 
  37.     $v2 = $xxl[$k1][$k2] = array_rand($color);//隨機填充顏色 
  38.    } 
  39.    if(!isset($nowCol[$k2])){ 
  40.     $nowCol[$k2] = 1; 
  41.    } 
  42.    if($k1 === 0){ 
  43.     $samCol[$k2][$nowCol[$k2]][$k1 .'-'$k2] = array($k1$k2$v2$k1 .'-'$k2 .'-'$v2); 
  44.    }else
  45.     if($v2 != $xxl[$k1-1][$k2]){//同一列上和前一個顏色不一樣 
  46.      $nowCol[$k2] ++; 
  47.     } 
  48.     $samCol[$k2][$nowCol[$k2]][$k1 .'-'$k2] = array($k1$k2$v2$k1 .'-'$k2 .'-'$v2); 
  49.    } 
  50.   
  51.   
  52.    if($k2 === 0){ 
  53.     $sam[$now][$k1 .'-'$k2] = array($k1$k2$v2$k1 .'-'$k2 .'-'$v2); 
  54.    }else
  55.     if($v2 != $xxl[$k1][$k2-1]){//同一行上和前一個顏色不一樣 
  56.      $now++; 
  57.     } 
  58.     $sam[$now][$k1 .'-'$k2] = array($k1$k2$v2$k1 .'-'$k2 .'-'$v2); 
  59.    } 
  60.   } 
  61.   //獲得行上相連色塊start 
  62.   foreach($sam as $x => $y){ 
  63.    if(count($y) > 2){ 
  64.     $key = 'R-'.$group
  65.     foreach($y as $x2 => $y2){ 
  66.      $y[$x2]['group']['r'] = $key
  67.     } 
  68.     $samArr += $y
  69.     $group ++; 
  70.    } 
  71.   } 
  72.   //獲得行上相連色塊end 
  73.  } 
  74.  //隨機填充顏色,并獲得行上相連色塊end 
  75.   
  76.  //獲得列上相連色塊start 
  77.  $group = 1; 
  78.  foreach($samCol as $k => $v){ 
  79.   foreach($v as $x => $y){ 
  80.    if(count($y) > 2){ 
  81.     $key = 'L-'.$group
  82.     foreach($y as $x2 => $y2){ 
  83.      $y[$x2]['group']['l'] = $key
  84.      if(isset($samArr[$x2]['group']['r'])){//判斷本點是否已出現在橫向組里 
  85.       $samArr[$x2]['group']['l'] = $key
  86.      } 
  87.     } 
  88.     $samArr += $y
  89.     $group ++; 
  90.    } 
  91.   } 
  92.  } 
  93.  //獲得列上相連色塊end 
  94.   
  95.  //查找相連色塊start 
  96.  $res = array();//相連色塊集合 
  97.  $hasRes = array(); 
  98.  foreach($samArr as $k => $v){ 
  99.   if(isset($hasRes[$k])){ 
  100.    continue
  101.   } 
  102.   $arr = array(); 
  103.   seek($samArr$v$arr); 
  104.   $res[] = array_keys($arr); 
  105.   $hasRes += $arr
  106.  } 
  107.  //查找相連色塊end 
  108.  show($xxl);//打印消除前的圖形 
  109.  if(emptyempty($res)){//如果沒有相連色塊則退出遞歸 
  110.   echo '=================================消除完畢!=================================='
  111.   return $point
  112.  } 
  113.  $thisPoint = countPoint($res);//計算本次消除獲得積分 
  114.  $point += $thisPoint;//累計到總積分 
  115.   
  116.  //消除相連色塊start 
  117.  $next = $xxl
  118.  foreach($res as $k => $v){ 
  119.   foreach($v as $k2 => $v2){ 
  120.    $y = $samArr[$v2][0]; 
  121.    $x = $samArr[$v2][1]; 
  122.    $xxl[$y][$x] = '*'
  123.    unset($next[$y][$x]); 
  124.   } 
  125.  } 
  126.  //消除相連色塊end 
  127.   
  128.  show($xxl);//打印消除時的圖形 
  129.  $next = step($next); 
  130.  show($next);//打印消除后的圖形 
  131.  echo "本次消除獲得積分數量:{$thisPoint}/n"
  132.  return play($next$point); 
  133.   
  134. /*計算獲得積分數量 
  135.  *$xxl  array 相連色塊集合 
  136.  */ 
  137. function countPoint($xxl){ 
  138.  //初始化積分配置start 
  139.  $config = array(3 => 10, 4 => 15, 5 => 20, 6 => 30, 7 => 40, 8 => 70, 9 => 100); 
  140.  for($i = 10; $i <= 64; $i++){ 
  141.   $config[$i] = 100 + ($i - 9) * 50; 
  142.  } 
  143.  //初始化積分配置end 
  144.  $point = 0; 
  145.  foreach($xxl as $v){ 
  146.   $key = count($v); 
  147.   $point += $config[$key]; 
  148.  } 
  149.  return $point
  150.   
  151. /*消掉并左移 
  152.  *$xxl  array 所有圖形集合 
  153.  */ 
  154. function step($xxl){ 
  155.  foreach($xxl as $k => $v){ 
  156.   $temp = array_merge($v); 
  157.   $count = count($temp); 
  158.   if($count == 8){ 
  159.    continue
  160.   } 
  161.   for($i = $count$i <= 7; $i++){ 
  162.    $temp[$i] = ' '
  163.   } 
  164.   $xxl[$k] = $temp
  165.  } 
  166.  return $xxl
  167.   
  168. /*找相鄰點 
  169.  *$xxl  array 相連圖形集合 
  170.  *$one   array 某一個點 
  171.  *$arr   array 圖形集合里的相鄰的點 
  172. */ 
  173. function seek($xxl$one, &$arr){ 
  174. // global $i; 
  175.  $near = array(); 
  176.  $near['up'] = ($one[0] - 1).'-'.$one[1];//上面的點 
  177.  $near['down'] = ($one[0] + 1).'-'.$one[1];//下面的點 
  178.  $near['left'] = $one[0].'-'.($one[1] - 1);//左面的點 
  179.  $near['right'] = $one[0].'-'.($one[1] + 1);//右面的點 
  180.  foreach($near as $v){ 
  181.   if(isset($xxl[$v]) && $xxl[$v][2] == $one[2]){//找到相鄰點 
  182.    $xj = array_intersect($one['group'], $xxl[$v]['group']); 
  183.    if(emptyempty($xj)){//如果相鄰的點不是本組的就跳過 
  184.     continue
  185.    } 
  186.    if(isset($arr[$v])){//如果該點已被遍歷過則跳過 
  187.     continue
  188.    } 
  189.    $arr[$v] = $xxl[$v]; 
  190.    seek($xxl$xxl[$v], $arr);//繼續找相鄰的點 
  191.   } 
  192.  } 
  193.   
  194. /*打印圖形 
  195.  *$xxl  array 所有圖形集合 
  196.  */ 
  197. function show($xxl){ 
  198.  //順時針旋轉矩陣start 
  199.  $arr = array(); 
  200.  foreach($xxl as $k => $v){ 
  201.   foreach($v as $k2 => $v2){ 
  202.    $arr[7-$k2][$k] = $v2
  203.   } 
  204.  } 
  205.  ksort($arr); 
  206.  //順時針旋轉矩陣end 
  207.  $str = ''
  208.  foreach($arr as $v){ 
  209.   foreach($v as $v2){ 
  210.    $str .= ' '.$v2
  211.   }//Vevb.com 
  212.   $str .= "/n"
  213.  } 
  214.  echo "/n".$str

運行結果如下:

12345分別代表5種顏色。

  1. =================================開始第1步================================== 
  2.  3 3 2 2 1 1 1 4 
  3.  4 3 4 3 4 1 1 3 
  4.  3 1 4 1 1 4 1 2 
  5.  2 3 4 3 1 2 4 4 
  6.  4 2 4 2 2 2 1 4 
  7.  3 3 2 1 2 3 1 1 
  8.  5 2 1 3 2 1 4 5 
  9.  3 4 5 1 3 2 3 3 
  10.   
  11.  3 3 2 2 * * * 4 
  12.  4 3 * 3 4 1 * 3 
  13.  3 1 * 1 1 4 * 2 
  14.  2 3 * 3 1 2 4 4 
  15.  4 2 * * * * 1 4 
  16.  3 3 2 1 * 3 1 1 
  17.  5 2 1 3 * 1 4 5 
  18.  3 4 5 1 3 2 3 3 
  19.   
  20.  3 3   4 
  21.  4 3 2  3 
  22.  3 1 3 1 2 
  23.  2 3 1 4 4 4 
  24.  4 2 2 3 4 2 1 4 
  25.  3 3 2 1 1 3 1 1 
  26.  5 2 1 3 1 1 4 5 
  27.  3 4 5 1 3 2 3 3 
  28. 本次消除獲得積分數量:55 
  29. =================================開始第2步================================== 
  30.  3 3 2 2 3 3 2 4 
  31.  4 3 3 2 1 3 3 3 
  32.  3 1 3 3 4 1 4 2 
  33.  2 3 5 1 2 4 4 4 
  34.  4 2 2 3 4 2 1 4 
  35.  3 3 2 1 1 3 1 1 
  36.  5 2 1 3 1 1 4 5 
  37.  3 4 5 1 3 2 3 3 
  38.   
  39.  3 3 2 2 3 3 2 4 
  40.  4 3 3 2 1 * * * 
  41.  3 1 3 3 4 1 4 2 
  42.  2 3 5 1 2 * * * 
  43.  4 2 2 3 4 2 1 4 
  44.  3 3 2 1 1 3 1 1 
  45.  5 2 1 3 1 1 4 5 
  46.  3 4 5 1 3 2 3 3 
  47.   
  48.  3 3 2 2 3   
  49.  4 3 3 2 1   
  50.  3 1 3 3 4 3 2 4 
  51.  2 3 5 1 2 1 4 2 
  52.  4 2 2 3 4 2 1 4 
  53.  3 3 2 1 1 3 1 1 
  54.  5 2 1 3 1 1 4 5 
  55.  3 4 5 1 3 2 3 3 
  56. 本次消除獲得積分數量:20 
  57. =================================開始第3步================================== 
  58.  3 3 2 2 3 4 1 3 
  59.  4 3 3 2 1 4 2 5 
  60.  3 1 3 3 4 3 2 4 
  61.  2 3 5 1 2 1 4 2 
  62.  4 2 2 3 4 2 1 4 
  63.  3 3 2 1 1 3 1 1 
  64.  5 2 1 3 1 1 4 5 
  65.  3 4 5 1 3 2 3 3 
  66. =================================消除完畢!================================== 
  67. 共獲得積分數量:75 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 恭城| 桐庐县| 象山县| 南投县| 都安| 丹凤县| 安宁市| 开原市| 巩留县| 阿拉善盟| 个旧市| 澄城县| 大荔县| 色达县| 江永县| 休宁县| 张家港市| 营口市| 阿瓦提县| 尼木县| 遂川县| 宁城县| 肥西县| 内江市| 昌江| 尼勒克县| 奉新县| 蛟河市| 拉孜县| 聂荣县| 康平县| 永嘉县| 彰化市| 邛崃市| 夏邑县| 额济纳旗| 若羌县| 大名县| 大足县| 旬阳县| 永清县|