偶然間看到的消消看,就是三個或者以上的會消去,就隨手寫了寫,當時還是汕頭,那一天沒事兒,剛好有些想法,就寫了寫,
只是一個初稿,沒有積分或者下一關
大概思路:
整個界面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