消消樂 遊戲 (三個消掉)Part 2

  • 1145
  • 0
  • 2013-01-21

摘要:消消樂 遊戲 (三個消掉)Part 2

SV簡直不敢相信,一個美好的星期六,一個早上會搞不定UI!

到了下午,還是使用暴力法Orz

本來想延用昨天的技巧,好不容易用VisibleChange改變所有pictureBox的顏色,才發現忘了眼睛是會騙人的......

原因是他一直在Change,所以我以為的跟我看到的是不同的sad

所以果然SV只適用暴力法XDDD

很哀傷的,目前的進度就是這樣:

在Form裡面:


public partial class Form1 : Form
    {
        int[,] pbArray = new int[8, 8];
        PictureBox[,] pbControl = new PictureBox[8, 8];
        public Form1()
        {
            InitializeComponent();
            Random gen = new Random(Guid.NewGuid().GetHashCode());
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    pbArray[i, j] = gen.Next(1, 5);
                }
            }
            #region pbControls
            pbControl[0, 0] = pb11;
            pbControl[0, 1] = pb12;
            pbControl[0, 2] = pb13;
            pbControl[0, 3] = pb14;
            pbControl[0, 4] = pb15;
            pbControl[0, 5] = pb16;
            pbControl[0, 6] = pb17;
            pbControl[0, 7] = pb18;

            pbControl[1, 0] = pb21;
            pbControl[1, 1] = pb22;
            pbControl[1, 2] = pb23;
            pbControl[1, 3] = pb24;
            pbControl[1, 4] = pb25;
            pbControl[1, 5] = pb26;
            pbControl[1, 6] = pb27;
            pbControl[1, 7] = pb28;

            pbControl[2, 0] = pb31;
            pbControl[2, 1] = pb32;
            pbControl[2, 2] = pb33;
            pbControl[2, 3] = pb34;
            pbControl[2, 4] = pb35;
            pbControl[2, 5] = pb36;
            pbControl[2, 6] = pb37;
            pbControl[2, 7] = pb38;

            pbControl[3, 0] = pb41;
            pbControl[3, 1] = pb42;
            pbControl[3, 2] = pb43;
            pbControl[3, 3] = pb44;
            pbControl[3, 4] = pb45;
            pbControl[3, 5] = pb46;
            pbControl[3, 6] = pb47;
            pbControl[3, 7] = pb48;

            pbControl[4, 0] = pb51;
            pbControl[4, 1] = pb52;
            pbControl[4, 2] = pb53;
            pbControl[4, 3] = pb54;
            pbControl[4, 4] = pb55;
            pbControl[4, 5] = pb56;
            pbControl[4, 6] = pb57;
            pbControl[4, 7] = pb58;

            pbControl[5, 0] = pb61;
            pbControl[5, 1] = pb62;
            pbControl[5, 2] = pb63;
            pbControl[5, 3] = pb64;
            pbControl[5, 4] = pb65;
            pbControl[5, 5] = pb66;
            pbControl[5, 6] = pb67;
            pbControl[5, 7] = pb68;

            pbControl[6, 0] = pb71;
            pbControl[6, 1] = pb72;
            pbControl[6, 2] = pb73;
            pbControl[6, 3] = pb74;
            pbControl[6, 4] = pb75;
            pbControl[6, 5] = pb76;
            pbControl[6, 6] = pb77;
            pbControl[6, 7] = pb78;

            pbControl[7, 0] = pb81;
            pbControl[7, 1] = pb82;
            pbControl[7, 2] = pb83;
            pbControl[7, 3] = pb84;
            pbControl[7, 4] = pb85;
            pbControl[7, 5] = pb86;
            pbControl[7, 6] = pb87;
            pbControl[7, 7] = pb88;
            #endregion
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    switch (pbArray[i, j])
                    {
                        case 1:
                            pbControl[i, j].Image = Resources.red;
                            break;
                        case 2:
                            pbControl[i, j].Image = Resources.green;
                            break;
                        case 3:
                            pbControl[i, j].Image = Resources.blue;
                            break;
                        case 4:
                            pbControl[i, j].Image = Resources.yellow;
                            break;
                    }
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        private void PB_Click(object sender, EventArgs e)
        {
            var pb = sender as PictureBox;

            if (pb != null)
            {
                pb.Visible = false;
            }
        }
    }

如果真的要說有什麼小技巧,那就是用#region 與#endregion將討人厭的地方包起來,

可以遮醜XDDDDD

不過這樣總算是可以安心把焦點放在pb_Click身上。

本來還去找了Controls這個東西,但是SV覺得好難就放棄。

但如果早上乖乖用暴力法,

應該已經coding三個就消除的地方吧?

於是畫面就很漂亮的是:

然後你會發現:

現成可以三個點一點的根本很少嘛!

Any way, 所以規則的設定很重要。

來談談那兩個陣列的意義吧!

第一個陣列pbArray是主要使用的陣列,他是用來紀錄哪個位置是什麼圖案。

也就是說pbArray[0,0]=2, 就是0,0這個位置(其實是我們命名的pb11)他所代表的顏色(圖案)是綠色,

因為SV設定1是紅色、2是綠色、3是藍色、4是黃色。為什麼是四種顏色呢?因為SV今天早上問姊姊三種圖案夠嗎,她說希望四種XDDDD

所以在Click就可以判斷哪一格的旁邊是什麼顏色,進而判斷是不是三個以上連在一起囉!

而要讓元件有消失的感覺,那就是用pbControl陣列,這樣的好處是用for迴圈來做動作以及判斷。

pbControl[0,0].Visible=false;

就是表示pb11這個pictureBox是看不到的,就有消失的感覺。

 

談到消失,如果要做動畫的感覺,其實可以做一點點的變化。

如果用昨天的方法,那麼所有元件的屬性基本上都不用修改。

想要做動畫感覺得消失來增加趣味性,就要使用timer了。

新增一個timer叫timerDispr, 代表要做消失動畫的timer。然後在他的事件Tick點兩點進入程式碼。


int row = 0;
        int col = 0;
        private void PB_Click(object sender, EventArgs e)
        {
            var pb = sender as PictureBox;

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

                timerDispr.Enabled = true;
            }
        }
        int tickDispr = 0;
        private void timerDispr_Tick(object sender, EventArgs e)
        {
            tickDispr++;
            if (tickDispr >= 1 && tickDispr < 2)
            {
                pbControl[row, col].Size = new Size(40, 40);
                pbControl[row, col].Location = new Point();
            }
            if (tickDispr >= 2)
            {
                pbControl[row, col].Visible = false;
                tickDispr = 0;
                timerDispr.Enabled = false;
            }
        }

cool 先來個圖解:

我們將被點到的pictureBox紀錄下來,也就是利用row和col,
減一是因為我們的tag是從(1,1)開始,但是陣列是從(0,0)開始^^
接著在timer事件裡製造動畫的假象。
你可以用Size來改變大小,讓圖案好像變小了,然後一直縮到最後看不到。
可是單純這樣做,你會發現Size的改變是從左上角開始,所以圖片就很奇怪的往左上角縮小!可是美觀與常理上,應該要是正中央縮小呀!
因為懶得改控制象的屬性(也許可以用控制象的屬性改變控制大小的座標點或什麼,但SV有64個控制單位,每個都調也太可憐了吧),
所以我們就用Location順便改變位置囉~SV超愛Location的

此例是用縮小一半到看不見為例。 你也可以分成縮小10單位、20單位、30單位...最後看不見。因為示範,單純用兩階段。 看了圖例,就可以慢慢分析,Location應該改成什麼位置了。 因為是縮小一半,因此最後的座標應該在原本位置X與Y分別加上(長與寬的一半/2)的位置。2是因為縮小成一半的關係。 因為SV的圖片是80X80大小,因此就是原來位置+40/2囉~ 所以改成這樣:


 private void timerDispr_Tick(object sender, EventArgs e)
        {
            tickDispr++;
            if (tickDispr >= 1 && tickDispr < 2)
            {
                pbControl[row, col].Size = new Size(40, 40);
                pbControl[row, col].Location = new Point(pbControl[row, col].Location.X + 20, pbControl[row, col].Location.Y + 20);
            }
            if (tickDispr >= 2)
            {
                pbControl[row, col].Visible = false;
                tickDispr = 0;
                timerDispr.Enabled = false;
            }
        }

這樣就有圖片點了就縮小到不見的感覺啦!(SV是覺得縮小一半就有很棒的動畫效果了)

這做法要小心,那就是pictureBox的SizeMode千萬不要用成stretchImage!否則就不會有圖片變化的變化了!

SV被這個害慘了Orz

另外,

也可以用透明度來產生其他消失的動畫。你可以想像ppt的"下一張"動畫,來衡量自己的消失有哪些方式,可以增加一點跟別人的消消樂不一樣的味道喔!

透明度的修改有幾張偷吃步的方法,

最簡單的就是你將圖片的資源增加已經修改透明度的圖片XDD

透過修改圖片來做假象~

話說回來,圖片資源可以這樣用:

點專案→[你的專案]屬性,然後在資源裡加入現有資源或新增(但是直接畫很刺激吧,小畫家都不行的人用滑鼠畫好嗎XDDD?)

接著就是這樣使用:

pb11.Image=Resources.[圖片];

Resources要將專案的屬性import(反正他會提示你,不用怕~)。

這樣的好處就是你可以用資源檔而不是讀檔,如此別人就無法用讀檔或超連結取得你的圖片了~

而且這樣真的超簡單使用的!!!!!

然後回到規則的部分,

SV希望:

點到後,圖片都往下移動。

等到真的只剩最後幾個後,就可以重新或者做其他像是關卡的設定。

 

下次再用直接的操作來演練囉~