消消樂 遊戲 (三個消掉)Part 3/1

  • 1271
  • 0

摘要:消消樂 遊戲 (三個消掉)Part 3/1

昨天和姐姐歡樂的與她同事聚會~所以想程式想的很心不在焉XDDD

不過我玩的很開心就是^^

關於三個連在一起的部份,終於有一點頭緒了。

不過還不能高興太早,

我很快就抓到bug了@@

所以解法希望在Part 3/2再分享給大家,

喜歡邊做邊學的人可以自己先研究研究喔~

接下來就是把焦點放在click,

先上部分程式碼:

        bool[,] isSame = new bool[8, 8];
        int row = 0;
        int col = 0;
        private void PB_Click(object sender, EventArgs e)
        {
            var pb = sender as PictureBox;

            if (pb != null)
            {
               
                row = Convert.ToInt16(pb.Tag.ToString().Substring(0, 1))-1;
                col = Convert.ToInt16(pb.Tag.ToString().Substring(1, 1))-1;

                #region three to dispeared
                //三個以上連在一起的判斷
                
                isSame[row, col] = true;
                isConnectedTop(row, col);
                isConnectedLeft(row, col);
                isConnectedDown(row, col);
                isConnectedRight(row, col);
                int isThreeConnect = connect1 + connect2 + connect3 + connect4;
                if (isThreeConnect >= 2)
                {
                    ToDisppeared();
                }
                else
                {
                    connect1 = 0;
                    connect2 = 0;
                    connect3 = 0;
                    connect4 = 0;
                }
                #region 歸零
                //歸零,給下一個用
                for (int i = 0; i < 8; i++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        isSame[i, j] = false;
                    }
                }
                connect1 = 0;
                connect2 = 0;
                connect3 = 0;
                connect4 = 0;
                row = 0;
                col = 0;
                #endregion
                #endregion
            }
        }
        private void ToDisppeared()
        {
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    if (isSame[i, j] == true)
                    {
                        //標記為true的就消失
                        pbControl[i, j].Visible = false;
                    }
                }
            }
            
        }
        int connect1 = 0;
        
        private void isConnectedTop(int rows, int cols)
        {
            if (rows - 1 >= 0)
            {
                if (pbArray[rows - 1, cols] == pbArray[row, col])
                {
                    //上方
                    isSame[rows - 1, cols] = true;
                    connect1++;
                    isConnectedLeft(rows - 1, cols);
                    isConnectedRight(rows - 1, cols);
                    isConnectedTop(rows - 1, cols);
                }
            }
        }
        int connect2 = 0;
        
        private void isConnectedLeft(int rows, int cols)
        {
            if (cols - 1 >= 0)
            {
                if (pbArray[rows, cols - 1] == pbArray[row, col])
                {
                    //左方
                    isSame[rows, cols - 1] = true;
                    connect2++;
                    isConnectedDown(rows, cols - 1);
                    isConnectedLeft(rows, cols - 1);
                    isConnectedTop(rows, cols - 1);
                }
            }
        }
        int connect3 = 0;
        
        private void isConnectedDown(int rows, int cols)
        {
            if (rows + 1 <= 7)
            {
                if (pbArray[rows + 1, cols] == pbArray[row, col])
                {
                    //下方
                    isSame[rows + 1, cols] = true;
                    connect3++;
                    isConnectedRight(rows + 1, cols);
                    isConnectedDown(rows + 1, cols);
                    isConnectedLeft(rows + 1, cols);
                    
                }
            }
        }
        int connect4 = 0;
        
        private void isConnectedRight(int rows, int cols)
        {
            if (cols + 1 <= 7)
            {
                if (pbArray[rows, cols + 1] == pbArray[row, col])
                {
                    //右方
                    isSame[rows, cols + 1] = true;
                    connect4++;
                    isConnectedDown(rows, cols + 1);
                    isConnectedTop(rows, cols + 1);
                    isConnectedRight(rows, cols + 1);
                }
            }
        }

 

 

isSame是用來判斷哪些需要消掉的陣列。

所以到了ToDisppeared就可以看isSame哪些是true,就讓圖案看不見(也就是消掉)。

雖然前天介紹過動畫版消掉,但為了節省麻煩,還是用Visible來控制就好XDDD

下面就是每一格都要比較它的上下左右有沒有一樣,

一樣就把connect1~4對應的相加,表示他的上方有幾個、左方有幾個、下方有幾個、右方有幾個.....

isThreeConnect則是判斷是否3個以上連在一起?

isThreeConnect只需判斷兩個的原因是因為自己也是一個,所以自己加另外兩個就能消掉了!

然而問題來了,

如果都是很單純的圖案,基本上都可用。

但是到了有四個在一起的像'口'這樣的圖案就完蛋了!

像上面這樣,不管什麼形狀,只要有一組這樣糾結在一起,它就出錯了Orz(堆疊錯誤、一直遞迴之類的)

如果不想改變現狀,你可以從圖案來修改,

那就是想辦法強制它不要糾結在一起!

然而一般來說即使糾結在一起也應該要消掉,

所以符合遊戲原則的話,還是需要糾結啦!

 

等糾結問題解決後,

下個目標就是將圖片改變位置!

因為消到最後,圖片東一塊西一塊的......

但如果你把圖案往下遞補,可以增加完整性而且有的碰在一起又可以消更多了!

 

那麼為糾結問題加油吧cheeky

 

新增:

原來的遞迴跟本部需要用到......

糾結問題還沒解決,但如果你用固定關卡(就是事先固定排列長相),沒有糾結的話還是可以玩的。