C# WPF新手入门之连连看关卡版3关.docx
- 文档编号:10196963
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:24
- 大小:1.13MB
C# WPF新手入门之连连看关卡版3关.docx
《C# WPF新手入门之连连看关卡版3关.docx》由会员分享,可在线阅读,更多相关《C# WPF新手入门之连连看关卡版3关.docx(24页珍藏版)》请在冰豆网上搜索。
C#WPF新手入门之连连看关卡版3关
C#WPF新手入门之连连看关卡版(3关)
之前做了个连连看简单版,只一关,可参见我的文库相关文档,这次增加了关卡,总共三关,并且可以选择关卡,播放不同背景音乐,歌名滚动显示。
效果如下:
第一关,8*8网格,共8种图片,每种图片出现8次,时间5分钟,背景音乐选择1
第二关,10*10网格,共10种图片,每种图片出现10次时间3分钟,背景音乐选择2
第三关,12*12网格,共12种图片,每种图片出现12次时间2.5分钟,背景音乐选择3
1.界面设计
2.
3.
共2个Grid,Grid1用于生产图片;Grid0上有三个label,显示时间,关卡和歌曲名;2个Menu,展开如左所示;由于歌曲名需要滚动显示,此处label3是放在canvas上的
Xaml代码如下:
Class="连连看.MainWindow" xmlns=" xmlns: x=" xmlns: d=" xmlns: mc="http: //schemas.openxmlformats.org/markup-compatibility/2006" xmlns: local="clr-namespace: 连连看" mc: Ignorable="d" Title="连连看V2.0"Height="624"Width="624"Background="#FFF1A8A8"Loaded="Window_Load"WindowStartupLocation="CenterScreen"ResizeMode="CanMinimize"Visibility="Visible"BorderBrush="#FF61B917"Icon="Image/1.JPG"> Name="Label1"Content="00: 00"HorizontalAlignment="Center"VerticalAlignment="Top"FontSize="16"RenderTransformOrigin="8.573,4.41"/> Name="Start_Btn"Header="开始游戏"Click="StartBtn_Click"/> Name="End_Btn"Header="结束游戏"Click="EndBtn_Click"/> Name="About_Btn"Header="关于"Background="#FFD1D4C5"BorderBrush="#FF65E69A"Margin="2,0,0,0"Click="AboutBtn_Click"/> Name="SelMenu"Grid.Row="0"HorizontalAlignment="Right"Height="29"Width="60"VerticalAlignment="Center"> Name="SelLevel"Header="关卡选择"VerticalAlignment="Center"Height="29"BorderBrush="#FFC5412C"Background="#FFAFD698"> Name="LevelOne"Header="第一关"Click="Level1_Click"/> Name="LevelTwo"Header="第二关"Click="Level2_Click"/> Name="LevelThird"Header="第三关"Click="Level3_Click"/> Name="Label2"Content=""RenderTransformOrigin="8.573,4.41"Margin="167,0,393,0"Width="58"VerticalAlignment="Center"Height="25"/> Name="Label3"Content=""Width="84"FlowDirection="RightToLeft"HorizontalAlignment="Left"Canvas.Left="5"Background="{x: Null}"ScrollViewer.HorizontalScrollBarVisibility="Auto"/> 4.程序设计 首先,在项目路径下需要一些图片: 3关,共3组图片 背景音乐,需要WAV格式: 3关,共种背景音乐 较之前简单版,这里增加了歌曲名的循环移动,此处用了简单的方法,原理是在Canvas上加了一个label,然后改变label位置和宽度,当label向左移动的时候宽度也随着减小,看上去label就像在慢慢消失,全部消失后再回到原始位置以此循环。 如下定义4个变量: LabelPos=Canvas.GetLeft(Label3);//获取歌曲名当前X轴位置 LabelPos_Orignal=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=LableWidth-20; if(LabelPos<-40)//全部左移出区域后回到原始位置 { Dispatcher.Invoke(newAction(()=> { LabelPos=LabelPos_Orignal; LableWidth=LabelWidth_Orignal; })); } 以下为完整源代码: usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; usingSystem.Windows; usingSystem.Windows.Controls; usingSystem.Windows.Data; usingSystem.Windows.Documents; usingSystem.Windows.Input; usingSystem.Windows.Media; usingSystem.Windows.Media.Imaging; usingSystem.Windows.Navigation; usingSystem.Windows.Shapes; usingSystem.Threading; usingSystem.Media; namespace连连看 { publicpartialclassMainWindow: Window { privateintcount=0;//图片点击次数 privateImageSelBeforeImg;//选中之前图片 privateintGameFlag=1;//游戏开始标志 privateintLeftTime=0;//剩余时间 privateintLeftMin;//剩余时间分钟 privateintLeftSec;//剩余时间秒 privateintImageNo=0;//图片名数量 privateintClearImg=0;//消除的图片 privateintEndSelect;//游戏结束选择失败=0/成功=1/手动结束=2/下一关=3 privateintLevel=1;//关卡数,默认第一关 privateintCGridNo=10;//生成网格数量 privateintCImageNo=10;//生成图片数量 privatedoubleLableWidth;//歌曲名宽度 privatedoubleLabelWidth_Orignal;//歌曲名原始宽度 privatedoubleLabelPos;//歌曲名位置X轴 privatedoubleLabelPos_Orignal;//歌曲名原始位置X轴 Threadthread; Imageimage; SoundPlayersoundPlayer; publicMainWindow() { InitializeComponent(); } privatevoidWindow_Load(objectsender,RoutedEventArgse)//界面初始化设置 { 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=Canvas.GetLeft(Label3);//获取歌曲名当前X轴位置 LabelPos_Orignal=LabelPos;//原始位置 LableWidth=Label3.Width;//获取歌曲名当前宽度 LabelWidth_Orignal=LableWidth;//原始宽度 this.KeyDown+=MainWindow_KeyDown;//按键事件 } privatevoidMainWindow_KeyDown(objectsender,KeyEventArgse)//关卡选择开启 { if((Keyboard.Modifiers&ModifierKeys.Control)==ModifierKeys.Control&&e.Key==Key.F1) { if(! SelMenu.IsVisible) { SelMenu.Visibility=Visibility.Visible; } else { SelMenu.Visibility=Visibility.Hidden; } } } privatevoidStartBtn_Click(objectsender,RoutedEventArgse)//点击按键开始游戏 { Start_Game(); } privatevoidStart_Game() { Start_Btn.IsEnabled=false; End_Btn.IsEnabled=true; switch(Level) { case1: CGridNo=8;CImageNo=8;break;//第一关,8*8网格,8种图片 case2: CGridNo=10;CImageNo=10;break;//第二关,10*10网格,10种图片 case3: CGridNo=12;CImageNo=12;break;//第三关,12*12网格,12种图片 default: break; } Creat_Grid(CGridNo);//生成网格 Create_Image(CImageNo);//加载图片 Game_Init();//加载初始设置 soundPlayer.Load();//加载背景音乐 soundPlayer.PlayLooping();//循环播放 thread.Start();//线程开始 } privatevoidEndBtn_Click(objectsender,RoutedEventArgse)//点击按键结束游戏 { EndSelect=2; GameEnd(); } privatevoidTimeStart()//剩余时间开始计时 { while(GameFlag==1) { LeftMin=LeftTime/60; LeftSec=LeftTime%60; Dispatcher.Invoke(newAction(()=>{ 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=LableWidth-20; if(LabelPos<-40)//全部左移出区域后回到原始位置 { Dispatcher.Invoke(newAction(()=> { LabelPos=LabelPos_Orignal; LableWidth=LabelWidth_Orignal; })); } Thread.Sleep(1000); if(LeftTime<0)//时间到0,游戏结束 { EndSelect=0; GameEnd(); } } } privatevoidImage_MouseDown(objectsender,MouseButtonEventArgse)//点击图片触发事件 { if(GameFlag==1) { if(count==0) { count++; SelBeforeImg=((Image)sender); } else { count=0; stringSelNowImg=((Image)sender).Name; if(SelBeforeImg.Name==SelNowImg&&SelBeforeImg! =(Image)sender)//成功消除 { ((Image)sender).Visibility=Visibility.Collapsed; SelBeforeImg.Visibility=Visibility.Collapsed; ClearImg++; switch(Level)//共3关,胜利后自动进入下一关 { case1: if(ClearImg==32) { EndSelect=3; Level++; ClearImg=0; GameEnd(); Thread.Sleep(500); Start_Game(); } break; case2: if(ClearImg==50) { EndSelect=3; Level++; ClearImg=0; GameEnd(); Thread.Sleep(500); Start_Game(); } break; case3: if(ClearImg==72) { EndSelect=1; ClearImg=0; GameEnd(); } break; default: break; } if(Level==3) { Level=1; } } else { SystemSounds.Hand.Play();//消除不成功提示音 } } } } privatevoidGameEnd()//游戏结束 { for(inti=0;i { Dispatcher.Invoke(newAction(()=>{ Imageimage1=image.FindName("Cimage"+i.ToString())asImage; GridName.Children.Remove(image1); GridName.UnregisterName("Cimage"+i.ToString()); })); } for(inti=0;i { Dispatcher.Invoke(newAction(()=>{ GridName.ColumnDefinitions.Clear(); GridName.RowDefinitions.Clear(); })); } soundPlayer.Stop();//音乐停止 GameFlag=0;//游戏标志位复位 ClearImg=0;//图片清除标志位复位 Dispatcher.Invoke(newAction(()=>{ Start_Btn.IsEnabled=true; End_Btn.IsEnabled=false; })); switch(EndSelect)//提示信息选择 { case0: {MessageBox.Show("时间到,游戏结束! ","游戏失败");};break; case1: {MessageBox.Show("恭喜,完成所有关卡! ","游戏胜利");};break; case2: {MessageBox.Show("游戏结束! ","游戏结束");};break; case3: {MessageBox.Show("恭喜进入下一关! ","游戏胜利");};break; default: break; } thread.Abort();//线程结束 } privatevoidCreat_Grid(intgridNo)//生成网格 { for(inti=0;i { ColumnDefinitioncolumn=newColumnDefinition(); GridName.ColumnDefinitions.Add(column); RowDefinitionrow=newRowDefinition(); GridName.RowDefinitions.Add(row); } } privatevoidCreate_Image(intimageNO)//加载图片 { int[,]arr1=newint[imageNO,imageNO]; Randomrandom=newRandom(); intSelImgSerial=1; switch(Level) { case1: SelImgSerial=11;break;//第一关,图片编号11~18 case2: SelImgSerial=1;break;//第二关,图片编号1~10 case3: SelImgSerial=21;break;//第三关,图片编号21~32 default: break; } for(inti=SelImgSerial;i 把数组arr1[0,0]~arr1[9,9]填满随机的1~10数字,并且每个数字出现10次 { intImageCount=0; while(ImageCount { intx
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# WPF新手入门之连连看关卡版3关 WPF 新手入门 连连 关卡