亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

詳解從零開始---用C#制作掃雷游戲

2019-10-29 21:09:25
字體:
來源:轉載
供稿:網友

C#的原因其實挺簡單的,因為一直對游戲挺感興趣,查了下比較流行的游戲引擎Unity的主要開發語言是C#,所以就決定從C#入手,學學面向對象的編程方法。

以前基本都做的是嵌入式開發,做嵌入式久了,基本上只用C語言,C語言面向過程的特性在嵌入式編程這種資源極度受限的情況確實十分有利,但這種方式在面對大型軟件的開發的時候就很難勝任了。編程的模式其實是一種思維習慣,習慣久了以后,想改變確實是一個艱難的過程···

說起C#,其實在大學的時候學過一個學期,說來慚愧那時候倒也沒把它當一門面向對象的語言(其實是當時根本不知道面向對象是啥),感覺跟C語言也就一點語法差異,把所有的用法全部歸為語法不同,說來也神奇,這種方法倒也能編程。最終學期結束的時候交上去一份用Winform開發的掃雷游戲結束了我的C#學習,在那之后就再也沒碰過C#。

現在重拾C#,為了免除掉不必要的干擾,并沒有直接在Unity上學習,而是仍然在VS中學習,但這次選擇了比較新的WPF,而不是WInform,作為學習,第一個任務還是跟以前一樣做一個掃雷游戲。

寫在不怎么前面的前面:本文主要分享下程序分析過程,具體的實現方法不是本文重點,對實現有問題的朋友可以自行評論區留言索要源碼或者提問^_^。

一、分析

1.游戲分析

那進入正題,應該如何完成這個游戲。忽略細枝末節的部分(如計時,顯示剩余雷數,菜單欄等)不說,就單說這個游戲的主體:掃雷區。

在游戲沒開始的時候,掃雷區放眼望去其實只有一個東西,那就是方塊...

C#制作掃雷游戲,C#,掃雷游戲,寫的掃雷游戲

忽略光影效果不談(是的,我又忽略了···),所有方塊的顏色都一樣,都響應相同的事件,那就是左鍵和右鍵。左鍵點開方塊,右鍵給方塊做個標記,認定為地雷。再繼續分析,方塊具有不同的種類。有的方塊點開之后周圍會有一大片方塊一起打開。有的方塊下面是地雷,點開就GameOver。還有方塊下面是數字,代表著周圍有多少個地雷。(果然,我又忽略了鼠標兩個鍵同時按自動打開周圍格子和第二次右鍵可以顯示問號的功能···但其實之后會發現這個功能其實要增加也會很簡單)。

所以,先來總結下掃雷游戲實現的核心:

  1. 方塊會響應鼠標事件(左鍵按下,左鍵單擊,右鍵按下,鼠標移入,鼠標移出)。
  2. 方塊被點開后的效果有三種(炸彈,數字,空),其中為空的時候會自動展開周圍所有的方塊。
  3. 方塊只能被打開一次,之后不再響應按鍵事件。
  4. 當插旗的方塊數和地雷數相等,并且每個包含地雷的方塊都被插了旗,則游戲勝利。
  5. 當包含地雷的方塊被打開,則游戲失敗。

2.實現技術分析

經過分析,是不是發現掃雷的的玩法其實很簡單,實現的技術也不難,全是靜態的沒有動畫的存在。

方塊的表現很像一個只能按一次的按鈕(事實上,在大學的時候我就是直接繼承的按鈕控件)。

但這一次為了能使用到更多C#相關的東西我使用了更加麻煩的自定義控件的方式。

方塊有三種表現形式,為特殊性,但很顯然也具有共性,所以在設計的時候,我把按鈕共性抽離出來,設計成了一個抽象的基類Cube。方塊有三種類型,但因為我懶,所以把其中的兩種(空白和數字)合并為了NumCube類,包含地雷的為BombCube類,這兩個類分別繼承了Cube。

Cube的實現:

C#制作掃雷游戲,C#,掃雷游戲,寫的掃雷游戲

Cube類中擁有以下字段:

C#制作掃雷游戲,C#,掃雷游戲,寫的掃雷游戲

ImageSource cubeNormalPicImageSource cubeOnPicImageSource cubeDownPicImageSource cubeDisablePicImageSource cubeFlagPic

這5個字段是用來設置Cube在各個狀態所顯示的圖片的(普通,鼠標進入,左鍵按下,失能,標記)

Bool isEnableBool isFlag

這兩個字段就是標記Cube是否被使能和Flag

Image cubeImageHighImage cubeImageLow

這2個是兩個image控件,作用是用來顯示圖片,之所以要2個圖片是因為旗子圖片被設計為一個疊加在Cube上的圖片。

下面再來重點講下下面2個東西:

displayCubemouseEvent

在設計中,這是兩個接口,分別用來處理鼠標事件和方塊的展開。不同于直接在內部直接實現接口,將兩個接口設計為Cube屬性是為了能動態的修改這兩個接口的實現方式,不至于每次修改都需要對Cube內的代碼進行修改,且可以實現每個不同的Cube都使用不同的代碼而不需要使用重寫,這種方式在設計模式中也叫“策略模式”。

Cube只擁有一個方法,那就是Open,但這個方法其實也是有display接口代理實現。

public void Open()   {     if (displayCube != null)     {  displayCube.Open(this);     }     }

displayCube.Open(this)之所以要把自身傳入,是因為Open方法要用到Cube自己的參數和方法。

BombCube繼承自Cube

C#制作掃雷游戲,C#,掃雷游戲,寫的掃雷游戲

只添加了一個字段:

ImageSource bombPic

用來存儲地雷圖片.

NumCube 繼承自Cube

C#制作掃雷游戲,C#,掃雷游戲,寫的掃雷游戲

Int bombNum

用來記錄方塊周圍有多少個BombCube,當其為0的時候,NumCube就是顯示為空的方塊。

添加了一個組件lable用來顯示數字Text。

interface的實現

C#制作掃雷游戲,C#,掃雷游戲,寫的掃雷游戲

分別為每種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中做游戲啦 哈哈。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品一区二555| 精品av在线播放| 日韩一区二区三区xxxx| 中文字幕欧美日韩| 亚洲精品国精品久久99热| 欧美激情喷水视频| 中文字幕日韩欧美在线视频| 国产日韩欧美影视| 亚洲欧洲日韩国产| 久久艹在线视频| 91精品视频免费| 激情成人中文字幕| 亚洲人成电影网站| 国产精品爱啪在线线免费观看| 国产精品网站入口| 亚洲a成v人在线观看| 4438全国成人免费| 中文字幕在线日韩| 久久久久久久国产精品视频| 国产视频欧美视频| 欧美日韩亚洲国产一区| 国产99久久精品一区二区| 日本午夜精品理论片a级appf发布| 色悠悠久久88| 国产91在线播放| 亚洲色图狂野欧美| 亚洲国产欧美在线成人app| 国产网站欧美日韩免费精品在线观看| 亚洲www在线| 欧美日韩免费观看中文| 国产精品一二三视频| 欧美成人第一页| 日韩欧美精品免费在线| 欧美一级电影久久| 国产欧美一区二区三区在线看| 欧美亚洲国产另类| 日韩av免费一区| 亚洲欧洲国产一区| 欧美在线视频网站| 欧美性在线观看| 国产精品1234| 亚洲欧美精品伊人久久| 欧美日韩加勒比精品一区| 亚洲成人黄色在线观看| 亚洲片av在线| 91精品久久久久久| 国产午夜精品免费一区二区三区| 国产精品入口尤物| 国产精品久久久999| 日韩高清电影免费观看完整| 日韩美女免费视频| 久久免费视频这里只有精品| 亚洲国产91精品在线观看| 亚洲国产精品成人一区二区| 成人免费在线网址| 欧美性猛交xxxx黑人猛交| 国产日韩欧美自拍| 日韩在线观看免费高清完整版| 精品国内产的精品视频在线观看| 欧美日韩高清在线观看| 国产精品久久久久久久久久小说| 欧美日韩免费网站| 欧美性极品少妇精品网站| 欧美成人免费小视频| 在线观看欧美日韩| 欧美美女15p| 欧美激情第6页| 九九久久国产精品| 在线观看久久久久久| 亚洲国模精品私拍| 国产视频精品一区二区三区| 中文字幕在线成人| 国产精品免费在线免费| 91国产美女视频| 亚洲天堂成人在线视频| 91精品久久久久久久久| 久久人人97超碰精品888| 亚洲综合在线做性| 丰满岳妇乱一区二区三区| 欧美亚洲另类制服自拍| 日韩av在线一区二区| 亚洲免费成人av电影| 美女视频黄免费的亚洲男人天堂| 97婷婷大伊香蕉精品视频| 欧美片一区二区三区| 久久噜噜噜精品国产亚洲综合| 久久伊人精品视频| 国产国语videosex另类| 日韩精品极品在线观看| 性欧美暴力猛交69hd| 亚洲国产毛片完整版| 日韩视频免费大全中文字幕| 97久久精品在线| 欧美性高跟鞋xxxxhd| 国产精品久久久久久久久久久新郎| 九九热这里只有精品免费看| 成人做爰www免费看视频网站| 亚洲va久久久噜噜噜久久天堂| 日韩免费视频在线观看| 国产美女久久精品香蕉69| 亚洲一区中文字幕| 日韩免费看的电影电视剧大全| 久久久999国产精品| 国产精品美腿一区在线看| 亚洲国内精品在线| 精品国产一区二区三区在线观看| 亚洲一区第一页| 成人黄色影片在线| 日韩在线视频观看正片免费网站| 欧美午夜精品伦理| 亚洲影院色无极综合| 欧美高清第一页| 91免费在线视频| 欧美日韩性生活视频| 久久色精品视频| 国产日韩换脸av一区在线观看| 在线日韩中文字幕| 国产精品久久久久久久久借妻| 久久中文字幕在线视频| 精品香蕉在线观看视频一| 国产精品白嫩美女在线观看| 亚洲最大福利网| 亚洲第一网中文字幕| 亚洲白拍色综合图区| 日韩免费在线看| 亚洲国产精品中文| 久久精品国产欧美激情| 姬川优奈aav一区二区| 在线成人激情黄色| 国产精品亚洲网站| 欧美在线日韩在线| 亚洲韩国日本中文字幕| 日韩高清免费观看| 欧美成人精品一区| 国产亚洲成av人片在线观看桃| 一区二区福利视频| 欧美最顶级的aⅴ艳星| 成人亚洲欧美一区二区三区| 欧美高清在线播放| 性欧美亚洲xxxx乳在线观看| 这里只有精品在线观看| 久久99亚洲热视| 欧美色视频日本版| 91夜夜未满十八勿入爽爽影院| 91国偷自产一区二区三区的观看方式| 国产精品电影在线观看| 理论片在线不卡免费观看| 欧美性生活大片免费观看网址| 国产欧美一区二区三区视频| 亚洲人成网7777777国产| 国产精品自产拍在线观看中文| 国产成人av网址| 欧美激情喷水视频| 成人精品一区二区三区电影黑人| 亚洲精品一区中文字幕乱码| 亚洲人成网站999久久久综合| 亚洲伊人成综合成人网| 亚洲成色777777在线观看影院| 国外成人性视频| 欧美一级大片在线观看| 欧美成人一二三| 久久久视频免费观看| 中文字幕成人精品久久不卡| 欧美在线视频一二三|