最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

100行C#代碼實(shí)現(xiàn)經(jīng)典掃雷游戲

 更新時(shí)間:2023年02月27日 09:21:19   作者:微小冷  
這篇文章主要為大家詳細(xì)介紹了如何用100行C#代碼實(shí)現(xiàn)經(jīng)典的掃雷游戲,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下

布局

布局效果如下,下面每個(gè)“網(wǎng)格”都是一個(gè)按鈕,點(diǎn)擊按鈕,就會(huì)有相應(yīng)的事件發(fā)生。

由于UniformGrid中每個(gè)Grid的尺寸相等,所以作為雷區(qū)的容器。

    <DockPanel>
        <DockPanel.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Margin" Value="5"/>
            </Style>
            <Style TargetType="TextBox">
                <Setter Property="Margin" Value="5"/>
                <Setter Property="InputMethod.IsInputMethodEnabled" Value="False"/>
            </Style>

        </DockPanel.Resources>
        <ToolBar DockPanel.Dock="Top">
            <TextBlock Text="雷區(qū)尺寸"/>
            <TextBox Width="40" Text="20" x:Name="txtNumX"/>
            <TextBlock Text="×"/>
            <TextBox Width="40" Text="20" x:Name="txtNumY"/>
            <TextBlock Text="雷數(shù)"/>
            <TextBox Width="40" Text="20" x:Name="txtNumMine"/>
            <Button Content="??" Click="btnNewGame_Click"/>
        </ToolBar>
        <UniformGrid Name="ugMine">
        </UniformGrid>

生成雷區(qū)

值得一提的是,由于隨機(jī)數(shù)可能在生成過程中產(chǎn)生重復(fù)的值,所以這里通過概率的方式來生成雷。

假設(shè)按鈕數(shù)為N,雷數(shù)為n,那么在][0,N]之間隨機(jī)生成一個(gè)數(shù)x,如果x<n,則判定當(dāng)前按鈕為雷。按鈕是否為雷的標(biāo)志作為布爾型存放在btn.tag中。

由于通過遍歷的方法生成雷,所以一旦剩余雷的個(gè)數(shù)和剩余按鈕的個(gè)數(shù)相等,就說明剩余的按鈕全都是雷。這種情況發(fā)生,則不必進(jìn)行隨機(jī)數(shù)的判定。

private void newGame()
{
   x = int.Parse(txtNumX.Text);
   y = int.Parse(txtNumY.Text);
   var nBtns = x * y;
   nMark = 0;
   nRes = int.Parse(txtNumMine.Text);
   if (nRes > nBtns)
       nRes = nBtns;

   pMine = new List<int>();

   ugMine.Rows = y;
   ugMine.Columns = x;
   ugMine.Children.Clear();

   Random rd = new Random();
   int numSetMine = 0;         //已經(jīng)布置的雷的個(gè)數(shù)

   for (int i = 0; i < nBtns; i++)
   {
       var btn = new Button();
       ugMine.Children.Add(btn);
       btn.Click += Btn_Click;
       btn.MouseRightButtonDown += Btn_MouseRightButtonDown;
       btn.Content = "";
       btn.Tag = false;
       if ((nRes - numSetMine) == (nBtns - i) ||       //如果剩余的雷數(shù)剛好等于剩余的按鈕數(shù),則剩下的按鈕都是雷
           (numSetMine < nRes && rd.Next(0, nBtns) < nRes))
       {
           btn.Tag = true;
           numSetMine += 1;
           pMine.Add(i);
       }
   }
}

左鍵掃雷和右鍵標(biāo)記

左鍵點(diǎn)擊,則類似于一個(gè)翻面的動(dòng)作;右鍵點(diǎn)擊,則相當(dāng)于是標(biāo)記,而且在標(biāo)記之后,不能再通過左鍵進(jìn)行翻面。

//左鍵單擊
private void Btn_Click(object sender, RoutedEventArgs e)
{
   var btn = sender as Button;
   int index = ugMine.Children.IndexOf(btn);
   flipButton(index);
   if(nMark == pMine.Count || nRes == pMine.Count)
       MessageBox.Show("您贏了!");
}
//右鍵單擊
private void Btn_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
   var btn = sender as Button;
   var flag = btn.Content.ToString() != "??";
   if (flag)
       btn.Click -= Btn_Click;	//如果已經(jīng)標(biāo)記,則卸載左鍵的功能
   else
       btn.Click += Btn_Click;	//如果取消標(biāo)記,則重新掛載左鍵的功能

   btn.Content = flag ? "??" : "";
   btn.Foreground = flag ? Brushes.Red : Brushes.Gray;
   nMark += flag ? 1 : -1;
}

右鍵單擊效果如下

翻面功能

在翻面的時(shí)候,如果當(dāng)前按鈕為雷,則雷炸了,游戲結(jié)束。

如果當(dāng)前按鈕不是雷,那么判斷該按鈕周圍是否有雷。如果有雷,則當(dāng)前按鈕顯示周圍雷的個(gè)數(shù);如果沒雷,則將周圍的雷全部翻面——需要調(diào)用自身。

private void flipButton(int index)
{
   var btn = ugMine.Children[index] as Button;
   if (!btn.IsEnabled)
       return;
   if ((bool)btn.Tag)
   {
       foreach (var i in pMine)
       {
           var mine = ugMine.Children[i] as Button;
           mine.Content = "??";
           mine.Foreground = Brushes.Red;
       }
       MessageBox.Show("您輸了");
       return;
   }
   nRes -= 1;
   btn.IsEnabled = false;
   int numMines = 0;

   var nears = setNear(index);
   foreach (var i in nears)
   {
       var near = ugMine.Children[i] as Button;
       if ((bool)near.Tag) 
           numMines += 1;
   }
   if (numMines != 0)
       btn.Content = numMines;
   else
       foreach (var i in nears)
           flipButton(i);
}

其中setNear是用于獲取當(dāng)前按周圍按鈕的序號(hào),這里分別需要考慮四個(gè)角、四個(gè)邊以及中間區(qū)域。

private int[] setNear(int index)
{
   if (index == 0)
       return new int[3] { 1, x, x + 1 };
   if (index == x * y - 1)
       return new int[3] { index - 1, index - x, index - x - 1 };
   if (index == x - 1)
       return new int[3] { x - 2, 2 * x - 1, 2 * x - 2 };
   if (index == x * y - x)
       return new int[3] { index + 1, index - x, index - x + 1 };
   if (index % x == 0)
       return new int[5] { index - x, index - x + 1, index + 1, index + x, index + x + 1 };
   if (index % x == (x - 1))
       return new int[5] { index - x - 1, index - x, index - 1, index + x - 1, index + x };
   if (index < x)
       return new int[5] { index - 1, index + 1, index + x - 1, index + x, index + x + 1 };
   if (index > x * (y - 1))
       return new int[5] { index - x - 1, index - x, index - x + 1, index - 1, index + 1 };
   return new int[8] { index - 1, index + 1, index - x, index-x-1,
       index-x+1,index + x,index+x-1,index+x+1 };
}

效果如下

以上就是100行C#代碼實(shí)現(xiàn)經(jīng)典掃雷游戲的詳細(xì)內(nèi)容,更多關(guān)于C#掃雷游戲的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#使用WMI實(shí)現(xiàn)監(jiān)聽進(jìn)程的啟動(dòng)和關(guān)閉

    C#使用WMI實(shí)現(xiàn)監(jiān)聽進(jìn)程的啟動(dòng)和關(guān)閉

    Windows Management Instrumentation(WMI)是用于管理基于 Windows 操作系統(tǒng)的數(shù)據(jù)和操作的基礎(chǔ)結(jié)構(gòu),本文將使用WMI實(shí)現(xiàn)監(jiān)聽進(jìn)程的啟動(dòng)和關(guān)閉,感興趣的可以了解下
    2024-01-01
  • user32.dll 函數(shù)說明小結(jié)

    user32.dll 函數(shù)說明小結(jié)

    這篇文章主要介紹了user32.dll 函數(shù)說明,需要的朋友可以參考下
    2018-06-06
  • C#操作Excel的多種方式小結(jié)

    C#操作Excel的多種方式小結(jié)

    在項(xiàng)目開發(fā)過程和辦公過程中,經(jīng)常要遇到對Excel進(jìn)行創(chuàng)建,讀寫等操作,本文為大家整理了一些C#操作Excel的方法,感興趣的小伙伴可以了解一下
    2024-11-11
  • C#使用Stack<T>進(jìn)行堆棧設(shè)計(jì)的實(shí)現(xiàn)

    C#使用Stack<T>進(jìn)行堆棧設(shè)計(jì)的實(shí)現(xiàn)

    堆棧代表了一個(gè)后進(jìn)先出的對象集合,當(dāng)您需要對各項(xiàng)進(jìn)行后進(jìn)先出的訪問時(shí),則使用堆棧,本文主要介紹了C#使用Stack<T>類進(jìn)行堆棧設(shè)計(jì)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),感興趣的可以了解一下
    2024-03-03
  • C#使用log4net記錄日志的方法步驟

    C#使用log4net記錄日志的方法步驟

    本文主要介紹了C#使用log4net記錄日志的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C# 實(shí)現(xiàn)Eval(字符串表達(dá)式)的三種方法

    C# 實(shí)現(xiàn)Eval(字符串表達(dá)式)的三種方法

    這篇文章主要介紹了C# 實(shí)現(xiàn)Eval(字符串表達(dá)式)的三種方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04
  • 三十分鐘快速掌握C# 6.0知識(shí)點(diǎn)

    三十分鐘快速掌握C# 6.0知識(shí)點(diǎn)

    這篇文章主要介紹了C# 6.0的相關(guān)知識(shí)點(diǎn),文中介紹的非常詳細(xì),通過這篇文字可以讓大家在三十分鐘內(nèi)快速的掌握C# 6.0,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • 詳解C#開發(fā)Android應(yīng)用程序的流程

    詳解C#開發(fā)Android應(yīng)用程序的流程

    在本篇文章里小編給大家分享了關(guān)于C#開發(fā)Android應(yīng)用程序的流程和相關(guān)技巧,需要的朋友們跟著學(xué)習(xí)下。
    2019-03-03
  • C#操作INI文件的方法詳解

    C#操作INI文件的方法詳解

    INI文件全稱是Initialization File的縮寫,即初始化文件,是windows系統(tǒng)的系統(tǒng)配置文件所采用的存儲(chǔ)格式,統(tǒng)管windows的各項(xiàng)配置。本文介紹了C#操作INI文件的方法,需要的可以參考一下
    2022-10-10
  • c#文本加密程序代碼示例

    c#文本加密程序代碼示例

    這是一個(gè)加密軟件,但只限于文本加密,加了窗口控件的滑動(dòng)效果,詳細(xì)看下面的代碼
    2013-11-11

最新評(píng)論

乾安县| 宁远县| 建宁县| 汉中市| 政和县| 翁源县| 西林县| 炎陵县| 临洮县| 玉龙| 湾仔区| 西青区| 扎鲁特旗| 清丰县| 奉贤区| 临猗县| 扶风县| 田东县| 白城市| 安康市| 始兴县| 樟树市| 梨树县| 巍山| 措美县| 深圳市| 清苑县| 皋兰县| 榆中县| 邵武市| 小金县| 浮山县| 武安市| 古丈县| 科技| 河池市| 美姑县| 天祝| 武胜县| 长兴县| 永仁县|