Смекни!
smekni.com

Генерирование псевдослучайных чисел на примере создания игры Сапер (стр. 5 из 5)

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";

}

}