if (Pole[row, col] >= 100)
{
//открываем клетку, открытые-белые
if (Pole[row, col] != 109)
g.FillRectangle(Brushes.White, x - 1, y - 1, x + W, y + H);
//подрыв на мине, клетка красная
else
g.FillRectangle(Brushes.Red, x - 1, y - 1, x + W, y + H);
//если рядом с клеткой есть мины, подписываем их кол-во
if ((Pole[row, col] >= 101) && (Pole[row, col] <= 108))
g.DrawString((Pole[row, col] - 100).ToString(), new Font("Tahoma", 20, FontStyle.Bold), Brushes.Blue, x + 3, y + 2);
}
// вклеткефлаг
if (Pole[row, col] >= 200)
this.flag(g, x, y);
//отрисовываемграницыклетки
g.DrawRectangle(Pens.Black, x - 1, y - 1, x + W, y + H);
// если игра завершена (status=2),показываем мины
if ((status == 2) && ((Pole[row, col] % 10) == 9))
this.mina(g, x, y);
}
private void open(int row, int col)//метод,открывающий текущую и все соседние клетки, в которых нет мин
{
//координаты области вывода
int x = (col - 1) * W + 1, y = (row - 1) * H + 1 + 25;
if (Pole[row, col] == 0)
{
Pole[row, col] = 100;
//отобразитьсодержимоеклетки
this.Invalidate(new Rectangle(x, y, W, H));
//открыть примыкающие клетки слева, справа, сверху, снизу
this.open(row, col - 1);
this.open(row - 1, col);
this.open(row, col + 1);
this.open(row + 1, col);
//примыкающие диагонально
this.open(row - 1, col - 1);
this.open(row - 1, col + 1);
this.open(row + 1, col - 1);
this.open(row + 1, col + 1);
}
else
if ((Pole[row, col] < 100) && (Pole[row, col] != -3))
{
Pole[row, col] += 100;
//отобразить содержимое клетки
this.Invalidate(new Rectangle(x, y, W, H));
}
}
private void mina(Graphics g, int x, int y)//метод,рисующиймину
{
//корпус
g.FillRectangle(Brushes.Green, x + 16, y + 26, 8, 4);
g.FillRectangle(Brushes.Green, x + 8, y + 30, 24, 4);
g.DrawPie(Pens.Black, x + 6, y + 28, 28, 16, 0, -180);
g.FillPie(Brushes.Green, x + 6, y + 28, 28, 16, 0, -180);
//полосанакорпусе
g.DrawLine(Pens.Black, x + 12, y + 32, x + 28, y + 32);
//вертикальный "ус"
g.DrawLine(Pens.Black, x + 20, y + 22, x + 20, y + 26);
//боковые "усы"
g.DrawLine(Pens.Black, x + 8, y + 30, x + 6, y + 28);
g.DrawLine(Pens.Black, x + 32, y + 30, x + 34, y + 28);
}
private void flag(Graphics g, int x, int y)//метод,рисующийфлаг
{
Point[] p = new Point[3];
Point[] m = new Point[5];
//флажок
p[0].X = x + 4;
p[0].Y = y + 4;
p[1].X = x + 30;
p[1].Y = y + 12;
p[2].X = x + 4;
p[2].Y = y + 20;
g.FillPolygon(Brushes.Red, p);
//древко
g.DrawLine(Pens.Black, x + 4, y + 4, x + 4, y + 35);
//буква М на флажке
m[0].X = x + 8;
m[0].Y = y + 14;
m[1].X = x + 8;
m[1].Y = y + 8;
m[2].X = x + 10;
m[2].Y = y + 10;
m[3].X = x + 12;
m[3].Y = y + 8;
m[4].X = x + 12;
m[4].Y = y + 14;
g.DrawLines(Pens.White, m);
}
public Form1()//конструктор главной формы
{
InitializeComponent();
//присваиваем начальные значения полям
MR = 10;
MC = 10;
NM = 10;
W = 40;
H = 40;
this.newGame(1);//вызовметода newGame(int r)
}
private void Form1_Paint(object sender, PaintEventArgs e)//обработчиксобытия Paint
{
this.showPole(e.Graphics, status);//вызовметода showPole(Graphics g, int status)
}
private void справкаToolStripMenuItem_Click(object sender, EventArgs e)//щелчокнапунктеменюСправка
{
Help.ShowHelp(this, this.helpProvider1.HelpNamespace);//вызовфайласправки
}
private void Сапер_MouseDown(object sender, MouseEventArgs e)//нажатиекнопкимышинаигровомполе
{
//если игра завершена, ничего не происходит
if (status == 2)
return;
//первыйщелчок
if (status == 0)
status = 1;
//преобразуем координаты мыши в индексы клетки, в которой был сделан щелчок
int row = (int)((e.Y - 25)/ H) + 1, col = (int)(e.X / W) + 1;
//координаты области вывода
int x = (col - 1) * W + 1, y = (row - 1) * H + 1 + 25;
//щелчок левой кнопки мыши
if (e.Button == MouseButtons.Left)
{
//открыта клетка, в которой есть мина
if (Pole[row, col] == 9)
{
Pole[row, col] += 100;
status = 2;//игра закончена
this.Invalidate();//перерисовать форму
}
else
{
if (Pole[row, col] < 9)
this.open(row, col);
}
}
//щелчокправойкнопкимыши
if (e.Button == MouseButtons.Right)
{
//в клетке не было флага, ставим его
if (Pole[row, col] <= 9)
{
nFlag += 1;
if (Pole[row, col] == 9)
nMin += 1;
Pole[row, col] += 200;
//все флаги расставлены
if ((nMin == NM) && (nFlag == NM))
{
status = 2;//игразакончена
this.Invalidate();//перерисоватьформу
}
else
this.Invalidate(new Rectangle(x, y, W, H));//перерисоватьклетку
}
else
{
//в клетке был флаг, убираем его
if (Pole[row, col] >= 200)
{
nFlag -= 1;
Pole[row, col] -= 200;
this.Invalidate(new Rectangle(x, y, W, H));//перерисоватьклетку
}
}
}
}
//обработчики щелчков на пунктах меню, в которых указывается размер поля и кол-во мин
private void минToolStripMenuItem_Click(object sender, EventArgs e)
{
MR = 10;
MC = 10;
NM = 10;
W = 40;
H = 40;
this.newGame(1);
this.Invalidate();
}
private void минToolStripMenuItem1_Click(object sender, EventArgs e)
{
MR = 10;
MC = 10;
NM = 15;
W = 40;
H = 40;
this.newGame(1);
this.Invalidate();
}
private void минToolStripMenuItem2_Click(object sender, EventArgs e)
{
MR = 10;
MC = 10;
NM = 20;
W = 40;
H = 40;
this.newGame(1);
this.Invalidate();
}
private void минToolStripMenuItem3_Click(object sender, EventArgs e)
{
MR = 20;
MC = 20;
NM = 20;
W = 30;
H = 30;
this.newGame(1);
this.Invalidate();
}
private void минToolStripMenuItem4_Click(object sender, EventArgs e)
{
MR = 20;
MC = 20;
NM = 40;
W = 30;
H = 30;
this.newGame(1);
this.Invalidate();
}
private void минToolStripMenuItem5_Click(object sender, EventArgs e)
{
MR = 20;
MC = 20;
NM = 60;
W = 30;
H = 30;
this.newGame(1);
this.Invalidate();
}
private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)//щелчокнапунктеменюО программе
{
AboutBox1 saper = new AboutBox1();//создание экземпляра формы О программе
saper.ShowDialog();//появление формы О программе
}
private void особыеToolStripMenuItem_Click(object sender, EventArgs e)//щелчокнапунктеменюОсобые
{
Form2 settings = new Form2();//созданиеэкземпляраформыНастройки
settings.ShowDialog();//появлениеформыНастройки
//присваиваем значения полям на основе введенных пользователем на форме Настройки
MR = settings.MR;
MC = settings.MC;
NM = settings.NM;
W = 30;
H = 30;
this.newGame(1);
this.Invalidate();
}
private void выходToolStripMenuItem_Click(object sender, EventArgs e)//щелчокнапунктеменюВыход
{
this.Close();
}
private void новаяИграToolStripMenuItem1_Click(object sender, EventArgs e)//щелчокнапунктеменюНовая игра
{
this.newGame(1);
this.Invalidate();
}
//обработчики щелчков на пунктах меню, в которых указывается способ расстановки мин
private void randomToolStripMenuItem_Click(object sender, EventArgs e)
{
this.newGame(1);
this.Invalidate();
}
private void линейныйКонгруентныйМеоToolStripMenuItem_Click(object sender, EventArgs e)
{
this.newGame(2);
this.Invalidate();
}
private void алгоритмToolStripMenuItem_Click(object sender, EventArgs e)
{
this.newGame(3);
this.Invalidate();
}
}
public partial class Form2 : Form //форманастроекигровогополя
{
public int MR,MC,NM;
public Form2()//конструктор формы настроек поля
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)//нажатиекнопкиОК
{
// не все текстовые поля заполнены, выводится предупреждение
if (((textBox1.Text == "") || (textBox2.Text == "")) || (textBox3.Text == ""))
{
MessageBox.Show("Заполните все поля!");
}
// все текстовые поля заполнены, задаются кол-ва клеток и мин
else
{
MR = Convert.ToInt32(textBox1.Text);
MC = Convert.ToInt32(textBox2.Text);
NM = Convert.ToInt32(textBox3.Text);
this.Close();
}
}
}
partial class AboutBox1 : Form //форма «Опрограмме»
{
public AboutBox1()//конструктор формы «О программе»
{
InitializeComponent();
// Initialize the AboutBox to display the product information from the assembly information.
// Change assembly information settings for your application through either:
// - Project->Properties->Application->Assembly Information
// - AssemblyInfo.cs
//задается текст компонентов формы О программе
this.Text = String.Format("Опрограмме");
this.labelProductName.Text = "Cапер";
this.labelVersion.Text = String.Format("Версия {0}", AssemblyVersion);
this.labelCopyright.Text = "АвторТемеревКирилл";
this.labelCompanyName.Text = "КФМГТУим.Н.Э.Баумана, группаСАПР-31";
this.textBoxDescription.Text = "Программасозданав Microsoft Visual Studio 2005 дляплатформы .NET Framework";
}
}