真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

使用C#來制作掃雷游戲的方法是什么-創(chuàng)新互聯(lián)

這篇文章主要介紹使用C#來制作掃雷游戲的方法是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

在睢縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,營銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,睢縣網(wǎng)站建設(shè)費用合理。

學(xué)C#的原因其實挺簡單的,因為一直對游戲挺感興趣,查了下比較流行的游戲引擎Unity的主要開發(fā)語言是C#,所以就決定從C#入手,學(xué)學(xué)面向?qū)ο蟮木幊谭椒ā?/p>

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

說起C#,其實在大學(xué)的時候?qū)W過一個學(xué)期,說來慚愧那時候倒也沒把它當一門面向?qū)ο蟮恼Z言(其實是當時根本不知道面向?qū)ο笫巧叮杏X跟C語言也就一點語法差異,把所有的用法全部歸為語法不同,說來也神奇,這種方法倒也能編程。最終學(xué)期結(jié)束的時候交上去一份用Winform開發(fā)的掃雷游戲結(jié)束了我的C#學(xué)習(xí),在那之后就再也沒碰過C#。

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

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

一、分析

1.游戲分析

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

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

使用C#來制作掃雷游戲的方法是什么

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

所以,先來總結(jié)下掃雷游戲?qū)崿F(xiàn)的核心:

  1. 方塊會響應(yīng)鼠標事件(左鍵按下,左鍵單擊,右鍵按下,鼠標移入,鼠標移出)。

  2. 方塊被點開后的效果有三種(炸彈,數(shù)字,空),其中為空的時候會自動展開周圍所有的方塊。

  3. 方塊只能被打開一次,之后不再響應(yīng)按鍵事件。

  4. 當插旗的方塊數(shù)和地雷數(shù)相等,并且每個包含地雷的方塊都被插了旗,則游戲勝利。

  5. 當包含地雷的方塊被打開,則游戲失敗。

2.實現(xiàn)技術(shù)分析

經(jīng)過分析,是不是發(fā)現(xiàn)掃雷的的玩法其實很簡單,實現(xiàn)的技術(shù)也不難,全是靜態(tài)的沒有動畫的存在。

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

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

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

Cube的實現(xiàn):

使用C#來制作掃雷游戲的方法是什么

Cube類中擁有以下字段:

使用C#來制作掃雷游戲的方法是什么

ImageSource cubeNormalPic
ImageSource cubeOnPic
ImageSource cubeDownPic
ImageSource cubeDisablePic
ImageSource cubeFlagPic

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

Bool isEnable
Bool isFlag

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

Image cubeImageHigh
Image cubeImageLow

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

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

displayCube
mouseEvent

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

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

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

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

BombCube繼承自Cube

使用C#來制作掃雷游戲的方法是什么

只添加了一個字段:

ImageSource bombPic

用來存儲地雷圖片.

NumCube 繼承自Cube

使用C#來制作掃雷游戲的方法是什么

Int bombNum

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

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

interface的實現(xiàn)

使用C#來制作掃雷游戲的方法是什么

分別為每種Cube設(shè)計了一種接口的實現(xiàn)方式,使用這種方式,若后期需要改為動畫顯示,也只需要實現(xiàn)一個動畫的接口,賦值給對應(yīng)的Cube就可以了。

二、實現(xiàn)

控件繼承:

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 鼠標事件的實現(xiàn):

鼠標事件主要是在各個事件中實現(xiàn)對Cube圖片的變換,例如鼠標移出事件

public void MouseLeaveCube(object sender, MouseEventArgs e)   
{      
 BombCube bombCube = sender as BombCube;     
 if (bombCube.IsEnable)     
 {
  isClicking = false;
  bombCube.cubeImageLow.Source =
  bombCube.cubeNormalPic;     
 }   
}

關(guān)于地雷位置的生成算法實現(xiàn):

游戲很重要的一個方面是,每次地雷的位置應(yīng)該不同。很容易想到應(yīng)該用隨機數(shù)來產(chǎn)生地雷的位置。這就需要隨機生成N個不相同的坐標。本程序的實現(xiàn)方法是創(chuàng)建一個list,之后使用隨機數(shù)在0-sizeX * sizeY - 1之間隨機生成一個數(shù),檢查list中是否包含該數(shù)字,若不包含則添加進list,直到list擁有N個元素停止。

List BombIndexList=new List();
      
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;

之后根據(jù)生成的list來確定坐標上應(yīng)該是NumCube還是BombCube

for (int y = 0; y < sizeY; y++)     
{
 for (int x = 0; x < sizeX;x++)
 {
  //cube屬性設(shè)置
  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,則其也應(yīng)該打開周圍的Cube),所以執(zhí)行該事件的時候一定要具有周圍Cube的信息(即能獲取到周圍的控件)。

獲取周圍的Cube的方法有兩種:

1.保存Cube自身的位置,并獲取所有Cube的位置

2.保存周圍Cube的信息

我使用的是第二種方式,之前Cube類中的Cubelist就是用來保存周圍Cube的信息的。通過CubeList找到周圍Cube,并觸發(fā)他們的左鍵單擊事件。

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內(nèi),例如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創(chuàng)建控件較慢,為了提升(修改寬度長度或地雷數(shù)量之后)游戲開始速度,應(yīng)該預(yù)先創(chuàng)建控件,并把控件放入list或者arr保存,按照需求取出。

到這掃雷游戲的制作就沒什么難度技術(shù)上的難度的,只需要通過百度了解一些WPF常用的事件,控件,xalm相關(guān)的知識就能做出一個掃雷游戲啦。相關(guān)源碼就不發(fā)在這了,需要的朋友可以評論中找我,這次游戲制作讓我對面向?qū)ο蟮幕揪幊谭椒ǖ牧私庥辛艘粋€很大的提升,下次應(yīng)該就可以在Unity中做游戲啦 哈哈。

以上是使用C#來制作掃雷游戲的方法是什么的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


新聞標題:使用C#來制作掃雷游戲的方法是什么-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://weahome.cn/article/jdoss.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部