用PHP實現開心消消樂演算法

2021-09-14 07:55:56 字數 4706 閱讀 4622

一、需求描述:

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共獲得積分數量:";

/*開始消除

*$xxl array 所有圖形集合

*$point int 獲得積分數量

*/$bu = 0;

function play($xxl, $point)

if(!isset($nowcol[$k2]))

if($k1 === 0)else

$samcol[$k2][$nowcol[$k2]][$k1 .'-'. $k2] = array($k1, $k2, $v2, $k1 .'-'. $k2 .'-'. $v2);

}if($k2 === 0)else

$sam[$now][$k1 .'-'. $k2] = array($k1, $k2, $v2, $k1 .'-'. $k2 .'-'. $v2);}}

//獲得行上相連色塊start

foreach($sam as $x => $y)

$samarr += $y;

$group ++;}}

//獲得行上相連色塊end

}//隨機填充顏色,並獲得行上相連色塊end

//獲得列上相連色塊start

$group = 1;

foreach($samcol as $k => $v)

}$samarr += $y;

$group ++;}}

}//獲得列上相連色塊end

//查詢相連色塊start

$res = array();//相連色塊集合

$hasres = array();

foreach($samarr as $k => $v)

$arr = array();

seek($samarr, $v, $arr);

$res = array_keys($arr);

$hasres += $arr;

}//查詢相連色塊end

show($xxl);//列印消除前的圖形

if(empty($res))

$thispoint = countpoint($res);//計算本次消除獲得積分

$point += $thispoint;//累計到總積分

//消除相連色塊start

$next = $xxl;

foreach($res as $k => $v)

}//消除相連色塊end

show($xxl);//列印消除時的圖形

$next = step($next);

show($next);//列印消除後的圖形

echo "本次消除獲得積分數量:\n";

return play($next, $point);

}/*計算獲得積分數量

*$xxl array 相連色塊集合

*/function countpoint($xxl)

//初始化積分配置end

$point = 0;

foreach($xxl as $v)

return $point;

}/*消掉並左移

*$xxl array 所有圖形集合

*/function step($xxl)

for($i = $count; $i <= 7; $i++)

$xxl[$k] = $temp;

}return $xxl;

}/*找相鄰點

*$xxl array 相連圖形集合

*$one array 某乙個點

*$arr array 圖形集合裡的相鄰的點

*/function seek($xxl, $one, &$arr)

if(isset($arr[$v]))

$arr[$v] = $xxl[$v];

seek($xxl, $xxl[$v], $arr);//繼續找相鄰的點}}

}/*列印圖形

*$xxl array 所有圖形集合

*/function show($xxl)

}ksort($arr);

//順時針旋轉矩陣end

$str = '';

foreach($arr as $v)

$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

開心消消樂分析

開心消消樂的出現,帶給我新的感受。1.介面很漂亮,沒有了那種極簡風格。2.利用了qq的關係,加入社交元素,向好友求助等功能使人們把自己的好友拉進來一起玩。3.遊戲中限制很多,每天一開始預設發30個精力值,每玩一關就消耗5個精力值。當精力值沒有的時候,可以向好友求助,每個好友可以傳送乙個精力值給你,而...

消消樂實現下墜 教你用Vue寫乙個開心消消樂

之前做過乙個演算法題,演算法要求就是寫乙個開心消消樂的邏輯演算法,當時也是考慮了一段時間才做出來。後來想了想,既然核心演算法都有了,能不能實現乙個開心消消樂的小遊戲呢,於是花了兩天時間做了乙個小遊戲出來。效果展示 預覽位址 遊戲規則 初始時會給玩家十分的初始分,每拖動一次就減一分,每消除乙個方塊就加...

python實現消消樂遊戲 C語言實現消消樂遊戲

問題描述 給定乙個矩陣,判斷移動哪乙個格仔,可以實現消除。定義連續三個即可消除 據說是華為的筆試題。分析先寫乙個函式,判斷包含 i,j 的格仔是否可能實現消除。然後就是向右向下交換,然後呼叫上面寫好的函式判斷 被交換的兩個格仔是否實現消除。重點是 1 只需要向右向下交換,因為遍歷的時候,後面的交換會...