49574 (Генерирование псевдослучайных чисел на примере создания игры "Сапер"), страница 3

2016-07-30СтудИзба

Описание файла

Документ из архива "Генерирование псевдослучайных чисел на примере создания игры "Сапер"", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "49574"

Текст 3 страницы из документа "49574"

if (random == 3)

{

this.BBS();//вызов метода BBS()

}

……………

}

//способы расстановки мин

private void Rand()//метод, основанный на использовании класса Random

{

int n = 0;//кол-во поставленных мин

int row, col;

Random rnd = new Random();//генеретор случайных чисел

//расстановка мин

do

{

row = rnd.Next(MR) + 1;

col = rnd.Next(MC) + 1;

if (Pole[row, col] != 9)

{

Pole[row, col] = 9;

n++;

}

}

while (n != NM);

}

private void Lin()//метод, основанный на использовании линейного

конгруэнтного метода

{

int n = 0;

int row, col;

double a = Convert.ToInt64(Math.Exp((double)5 * Math.Log(7))),

m = Convert.ToInt64(Math.Exp((double)31 * Math.Log(2))) - 1;

int x = 27011989, c = 19;

//расстановка мин

do

{

//для нахождения пвевдослучайного числа Х используется

формула x(k+1)=(a * x(k) + c) mod m

x = (int)((a * x + c) % m);

//находится пвевдослучайный индекс клетки на [0,MR]

row =Convert.ToInt32( Math.Ceiling((double) MR * x / (m-1)));

x = (int)((a * x + c) % m);

//находится пвевдослучайный индекс клетки на [0,MС]

col = Convert.ToInt32(Math.Ceiling((double)MC * x / (m-1)));

if (Pole[row, col] != 9)

{

Pole[row, col] = 9;

n++;

}

}

while (n != NM);

}

private void BBS()//метод, основанный на использовании алгоритма Блюма, Блюма

и Шуба

{

int n = 0;

int row, col;

int x = 2701;

int p=2047,q=8191;

int M = p * q;

//расстановка мин

do

{

//для нахождения пвевдослучайного числа Х используется

формула x(k+1)=(x(k)^2) mod m

x = Math.Abs((int)((x * x) % M));

//находится пвевдослучайный индекс клетки на [0,MR]

row = Convert.ToInt32(Math.Ceiling((double)MR * x / (M-1)));

x = Math.Abs((int)((x * x) % M));

//находится пвевдослучайный индекс клетки на [0,MС]

col = Convert.ToInt32(Math.Ceiling((double)MC * x / (M-1)));

if (Pole[row, col] != 9)

{

Pole[row, col] = 9;

n++;

}

}

while (n != NM);

}

private void showPole(Graphics g, int status)//метод,отрисовывающий поле

{

for (int row = 1; row <= MR; row++)

{

for (int col = 1; col <= MC; col++)

{

this.kletka(g, row, col, status);//вызов метода kletka()

}

}

}

private void kletka(Graphics g, int row, int col, int status)

//метод,выводящий содержимое клетки

{

…………

// в клетке флаг

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)//метод,открывающий текущую и все соседние

клетки, в которых нет мин

{

…………

//рекурсивный процесс открытия всей пустых соседих клеток

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

}

…………

}

а также два метода, основанных на работе с графикой:

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

}

События

Событие вызывает исполнение некоторого фрагмента кода. События — неотъемлемая часть программирования для Microsoft Windows. Например, события возникают при движении мыши, щелчке или изменении размеров окна. Важнейшую роль играет обработчики событий— методы, исполняемые при генерации событий:

private void Сапер_MouseDown(object sender, MouseEventArgs e)//нажатие кнопки

мыши на игровом поле

{

}

private void новаяИграToolStripMenuItem1_Click(object sender, EventArgs e) //щелчок на пункте меню Новая игра

{

this.newGame(1);

this.Invalidate();

}

//обработчики щелчков на пунктах меню, в которых указывается размер поля и кол-во мин

private void минToolStripMenuItem_Click(object sender, EventArgs e)

{

}

private void минToolStripMenuItem1_Click(object sender, EventArgs e)

{

}

private void минToolStripMenuItem2_Click(object sender, EventArgs e)

{

}

private void минToolStripMenuItem3_Click(object sender, EventArgs e)

{

}

private void минToolStripMenuItem4_Click(object sender, EventArgs e)

{

}

private void минToolStripMenuItem5_Click(object sender, EventArgs e)

{

}

private void особыеToolStripMenuItem_Click(object sender, EventArgs e) //щелчок на пункте меню Особые

{

Настройки settings = new Настройки();//создание экземпляра формы

Настройки

settings.ShowDialog();//появление формы Настройки

//присваиваем значения полям на основе введенных пользователем на

форме Настройки

MR = settings.MR;

MC = settings.MC;

NM = settings.NM;

W = 30;

H = 30;

this.newGame(1);

this.Invalidate();

}

//обработчики щелчков на пунктах меню, в которых указывается способ расстановки мин

private void randomToolStripMenuItem_Click(object sender, EventArgs e)

{

}

private void инейныйКонгруэнтныйМеоToolStripMenuItem_Click(object sender, EventArgs e)

{

}

private void алгоритмToolStripMenuItem_Click(object sender, EventArgs e)

{

}

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

//щелчок на пункте меню Выход

{

this.Close();

}

private void справкаToolStripMenuItem_Click(object sender, EventArgs e) //щелчок на пункте меню Справка

{

Help.ShowHelp(this, this.helpProvider1.HelpNamespace);//вызов файла справки

}

private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e) //щелчок на пункте меню О программе

{

AboutBox1 saper = new AboutBox1();//создание экземпляра формы

О программе

saper.ShowDialog();//появление формы О программе

}

Отдельного внимания заслуживает событие Paint, которое сообщает программе о необходимости отобразить информацию в окне. Paint информирует программу о том, что вся клиентская область или ее часть недействительна (invalid) и требует перерисовки. Когда форма только что создана, вся клиентская область недействительна, так как программа еще ничего в ней не показывала. В программе происходит первое событие Paint, сообщающее о необходимости показать что-нибудь в клиентской области. Когда окна перемещаются по экрану, так что они перекрывают друг друга, Windows не запоминает вид клиентской области, закрытой другим окном. Потом, когда клиентская область снова открывается, программа должна восстановить ее вид. Поэтому в ней и происходит событие Paint. Когда окно программы после свертывания возвращается в нормальное состояние, в ней также происходит событие Paint.

private void Form1_Paint(object sender, PaintEventArgs e)//обработчик события

Paint

{

this.showPole(e.Graphics, status); //вызов метода showPole

}

3.Технологическая часть

    1. 3.1.Системные требования

Для запуска игры оптимальны следующие системные требования:

  1. Процессор Pentium 3.

  2. Частота процессора 800 Мгц.

  3. 256 Мб ОЗУ.

  4. Видеоадаптер Radeon 9600 и аналогичные.

  5. Visual Studio 2003 или 2005.

  6. Операционная система Windows 2000 и более поздние версии

3.2.Запуск и процесс игры.

Для запуска игры необходимо выполнить следующие действия:

1.Вставьте диск «Курсовая работа Темерева К., гр. САПР-31. Игра “Сапер”» в дисковод.

2.

- нажмите кнопку Пуск

- двойным щелчком левой кнопки мыши откройте Мой компьютер

- двойным щелчком откройте

3.На экране появится окно (см. рис.3.1)

4.Если на компьютере не установлена платформа .NET нужно открыть папку Microsoft .NET Framework 3.0 и двойным щелчком запустить установочный файл dotnetfx3.exe

5.Запуск игры осуществляется двойным щелчком на файле

Цель игры состоит в том, чтобы как можно быстрее найти все мины на минном поле, не вскрыв ни одну из них.

Чтобы начать игру в меню Игра нужно выбрать команду Новая игра (рис.3.2).

Игрок имеет возможность открыть любую ячейку, щелкнув ее левой кнопкой мыши. Если открываемая ячейка содержит мину, игра завершается.

Если мины нет, в ячейке появится цифра, которая указывает, сколько мин находится в восьми смежных с ней ячейках.

Чтобы пометить ячейку, в которой по мнению игрока находится мина, нужно щелкнуть ее правой кнопкой мыши.

Чтобы настроить игровое поле в меню Игра следует выбрать команду Игровое поле (рис.3.2), а далее:

  • выбрать размер поля 10 * 10 или 20 *20, затем количество мин 10, 15, 20, 40, 60

или выбрать команду Особые и задать размер поля, указав количество клеток по горизонтали и вертикали, а также ввести число мин. (рис.3.3)

Чтобы изменить способ расстановки мин на поле, в меню Игра нужно выбрать команду Способ расстановки мин, а далее:

  • Random

  • Линейный конгруэнтный метод

  • Алгоритм Блюма, Блюма и Шуба.

Чтобы найти инструкцию по игре, нужно выбрать в меню Справка, а для ознакомления с информацией о приложении выбрать

О программе

Заключение

В ходе выполнения курсовой работы были рассмотрены и проанализированы основные методы генерирования псевдослучайных чисел: линейный конгруэнтный метод, метод Фибоначчи с запаздываниями, алгоритм Блюма, Блюма и Шуба, Вихрь Мерсенна.

Для реализации в курсовой работе были выбраны: метод, основанный на использовании системного класса Random, линейный конгруэнтный метод и алгоритм Блюма, Блюма и Шуба в связи с их достаточно простым математическим представлением и возможностью получения любого числа, располагая только значением стартового.

Выдвинуты требования к функциональности приложения, исходя из специфики игры «Сапер» и сформулированы необходимые характеристики того языка программирования, с помощью которого предполагалось выполнить поставленную задачи, проанализированы преимущества и недостатки разных языков и сделан выбор в пользу языка С#.

В конструкторской части были использованы новые визуальные компоненты. На основе имеющихся и полученных знаний об основных структурах языка С# реализованы алгоритм игры и графический интерфейс.

Технологическая часть состояла из разработки подробных инструкций по запуску и работе с приложением, а также сформулированы рекомендуемые требования к системе при работе с проектом.

Задание на курсовую работу было выполнено полностью.

  1. Литература

  1. Кнут Д. Искусство программирования, т. 2. Получисленные методы -М.: «Вильямс», 2007. — С. 832.

  2. Зубинский А. В поисках случайности. - Компьютерное Обозрение,

29 (2003)

  1. Шилдг Г. Полный справочник по С#/Пер. с англ. — М. : Издательский дом "Вильямc", 2004. — 752 с.

  2. Ватсон К. С#. – М.: Издательство "Лори", 2005

  3. Рихтер Дж. Программирование на платформе Microsoft .NET Framework. - М.: Издательско-торговый дом “Русская Редакция”, 2003.-464 с.

  4. Фролов А. В. Фролов Г. В. Язык С#. Самоучитель. - М: Издательство «ДИАЛОГ-МИФИ», 2003. - 560 с.

  1. Приложение 1

Код программы

public partial class Form1 : Form //главная форма программы

{

private int

MR,//кол-во клеток по вертикали

MC,//кол-во клеток по горизонтали

NM,//кол-во мин

W,//ширина клетки поля

H;//высота клетки поля

private int

nMin,//кол-во найденных мин

nFlag;//кол-во поставленных флагов

private int status;/*отражает различные этапы работы программы:

0-начало игры,

1-игра,

2-конец игры*/

private int[,] Pole;/*элемент массива задает клетку поля и принимает значения

0-8 -кол-во мин в соседних клетках,

9 -в клетке мина,

100-109 -клетка открыта,

200-209 -в клетку поставлен флаг*/

private void newGame(int r)/*метод, запускающий новую игру;

значение формального параметра r указывает на способ расстановки мин

1-используя системный класс Random,

2-используя линейный конгруэнтный метод,

3-используя алгоритм Блюма, Блюма и Шуба*/

{

this.ClientSize = new Size(W * MC + 1, H * MR + 1+25);/*устанавливаем размер формы в соответствии

с размером игрового поля*/

int row, col;//индексы клетки

int k;//кол-во мин в соседних клетках

Pole = new int[MR + 2, MC + 2];//инициализация массива минного поля

/*неотражаемым элементам массива минного поля присваиваем значение -3

для завершения процесса открытия клеток*/

for (row = 0; row <= MR + 1; row++)

{

Pole[row, 0] = -3;

Pole[row, MC + 1] = -3;

}

for (col = 0; col <= MC + 1; col++)

{

Pole[0, col] = -3;

Pole[MR + 1, col] = -3;

}

//обнуление элементов массива минного поля

for (row = 1; row <= MR; row++)

{

for (col = 1; col <= MC; col++)

{

Pole[row, col] = 0;

}

}

//метод расстановки мин

int random = r;

if (random == 1)

{

this.Rand();//вызов метода Rand()

}

if (random == 2)

{

this.Lin();//вызов метода Lin()

}

if (random == 3)

{

this.BBS();//вызов метода BBS()

}

//для каждой клетки вычисляем кол-во мин в соседних клетках

for (row = 1; row <= MR; row++)

{

for (col = 1; col <= MC; col++)

{

if (Pole[row, col] != 9)

{

k = 0;

if (Pole[row - 1, col - 1] == 9)

k++;

if (Pole[row - 1, col] == 9)

k++;

if (Pole[row - 1, col + 1] == 9)

k++;

if (Pole[row, col - 1] == 9)

k++;

if (Pole[row, col + 1] == 9)

k++;

if (Pole[row + 1, col - 1] == 9)

k++;

if (Pole[row + 1, col] == 9)

k++;

if (Pole[row + 1, col + 1] == 9)

k++;

Pole[row, col] = k;

}

status = 0;//начало игры

nMin = 0;//нет обнаруженных мин

nFlag = 0;//нет поставленных флагов

}

}

}

//способы расстановки мин

private void Rand()//метод, основанный на использовании системного класса Random,

{

int n = 0;//кол-во поставленных мин

int row, col;

Random rnd = new Random();//генеретор случайных чисел

//расстановка мин

do

{

row = rnd.Next(MR) + 1;

col = rnd.Next(MC) + 1;

if (Pole[row, col] != 9)

{

Pole[row, col] = 9;

n++;

}

}

while (n != NM);

}

private void Lin()//метод, основанный на использовании линейного конгруэнтного метода

{

int n = 0;

int row, col;

double a = Convert.ToInt64(Math.Exp((double)5 * Math.Log(7))), m = Convert.ToInt64(Math.Exp((double)31 * Math.Log(2))) - 1;

int x = 27011989, c = 19;

//расстановка мин

do

{

//для нахождения пвевдослучайного числа Х используется формула x(k+1)=(a * x(k) + c) mod m

x = (int)((a * x + c) % m);

//находится пвевдослучайный индекс клетки на [0,MR]

row =Convert.ToInt32( Math.Ceiling((double) MR * x / (m-1)));

x = (int)((a * x + c) % m);

//находится пвевдослучайный индекс клетки на [0,MС]

col = Convert.ToInt32(Math.Ceiling((double)MC * x / (m-1)));

if (Pole[row, col] != 9)

{

Pole[row, col] = 9;

n++;

}

}

while (n != NM);

}

private void BBS()//метод, основанный на использовании алгоритма Блюма, Блюма и Шуба

{

int n = 0;

int row, col;

int x = 2701;

int p=2047,q=8191;

int M = p * q;

//расстановка мин

do

{

//для нахождения пвевдослучайного числа Х используется формула x(k+1)=(x(k)^2) mod m

x = Math.Abs((int)((x * x) % M));

//находится пвевдослучайный индекс клетки на [0,MR]

row = Convert.ToInt32(Math.Ceiling((double)MR * x / (M - 1)));

x = Math.Abs((int)((x * x) % M));

//находится пвевдослучайный индекс клетки на [0,MС]

col = Convert.ToInt32(Math.Ceiling((double)MC * x / (M - 1)));

if (Pole[row, col] != 9)

{

Pole[row, col] = 9;

n++;

}

}

while (n != NM);

}

private void showPole(Graphics g, int status)//метод,отрисовывающий поле

{

for (int row = 1; row <= MR; row++)

{

for (int col = 1; col <= MC; col++)

{

this.kletka(g, row, col, status);//вызов метода kletka(Graphics g, int row, int col, int status)

}

}

}

private void kletka(Graphics g, int row, int col, int status)//метод,выводящий содержимое клетки

{

//координаты области вывода

int x = (col - 1) * W + 1, y = (row - 1) * H + 1 + 25;

//неоткрытые клетки - серые

if (Pole[row, col] < 100)

{

g.FillRectangle(SystemBrushes.ControlLight, x - 1, y - 1, x + W, y + H);

}

//открытые или помеченные клетки

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

}

}

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Нашёл ошибку?
Или хочешь предложить что-то улучшить на этой странице? Напиши об этом и получи бонус!
Бонус рассчитывается индивидуально в каждом случае и может быть в виде баллов или бесплатной услуги от студизбы.
Предложить исправление
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5076
Авторов
на СтудИзбе
455
Средний доход
с одного платного файла
Обучение Подробнее