91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用C#代碼實現經典掃雷游戲

發布時間:2023-02-27 10:55:09 來源:億速云 閱讀:91 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么使用C#代碼實現經典掃雷游戲”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么使用C#代碼實現經典掃雷游戲”文章能幫助大家解決問題。

布局

布局效果如下,下面每個“網格”都是一個按鈕,點擊按鈕,就會有相應的事件發生。

怎么使用C#代碼實現經典掃雷游戲

由于UniformGrid中每個Grid的尺寸相等,所以作為雷區的容器。

    <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="雷區尺寸"/>
            <TextBox Width="40" Text="20" x:Name="txtNumX"/>
            <TextBlock Text="×"/>
            <TextBox Width="40" Text="20" x:Name="txtNumY"/>
            <TextBlock Text="雷數"/>
            <TextBox Width="40" Text="20" x:Name="txtNumMine"/>
            <Button Content="????" Click="btnNewGame_Click"/>
        </ToolBar>
        <UniformGrid Name="ugMine">
        </UniformGrid>

生成雷區

值得一提的是,由于隨機數可能在生成過程中產生重復的值,所以這里通過概率的方式來生成雷。

假設按鈕數為N,雷數為n,那么在][0,N]之間隨機生成一個數x,如果x<n,則判定當前按鈕為雷。按鈕是否為雷的標志作為布爾型存放在btn.tag中。

由于通過遍歷的方法生成雷,所以一旦剩余雷的個數和剩余按鈕的個數相等,就說明剩余的按鈕全都是雷。這種情況發生,則不必進行隨機數的判定。

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;         //已經布置的雷的個數

   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) ||       //如果剩余的雷數剛好等于剩余的按鈕數,則剩下的按鈕都是雷
           (numSetMine < nRes && rd.Next(0, nBtns) < nRes))
       {
           btn.Tag = true;
           numSetMine += 1;
           pMine.Add(i);
       }
   }
}

左鍵掃雷和右鍵標記

左鍵點擊,則類似于一個翻面的動作;右鍵點擊,則相當于是標記,而且在標記之后,不能再通過左鍵進行翻面。

//左鍵單擊
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;	//如果已經標記,則卸載左鍵的功能
   else
       btn.Click += Btn_Click;	//如果取消標記,則重新掛載左鍵的功能

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

右鍵單擊效果如下

怎么使用C#代碼實現經典掃雷游戲

翻面功能

在翻面的時候,如果當前按鈕為雷,則雷炸了,游戲結束。

如果當前按鈕不是雷,那么判斷該按鈕周圍是否有雷。如果有雷,則當前按鈕顯示周圍雷的個數;如果沒雷,則將周圍的雷全部翻面&mdash;&mdash;需要調用自身。

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是用于獲取當前按周圍按鈕的序號,這里分別需要考慮四個角、四個邊以及中間區域。

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 };
}

效果如下

怎么使用C#代碼實現經典掃雷游戲

關于“怎么使用C#代碼實現經典掃雷游戲”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

博兴县| 嘉善县| 漠河县| 齐齐哈尔市| 郓城县| 大新县| 雅江县| 山西省| 白山市| 报价| 大宁县| 大安市| 越西县| 彭州市| 浏阳市| 通化县| 西青区| 江孜县| 黄山市| 岳西县| 麦盖提县| 定安县| 北辰区| 婺源县| 桐梓县| 新乐市| 普陀区| 如东县| 日照市| 平原县| 福清市| 汝城县| 佛冈县| 乐业县| 贵阳市| 美姑县| 文登市| 武安市| 冀州市| 江油市| 扎赉特旗|