摘要:消消樂 遊戲 (三個消掉)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(堆疊錯誤、一直遞迴之類的)
如果不想改變現狀,你可以從圖案來修改,
那就是想辦法強制它不要糾結在一起!
然而一般來說即使糾結在一起也應該要消掉,
所以符合遊戲原則的話,還是需要糾結啦!
等糾結問題解決後,
下個目標就是將圖片改變位置!
因為消到最後,圖片東一塊西一塊的......
但如果你把圖案往下遞補,可以增加完整性而且有的碰在一起又可以消更多了!
那麼為糾結問題加油吧
新增:
原來的遞迴跟本部需要用到......
糾結問題還沒解決,但如果你用固定關卡(就是事先固定排列長相),沒有糾結的話還是可以玩的。