学C#的缘由实在挺简朴的,由于一直对游戏挺感兴趣,查了下比较盛行的游戏引擎Unity的主要开辟言语是C#,所以就决议从C#入手,学学面向对象的编程要领。
之前基础都做的是嵌入式开辟,做嵌入式久了,基础上只用C言语,C言语面向历程的特征在嵌入式编程这类资本极端受限的状况确切非常有益,但这类体式格局在面临大型软件的开辟的时刻就很难胜任了。编程的形式实际上是一种思维习气,习气久了今后,想转变确切是一个困难的历程···
提及C#,实在在大学的时刻学过一个学期,说来惭愧那时刻倒也没把它当一门面向对象的言语(实际上是当时基础不知道面向对象是啥),觉得跟C言语也就一点语法差别,把一切的用法悉数归为语法差别,说来也奇异,这类要领倒也能编程。终究学期完毕的时刻交上去一份用Winform开辟的扫雷游戏完毕了我的C#进修,在那以后就再也没碰过C#。
如今重拾C#,为了免撤除不必要的滋扰,并没有直接在Unity上进修,而是仍然在VS中进修,但此次挑选了比较新的WPF,而不是WInform,作为进修,第一个使命照样跟之前一样做一个扫雷游戏。
写在不怎么前面的前面:本文主要分享下顺序剖析历程,细致的完成要领不是本文重点,对完成有题目的朋侪能够自行批评区留言索要源码或许发问^_^。
一、剖析
1.游戏剖析
那进入正题,应当怎样完成这个游戏。疏忽细枝末节的部份(如计时,显现盈余雷数,菜单栏等)不说,就单说这个游戏的主体:扫雷区。
在游戏没最先的时刻,扫雷区放眼望去实在只要一个东西,那就是方块...
疏忽光影结果不谈(是的,我又疏忽了···),一切方块的色彩都一样,都相应雷同的事宜,那就是左键和右键。左键点开方块,右键给方块做个标记,认定为地雷。再继续剖析,方块具有差别的品种。有的方块点开以后四周会有一大片方块一同翻开。有的方块下面是地雷,点开就GameOver。另有方块下面是数字,代表着四周有多少个地雷。(果真,我又疏忽了鼠标两个键同时按自动翻开四周格子和第二次右键能够显现问号的功用···但实在以后会发明这个功用实在要增添也会很简朴)。
所以,先来总结下扫雷游戏完成的中心:
方块会相应鼠标事宜(左键按下,左键单击,右键按下,鼠标移入,鼠标移出)。
方块被点开后的结果有三种(炸弹,数字,空),个中为空的时刻会自动睁开四周一切的方块。
方块只能被翻开一次,以后不再相应按键事宜。
当插旗的方块数和地雷数相称,而且每一个包括地雷的方块都被插了旗,则游戏成功。
当包括地雷的方块被翻开,则游戏失利。
2.完成手艺剖析
经由剖析,是不是是发明扫雷的的弄法实在很简朴,完成的手艺也不难,满是静态的没有动画的存在。
方块的表现很像一个只能按一次的按钮(事实上,在大学的时刻我就是直接继续的按钮控件)。
但这一次为了能运用到更多C#相干的东西我运用了越发贫苦的自定义控件的体式格局。
方块有三种表现形式,为特殊性,但很显然也具有共性,所以在设想的时刻,我把按钮共性抽离出来,设想成了一个笼统的基类Cube。方块有三品种型,但由于我懒,所以把个中的两种(空缺和数字)兼并为了NumCube类,包括地雷的为BombCube类,这两个类离别继续了Cube。
Cube的完成:
Cube类中具有以下字段:
ImageSource cubeNormalPic ImageSource cubeOnPic ImageSource cubeDownPic ImageSource cubeDisablePic ImageSource cubeFlagPic
这5个字段是用来设置Cube在各个状况所显现的图片的(一般,鼠标进入,左键按下,失能,标记)
Bool isEnable Bool isFlag
这两个字段就是标记Cube是不是被使能和Flag
Image cubeImageHigh Image cubeImageLow
这2个是两个image控件,作用是用来显现图片,之所以要2个图片是由于旌旗图片被设想为一个叠加在Cube上的图片。
下面再来重点讲下下面2个东西:
displayCube mouseEvent
在设想中,这是两个接口,离别用来处置惩罚鼠标事宜和方块的睁开。差别于直接在内部直接完成接口,将两个接口设想为Cube属性是为了能动态的修正这两个接口的完成体式格局,不至于每次修正都须要对Cube内的代码举行修正,且能够完成每一个差别的Cube都运用差别的代码而不须要运用重写,这类体式格局在设想形式中也叫“战略形式”。
Cube只具有一个要领,那就是Open,但这个要领实在也是有display接口代办完成。
public void Open() { if (displayCube != null) { displayCube.Open(this); } }
displayCube.Open(this)之所以要把本身传入,是由于Open要领要用到Cube本身的参数和要领。
BombCube继续自Cube
只添加了一个字段:
ImageSource bombPic
用来存储地雷图片.
NumCube 继续自Cube
Int bombNum
用来纪录方块四周有多少个BombCube,当其为0的时刻,NumCube就是显现为空的方块。
添加了一个组件lable用来显现数字Text。
interface的完成
离别为每种Cube设想了一种接口的完成体式格局,运用这类体式格局,若后期须要改成动画显现,也只须要完成一个动画的接口,赋值给对应的Cube就可以够了。
二、完成
控件继续:
Wpf举行控件继续的时刻须要注重,被继续的控件不能有xaml。
在继续的时刻,xaml中须要到场以下语句:
< myTypes:Cube x:Class="扫雷.UserControl.NumCube" xmlns=" http:// schemas.microsoft.com/w infx/2006/xaml/presentation " xmlns:x=" http:// schemas.microsoft.com/w infx/2006/xaml " xmlns:mc=" http:// schemas.openxmlformats.org /markup-compatibility/2006 " xmlns:d=" http:// schemas.microsoft.com/e xpression/blend/2008 " mc:Ignorable="d" xmlns:myTypes="clr-namespace:扫雷.UserControl" d:DesignHeight="18" d:DesignWidth="18">
Cube 鼠标事宜的完成:
鼠标事宜重如果在各个事宜中完成对Cube图片的变更,比方鼠标移出事宜
public void MouseLeaveCube(object sender, MouseEventArgs e) { BombCube bombCube = sender as BombCube; if (bombCube.IsEnable) { isClicking = false; bombCube.cubeImageLow.Source = bombCube.cubeNormalPic; } }
关于地雷位置的生成算法完成:
游戏很主要的一个方面是,每次地雷的位置应当差别。很轻易想到应当用随机数来发生地雷的位置。这就须要随机生成N个不雷同的坐标。本顺序的完成要领是建立一个list<int>,以后运用随机数在0-sizeX * sizeY - 1之间随机生成一个数,搜检list中是不是包括该数字,若不包括则添加进list,直到list具有N个元素住手。
List<int> BombIndexList=new List<int>(); Random ran = new Random(); do { int bombIndex = ran.Next(0,sizeX * sizeY - 1); if(!BombIndexList.Contains(bombIndex)) { BombIndexList.Add(bombIndex); } else { continue; } } while (BombIndexList.Count < BombNum); IndexList = BombIndexList;
以后依据生成的list来肯定坐标上应当是NumCube照样BombCube
for (int y = 0; y < sizeY; y++) { for (int x = 0; x < sizeX;x++) { //cube属性设置 if(bombIndexList.Exists((int temp) => temp == x + y * cubeX)) { cubexMatrix[x, y] =bombCubeList[bombIndex++]; } else { numCubeList[numIndex].Text =""; cubexMatrix[x, y] =numCubeList[numIndex++]; } cubexMatrix[x, y].IsFlag =false; cubexMatrix[x, y].Margin =new Thickness(x * 18, y * 18, 0, 0); cubexMatrix[x, y].IsEnable = true; SetCubeBombNum(cubexMatrix,cubeX, cubeY); bombGrid.Children.Add(cubexMatrix[x, y]); } }
怎样让空缺Cube翻开今后会翻开四周的Cube:
由于这类翻开体式格局有点类似于递归,须要有传染性(即若翻开的也是空缺Cube,则其也应当翻开四周的Cube),所以实行该事宜的时刻一定要具有四周Cube的信息(即能猎取到四周的控件)。
猎取四周的Cube的要领有两种:
1.保留Cube本身的位置,并猎取一切Cube的位置
2.保留四周Cube的信息
我运用的是第二种体式格局,之前Cube类中的Cubelist就是用来保留四周Cube的信息的。经由过程CubeList找到四周Cube,并触发他们的左键单击事宜。
public void MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { NumCube numCube = sender as NumCube; if (numCube.IsEnable && numCube.IsFlag == false) { // 完成在控件上点击 if (isClicking) { isClicking = false; numCube.IsEnable = false; if (numCube.BombNum != 0) numCube.Text = Convert.ToString(numCube.BombNum); else { foreach (Cube cubeTemp in numCube.CubeList) { MouseButtonEventArgs args = new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left); args.RoutedEvent = Cube.MouseLeftButtonDownEvent; cubeTemp.RaiseEvent(args); args.RoutedEvent = Cube.MouseLeftButtonUpEvent; cubeTemp.RaiseEvent(args); } } } } }
一些小技能:
1.能够把一些图片的修正放在属性的set内,比方disable的图片。
public bool IsEnable { get { return isEnable; } set { isEnable = value; if (isEnable) { if (cubeNormalPic != null) cubeImageLow.Source = cubeNormalPic; } else { if (cubeDisablePic != null) cubeImageLow.Source = cubeDisablePic; } } }
2.Wpf建立控件较慢,为了提拔(修正宽度长度或地雷数目以后)游戏最先速率,应当预先建立控件,并把控件放入list或许arr保留,根据需求掏出。
到这扫雷游戏的制造就没什么难度手艺上的难度的,只须要经由过程百度相识一些WPF经常使用的事宜,控件,xalm相干的学问就可以做出一个扫雷游戏啦。相干源码就不发在这了,须要的朋侪能够批评中找我,此次游戏制造让我对面向对象的基础编程要领的相识有了一个很大的提拔,下次应当就可以够在Unity中做游戏啦 哈哈。
以上就是怎样运用C#来制造扫雷游戏的图文代码教程的细致内容,更多请关注ki4网别的相干文章!