摘要:S型for迴圈 (for迴圈的非一般用法)
為了"消消樂遊戲"查遍所有圖案,
以判斷是否已經全點完了(沒有三個連在一起),
SV絞盡了腦汁~
果然"知識非瀑布式",
之前所以為的跟實作的不太一樣。
判斷是否全點完的方法應該是找出有沒有固定形式?
因為三個連在一起的圖案有六種:
| L 「 」 __ ┐
然後判斷每個陣列是否有這樣的形式(也就是之前的color陣列)。
詳細情況下次再說!
這次來個簡單一點的小技巧!
因為要思考從哪裡開始點擊,所以for迴圈讓我思考很久!
現在把二維矩陣想像成我的那個小遊戲,
然後思考:
一般的for迴圈是這樣的(從左到右,從上到下):
// 00 01 02 03 04 05 ------>
// 10 11 12 13 14 15 ------>
// 20 21 22 23 24 25 ------>
// 30 31 32 33 34 35 ------>
// 40 41 42 43 44 45 ------>
// 50 51 52 53 54 55 ------>
for($i=0;$i<6;$i++)
{
for($j=0;$j<6;$j++)
{
$array[$i][$j]="$i"."$j";
}
}
SV是用PHP寫虛擬碼~
其實SV以前都不知道for迴圈到底怎麼跑的......真是慚愧呀Orz
終於為了遊戲搞懂它XDDDD
此遊戲需要用倒S的for迴圈(因為圖案是集中在左邊),
所以先來學一下S型迴圈吧:
// 05 04 03 02 01 00 |-----
// 10 11 12 13 14 15 ˇ----|
// 25 24 23 22 21 20 |----ˇ
// 30 31 32 33 34 35 ˇ----|
// 45 44 43 42 41 40 |----ˇ
// 50 51 52 53 54 55 ˇ----|
// <----ˇ
for($i=0;$i<6;$i++)
{
if(($i%2)==0)
{
//0,2,4,....
for($j=5;$j>=0;$j--)
{
$array2[$i][$j]="$i"."$j";
}
}
else
{
for($j=0;$j<6;$j++)
{
$array2[$i][$j]="$i"."$j";
}
}
}
請原諒SV的鬼畫幅示意圖XDD
也就是從右邊判斷到左邊然後往下回到右邊判斷。
用array2表示跟一般的for迴圈用法不太一樣。
也就是說,除了偶數列,奇數列都是跟平常沒什麼兩樣的~
因此,倒S型就變成這樣:
// 00 01 02 03 04 05 -----|
// 15 14 13 12 11 10 |----ˇ
// 20 21 22 23 24 25 ˇ----|
// 35 34 33 32 31 30 |----ˇ
// 40 41 42 43 44 45 ˇ----|
// 55 54 53 52 51 50 |----ˇ
// ˇ---->
for($i=0;$i<6;$i++)
{
if((($i+1)%2)==0)
{
//1,3,5,....
for($j=5;$j>=0;$j--)
{
$array2[$i][$j]="$i"."$j";
}
}
else
{
for($j=0;$j<6;$j++)
{
$array2[$i][$j]="$i"."$j";
}
}
}
變成奇數列的部分要相反。
若是跟一般的for迴圈相反,很簡單:
// 05 04 03 02 01 00 <------
// 15 14 13 12 11 10 <------
// 25 24 23 22 21 20 <------
// 35 34 33 32 31 30 <------
// 45 44 43 42 41 40 <------
// 55 54 53 52 51 50
for($i=0;$i<5;$i++)
{
for($j=5;$j>=0;j--)
{
$array2[$i][$j]="$i"."$j";
}
}
那麼如果我的S型是直線的呢?
// 50 40 30 20 10 00 >-ˇ >-ˇ >-ˇ
// 01 11 21 31 41 51 | | | | | |
// 52 42 32 22 12 02 | | | | | |
// 03 13 23 33 43 53 | | | | | |
// 54 44 43 42 41 40 | | | | | |
// 05 15 25 35 45 55 | >-^ >-^ ˇ
//
for($i=0;$i<6;$i--)
{
if((($i+1)%2)==0)
{
//1,3,5,....
for($j=5;$j>=0;$j--)
{
$array2[$j][$i]="$j"."$i";
}
}
else
{
for($j=0;$j<6;$j++)
{
$array2[$j][$i]="$j"."$i";
}
}
}
你會覺得,咦?怎麼跟S型很像?對呀!就是在陣列做手腳就可以了^^也就是陣列的i, j互換。
剩下的就是依樣畫葫蘆就好囉~
可能一般情況很少會用到,
剛好SV的小遊戲需要用到,
就分享給大家囉~
要是下篇要介紹如何判斷遊戲結束,就請大家回來看看這篇就知道意思囉
不過因為SV沒有實作,只是模擬,實際效果要測試測試(要注意陣列是不是超過index)~
這些奇怪的for迴圈可能遊戲才會使用到吧XDDDD
修改:
不好意思,剛剛實測後,發現自己竟然把它變成無窮迴圈了(因為我忘了把j--而不是j++)!
所以如果是相反數過來的(不是0~n),就要用--喔~