C#WPF扫雷

落花浮王杯 提交于 2019-12-31 20:46:13

还有点小问题,基本功能都可以实现,排行榜排名没有实现

设计界面

<Window x:Class="扫雷.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:扫雷"
        mc:Ignorable="d"
        Title="扫雷" Height="700" Width="700" Icon="img/logo.ico" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
    <Grid x:Name="g">
        <Grid.RowDefinitions>
            <RowDefinition Height="30"></RowDefinition>
            <RowDefinition Height="70"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="65"></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition Width="65"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Menu Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3">
            <MenuItem Width="60" Height="30" HorizontalContentAlignment="Center" VerticalContentAlignment="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="初级" Margin="0,0,-40,0" Click="MenuItem_Click_1">
                        <MenuItem.Icon>
                            <Image Source="img/cj.ico"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="中级" Margin="0,0,-40,0" Click="MenuItem_Click_2">
                        <MenuItem.Icon>
                            <Image Source="img/zj.ico"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                    <MenuItem Header="高级" Margin="0,0,-40,0" Click="MenuItem_Click_3">
                        <MenuItem.Icon>
                            <Image Source="img/gj.ico"></Image>
                        </MenuItem.Icon>
                    </MenuItem>
                </MenuItem>
                <MenuItem Header="设置" Margin="0,0,0,0">
                    <MenuItem.Icon>
                        <Image Source="img/mrp.ico"></Image>
                    </MenuItem.Icon>
                    <MenuItem Header="排行榜" Margin="0,0,0,0" >
                        <MenuItem.Icon>
                            <Image Source="img/phb.ico"></Image>
                        </MenuItem.Icon>
                        <MenuItem Header="初级" Margin="0,0,-40,0" Click="MenuItem_Click_5" >
                            <MenuItem.Icon>
                                <Image Source="img/cj.ico"></Image>
                            </MenuItem.Icon>
                        </MenuItem>
                        <MenuItem Header="中级" Margin="0,0,-40,0" Click="MenuItem_Click_6" x:Name="zj">
                            <MenuItem.Icon>
                                <Image Source="img/zj.ico"></Image>
                            </MenuItem.Icon>
                        </MenuItem>
                        <MenuItem Header="高级" Margin="0,0,-40,0" Click="MenuItem_Click_7" x:Name="gj">
                            <MenuItem.Icon>
                                <Image Source="img/gj.ico"></Image>
                            </MenuItem.Icon>
                        </MenuItem>
                    </MenuItem>
                </MenuItem>
                <MenuItem Header="退出" Margin="0,0,-5,0" Click="MenuItem_Click">
                    <MenuItem.Icon>
                        <Image Source="img/exit.ico"></Image>
                    </MenuItem.Icon>
                </MenuItem>
                
            </MenuItem>
        </Menu>
         <Border Grid.Row="1" Grid.Column="0"  Grid.RowSpan="2" Grid.ColumnSpan="3">
            <Border.Background>
                <ImageBrush ImageSource="img/bg.jpg" Stretch="Fill"></ImageBrush>
            </Border.Background>
        </Border>
        <Grid x:Name="bg" Grid.Row="2" Grid.Column="1" Margin="15,15,15,15">
            <Grid.Background>
                <ImageBrush ImageSource="img/main.png"></ImageBrush>
            </Grid.Background>
        </Grid>
        <StackPanel Grid.Row="1" Grid.Column="1" >
            <Label Content="时间:0s" FontSize="30" Margin="100,10,0,0" x:Name="la"></Label>
            <StackPanel.Background>
                <ImageBrush ImageSource="img/menu2.png"></ImageBrush>
            </StackPanel.Background>
        </StackPanel>
        <Canvas x:Name="xm" Background="Beige" Grid.ColumnSpan="3" Grid.RowSpan="3">
            <Label Content="姓名:" FontSize="20" Canvas.Left="200" Canvas.Top="250"></Label>
            <TextBox x:Name="box" Width="200" Height="40" Canvas.Left="270" Canvas.Top="250" FontSize="20"></TextBox>
            <Button Content="OK" Canvas.Left="300" Canvas.Top="350" Width="50" Height="30" FontSize="20" Click="Button_Click" x:Name="ok"></Button>
        </Canvas>
    </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 扫雷
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        //声明常量10行
        int rows = 10;
        //
        int[,] mines;
        //图片的二维数组
        Image[,] images;
        //溢出
        bool[,] overlist;
        //声明常量雷的个数
        int minecount = 10;

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            time.Interval = TimeSpan.FromSeconds(1);
            time.Tick += Time_Tick;
            cj.Tag = "";
        }
        Random r = new Random();
        //装秒数的
        List<int> list = new List<int>();
        //初始化游戏
        private void InitialGame()
        {

            for (int i = 0; i < rows; i++)
            {
                RowDefinition row = new RowDefinition();
                bg.RowDefinitions.Add(row);
                ColumnDefinition column = new ColumnDefinition();
                bg.ColumnDefinitions.Add(column);
            }
            //显示网格线
            bg.ShowGridLines = true;

           

            mines = new int[rows, rows];
            images = new Image[rows, rows];
            overlist = new bool[rows, rows];
            //二维数组中每个元素默认值是0,如果是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)
                {
                    i--;
                }
                else
                {
                    mines[row, colmun] = 1;
                }
            }
            //初始情况下所有的Image全部装zhuan
            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));
                    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 };
                    bg.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));
        }

        //按下左键时
        private void MainWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {

            Image img = sender as Image;
            //声明int数组
            int[] index = img.Tag as int[];
            //点击的这个是一个安全地区
            if (!Ismine(index[0], index[1]))
            {
                //要判断周围的地雷数,基本上所有的雷周围至少有3个,最多有8个相邻
                //假设当前这个是i,j,则需要考虑周围的(i-1,j),(i-1,j-1),(i,j-1),(i+1,j-1),(i+1,j),(i+1,j+1),(i,j+1),(i-1,j+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)
                {
                    time.Stop();
                    MessageBoxResult r = MessageBox.Show("是否重新开始游戏", "获胜", MessageBoxButton.YesNo, MessageBoxImage.Warning);
                    if (r == MessageBoxResult.Yes)
                    {
                        string str = box.Text+"用时:"+num+"s";
                        if (cj.Tag.ToString() == "1")
                        {
                            FileStream file = new FileStream("../../img/index.txt", FileMode.Append, FileAccess.Write);
                            StreamWriter stream = new StreamWriter(file);
                            stream.Write(str + "\r\n");
                            stream.Close();
                        }
                        if (cj.Tag.ToString() == "2")
                        {
                            
                            FileStream file = new FileStream("../../img/index1.txt", FileMode.Append, FileAccess.Write);
                            StreamWriter stream = new StreamWriter(file);
                            stream.Write(str + "\r\n");
                            stream.Close();
                        }
                        if (cj.Tag.ToString() == "3")
                        {
                            FileStream file = new FileStream("../../img/index2.txt", FileMode.Append, FileAccess.Write);
                            StreamWriter stream = new StreamWriter(file);
                            stream.Write(str + "\r\n");
                            stream.Close();
                        }

                        bg.Children.Clear();
                        bg.RowDefinitions.Clear();
                        bg.ColumnDefinitions.Clear();
                        InitialGame();
                        la.Content = "时间:" + 0 + "s";
                        num = 0;
                        time.Start();
                    }
                    else
                    {
                        
                        bg.Children.Clear();
                        bg.RowDefinitions.Clear();
                        bg.ColumnDefinitions.Clear();
                        la.Content = "时间:" + 0 + "s";
                        num = 0;
                    }
                }
            }
            else
            {
                for (int i = 0; i < mines.GetLength(0); i++)
                {
                    for (int j = 0; j < mines.GetLength(1); j++)
                    {
                        if (mines[i, j] == 1)
                        {
                            time.Stop();
                            images[i, j].Source = new BitmapImage(new Uri("img/lei.gif", UriKind.Relative));
                        }
                    }
                }
                
                MessageBoxResult r = MessageBox.Show("是否重新开始游戏", "失败", MessageBoxButton.YesNo, MessageBoxImage.Warning);
                
                if (r == MessageBoxResult.Yes)
                {

                    la.Content = "时间:" + 0 + "s";
                    num = 0;
                    time.Start();
                    bg.Children.Clear();
                    bg.RowDefinitions.Clear();
                    bg.ColumnDefinitions.Clear();
                    InitialGame();
                    
                }
                else
                {
                    bg.Children.Clear();
                    bg.RowDefinitions.Clear();
                    bg.ColumnDefinitions.Clear();
                    la.Content = "时间:" + 0 + "s";
                    num = 0;
                }
            }
        }
        //声明一个bool型判断是否是雷
        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;
                }
            }
        }
        //统计雷的方法
        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, j - 1))
            {
                count++;
            }
            if (Ismine(i + 1, j - 1))
            {
                count++;
            }
            if (Ismine(i + 1, j))
            {
                count++;
            }
            if (Ismine(i + 1, j + 1))
            {
                count++;
            }
            if (Ismine(i, j + 1))
            {
                count++;
            }
            if (Ismine(i - 1, j + 1))
            {
                count++;
            }
            //判断不是雷时,移除图片
            if (count == 0)
            {
                bg.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
            {
                //移除图片,根据雷来判断输出数字
                bg.Children.Remove(img);
                Label la = new Label();
                la.Content = count.ToString();
                Grid.SetRow(la, i);
                Grid.SetColumn(la, j);
                la.FontSize = 15;
                la.HorizontalContentAlignment = HorizontalAlignment.Center;
                la.VerticalContentAlignment = VerticalAlignment.Center;
                bg.Children.Add(la);
            }
        }
        //按退出按钮
        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
        //初级按钮
        private void MenuItem_Click_1(object sender, RoutedEventArgs e)
        {
            cj.Tag = 1;
            bg.Children.Clear();
            bg.RowDefinitions.Clear();
            bg.ColumnDefinitions.Clear();
            rows = 10;
            minecount = 10;
            InitialGame();
            time.Start();
            la.Content = "时间:" + 0 + "s";
            num = 0;
            
        }
        //中级按钮
        private void MenuItem_Click_2(object sender, RoutedEventArgs e)
        {
            cj.Tag = 2;
            bg.Children.Clear();
            bg.RowDefinitions.Clear();
            bg.ColumnDefinitions.Clear();
            rows = 15;
            minecount = 15;
            InitialGame();
            time.Start();
            la.Content = "时间:" + 0 + "s";
            num = 0;
            
        }
        //高级按钮
        private void MenuItem_Click_3(object sender, RoutedEventArgs e)
        {
            cj.Tag = 3;
            bg.Children.Clear();
            bg.RowDefinitions.Clear();
            bg.ColumnDefinitions.Clear();
            rows = 20;
            minecount = 20;
            InitialGame();
            time.Start();
            la.Content = "时间:" + 0 + "s";
            num = 0;
            
        }
        //计时器
        DispatcherTimer time = new DispatcherTimer();
        
        //记录时间
        int num = 0;
        private void Time_Tick(object sender, EventArgs e)
        {
            num++;
            la.Content = "时间:" + num + "s";
            
        }
        //排行榜
       

        Label cj = new Label();
        
        //OK
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            g.Children.Remove(xm);
            
        }
        //初级
        private void MenuItem_Click_5(object sender, RoutedEventArgs e)
        {
            
            StreamReader reader = new StreamReader("../../img/index.txt");
            string st = reader.ReadToEnd();//读取所有的字符
            MessageBox.Show(st + "\r\n");
            reader.Close();
        }
        //中级
        private void MenuItem_Click_6(object sender, RoutedEventArgs e)
        {
           
            StreamReader reader = new StreamReader("../../img/index1.txt");
            string st = reader.ReadToEnd();//读取所有的字符
            MessageBox.Show(st + "\r\n");
            reader.Close();
        }
        //高级
        private void MenuItem_Click_7(object sender, RoutedEventArgs e)
        {
            
            StreamReader reader = new StreamReader("../../img/index2.txt");
            string st = reader.ReadToEnd();//读取所有的字符
            MessageBox.Show(st + "\r\n");
            reader.Close();
        }
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!