久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

利用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;
}

運行結果如下:

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 精品视频一区二区三区 | 久久99国产精一区二区三区 | 国产96色在线 | 午夜久久久久久久久久一区二区 | 亚洲精品99| 国产美女在线免费观看 | 成人免费视频 | 亚洲性视频在线 | 日日日色| 国产精品久久久久久久7电影 | 国产精品日韩一区二区 | 亚洲自拍偷拍欧美 | 国产98色在线 | 日韩 | 国产高清一区二区三区 | 超碰网址| 国产欧美日韩一区二区三区 | 成人毛片视频在线播放 | 久久久久久久网 | 欧美另类视频 | 久久精品国产精品青草 | 国产精品久久久久久久免费观看 | 精品国产欧美一区二区三区成人 | 日韩免费高清视频 | 爱操av | 91av在线免费播放 | 一区二区av | 亚州毛片 | 美女久久久久久久久 | 日日摸夜夜爽人人添av | 中文字幕av第一页 | 欧美午夜精品理论片a级按摩 | 91社影院在线观看 | 欧美日韩在线视频一区二区 | 91中文字幕在线观看 | 男人的天堂在线视频 | 久久久久国产精品www | 爽爽免费视频 | 97视频在线免费 | 成人三区四区 | 午夜精品一区二区三区在线观看 | 中文字幕一区二区三区四区 |