Генерування псевдовипадкових чисел на прикладі створення гри Сапер

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Державна освітня установа
вищої професійної освіти
«Московський державний технічний університет
ім. Н. Е. Баумана »
Калузький філія
кафедра
«Системи автоматизованого проектування»
Пояснювальна записка
до курсової роботи
з дисципліни:
«Програмування на мові високого рівня»
на тему:
«Генерування псевдовипадкових чисел на прикладі створення гри" Сапер
Калуга 2007

Зміст
Вступ 3
1.Ісследовательская частина 4
1.1.Генерірованіе псевдовипадкових чисел
1.2.Целесообразность вибору мови
2.Конструкторская частина
2.1.Структура проекту.
2.2. Програмна реалізація основних елементів C #.
2.2.1.Класси
2.2.2.Члени класу
3.Технологіческая частина
3.1.Сістемние вимоги
3.2.Запуск і процес гри.
Висновок
Література
Додаток

Введення

Тема моєї курсової роботи «гра" Тетріс "». У ході виконання роботи були поставлені наступні цілі:
¾ вивчити основні підходи при створенні Windows додатків;
¾ набути навичок роботи з 2D графікою в Windows додатках в С #;
¾ досліджувати методи генерації псевдовипадкових чисел.
Завданням курсової роботи є розробка гри «Сапер» з розташуванням хв на основі декількох методів генерації випадкових чисел.
Ця тема є актуальною, оскільки в ході розробки гри є можливість вивчити процес створення Windows додатків і роботу з 2D графікою, а «генерація випадкових чисел - занадто важлива справа, щоб залишати її на волю випадку» (Джон фон Нейман).

1.Ісследовательская частина

1.1.Генерірованіе псевдовипадкових чисел

Для розстановки хв на ігровому полі в грі «Сапер» необхідно випадковим чином задати координати клітини з міною. Для цього в програмі використовуються різні методи генерування таких координат.
Генератор псевдовипадкових чисел (ГПСЧ) - алгоритм, що генерує послідовність чисел, елементи якої майже незалежні один від одного і підкоряються заданого розподілу. [1]
Сучасна інформатика широко використовує псевдовипадкові числа в самих різних додатках - від методу Монте-Карло до криптографії. Генератори псевдовипадкових чисел широко використовуються в імітаційному моделюванні.
Термін ГПСЧ часто використовується для опису ГПСБ (PRBG) - генераторів псевдовипадкових біт, а так само різних потокових шифрів. Призначення ГПСЧ - генерація послідовностей чисел, які неможливо відрізнити від випадкових. Ніякої детермінований алгоритм не може генерувати повністю випадкові числа, а тільки лише апроксимувати деякі властивості випадкових чисел.
Найпростіші апаратні ГВЧ (АГСЧ) засновані на тих властивостях елементів електронних схем, з якими так довго і наполегливо боролися інженери - схемотехніки. Це властивість - власні шуми електронного приладу.
В окремий підклас АГСЧ варто винести розробки, в яких замість дискретного електронного компонента застосовується куди більш складний джерело природної випадковості. Наприклад, поміщена в спеціальний футляр при повній відсутності світла ПЗС-матриця камери приводиться керуючої програмою в найгірший режим, при якому шумові характеристики максимальні і картина чистого, природного хаосу придатна до подальшої обробки.
Другому обширного класу АГСЧ найкраще підійде назва "функціональний". Тут в якості "джерела ентропії" використовуються фундаментальні функціональні властивості електронних приладів, наприклад лічильників Гейгера-Мюллера. Неприємною особливістю подібних пристроїв є необхідність застосування радіоізотопних джерел.
Третій клас АГСЧ-це "фундаментальний" клас. Найбільш яскравий представник "фундаментальних" АГСЧ - оптичний квантовий генератор випадкових чисел ". Також існує пристрій, в якому фундаментальні фізичні принципи, наносекундному синхронізація та сама сучасна електроніка підпорядковані рішенням самої утилітарною завдання - отримання випадкових чисел, оновлюються 100 тис. разів на секунду.
Четвертий клас АГСЧ можна умовно назвати "паразитним персонально-комп'ютерним". До їх властивостями відносяться перш за все теплові шуми і флуктуації в підсистемі аналогового вводу / виводу звукового адаптера.
В окремий клас "курйозних" АГСЧ можна виділити спеціалізованих роботів, методично кидають ... звичайні гральні кістки і оснащених системою технічного зору для зчитування випали очок.
Більшість простих арифметичних генераторів хоча і мають великий швидкістю, але страждають від багатьох серйозних недоліків:
¾ Занадто короткий період / періоди
¾ Послідовні значення не є незалежними
¾ Деякі біти «менш випадкові», ніж інші
¾ Нерівномірний розподіл одномірне
¾ Оборотність
Найбільш поширені лінійний конгруентний метод, метод Фібоначчі з запізнюваннями, алгоритм Блюма, Блюма і Шуба, Вихор Мерсенна.
Лінійний конгруентний метод
Даний алгоритм був запропонований Д. Х. Лемером в 1948 році. Застосовується в простих випадках і не має криптографічного стійкістю. Використовується в якості стандартного генератора багатьма компіляторами.
Цей алгоритм полягає в ітеративному застосуванні формули (1):
QUOTE (1)
де a> 0, c> 0, M> 0 - деякі цілочисельні константи. Отримана послідовність залежить від вибору стартового числа X 0 і при різних його значеннях виходять різні послідовності випадкових чисел. У той же час, багато властивостей послідовності X j визначаються вибором коефіцієнтів у формулі і не залежать від вибору стартового числа. Ясно, що послідовність чисел, що генерується таким алгоритмом, періодична з періодом, що не перевищує m. При цьому довжина періоду дорівнює m тоді і тільки тоді, коли:
1. НОД (c, m) = 1 (тобто c і m взаємно прості);
2. a - 1 кратно p для всіх простих p - дільників m;
3. a - 1 кратно 4, якщо m кратно 4.
При реалізації вигідно вибирати m = 2 e, де e - число біт у машинному слові, оскільки це дозволяє позбутися від відносно повільної операції приведення по модулю.
Формула (2) для обчислення n-й члена послідовності, знаючи тільки 0-й
(2)

Метод Фібоначчі з запізнюваннями.
Особливості розподілу випадкових чисел, що генеруються лінійним конгруентним алгоритмом, робить неможливим їх використання в статистичних алгоритмах, що вимагають високого дозволу. [2]
У зв'язку з цим лінійний конгруентний алгоритм поступово втратив свою популярність і його місце зайняло сімейство фібоначчійовий алгоритмів, які можуть бути рекомендовані для використання в алгоритмах, критичних до якості випадкових чисел.
Найбільшу популярність фібоначчійовий датчики отримали у зв'язку з тим, що швидкість виконання арифметичних операцій з числами зрівнялася зі швидкістю целочисленной арифметики, а фібоначчійовий датчики природно реалізуються у речовій арифметиці.
Один із широко поширених фібоначчійовий датчиків заснований на наступній ітеративної формулою (3):
X (k) = \ left \ {\ begin {matrix} X (ka)-X (kb), & \ mbox {if} X (ka) \ geq X (kb); \ \ X (ka)-X ( kb) +1, & \ mbox {if} X (ka) <X (kb); \ end {matrix} \ right. (3)
де X (k) - дійсні числа з діапазону [0, 1),
a, b - цілі позитивні числа, що називаються лагами.
Для роботи фібоначчійовий датчику потрібно знати max (a, b) попередніх згенерованих випадкових чисел. При програмної реалізації для зберігання згенерованих випадкових чисел використовується кінцева циклічна чергу на базі масиву. Для старту фібоначчійовий датчику потрібно max (a, b) випадкових чисел, які можуть бути згенеровані простим конгруентним датчиком.
Рекомендуються наступні значення: a = 55, b = 24; a = 17, b = 5;
a = 97, b = 33.
Алгоритм Блюма, Блюма і Шуба (Blum Blum Shub, BBS)
Запропоновано в 1986 році Ленор і Мануелем Блюм і Майклом Шубом.
BBS полягає в застосуванні формули (4):
x n +1 = (x n) 2 mod M (4)
де M = p * q є твором двох великих простих p і q.
На кожному кроці алгоритму вихідні дані виходять з x n шляхом взяття або біта парності, або одного або більше найменш значущих біт x n.
Два простих числа, p і q, повинні бути обидва порівнянні з 3 по модулю 4 і НОД (φ (p-1), φ (q-1)) повинен бути малий.
Цікавою особливістю цього алгоритму є те, що для отримання x n необов'язково обчислювати все n - 1 попередніх чисел, якщо відомо початковий стан генератора x 0 і числа p і q. n-ве значення може бути обчислено "напряму" використовуючи формулу (5):
x n = x 0 (2 ^ n) mod ((p-1) (q-1)) mod M (5)
Вихор Мерсенна (Mersenne twister)
Розроблено в 1997 японськими вченими Макото Мацумото і Такудзі Нісімура. Він забезпечує швидку генерацію високоякісних псевдовипадкових чисел, так як спочатку був розроблений з урахуванням помилок, знайдених в інших алгоритмах.
Існують щонайменше два загальних варіанти алгоритму, що розрізняються лише розміром використовується простого числа Мерсенна. Новітній і найбільш поширений називається Mersenne Twister MT 19937.
MT 19937 має такі очікувані властивості:
1. Він був розроблений з метою мати величезний період, розміром 2 19937 - 1.
2. Він має вищий порядок просторового еквіраспространенія.
3. Він значно швидше, ніж всі інші генератори, за винятком статистично-дефектних генераторів.
4. Він статистично випадковий у всіх вихідних бітах.
Генерування випадкових чисел за допомогою класу Random в С #.
Щоб згенерувати послідовність псевдовипадкових чисел, використовується клас Random. Початок такої послідовності визначається деяким початковим числом, яке автоматично надається класом Random або задається явно.
У класі Random визначені наступні два конструктора:
public Random ()
public Random (int seed)
За допомогою першої версії конструктора створюється об'єкт класу Random, який для обчислення початкового числа послідовності випадкових чисел використовує системний час. При використанні другої версії конструктора початкове число задається в параметрі seed.
Клас Random (скорочено)
/ / Конструктори
Random ()
Random (int а);
/ / Методи примірника
int Next ();
int Next (int макс_значеніе);
int Next (int мін_значеніе, int макс_значеніе);
double NextDouble ();
Конструктори повертають випадкові об'єкти, які утворюють послідовність псевдовипадкових чисел. Методи Next повертають наступне число у послідовності, можливо, між заданими значеннями. NextDouble повертає число в діапазоні від 0.0 до 1.0.
Порівнявши методи отримання псевдовипадкових чисел для реалізації в програмі, я вибрав, крім методу, заснованого на використанні системного класу Random, лінійний конгруентний метод і алгоритм Блюма, Блюма і Шуба, виходячи з переваг цих методів перед іншими:
¾ більш просте математичне представлення, а отже і програмна реалізація;
¾ можливість отримання будь-якого числа, маючи в своєму розпорядженні тільки значенням стартового.

1.2.Целесообразность вибору мови

У курсовому проекті була поставлена ​​задача, реалізація якої може бути зроблена за допомогою різних мов програмування. У зв'язку з цим потрібно сформулювати ті вимоги, яким обов'язково повинен відповідати обрана мова. Це:
1. Можливість створення Windows додатків.
2. Створення максимально можливого зручності в роботі
3. Підтримка інших мов програмування і платформ
4. Велика кількість бібліотек
5. Простота вивчення мови на основі наявних знань.
Перший критерій різко відсікає велику кількість різних мов, тому що програма повинна мати зручний і сучасний інтерфейс користувача. Підтримка багатьох мов програмування та платформ дозволить користувачеві вдосконалити даний проект на різних мовах. Велика кількість бібліотек дає можливість значно зменшити вихідний код програми.
Сформулювавши вимоги, потрібно перейти до аналізу існуючих мов програмування.
Сотні наявних мов можуть бути поділені на три загальних типу: машинні, асемблерні і мови високого рівня.
Машинні мови незручні для сприйняття людиною. Машинні мови є машинно-залежними, тобто конкретний машинний мова може бути використаний тільки з певним типом комп'ютера.
Для перетворення програм були розроблені програми-транслятори, звані асемблера. З появою мов асемблера використання комп'ютерів значно розширилося, однак все ще було потрібно написання великої кількості інструкцій навіть для реалізації рішень найпростіших завдань.
Для прискорення процесу програмування були розроблені мови високого рівня, в яких для виконання складних дій досить написати один оператор.
На практиці програмісту-одиночці або невеликій робочій групі доведеться використовувати якісь потужні кошти, начебто візуальних систем програмування (Visual Basic, C + + Builder, С #, Delphi) або ж універсальне середовище розробки типу Borland C + + в поєднанні з бібліотекою класів, такий , як OWL або MFC. [3]
Бурхливий розвиток обчислювальної техніки, потреба в ефективних засобах розробки програмного забезпечення призвели до появи систем програмування, орієнтованих на так звану "швидку розробку", серед яких можна виділити Borland Delphi, Microsoft Visual Basic. З появою Visual Basic програмування в Windows не стає більш ефективним, але воно стає більш простим (в більшості випадків).
Якщо говорити про створення програм з інтерфейсом Windows, то не можна, звичайно, не обійти увагою візуальні засоби програмування C + + Builder. Кілька років тому рядовому програмістові залишалося тільки мріяти про створення власних програм, що працюють у середовищі Windows, оскільки єдиним засобом розробки був Borland C + + for Windows, явно орієнтований на професіоналів, що володіють серйозними знаннями і досвідом. C + + Builder буквально нав'язує програмістові свій власний стиль програмування, при якому, навіть за особливого бажання, перейти з C + + Builder на щось інше вже не надається можливим. С + + не підтримує інших мов програмування.
Delphi - це середовище швидкої розробки, в якій в якості мови програмування використовується мова Delphi. Мова Delphi - строго типізований об'єктно-орієнтована мова, в основі якого лежить добре знайомий програмістам Object Pascal. Borland Delphi 7 Studio дозволяє створювати самі різні програми: від найпростіших одновіконних додатків до програм управління розподіленими базами. Delphi-не підтримує інших мов програмування, але здатний підтримувати різні платформи.
Однак, при всьому цьому вибір падає на мову С #, що входить в Visual Studio. Net, так як він має ряд переваг, які спрощують процес створення додатків.
C # створювався Microsoft, як основна мова для. NET Framework. Microsoft спроектувала C # таким чином, що б С, С + + і Java-програмісти змогли легко перейти на нього. C # має коріння в мовах С, С + + і Java, тому такий перехід не повинен викликати труднощів.
Синтаксис у C # не такий складний як у С + +, тому його вивчення набагато легше. Більшість операцій, які ви можете робити на С + +, можна зробити і на C #, за винятком операцій доступу до низькорівневих функцій (це все-таки можна зробити за допомогою некерованого коду).
С # - перша мова, підтримуваний версіями. NET Framework для інших платформ.
C # має схожий з C стиль синтаксису (для керуючих конструкцій, блоків коду, опису сигнатури методів та ін), багато спільного з Java (відсутність множинного успадкування та шаблонів, наявність збирача сміття) і Delphi (орієнтованість на створення компонент), в той же час має і свій колорит.
C # об'єктно-орієнтована мова, як і вся платформа. NET [7].
У C # представлена ​​концепція просторів імен, аналогічна пакетів в Java. Це дозволяє ієрархічно структурувати систему типів, роблячи код набагато більш зрозумілим і дозволяючи уникнути проблем з ім'ям. Реалізація структур як типів, робота з якими йде за значенням, разом з можливістю використовувати не тільки вкладені масиви (як в Java), але і багатовимірні дозволяє оптимізувати продуктивність додатків.
Через дуже зручного об'єктно-орієнтованого дизайну, C # є гарним вибором для швидкого конструювання різних компонентів.
Платформа. Net містить багато важливих служб:
1. . Net надає кошти для виконання інструкцій, що містяться в програмі, написаній на C #. Ця частина. Net називається середовищем виконання.
2. . Net допомагає реалізувати так звану середу, безпечну до невідповідності типів даних.
3. . Net звільняє програміста від стомлюючого і нерідко приводить до помилок процесу управління комп'ютерною пам'яттю, яка використовується програмою.
4. . Net надає безпечне середовище виконання.
5. До складу. Net входять бібліотека, що містить масу готових програмних компонентів, які можна використовувати у власних програмах. Вона економить чимало часу, оскільки програміст може скористатися готовими фрагментами коду. Фактично, він повторно використовує код, створений і ретельно перевірений професійними програмістами Microsoft.
6. В. Net спрощена підготовка програми до виконання.
7. . Net забезпечує прекрасне взаємодію програм, написаних на різних мовах. Будь-яка мова підтримуваний. Net, може взаємодіяти з іншими мовами цієї платформи.
Проаналізувавши переваги З # в порівнянні з іншими мовами, можна зробити висновок, що він задовольняє всім раніше озвученим вимогам.

2.Конструкторская частина

2.1.Структура проекту.

Даний проект складається з файлів
Нижче подано опис основних файлів:
¾ Form1.cs - файл, в якому міститься код, що відповідає за роботу головної форми програми;
¾ Form1.resx - файл, в якому міститься інформація про графічному поданні головної форми «Сапер»;
¾ Form2.cs - файл, в якому міститься код, що відповідає за роботу форми налаштувань ігрового поля;
¾ Form2.resx - файл, в якому міститься інформація про графічному поданні форми налаштувань ігрового поля;
¾ AboutBox1.cs - файл, в якому міститься код, що відповідає за роботу форми «Про програму»;
¾ AboutBox1.resx - файл, в якому міститься інформація про графічному поданні форми «Про програму»;
¾ Справка.htm - HTML-сторінка, в якій міститься довідка по грі;
¾ Міна.jpg - зображення міни на формі «Про програму»
¾ Сапер.exe - закомпілірованний файл програми, що знаходиться в папці debug, яка знаходиться в папці bin
2.2. Програмна реалізація основних елементів C #.
Для його запуску необхідно клікнути кнопку Пуск, вибрати в пункті Всі програми \ Microsoft Visual Studio. NET 2005 \ Microsoft Visual Studio. NET 2005. Далі в запустивши додаток клікнути кнопку Open Project і використовуючи провідник, вибрати файл Сапер.sln. Програма відкриє програму. Для зміни зовнішнього вигляду програми необхідно скористатися ярликом Design. Можна додати нові елементи форми, перетягнувши їх з вікна Toolbox. У моїй роботі це HelpProvider і MenuStrip при конструюванні головної форми, Label, TextBox і Button при створенні форми налаштувань ігрового поля. Властивості компонентів можна змінити, зайшовши в меню View - Properties Windows або в коді програми:
/ / Задається текст компонентів форми Про програму
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
Клацнувши значок Блискавка в меню Properties можна знайти всі події і двічі клацнувши на одне з них, написати обробник.

2.2.1.Класси
Слід зазначити, що будь-яка форма, що є основним елементом для користувача інтерфейсу і основою для побудови програми, одночасно і клас, тому вдається створювати екземпляри форм і породжувати одні форми від інших. У даній програмі присутні наступні класи, відповідні формам Windows додатку.
public partial class Form1: Form / / головна форма програми
{
... ... ...
public Form1 () / / конструктор головної форми
{
InitializeComponent ();
/ / Присвоюємо початкові значення полів
MR = 10;
MC = 10;
NM = 10;
W = 40;
H = 40;
this.newGame (1); / / виклик методу newGame (int r)
}
... ... ...
}
public partial class Form2: Form / / форма налаштувань ігрового поля
{
... ... ...
public Form2 () / / конструктор форми Установки
{
InitializeComponent ();
}
... ... ...
}
partial class AboutBox1: Form / / форма «Про програму»
{
... ... ...
public AboutBox1 () / / конструктор форми Про програму
{
InitializeComponent ();
/ / Задається текст компонентів форми Про програму
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";
}
... ... ...
}
2.2.2.Члени класу
Поля
Полем називається член-змінна, що містить деяке значення. У ООП поля іноді називають даними об'єкту.
Для класів
public partial class Form1: Form
public partial class Form2: 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-в клітку поставлений прапор * /
Слід зазначити, що змінна Pole зберігає в собі посилання на двовимірний масив. Масиви в C # поділяються на два типи: одновимірні і багатовимірні.
Елементи багатовимірних масивів ідентифікуються набором індексів - "координат" у багатовимірному просторі. Кожен вимір має свою розмірність, не залежну від інших.
Ініціалізація
Pole = new int [MR + 2, MC + 2];
відбувається в методі
private void newGame (int r)
{
}
який буде розглянуто далі.
Доступ до елементів проводиться за допомогою оператора [], в якому індекси вказуються через кому. Присвоєння значень елементам присвоюється у методі:
private void newGame (int r)
{
... ... ... ...
/ * Невідбивальним елементів масиву мінного поля присвоюємо
значення -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;
}
}
... ... ...
}
а також в інших методах.
Методи
Методом називається реальний код, що впливає на дані об'єкта (або поля). При оголошенні методів використовується конструкція виду:
<Модіф_дост> <тіп_возвр_знач> <ідент_метода> (<формальн_парам> opt)
{
<Тело_метода>
}
Метод в процесі своєї роботи може не тільки змінювати поля об'єкту, але й обчислювати деякі додаткові значення. Якщо повертати значення не потрібно, то як типу значення вказується void.
Методи, використовувані в розробленому додатку і забезпечують процес гри:
private void newGame (int r) / / метод, який запускає нову гру
{
... ... ... ...
/ / Вибір методу розстановки хв
int random = r;
if (random == 1)
{
this.Rand ();// виклик методу Rand ()
}
if (random == 2)
{
this.Lin ();// виклик методу Lin ()
}
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.Технологіческая частина

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. Кнут Д. Мистецтво програмування, т. 2. Получісленние методи-М.: «Вільямс», 2007. - С. 832.
2. Зубінскій А. У пошуках випадковості. - Комп'ютерний Огляд,
29 (2003)
3. Шілдг Г. Повний довідник по С # / Пер. з англ. - М.: Видавничий дім "Вільямc", 2004. - 752 с.
4. Ватсон К. С #. - М.: Видавництво "Лорі", 2005
5. Ріхтер Дж. Програмування на платформі Microsoft. NET Framework. - М.: Видавничо-торговий дім "Російська Редакція", 2003.-464 с.
6. Фролов О. В. Фролов Г. В. Мова С #. Самовчитель. - М: Видавництво «ДІАЛОГ-МІФІ», 2003. - 560 с.

Додаток 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) ((eY - 25) / H) + 1, col = (int) (eX / 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";
}
}
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Курсова
89.4кб. | скачати


Схожі роботи:
Генерування псевдовипадкових чисел Метод середини квадрата
Генерування випадковості чисел
Статистичне дослідження властивостей псевдовипадкових чисел одержуваних методом Джона фон Неймана
Створення мережевої гри
Створення гри типу DOOM Wolf 3D
Створення гри типу DOOM Wolf 3D 2
Закономірність розподілу простих чисел в ряду натуральних чисел
Створення ігрової програми шашки для гри між людиною і комп`ютером на мові С Builder
Властивості чисел Періодична система чисел
© Усі права захищені
написати до нас