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