游戏介绍:
此游戏共分为四关,新手,初级,中级,高级
通过改变格子数和雷数来进行跳关;
新手: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("");
}
}
}