S型for迴圈 (for迴圈的非一般用法)

  • 1903
  • 0

摘要: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的小遊戲需要用到,

就分享給大家囉~
要是下篇要介紹如何判斷遊戲結束,就請大家回來看看這篇就知道意思囉angel

 

不過因為SV沒有實作,只是模擬,實際效果要測試測試(要注意陣列是不是超過index)~
這些奇怪的for迴圈可能遊戲才會使用到吧XDDDD

 

修改:
不好意思,剛剛實測後,發現自己竟然把它變成無窮迴圈了(因為我忘了把j--而不是j++)!
所以如果是相反數過來的(不是0~n),就要用--喔~