1、C# WPF新手入门之连连看关卡版3关C# WPF新手入门之连连看关卡版(3关)之前做了个连连看简单版,只一关,可参见我的文库相关文档,这次增加了关卡,总共三关,并且可以选择关卡,播放不同背景音乐,歌名滚动显示。效果如下:第一关,8*8网格,共8种图片,每种图片出现8次,时间5分钟,背景音乐选择1第二关,10*10网格,共10种图片,每种图片出现10次时间3分钟,背景音乐选择2 第三关,12*12网格,共12种图片,每种图片出现12次时间2.5分钟,背景音乐选择31. 界面设计2. 3. 共2个Grid, Grid1用于生产图片;Grid0上有三个label,显示时间,关卡和歌曲名;2个Men
2、u,展开如左所示;由于歌曲名需要滚动显示,此处label3是放在canvas上的 Xaml代码如下: 4. 程序设计首先,在项目路径下需要一些图片: 3关,共3组图片 背景音乐,需要WAV格式:3关,共种背景音乐 较之前简单版,这里增加了歌曲名的循环移动,此处用了简单的方法,原理是在Canvas上加了一个label,然后改变label位置和宽度,当label向左移动的时候宽度也随着减小,看上去label就像在慢慢消失,全部消失后再回到原始位置以此循环。如下定义4个变量:LabelPos = Canvas.GetLeft(Label3);/获取歌曲名当前X轴位置 LabelPos_Orignal
3、 = LabelPos;/原始位置 LableWidth = Label3.Width;/获取歌曲名当前宽度 LabelWidth_Orignal = LableWidth;/原始宽度主循环中执行:/*歌曲名当前宽度和位置设定*/Canvas.SetLeft(Label3, LabelPos); LabelPos = Canvas.GetLeft(Label3); Label3.Width = LableWidth; LableWidth = Label3.Width; /*歌曲名宽度和位置变化*/ LabelPos = LabelPos - 10; LableWidth = LableWid
4、th - 20; if (LabelPos LabelPos = LabelPos_Orignal; LableWidth = LabelWidth_Orignal; ); 以下为完整源代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Win
5、dows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using System.Threading;using System.Media;namespace 连连看 public partial class MainWindow : Window private int count = 0;/图片点击次数 private I
6、mage SelBeforeImg;/选中之前图片 private int GameFlag=1;/游戏开始标志 private int LeftTime = 0;/剩余时间 private int LeftMin;/剩余时间 分钟 private int LeftSec;/剩余时间 秒 private int ImageNo = 0;/图片名数量 private int ClearImg = 0;/消除的图片 private int EndSelect;/游戏结束选择 失败=0/成功=1/手动结束=2/下一关=3 private int Level=1;/关卡数,默认第一关 private
7、int CGridNo = 10;/生成网格数量 private int CImageNo = 10;/生成图片数量 private double LableWidth;/歌曲名宽度 private double LabelWidth_Orignal;/歌曲名原始宽度 private double LabelPos;/歌曲名位置X轴 private double LabelPos_Orignal;/歌曲名原始位置X轴 Thread thread; Image image; SoundPlayer soundPlayer; public MainWindow() InitializeCompon
8、ent(); private void Window_Load(object sender, RoutedEventArgs e)/界面初始化设置 LeftMin = LeftTime / 60; LeftSec = LeftTime % 60; Label1.Content = LeftMin.ToString().PadLeft(2,0) + : + LeftSec.ToString().PadLeft(2,0);/剩余时间显示 End_Btn.IsEnabled = false; SelMenu.Visibility = Visibility.Hidden; LabelPos = Can
9、vas.GetLeft(Label3);/获取歌曲名当前X轴位置 LabelPos_Orignal = LabelPos;/原始位置 LableWidth = Label3.Width;/获取歌曲名当前宽度 LabelWidth_Orignal = LableWidth;/原始宽度 this.KeyDown += MainWindow_KeyDown;/按键事件 private void MainWindow_KeyDown(object sender, KeyEventArgs e)/关卡选择开启 if (Keyboard.Modifiers & ModifierKeys.Control)
10、= ModifierKeys.Control & e.Key = Key.F1) if (!SelMenu.IsVisible) SelMenu.Visibility = Visibility.Visible; else SelMenu.Visibility = Visibility.Hidden; private void StartBtn_Click(object sender, RoutedEventArgs e)/点击按键开始游戏 Start_Game(); private void Start_Game() Start_Btn.IsEnabled = false; End_Btn.I
11、sEnabled = true; switch (Level) case 1: CGridNo = 8; CImageNo = 8; break;/第一关,8*8网格,8种图片 case 2: CGridNo = 10; CImageNo = 10; break;/第二关,10*10网格,10种图片 case 3: CGridNo = 12; CImageNo = 12; break;/第三关,12*12网格,12种图片 default: break; Creat_Grid(CGridNo);/生成网格 Create_Image(CImageNo);/加载图片 Game_Init();/加载初
12、始设置 soundPlayer.Load();/加载背景音乐 soundPlayer.PlayLooping();/循环播放 thread.Start();/线程开始 private void EndBtn_Click(object sender, RoutedEventArgs e)/点击按键结束游戏 EndSelect = 2; GameEnd(); private void TimeStart()/剩余时间开始计时 while (GameFlag=1) LeftMin = LeftTime / 60; LeftSec = LeftTime % 60; Dispatcher.Invoke(
13、new Action() = Label1.Content = LeftMin.ToString().PadLeft(2, 0) + : + LeftSec.ToString().PadLeft(2, 0);/剩余时间显示 Canvas.SetLeft(Label3, LabelPos);/歌曲名左移 LabelPos = Canvas.GetLeft(Label3); Label3.Width = LableWidth; LableWidth = Label3.Width; ); LeftTime-; LabelPos = LabelPos - 10; LableWidth = LableW
14、idth - 20; if (LabelPos LabelPos = LabelPos_Orignal; LableWidth = LabelWidth_Orignal; ); Thread.Sleep(1000); if (LeftTime0)/时间到0,游戏结束 EndSelect = 0; GameEnd(); private void Image_MouseDown(object sender, MouseButtonEventArgs e)/点击图片触发事件 if (GameFlag=1) if (count = 0) count+; SelBeforeImg = (Image)se
15、nder); else count = 0; string SelNowImg = (Image)sender).Name; if (SelBeforeImg.Name = SelNowImg & SelBeforeImg != (Image)sender)/成功消除 (Image)sender).Visibility = Visibility.Collapsed; SelBeforeImg.Visibility = Visibility.Collapsed; ClearImg+; switch (Level)/共3关,胜利后自动进入下一关 case 1: if (ClearImg = 32)
16、 EndSelect = 3; Level+; ClearImg = 0; GameEnd(); Thread.Sleep(500); Start_Game(); break; case 2: if (ClearImg = 50) EndSelect = 3; Level+; ClearImg = 0; GameEnd(); Thread.Sleep(500); Start_Game(); break; case 3: if (ClearImg = 72) EndSelect = 1; ClearImg = 0; GameEnd(); break; default: break; if (Le
17、vel=3) Level = 1; else SystemSounds.Hand.Play();/消除不成功提示音 private void GameEnd()/游戏结束 for (int i = 0; i Image image1 = image.FindName(Cimage + i.ToString() as Image; GridName.Children.Remove(image1); GridName.UnregisterName(Cimage + i.ToString(); ); for (int i = 0; i GridName.ColumnDefinitions.Clear
18、(); GridName.RowDefinitions.Clear(); ); soundPlayer.Stop();/音乐停止 GameFlag = 0;/游戏标志位复位 ClearImg = 0;/图片清除标志位复位 Dispatcher.Invoke(new Action() = Start_Btn.IsEnabled = true; End_Btn.IsEnabled = false; ); switch (EndSelect)/提示信息选择 case 0: MessageBox.Show(时间到,游戏结束!,游戏失败); ; break; case 1: MessageBox.Sho
19、w(恭喜,完成所有关卡!,游戏胜利); ;break; case 2: MessageBox.Show(游戏结束!,游戏结束); ; break; case 3: MessageBox.Show(恭喜进入下一关!, 游戏胜利); ; break; default: break; thread.Abort();/线程结束 private void Creat_Grid(int gridNo)/生成网格 for (int i = 0; i gridNo; i+)/生成No*No的格子 ColumnDefinition column = new ColumnDefinition(); GridNam
20、e.ColumnDefinitions.Add(column); RowDefinition row = new RowDefinition(); GridName.RowDefinitions.Add(row); private void Create_Image(int imageNO)/加载图片 int, arr1 = new intimageNO, imageNO; Random random = new Random(); int SelImgSerial=1; switch (Level) case 1:SelImgSerial = 11;break;/第一关,图片编号1118 case 2:SelImgSerial = 1; break;/第二关,图片编号110 case 3: SelImgSerial = 21; break;/第三关,图片编号2132 default: break; for (int i = SelImgSerial; i SelImgSerial+imageNO; i+)/比如image=10:把数组arr10,0arr19,9填满随机的110数字,并且每个数字出现10次 int ImageCount = 0; while (ImageCount imageNO) int x
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1