Смекни!
smekni.com

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

{

}

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.Технологическая часть

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

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

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

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

3. 256 Мб ОЗУ.

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

5. VisualStudio 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. Кнут Д. Искусство программирования, т. 2. Получисленные методы -М.: «Вильямс», 2007. — С. 832.

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

29 (2003)

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

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

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

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

Приложение 1

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

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

}

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