wpf 消消看(附源代碼)


偶然間看到的消消看,就是三個或者以上的會消去,就隨手寫了寫,當時還是汕頭,那一天沒事兒,剛好有些想法,就寫了寫,

只是一個初稿,沒有積分或者下一關

大概思路:
整個界面9*9 81個格子,通過9行9列進行判定,消去還是重新生成,內部有兩個線程,一個控制界面消去,另外一個控制圖片從上往下落

        //64位數組,存儲64個圖片
        private ImageShow[,] imageList = new ImageShow[8, 8];
        //圖片固定大小尺寸
        private const int ImageSize = 94;
        //兩個已經被選中的圖片
        bool FirClick = false;
        bool SecClick = false;
        bool IsFir = false;
        int FirRow = 0;
        int FirCol = 0;
        int SecRow = 0;
        int SecCol = 0;
        Random rd = new Random();
        //控制消失動畫線程
        DispatcherTimer dispathcertimer=new DispatcherTimer();

        //控制新產生的圖片動畫
        DispatcherTimer dispatchCreate = new DispatcherTimer();

因為有7個圖片,所以隨即選擇圖片,用自帶的random就行,在圖片類里有這兩個方法

     
        public void Hide()
        {
            DoubleAnimation shadeOut = new DoubleAnimation(0, new Duration(TimeSpan.FromSeconds(0.3)));
            shadeOut.Completed += new EventHandler(shadeOut_Completed);
            image.BeginAnimation(Image.OpacityProperty, shadeOut);
        }

        void shadeOut_Completed(object sender, EventArgs e)
        {
            DoubleAnimationUsingKeyFrames animation = new DoubleAnimationUsingKeyFrames();
            animation.Duration = new Duration(TimeSpan.FromSeconds(0.3));
            animation.KeyFrames.Add(new LinearDoubleKeyFrame(1.1, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.1))));
            animation.KeyFrames.Add(new LinearDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.4))));

           
            this.BeginAnimation(Image.OpacityProperty,animation, HandoffBehavior.SnapshotAndReplace);
        }

用動畫控制圖片的消去


主界面上主要是這個算法:

        /// <summary>
        /// 后台啟動動畫填充事件
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="e"></param>
        private void dispatchCreate_Tick(object obj, EventArgs e)
        {
            //啟動動畫板
            Storyboard sb = new Storyboard();
            //ImageSize

            #region  以前寫的算法
            for (int i = 0; i < 8; i++)
            {
                //初始為第行,如果遇到狀態是1的,則開始計數
                int temp = 0;
                for (int j = 0; j < 8; j++)
                {
                    if (imageList[j, i].GetImageState == 1)
                    {
                        temp++;

                        if (j == 7)
                        {
                            //找到最頂端沒有消失的圖片,只用關注行就可以了
                            int judgy = j - temp - 1;

                            for (int m = j; m >= 0; m--)
                            {
                                DoubleAnimation da;

                                if (judgy >= 0)
                                {
                                    imageList[m, i] = imageList[judgy, i];
                                    da = new DoubleAnimation(ImageSize * judgy, ImageSize * m, new Duration
                            (TimeSpan.FromMilliseconds(200 * temp)));
                                    //imageList[j-m-1, i].BeginAnimation(Canvas.TopProperty, da);

                                }
                                else
                                {
                                    ImageShow imageshow = new ImageShow(rd.Next(1, 7), 0, 0);
                                    carr.Children.Add(imageshow);
                                    Canvas.SetLeft(imageshow, i * ImageSize);
                                    Canvas.SetTop(imageshow, judgy * ImageSize);
                                    imageList[m, i] = imageshow;
                                    da = new DoubleAnimation(ImageSize * judgy, ImageSize * m, new Duration
                                (TimeSpan.FromMilliseconds(200 * temp)));
                                    //imageList[j - m - 1, i].BeginAnimation(Canvas.TopProperty, da);

                                }

                                Storyboard.SetTarget(da, imageList[m, i]);
                                Storyboard.SetTargetProperty(da, new PropertyPath("(Canvas.Top)"));
                                sb.Children.Add(da);
                                judgy--;
                            }
                            temp = 0;
                        }
                    }
                    else if (temp > 0 && imageList[j, i].GetImageState == 0)
                    {
                        //找到最頂端沒有消失的圖片,只用關注行就可以了
                        int judgy = j - temp - 1;

                        for (int m = j - 1; m >= 0; m--)
                        {
                            DoubleAnimation da;

                            if (judgy >= 0)
                            {
                                imageList[m, i] = imageList[judgy, i];
                                da = new DoubleAnimation(ImageSize * judgy, ImageSize * m, new Duration
                        (TimeSpan.FromMilliseconds(200 * temp)));
                                //imageList[j-m-1, i].BeginAnimation(Canvas.TopProperty, da);

                            }
                            else
                            {
                                ImageShow imageshow = new ImageShow(rd.Next(1, 7), 0, 0);
                                carr.Children.Add(imageshow);
                                Canvas.SetLeft(imageshow, i * ImageSize);
                                Canvas.SetTop(imageshow, judgy * ImageSize);
                                imageList[m, i] = imageshow;
                                da = new DoubleAnimation(ImageSize * judgy, ImageSize * m, new Duration
                            (TimeSpan.FromMilliseconds(200 * temp)));
                                //imageList[j - m - 1, i].BeginAnimation(Canvas.TopProperty, da);

                            }

                            Storyboard.SetTarget(da, imageList[m, i]);
                            Storyboard.SetTargetProperty(da, new PropertyPath("(Canvas.Top)"));
                            sb.Children.Add(da);
                            judgy--;
                        }
                        temp = 0;
                    }
                }
            }
            #endregion
            
            sb.Begin();
            dispatchCreate.Stop();
            for (int l = 0; l < 8; l++)
            {
                for (int k = 0; k < 8; k++)
                {
                    imageList[l, k].GetImageState = 0;
                
                }
            }
            //dispathcertimer.Tick += new EventHandler(dispathcertimer_Tick);
            //dispathcertimer.Interval = TimeSpan.FromMilliseconds(60);
            dispathcertimer.Start();
        }

通過9*9行列判斷,判斷哪個位置空缺,然后重新生成幾個圖片,從上往下用動畫控制落下,沒有專門寫一個控制動畫類

單純為了功能而實現功能

 

消去和補充加上了,基本就是相當於一個消消看的雛形,至於積分或者下一關之類的,如果朋友有興趣,可以繼續弄,只是提供一個思路,代碼風格或者冗余方法都不在考慮之中,畢竟只是一天時間突然奇想寫的,會有bug和不足,僅作參考,若有興趣,可以討論

 

源碼:files.cnblogs.com/fish124423/Dip.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM