WPF扫雷游戏(简略版)

在这里插入图片描述

游戏介绍:

此游戏共分为四关,新手,初级,中级,高级
通过改变格子数和雷数来进行跳关;
新手:10*10格子 10颗雷
初级:12*12格子 12颗雷
中级: 14*14格子 14颗雷
高级:16*16格子 15颗雷
在这里插入图片描述

设计界面

<Window x:Class="WPF扫雷.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF扫雷"
        mc:Ignorable="d"
        Title="WPF扫雷" Icon="../../img/logo.ico" Height="800" Width="800" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"></RowDefinition>
            <RowDefinition Height="100"></RowDefinition>
            <RowDefinition Height="121*"></RowDefinition>
            <RowDefinition Height="519*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0"></ColumnDefinition>
            <ColumnDefinition Width="10.8"/>
            <ColumnDefinition Width="54"/>
            <ColumnDefinition Width="31*"></ColumnDefinition>
            <ColumnDefinition Width="135*"/>
            <ColumnDefinition Width="65"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Menu Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="6" Margin="0,0,-0.4,0.4">
            <MenuItem Width="60" Height="30" HorizontalAlignment="Center" VerticalAlignment="Center">
                <MenuItem.Icon>
                    <Image Source="img/Sysico.ico" Margin="0"></Image>
                </MenuItem.Icon>
                <MenuItem.Header>
                    <Label Content="菜单" Margin="-10,0,0,0"></Label>
                </MenuItem.Header>
                <MenuItem Header="等级" Margin="0,0,0,0" >
                    <MenuItem.Icon>
                        <Image Source="img/CustomerOrder.ico"></Image>
                    </MenuItem.Icon>
                    <MenuItem Header="新手" Name="Noob">
                        <MenuItem.Icon>
                            <Image Source="img/small.ico"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="初级" Name="Chuji">
                        <MenuItem.Icon>
                            <Image Source="img/logo-one.ico"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="中级" Name="Zhoji">
                        <MenuItem.Icon>
                            <Image Source="img/logo-two.ico"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="高级" Name="Gaoji">
                        <MenuItem.Icon>
                            <Image Source="img/logo-fore.ico"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                </MenuItem>
                <MenuItem Header="排名" Margin="0,0,0,0"  Click="MenuItem_Click_1">
                    
                </MenuItem>
                <MenuItem Header="设置" Margin="0,0,0,0">
                    <MenuItem.Icon>
                        <Image Source="img/mrp.ico"></Image>
                    </MenuItem.Icon>
                    <MenuItem Header="改变背景图">
                        <MenuItem.Icon>
                            <Image Source="img/logo-one.ico"></Image>
                        </MenuItem.Icon>
                        <MenuItem Header="场景一" Name="photo_1">
                            <MenuItem.Icon>
                                <Image Source="img/logo-one.ico"></Image>
                            </MenuItem.Icon>
                        </MenuItem>
                        <MenuItem Header="场景二" Name="photo_2">
                            <MenuItem.Icon>
                                <Image Source="img/logo-two.ico"></Image>
                            </MenuItem.Icon>
                        </MenuItem>
                        <MenuItem Header="场景三" Name="photo_3">
                            <MenuItem.Icon>
                                <Image Source="img/logo-treen.ico"></Image>
                            </MenuItem.Icon>
                        </MenuItem>
                        <MenuItem Header="场景四" Name="photo_4">
                            <MenuItem.Icon>
                                <Image Source="img/logo-fore.ico"></Image>
                            </MenuItem.Icon>
                        </MenuItem>
                    </MenuItem>
                </MenuItem>
                <MenuItem Header="退出" Margin="0,0,-40,0" Click="MenuItem_Click">
                    <MenuItem.Icon>
                        <Image Source="img/exit.ico"></Image>
                    </MenuItem.Icon>
                </MenuItem>
            </MenuItem>
        </Menu>
        <Border Grid.Column="0" Grid.RowSpan="4" Grid.ColumnSpan="6" Margin="0,30,-0.4,0.4">
            <Border.Background>
                <ImageBrush ImageSource="img/bg.jpg" Stretch="Fill" x:Name="Bg" ></ImageBrush>
            </Border.Background>
            <Canvas/>
        </Border>
        <Grid Name="GameBG" Grid.Row="2" Grid.Column="3" Margin="35.2,34.6,34.8,35.4" Grid.RowSpan="2" Grid.ColumnSpan="2">
            <Grid.Background>
                <ImageBrush ImageSource="img/main.png"></ImageBrush>
            </Grid.Background>
        </Grid>
        <StackPanel x:Name="topBar" Grid.Column="3" Grid.RowSpan="2" Grid.ColumnSpan="3" Margin="0.2,30,64.6,0.4" >
            <StackPanel.Background>
                <ImageBrush ImageSource="img/menu2.png"></ImageBrush>
            </StackPanel.Background>
        </StackPanel>
    </Grid>
</Window>

主程序设计

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.IO;
namespace WPF扫雷
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        Random r = new Random();
        int rows = 10; // 格子数
        int[,] mines; // 格子
        Image[,] images;// 存储图片数组
        bool[,] overList;
        int mineCount = 10;// 雷数
        string Jude = "deflut";  // 判断关卡
        string JudeName="新手"; // 判断等级名
        int count = 0; // 倒计时参数
        Label Countdown = new Label(); // 倒计时对象
        Label Grade = new Label(); // 等级对象
        DispatcherTimer countTimer = new DispatcherTimer(); // 倒计时定时器
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Noob.Click += Noob_Click;//点击新手
            Chuji.Click += Chuji_Click; // 点击初级
            Zhoji.Click += Zhoji_Click; // 点击中级
            Gaoji.Click += Gaoji_Click; // 点击高级
            photo_1.Click += Photo_1_Click;// 点击改变场景一
            photo_2.Click += Photo_2_Click;// 点击改变场景二
            photo_3.Click += Photo_3_Click;// 点击改变场景三
            photo_4.Click += Photo_4_Click;//点击改变场景四
            GeZi(10);// 格子数
            InitialGame(10, 10); // 格子数,雷数
            // 倒计时对象
            Countdown.Width = 120;
            Countdown.Height = 50;
            Countdown.Content = count+"s";
            Countdown.FontSize = 30;
            Countdown.Margin = new Thickness(100,20,100,10);
            topBar.Children.Add(Countdown);
            countTimer.Interval =TimeSpan.FromSeconds(1);
            countTimer.Tick += CountTimer_Tick;
            // 记录等级对象
            Grade.Width = 180;
            Grade.Height = 50;
            Grade.Content = "等级:" + JudeName;
            Grade.FontSize = 30;
            Grade.Margin = new Thickness(240,-60,50,10);
            topBar.Children.Add(Grade);    
        }
        private void CountTimer_Tick(object sender, EventArgs e)
        {
            count++;
            Countdown.Content = count + "s";
        }

        private void Photo_1_Click(object sender, RoutedEventArgs e)
        {
            Bg.ImageSource = new BitmapImage(new Uri("../../img/one.png",UriKind.Relative));
        }
        private void Photo_2_Click(object sender, RoutedEventArgs e)
        {
            Bg.ImageSource = new BitmapImage(new Uri("../../img/two.png", UriKind.Relative));
        }
        private void Photo_3_Click(object sender, RoutedEventArgs e)
        {
            Bg.ImageSource = new BitmapImage(new Uri("../../img/treen.png", UriKind.Relative));
        }
        private void Photo_4_Click(object sender, RoutedEventArgs e)
        {
            Bg.ImageSource = new BitmapImage(new Uri("../../img/fore.png", UriKind.Relative));
        }
        private void GeZi(int rows) // 格子数
        {
            for (int i = 0; i < rows; i++)
            {
                RowDefinition row = new RowDefinition(); // 行数
                GameBG.RowDefinitions.Add(row); // 添加到游戏区
                ColumnDefinition column = new ColumnDefinition(); // 列数
                GameBG.ColumnDefinitions.Add(column); //添加到游戏区
            }
            GameBG.ShowGridLines = true; // 显示网格
        }
        // 新手
        private void Noob_Click(object sender, RoutedEventArgs e)
        {
            Bg.ImageSource = new BitmapImage(new Uri("../../img/bg.jpg", UriKind.Relative));
            GameBG.RowDefinitions.Clear(); // 清除行
            GameBG.ColumnDefinitions.Clear(); // 清除列
            GameBG.Children.Clear(); // 清除之前
            rows = 10;
            mineCount = 10;
            InitialGame(rows, mineCount); //格子数,雷数
            GeZi(10); // 格子数
            Jude = "Noob";
            JudeName = "新手";
            Grade.Content = "等级:" + JudeName;
        }
        // 初级
        private void Chuji_Click(object sender, RoutedEventArgs e)
        {
            Bg.ImageSource = new BitmapImage(new Uri("../../img/one.png", UriKind.Relative));
            GameBG.RowDefinitions.Clear(); // 清除行
            GameBG.ColumnDefinitions.Clear(); // 清除列
            GameBG.Children.Clear(); // 清除之前
            rows = 12;
            mineCount = 12;
            InitialGame(rows,mineCount); //格子数,雷数
            GeZi(12); // 格子数
            Jude = "chuJi";
            JudeName = "初级";
            Grade.Content = "等级:" + JudeName;
        }
        // 中级
        private void Zhoji_Click(object sender, RoutedEventArgs e)
        {
            Bg.ImageSource = new BitmapImage(new Uri("../../img/two.png", UriKind.Relative));
            GameBG.RowDefinitions.Clear(); // 清除行
            GameBG.ColumnDefinitions.Clear();// 清除列
            GameBG.Children.Clear();
            mineCount = 14;
            InitialGame(14, mineCount);// 格子数,雷数
            GeZi(14);
            Jude = "zhoJi";
            JudeName = "中级";
            Grade.Content = "等级:" + JudeName;
        }
        // 高级
        private void Gaoji_Click(object sender, RoutedEventArgs e)
        {
            Bg.ImageSource = new BitmapImage(new Uri("../../img/treen.png", UriKind.Relative));
            GameBG.RowDefinitions.Clear();// 清除行
            GameBG.ColumnDefinitions.Clear();// 清除列
            GameBG.Children.Clear();
            rows = 16;
            mineCount = 15;
            InitialGame(rows,mineCount);// 格子数,雷数
            GeZi(16);
            Jude = "gaoJi";
            JudeName = "高级";
            Grade.Content = "等级:" + JudeName;
        }
        private void InitialGame(int rows, int mineCount)
        {
            mines = new int[rows, rows]; // 10*10的格子 
            images = new Image[rows, rows];//图片初始位置
            overList = new bool[rows, rows];
            //每个元素默认0,1为有雷
            for (int i = 0; i < mineCount; i++)
            {
                int row = r.Next(0, mines.GetLength(0)); //随机行位置
                int colmun = r.Next(0, mines.GetLength(1));//随机列位置
                if (mines[row,colmun]==1) //如果与上一次随机的雷位置变为0
                {
                    i--;
                }
                else
                {
                    mines[row, colmun] = 1;// 随机的位置设为1
                }
            }
            // 初始化砖块图片
            for (int i = 0; i < images.GetLength(0); i++)
            {
                for (int j = 0; j < images.GetLength(1); j++)
                {
                    
                    images[i, j] = new Image(); // 添加砖块图片
                        images[i, j].Source = new BitmapImage(new Uri("img/zhuan.gif", UriKind.Relative));
                    /*if (mines[i,j]==1)
                    {
                        images[i, j].Source = new BitmapImage(new Uri("img/lei.gif", UriKind.Relative));
                    }
                    else
                    {
                    }*/
                    images[i, j].Margin = new Thickness(2, 2, 2, 2);// 外边距
                    Grid.SetRow(images[i, j], i);// 设置行坐标
                    Grid.SetColumn(images[i, j], j);// 设置列坐标
                    images[i, j].Tag = new int[2] { i, j };// 记录此时的位置
                    GameBG.Children.Add(images[i, j]); // 添加到游戏区
                    images[i, j].MouseLeftButtonDown +=  MainWindow_MouseLeftButtonDown; // 左键
                    images[i, j].MouseRightButtonDown += MainWindow_MouseRightButtonDown;// 右键
                }
            }
        }
        private void MainWindow_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            Image img = sender as Image;
            img.Source = new BitmapImage(new Uri("img/qizi.gif", UriKind.Relative)); // 设置为旗子图片
        }
        MessageBoxResult rest;
        private void MainWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            countTimer.Start();
            Image img = sender as Image;
            int[] index = img.Tag as int[];// 给雷图片添加Tag值 
            if (!IsMine(index[0],index[1])) // 点击不是雷
            {
                CountMine(index[0], index[1], img);
                int left = 0; // 剩余的雷数
                for (int i = 0; i < overList.GetLength(0); i++)
                {
                    for (int j = 0; j < overList.GetLength(1); j++)
                    {
                        if (overList[i,j]==false)
                        {
                            left++;
                        }
                    }
                }
                if (left==mineCount) // 如果剩余雷数等于设置的雷数 则获胜
                {
                  MessageBoxResult rse= MessageBox.Show("是否进入下一关","游戏胜利!");
                    countTimer.Stop();
                    if (rse==MessageBoxResult.OK)
                    {
                        int row, lei;
                            string ss = "等级:"+ JudeName + ";用时:"+count;
                            FileStream Jilu = new FileStream("../../word/paiming.txt", FileMode.Append, FileAccess.Write);
                            StreamWriter strWrit = new StreamWriter(Jilu);
                            strWrit.WriteLine(ss + "\r\n");
                            strWrit.Close();
                        if (Jude.ToString() == "deflut"|| Jude.ToString() == "Noob") // 判断是否默认
                        {
                            MessageBox.Show("进入初级关卡");
                            row = 12;
                            lei = 15;
                            gameAnew(row, lei);
                            Jude = "chuJi";
                            JudeName = "初级";
                            Grade.Content = "等级:" + JudeName;
                            Bg.ImageSource = new BitmapImage(new Uri("../../img/one.png", UriKind.Relative));

                        }
                        else if (Jude.ToString() == "chuJi") // 判断是否初级
                        {
                            MessageBox.Show("进入中级关卡");
                            row = 14;
                            lei = 18;
                            gameAnew(row, lei);
                            Jude = "zhoJi";
                            JudeName = "中级";
                            Grade.Content = "等级:" + JudeName;
                            Bg.ImageSource = new BitmapImage(new Uri("../../img/two.png", UriKind.Relative));
                        }
                         else if (Jude.ToString() == "zhoJi")// 判断是否中级
                        {
                            MessageBox.Show("进入高级关卡");
                            row = 16;
                            lei = 25;
                            gameAnew(row, lei);
                            Jude = "gaoJi";
                            JudeName = "高级";
                            Grade.Content = "等级:" + JudeName;
                            Bg.ImageSource = new BitmapImage(new Uri("../../img/treen.png", UriKind.Relative));
                        }
                         else if (Jude.ToString() == "gaoJi")// 判断是否高级
                        {
                            MessageBox.Show("进入最高级关卡");
                            row = 18;
                            lei = 30;
                            gameAnew(row, lei);
                            JudeName = "最高级";
                            Grade.Content = "等级:" + JudeName;
                            Bg.ImageSource = new BitmapImage(new Uri("../../img/fore.png", UriKind.Relative));
                        }
                        count = 0;
                        countTimer.Start();
                    }
                }
            }
            else // 点击到是雷
            {
                for (int i = 0; i < mines.GetLength(0); i++)
                {
                    for (int j = 0; j < mines.GetLength(1); j++)
                    {
                        if (mines[i, j] == 1) // 如果此位置是1,切换雷图片
                        {
                            images[i, j].Source = new BitmapImage(new Uri("img/lei.gif", UriKind.Relative));
                        }
                    }
                }
                countTimer.Stop();// 倒计时暂停
                 rest= MessageBox.Show("是否重新开始", "游戏结束");
                AnewPopup();
            }
        }
        
        private void AnewPopup() // 是否重新开始弹框
        {
            if (rest == MessageBoxResult.OK)
            {
                count = 0;
                countTimer.Start();
                int row, lei;
                if (Jude.ToString() == "deflut"|| Jude.ToString() == "Noob") // 判断是否默认
                {
                    JudeName = "新手";
                    Grade.Content = "等级:" + JudeName;
                    row = 10;
                    lei = 10;
                    gameAnew(row, lei);
                }
                if (Jude.ToString() == "chuJi") // 判断是否初级
                {
                    JudeName = "初级";
                    Grade.Content = "等级:" + JudeName;
                    row = 12;
                    lei = 12;
                    gameAnew(row, lei);
                }
                if (Jude.ToString() == "zhoJi")// 判断是否中级
                {
                    JudeName = "中级";
                    Grade.Content = "等级:" + JudeName;
                    row = 14;
                    lei = 14;
                    gameAnew(row, lei);
                }
                if (Jude.ToString() == "gaoJi")// 判断是否高级
                {
                    JudeName = "高级";
                    Grade.Content = "等级:" + JudeName;
                    row = 16;
                    lei = 15;
                    gameAnew(row, lei);
                }
            }
        }

        private void gameAnew(int row,int lei) // 此关卡重新开始方法
        {
            GameBG.RowDefinitions.Clear(); // 清除游戏区行
            GameBG.ColumnDefinitions.Clear(); // 清除游戏区列
            GameBG.Children.Clear(); // 清除图片,和label
            rows = row; // 重新赋给格子方法
            mineCount = lei; // 雷数
            GeZi(rows); //格子方法
            InitialGame(rows, mineCount);
        }

        // 判断是否是雷
        bool IsMine(int i,int j)
        {
            if (i<0||j<0||i>=mines.GetLength(0)||j>=mines.GetLength(1))
            {
                return false; // 此不为雷
            }
            else
            {
                if (mines[i,j]==1)
                {
                    return true; // 设置为雷
                }
                else
                {
                    return false;
                }
            }
        }
        /*111
          101
          111*/
        void CountMine(int i,int j,Image img) // 判断点击方块后,八个方向
        {
            if (overList[i,j]==true)
            {
                return;
            }
            overList[i, j] = true;
            int count = 0; // 初始附近雷数
            if (IsMine(i-1,j)) // 点击的块左边
            {
                count++;
            }
            if (IsMine(i-1,j-1)) // 点击的块左下方
            {
                count++;
            }
            if (IsMine(i - 1, j + 1))// 左上方
            {
                count++;
            }

            if (IsMine(i,j-1))// 点击块的下方
            {
                count++;
            }
            if (IsMine(i, j + 1))// 点击块的上方
            {
                count++;
            }

            if (IsMine(i + 1, j+1))// 点击右上角
            {
                count++;
            }
            if (IsMine(i+1,j)) 
            {
                count++;
            }
            if (IsMine(i+1,j-1))
            {
                count++;
            }

            if (count == 0)
            {
                GameBG.Children.Remove(img);
                if (i > 0)
                {
                    CountMine(i - 1, j, images[i - 1, j]);
                }
                if (j > 0)
                {
                    CountMine(i, j - 1, images[i, j - 1]);
                }
                if (i > 0 && j > 0)
                {
                    CountMine(i - 1, j - 1, images[i - 1, j - 1]);
                }
                if (i < mines.GetLength(0) - 1)
                {
                    CountMine(i + 1, j, images[i + 1, j]);
                }
                if (j < mines.GetLength(1) - 1)
                {
                    CountMine(i, j + 1, images[i, j + 1]);
                }
                if (i > 0 && j < mines.GetLength(1) - 1)
                {
                    CountMine(i - 1, j + 1, images[i - 1, j + 1]);
                }
                if (i < mines.GetLength(0) - 1 && j < mines.GetLength(1) - 1)
                {
                    CountMine(i + 1, j + 1, images[i + 1, j + 1]);
                }
                if (i < mines.GetLength(0) - 1 && j > 0)
                {
                    CountMine(i + 1, j - 1, images[i + 1, j - 1]);
                }
            }
            else
            {
                GameBG.Children.Remove(img);
                Label lb = new Label();
                lb.Content = count.ToString();   // 将获取的附近雷数 赋给lb
                Grid.SetColumn(lb, j);
                Grid.SetRow(lb, i);
                lb.FontSize = 15;
                lb.HorizontalContentAlignment = HorizontalAlignment.Center;
                lb.VerticalAlignment = VerticalAlignment.Center;
                GameBG.Children.Add(lb);
            }
        }

        //退出
        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        //排名
        private void MenuItem_Click_1(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("");
        }
    }
}
发布了117 篇原创文章 · 获赞 111 · 访问量 9651

猜你喜欢

转载自blog.csdn.net/dust__/article/details/103739842