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


设计界面
<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();
}
}
}
来源:CSDN
作者:(_じ☆ve暧メ晴
链接:https://blog.csdn.net/weixin_45787511/article/details/103720143