Розробка мережевої гри "Вікторина"
Аналіз сучасного стану питання та обґрунтування завдання на роботу. Аргумент вибору мови програмування. Розробка блок-схеми методу визначення переможця. Програмна реалізація мережевого підключення. Реалізація окремо серверного та клієнтського додатку.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 09.11.2014 |
Размер файла | 4,9 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Зміст
- Вступ
- 1. Аналіз сучасного стану питання та обґрунтування завдання на роботу
- 1.1 Предметна область
- 1.2 Існуючі реалізації гри
- 1.3 Розробка технічного завдання на роботу
- 1.4 Обґрунтування вибору мови програмування
- 1.5 Висновки
- 2. Проектування методів та засобів гри «Вікторина»
- 2.1Розробка діаграми класів
- 2.2 Розробка діаграми взаємодії
- 2.3 Розробка блок-схеми методу визначення переможця
- 2.4 Висновки
- 3. програмна реалізація гри «Вікторина»
- 3.1 Програмна реалізація мережевого підключення
- 3.2 Програмна реалізація гри
- 3.3 Інструкція користувача
- 3.4 Висновки
- Висновки
- Перелік посилань
- Додаток А. Відношення діаграм класів Server та Client
- Додаток Б. Головне вікно програми
- Додаток В. Лістинг програми
Вступ
Сьогодні важко уявити життя сучасної людини без розваг. Особливо зараз, у вік прогресу техніки, коли усі без винятку, і дорослі, і малі віддають перевагу іграм на мобільному телефоні чи комп'ютері, а не іграм на папері, чи, наприклад, на шаховій дошці. Звичайно, грати за комп'ютером зручно і цікаво. Ще краще грати з другом, тому ідеальним вибором є мережева реалізація гри. На даний момент часу існує безліч варіацій і аналогів різноманітних ігор. програмування мережа клієнтський
У даній курсовій роботі буде розроблено гру «Вікторина». Ця гра одна з небагатьох існуючих ігор в наш час, яка підвищує та розвиває інтелект гравців. Існує багато популярних аналогів «Вікторини», але кожен з них має свої недоліки.
Особливістю даної реалізації буде можливість мережевого підключення. Це забезпечить більшу динамічність гри, а також складність гри буде вищою, що зробить її цікавішою.
1. Аналіз сучасного стану питання та обґрунтування завдання на роботу
В даній курсовій роботі необхідно розробити мережеву гру «Вікторина». Розглянемо предметну область, існуючі реалізації даної гри, технічне завдання та оберемо мову програмування.
1.1 Предметна область
Гра «Вікторина» приваблює своєю цікавістю з одного боку та простотою з іншого. Дана курсова робота присвячена розробці мережевої реалізації цієї гри, адже зараз, на жаль, не існує її аналогів в Інтернеті.
Ціль гри - набрати якомога більше балів. Бали начисляються за правильні відповіді на запитання вікторини. За кожну правильну відповідь зачисляється 1 бал.У випадку вірної, або невірної відповіді учаснику вікторини пропонується наступне питання вікторини.
Питання задається гравцем-противником. Із чотирьох варіантів відповідей на кожне питання вікторини, лише один правильний. Учасник має право зупинити гру на будь-якому питанні.
Гравець, який відповів на більшу кількість питань і набрав найбільшу кількість балів, оголошується переможцем.
Для розробки гри важливим є вибір мови програмування, оскільки вона впливає на ефективність, зручність, швидкість виконання програми.
Існує багато різних мов програмування, серед яких найпоширенішими є С, С++, Java, Delphi, С#[1]. Але найкращою і найзручнішою є мова С#.
1.2 Існуючі реалізації гри
Так як гра «Вікторина» являється не дуже відомою грою, аналогів та існуючих реалізацій у неї немає. Але можна розглянути, схожі за принципом дії, ігри.
Найвідомішою схожою на «Вікторину» є гра «Хто хоче стати міліонером». В даній грі гравець так само відповідає на подані запитання, але різниця в тому, що у грі «Хто хоче стати міліонером» гравець може грати лише з комп'ютером. Розглянемо кілька різних реалізацій даної гри.
Перша гра, розроблена сайтом http://tvmillioner.ru/ має назву «кто хочет стать миллионером»(рис. 1). Дана гра є онлайн-аналогом популярного телешоу «Хто хоче стати міліонером». Щоб приєднається до гри, досить зібратися з думками і дати відповіді на 15 запропонованих питань. Питання підрозділяються за рівнями складності, і правильні відповіді збільшують рахунок гравця на відповідну суму віртуальних рублів. Відповідь на просте питання приносить від 100 до 1000, на питання середньої складності - від 2000 до 32000, на питання підвищеної складності - від 64000 до 1000000.
Рисунок 1 - Гра «Кто хочет стать Миллионером»
Другим аналогом є гра, що розроблена сайтом http://oschastlivchik.ru/, має назву «Кто хочет стать Миллионером» та зображена на рисунку 2. Щодня між учасниками онлайн ігри, які виграли три мільйони, проводиться розіграш реальних грошових призів - від 100 рублів до 5 тис. Відповівши вірно на 15 питань, вам буде запропоновано ввести номер вашого телефону і взяти участь у лотереї між переможцями гри «Хто хоче стати мільйонером». Якщо пощастить, на рахунок мобільного телефону будуть зараховані реальні грошові кошти. Шанс виграти справжні гроші досить великий, оскільки фінальні питання є досить складними і далеко не у всіх виходить дійти до останнього питання і вірно відповісти на нього.
Недоліком даної гри є можливість безкоштовно грати лише у демо-версії. Тому для того, щоб дійти до останнього питання, потрібно вносити кошти.
Рисунок 2 - Гра «Кто хочет стать Миллионером»
Третій аналог розроблений сайтом http://nuomondo.com/ має назву «Миллионер» (рис. 3).
Дана гра розроблена для Android-користувачів, має простий, яскравий та зручний інтерфейс. Гра за мотивами відомого шоу "Хто хоче стати мільйонером" ("О щасливчик").
15 питань, 4 варіанти відповіді, 2 незгораємі суми, 3 підказки і $ 1 000 000. База містить біля 10000 питань.
Рисунок 3 - Гра «Миллионер»
Основним недоліком усіх трьох аналогів гри є те, що вони не розраховані на гру по мережі між користувачами, можлива тільки гра з комп'ютером.
1.3 Розробка технічного завдання на роботу
Використовуючи мову програмування C#:
1. Розробити гру за заданим варіантом.
2. Розробити клас Server та клас Client. Кожен клас повинен містити public, private, static властивості та методи. В кожному класі повинно бути реалізовано мінімум три властивості та три методи.
3. Спроектувати конструктор для одного з класів.
4. Реалізувати можливість гри по мережі одним з способів. Перший спосіб - реалізація окремо серверного та клієнтського додатку. Другий спосіб - реалізація одного додатку з можливістю вибору режиму сервера або клієнта відповідно.
5. Якщо за правилами гри необхідно очікувати хід іншого гравця (противника) то потрібно заблокувати ігрове поле та вивести відповідне повідомлення про очікування ходу.
6. Інтерфейс гри розробити за допомогою технології Windows Forms.
7. Розробити вікно довідки в якій вказати автора програми та коротку інструкцію користувача.
Для запуску програми апаратне забезпечення повинно відповідати мінімальним вимогам:
- комп'ютер серії IBM PC з частотою 233 МГц і вище;
- 64МБ оперативної пам'яті;
- графічний адаптер SVGA (Super Video Graphic Adapter);
- відеокарта об'ємом пам'яті не менше 4МБ;
- клавіатура;
- ОС Windows Vista/7/ХР;
- .NET Framework 3.5.
Розмір дискового простору, що займає програма: 15 704 байт. Розмір оперативної пам'яті, що займає програма: 3 500 КБайт.
1.4 Обґрунтування вибору мови програмування
Мова C# з'явилася на світ в червні 2000 р. в результаті роботи великої групи розробників компанії Microsoft, очолюваної Андерсом Хейлсберг (Anders Hejlsberg).
Автори C# прагнули створити мову, що поєднує простоту і виразність сучасних об'єктно-орієнтованих мов (як, наприклад, Java) з багатством можливостей і міццю C++. За словами Андерса Хейлсберга, C# запозичив більшість своїх синтаксичних конструкцій з C++. Зокрема, в ньому присутні такі зручні типи даних, як структури та перерахування. Синтаксичні конструкції С# успадковані не тільки від C++, але і від Visual Basic. Наприклад, в С#, як і в Visual Basic, використовуються властивості класів. Як C++, С# дозволяє виробляти перевантаження операторів для створених власних типів, в той час як Java не підтримує ні ту, ні іншу можливість. [9]
Завдяки тому, що C# є гібридом безлічі мов, він є продуктом, який синтаксично так само "чистий", як Java (якщо не "чистіше"), майже так само простий, як VB6, і володіє майже такою ж потужністю і гнучкістю, як C++ (без відповідних "жахливих" конструкцій). По суті, мова C# пропонує наступні можливості (багато з яких властиві і всім іншим мовам програмування, що забезпечують підтримку .NET):
– відсутність покажчиків. Програми на C# зазвичай не вимагають прямого звернення до покажчиків (хоча є можливість отримати до них доступ на більш низькому рівні, якщо це необхідно);
– автоматичне управління пам'яттю через збірку сміття. З цієї причини в C# не підтримується ключове слово delete;
– формальні синтаксичні конструкції для переліків, структур і властивостей класів;
– аналогічне C++ перевантаження операцій для користувача типів, але без зайвих складнощів (наприклад, не потрібно контролювати «повернення *this для зв'язування»);
– повний і добре визначений набір основних типів. У C# 2005 є можливість будувати загальні типи з використанням синтаксису, дуже схожого на шаблони C++;
– повна підтримка техніки програмування, заснованої на використанні інтерфейсів;
– повна підтримка технології аспектно-орієнтованого програмування (АОП) через атрибути. Ця гілка розробки дозволяє призначати характеристики типам і їх членам, щоб уточнювати їх поведінку;
– вбудована підтримка автоматичної генерації XML-документації. Автоматичне звільнення динамічно розподіленої пам'яті;
– можливість позначки класів і методів атрибутами, обумовленими користувачем. Це може бути корисно при документуванні і здатне впливати на процес компіляції;
– повний доступ до бібліотеки базових класів .NET, а також легкий доступ до Windows API (якщо це дійсно необхідно);
– покажчики і прямий доступ до пам'яті, якщо вони необхідні. Однак мова розроблена таким чином, що практично у всіх випадках можна обійтися і без цього;
– підтримка властивостей і подій в стилі VB;
– проста зміна ключів компіляції. Дозволяє отримувати виконувані файли або бібліотеки компонентів .NET, які можуть бути викликані іншим кодом так само, як елементи управління ActiveX (компоненти СОМ);
– можливість використання С# для написання динамічних web-сторінок ASP.NET [10].
Однією з областей, для яких не призначена ця мова, є критичні за часом і високопродуктивні програми, коли має значення, чи буде займати виконання циклу 1000 або 1050 машинних циклів, і звільняти ресурси потрібно негайно. C++ залишається в цій області найкращою з мов низького рівня. У С# відсутні деякі ключові моменти, необхідні для створення високопродуктивних додатків, зокрема підставляються функції і деструктори, виконання яких гарантується в певних точках коду.
Враховуючи всі переваги мови C#, можна зробити висновок, що вона є однією з найкращих та найперспективніших на сьогоднішній день та найбільш оптимальною для розробки даного завдання у курсовій роботі.
1.5 Висновки
Предметна область розробки - гра «Вікторина». Це цікава гра для двох учасників, суть якої полягає у тому, що виграє той із учасників, хто правильно відповість на більшу кількість питань.
Зараз немає аналогів гри «Вікторина», так як це не дуже відома гра серед молоді, але у якості аналогів можна розглядати гру «Хто хоче стати мільйонером?», адже вони мають однаковий принцип дії.
Для розробки програми обрана мова програмування C#. Вона поєднує у собі простоту синтаксису та могутні виразні можливості, властиві для таких мов, як С++ та Java. Отже, ця мова є найбільш зручною для реалізації гри.
2. Проектування методів та засобів гри «Вікторина»
Перед тим, як розпочати програмну реалізацію гри «Вікторна» необхідно продумати теоретичні підходи до побудови програми. Тобто, розробити діаграму класів, діаграму взаємодій класів для підключення до серверу та блок-схему визначення переможця.
2.1 Розробка діаграми класів
У зв'язку з тим, що C# - об'єктно-орієнтована мова програмування, необхідною є умова використання класів об'єктів для практичної реалізації. Клас - це логічна структура, що дозволяє створювати свої власні користувацькі типи шляхом групування змінних інших типів, методів і подій. У додатку А зображено діаграми класів Server та Client та їх відношення.
Клас на діаграмі зображується у вигляді прямокутника, розділеного горизонтальними лініями на три частини. У першій частині вказується назва класу. Як правило, ім'я класу складається з одного, максимум двох слів. Друга частина містить перелік атрибутів класу, які характеризують той чи інший об'єкт цього класу в моделі предметної області. Третя частина містить перелік операцій, що відображають його поведінку в моделі предметної області.
Статична властивість online зберігатиме чи клієнт підключений (true/false), статична тому що вона буде перевірятись в паралельному потоці, адже сам потік не має доступу до цих самих властивостей. Властивості btn, btn1, btn2 типу Button створені для того, щоб у формі з'являлися елементи управління Button під час виконання коду. Властивості label, label 1, label 2 типу Label створені для того, щоб у формі з'являлися елементи управління Button під час виконання коду.
Так як реалізовується мережева гра, необхідно розробити мережеве підключення. Властивість online буде вказувати за допомогою значень true або false, що містяться у ній, чи підключений клієнт до сервера чи ні. Listener типу Socket буде очікувати підключення клієнта, guest типу Socket буде створюватись після того, як клієнт підключиться. Властивість for_accepter типу Thread створюється конкретно для зміни потоку.
Розглянемо детальніше методи класу. Метод являє собою блок коду, що містить набір інструкцій. Програма ініціює виконання операторів, викликаючи метод і задаючи необхідні аргументи методу.
Метод serverStart() буде запускати сервер, метод SocketAccepterThread() буде створювати новий потік, який буде приймати підключення, метод SocketAccepter (object) буде приймати саме підключення, метод MessageReceiver (Socket client) буде приймати мережеві повідомлень, метод fillTxt (string) буде обробляти прийняті по мережі повідомлення. Відправляти повідомлення по мережі можна буде за допомогою методу MessageSender (string). Метод serverStop() буде виконувати відключення від серверу та форма буде закриватися за допомогою методу Form1_FormClosing (object, FormClosingeventArgs).
Після того, як гравець обере діапазон та натисне кнопку підтверджуючи вибір, за допомогою методу button1_Click(object, EventArgs) виникнуть текстові поля для вводу діапазону. Щоб гравці вводили лише цифри із обраного діапазону (наприклад, якщо гравець обрав потрібну літеру треба заблокувати натискання усіх інших цифр для коректної роботи програми) створені методи Key_press1(object sender, KeyPressEventArgs e), Key_press2(object sender, KeyPressEventArgs e), Key_press3(object sender, KeyPressEventArgs e). Щоб гравець мав змогу обрати кожне число із розкладки застосовуються методи Text_changed (object,EventArgs), Text_changed1 (object,EventArgs), Text_changed2(object,EventArgs). Далі активується кнопка створення поля гри, натискаючи на яку викликається метод btnClick(object,EventArgs), що створює поле для гри.
Метод block_field() буде блокувати ігрове поле під час очікування ходу другого гравця, метод unblock_field() буде розблоковувати ігрове поле, коли настане черга робити хід цього гравця. Якщо гравець захоче вказати діапазон противника, він натисне відповідну кнопку та викличе обробник подій btnClk(object, EventArgs), що відкриє форму для перевірки переможця.
Для чіткого уявлення поставленого завдання необхідно продумати як саме буде відбуватися створення серверу та підключення до нього. Для наочності необхідно розробити діаграму взаємодій між класами Server та Client.
Діаграма взаємодії - це діаграма, на якій представлено взаємодію, що складається з безлічі об'єктів і відносин між ними, включаючи і повідомлення, якими вони обмінюються. Цей термін застосовується до видів діаграм з акцентом на взаємодії об'єктів (діаграмах кооперації, послідовностей і діяльності).
Діаграма послідовностей - це діаграма взаємодії, в якій основний акцент зроблений на впорядкування повідомлень в часі.
Діаграма кооперації - це діаграма взаємодій, в якій основний акцент зроблений на структурній організації об'єктів, що посилають і отримують повідомлення.
Тобто діаграма взаємодії описує взаємодію, у якій об'єкти відправляють і отримують повідомлення, а діаграма кооперації - це аналог діаграми послідовностей, який теж показує обмін повідомленнями між об'єктами, але акцентує увагу на ролях, які об'єкти грають у взаємодії.
Діаграма класу Client відрізняється від діаграми класу Server тільки мережевою реалізацією. Розглянемо відсутні у класі Server властивості та методи.
Властивість serverIP типу IPAddress буде містити ІР сервера до якого потрібно підключитись. За допомогою властивості client типу Socket буде відбуватися підключення до серверу. Властивість for_receiver типу Thread призначена для потоку.
Метод Connect() буде здійснювати підключення до серверу програми. Метод sender(string) буде відправляти повідомлення по мережі, а методи stopClient() та Client_FormClosing(object, FormClosingeventArgs) будуть відповідно відключати від серверу та закривати форму.
Так як другий гравець обирає певну літеру, змінна repeat відповідатиме за створення текстового поля у випадку правильної відгадки літери.
2.2 Розробка діаграми взаємодії
Для чіткого уявлення поставленого завдання необхідно продумати як саме буде відбуватися створення серверу та підключення до нього. Для наочності необхідно розробити діаграму взаємодій між класами Server та Client.
Діаграма взаємодії - це діаграма, на якій представлено взаємодію, що складається з безлічі об'єктів і відносин між ними, включаючи і повідомлення, якими вони обмінюються. Цей термін застосовується до видів діаграм з акцентом на взаємодії об'єктів (діаграмах кооперації, послідовностей і діяльності).
Діаграма послідовностей - це діаграма взаємодії, в якій основний акцент зроблений на впорядкування повідомлень в часі.
Діаграма кооперації - це діаграма взаємодій, в якій основний акцент зроблений на структурній організації об'єктів, що посилають і отримують повідомлення.
Тобто діаграма послідовності описує (і саме тому так і називається) послідовність, у якій об'єкти відправляють і отримують повідомлення, а діаграма кооперації - це аналог діаграми послідовностей, який теж показує обмін повідомленнями між об'єктами, але акцентує увагу на ролях, які об'єкти грають у взаємодії.
Перш за все у класі Server потрібно запустити сервер за допомогою методу serverStart(), потім завдяки методу SocketAccepterThread() створюється новий потік що буде приймати підключення, а метод SocketAccepter(object) приймає підключення.
Далі необхідно очікувати підключення від класу Client, яке відбувається за допомогою методу Connect(). Після того, як клієнт підключився до серверу, відбувається обмін мережевими повідомленнями.
Рисунок 4 - Діаграма взаємодії підключення до серверу
Після підключення до серверу розпочнеться гра, і далі будуть по черзі викликатися методи прийому та відправки повідомлень по мережі: для класу Server це MessageReceiver(Socket client) та MessageSender(string mess) відповідно, а для класу Client це методи ReceiverThread() та Sender(string mess) відповідно.
2.3 Розробка блок-схеми методу визначення переможця
Блок-схема - це спосіб подання алгоритмів в графічній формі за допомогою геометричних фігур, які з'єднуються між собою лініями.
Спосіб подання алгоритму у вигляді блок-схеми спрощує алгоритм, дає візуальне розуміння його роботи. Для кращого розуміння алгоритму визначення переможця необхідно розробити його блок-схему(рис. 5).
Рисунок 5 - Блок-схема методу визначення переможця
Переможцем гри вважається той гравець, який дасть більше правильних відповідей.
Для того, щоб реалізувати визначення переможця, необхідно дотримуватись наступного алгоритму. Спочатку виконується перевірка чи це останній хід. Якщо ні - гра продовжується, якщо так, то відбувається перевірка кількості правильних відповідей. Якщо гравець номер один набрав більше правильних відповідей за іншого гравця - він стає переможцем, якщо правильних відповідей так само - оголошується нічия, якщо ж він набрав менше за іншого гравця - він програє.
2.4 Висновки
У даному розділі було спроектовано теоретичні підходи до реалізації гри «Вікторина».
Оскільки мова C# є об'єктно-орієнтованою мовою, необхідною є умова використання класів об'єктів, тому для полегшення подальшої практичної реалізації програми було розроблено діаграми класів.
Також, була розроблена діаграма взаємодій між класами для підключення до серверу.
Задля того, аби повністю зрозуміти алгоритм визначення переможця, було створено блок-схему.
3. Програмна реалізація гри «Вікторина»
На основі спроектованих методів та засобів гри «Вікторина» розробимо програмну реалізацію гри, опишемо створений інтерфейс користувача та інструкцію роботи з програмою.
3.1 Програмна реалізація мережевого підключення
Для виконання завдання курсової роботи обов'язково необхідно здійснити програмну реалізацію мережевого підключення.
Програма має три основних форми: Program, Server та Client. Форма Program відповідає за створення двох інших форм та містить у собі textbox з ІР-адресою серверу. Server та Client - це два мережевих гравця. Форма Server створює мережеве підключення, а Client підключається до нього.
Для початку роботи необхідно вписати потрібні нам бібліотеки для роботи з мережею:
using System.Net.Sockets;
using System.Net;
using System.Threading;
Для повної мережевої взаємодії потрібно створити такі методи: метод підключення до серверу, метод створення нового потоку для отримання мережевих повідомлень, метод обробки повідомлень, метод відправки повідомлень та метод відключення від серверу.
Спочатку використаємо конструктор форми Server, щоб викликати метод створення серверу:
public Server(MainMenu a)
{
parent_form = a;
InitializeComponent();
serverStart();
}
Метод запуску сервера створює нове підключення, описує ІР-адрес та порт, по якому можна підключитись. Після запуску сервера відбувається виклик методу SocketAccepterThread().
private void serverStart()
{
try
{
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
online = true;
Point = new IPEndPoint(IPAddress.Any, port);
listener.Bind(Point);
listener.Listen(10);
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
SocketAccepterThread();
}
Метод SocketAccepterThread() створює новий потік, по якому буде приймати підключення від Client.
private void SocketAccepterThread()
{
for_accepter = new Thread(new ParameterizedThreadStart (SocketAccepter));
for_accepter.Start();
}
В новому потоці необхідно виконати метод SocketAccepter(). Він приймає підключення та викликає метод прийому повідомлень.
private void SocketAccepter(object o)
{
while (Server.online && for_accepter.IsAlive)
{
try
{
guest = listener.Accept();
MessageReceiver(guest);
}
catch (Exception ex)
{
}
}
}
Метод MessageReceiver() за умови, що сервер працює, створює масив байтів, записує у нього повідомлення та викликає метод обробки повідомлень.
private void MessageReceiver(Socket client)
{
while (online)
{
byte[] bytes = new byte[1024];
client.Receive(bytes);
if (bytes.Length != 0)
{
string data = Encoding.UTF8.GetString(bytes);
fillTxt(data);
}
}
guest.Shutdown(SocketShutdown.Both);
}
Метод MessageSender() відправляє повідомлення по мережі. За умови, що сервер працює, створюється масив байтів, стрічка перетворюється в байти та відправляється клієнту.
public void MessageSender(string mess)
{
if (Server.online)
{
byte[] bytes = new byte[1024];
bytes = Encoding.UTF8.GetBytes(mess);
try
{
guest.Send(bytes);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
Метод serverStop() зупиняє роботу серверу. Після цього нові потоки для прослуховування повідомлень і очікування підключень створюватись не будуть.
private void serverStop()
{
listener.Close();
online = false;
}
Програмна реалізація мережевого підключення працює згідно розробленої у другому розділі діаграми класів.
3.2 Програмна реалізація гри
Після того, як відбудеться мережеве підключення двох гравців, гра розпочнеться. Перший гравець, що створює сервер, відкриє головне вікно програми і першим розпочне свій хід. Другий гравець запустить програму як клієнт, у нього так само виведеться головне вікно програми, але він буде здійснювати свій хід другим. Тому спочатку зчитуємо для першого гравця зчитуємо список питань, який він зможе задати супернику :
Encoding enc = Encoding.GetEncoding(1251);
StreamReader ReadAkk = new StreamReader("Account.txt", enc);
while (!ReadAkk.EndOfStream)
{
string[] answer = ReadAkk.ReadLine().Split('.');
BoxQuest.Items.Add(answer[0]);
}
ReadAkk.Close();
Після цього задаємо вибране питання супернику використовуючи такий код:
if (BoxQuest.Text != "Задать вопрос")
{
MessageSender(BoxQuest.Text + ".");
groupBox2.Enabled = false; }
else
{
MessageBox.Show("Выберите вопрос");
}
У другого гравця повинно обробитись запитання першого гравця після чого треба вивести всі варіанти відповіді на нього. Одночасно з обробкою списку варіантів відповіді буде заповнений список питань для наступної дії. Для цього використаємо код:
groupBox1.Enabled = true;
string[] split = value.Split('.');
if (split.Count() < 3 )
{
string Quest = split[0];
MyAsk.Text = Quest;
BoxQuest.Items.Clear();
Encoding enc = Encoding.GetEncoding(1251);
StreamReader ReadAkk = new StreamReader("Account.txt", enc);
while (!ReadAkk.EndOfStream)
{
string[] answer = ReadAkk.ReadLine().Split('.');
if (answer[0] == Quest) { this.str = answer; }
BoxQuest.Items.Add(answer[0]);
}
ReadAkk.Close();
BoxAnswer.Items.Clear();
for (int i = 1; i < this.str.Count(); i++)
{
BoxAnswer.Items.Add(str[i]);
}
}
Після вибору відповіді треба перевірити її на правильність і у разі успіху збільшити рахунок гри данного гравця, інакше сповістити гравця про неправильну відповідь. Після цього треба заблокувати ігрове поле з вибором відповіді та розблокувати поле з вибором питань для суперника. Для цього використаємо функцію void SendBut_Click(object sender, EventArgs e):
if (BoxAnswer.Text != "Варианты ответа")
{
if (BoxAnswer.Text == this.str[1])
{
MyCount += 5;
MyPoint.Text=Convert.ToString(MyCount);
}
else
{
answ.Text = "Неправильно";
}
groupBox2.Enabled = true;
groupBox1.Enabled = false;
CountQuestion++;
Hod.Text = Convert.ToString(CountQuestion);
}
else
{
MessageBox.Show("Выберите ответ");
}
Після вибору відповіді треба обрати питання для суперника та відправити його. Під час кожної відправки питань перевіряється іх кількість і у разі досягнення їх кількості з зазначеною - супернику відправляються не тільки питання, а ще й рахунок даного гравця для перевірки на стан гри. Для цього використаємо функцію void QuestBut_Click(object sender, EventArgs e):
if (CountQuestion == CountQuestionLimit)
{
if (BoxQuest.Text != "Задать вопрос")
{
MessageSender(BoxQuest.Text + ".proverka." + this.MyCount);
groupBox2.Enabled = false;
}
else
{
MessageBox.Show("Выберите вопрос"); }
}
else
{
if (BoxQuest.Text != "Задать вопрос")
{
MessageSender(BoxQuest.Text + "."); groupBox2.Enabled = false;
}
else
{
MessageBox.Show("Выберите вопрос");
}
}
Фрагмент коду за яким визначається переможець і розсилаються повідомлення щодо цього:
if (MyCount > TargetCount)
{
MessageBox.Show("Вы победили");
Sender("0...");
this.Close();
}
else if (MyCount < TargetCount)
{
MessageBox.Show("Вы проиграли");
Sender("1...");
this.Close();
}
else
{
Sender("2...");
MessageBox.Show("Ничья");
this.Close();
}
Гра завершується після того як кожен гравець відповість на 20 запитань.
3.3 Інструкція користувача
Для запуску гри достатньо запустити виконуваний файл kyrsov.exe. На екрані з'явиться вікно підключення до сервера (рис. 6). Спочатку потрібно запустити сервер програми натиснувши на кнопку Server, потім знову запустити виконуваний файл та натиснути на кнопку Connect, щоб підключити клієнта.
На рисунку 7 наведено зображення ігрового вікна з активним вибором питання для суперника.
Рисунок 6 - Вигляд вікна підключення до сервера
Підключення клієнта до сервера здійснюється за IP адресою, яка вводиться в текстове поле «Conntect to:» (див. рис. 6).
Рисунок 7 - Вигляд ігрового вікна з вибором питання
На рисунку 8 наведено зображення ігрового вікна з активним вибором відповіді на питання.
Рисунок 8 - Вигляд ігрового вікна з вибором відповіді
Після завершення ходу гравця, його поля блокуються до завершення ходу суперника (рис. 9).
Рисунок 9 - Вигляд заблокованого ігрового вікна
Переможцем є гравець, який дав більше правильних відповідей.
3.4 Висновки
В даному розділі було розглянуто програмну реалізацію гри, визначення переможця та розроблене мережеве підключення.
Розроблений інтерфейс програми відповідає всім оригінальним правилам гри. Він є зручним, функціональним та простим для розуміння користувача.
Також описана інструкція користувача роботи з програмою.
Висновки
Завданням даної курсової роботи є розробка мережевої гри «Вікторина».
Було розглянуто предметну область гри, існуючі реалізації, технічне завдання. Для розробки програми обране середовище програмування мови C#.
Для полегшення виконання програмної реалізації розроблені теоретичні підходи до побудови програми, а саме: розроблена діаграма класів, діаграма взаємодій для визначення переможця та спроектований інтерфейс користувача.
На основі спроектованих методів та засобів гри «Вікторина» розроблена практична реалізація самої гри. Описана інструкція користувача роботи з програмою.
Завдання курсової роботи виконано успішно. Інтерфейс програми простий та інтуїтивно зрозумілий для користувача.
Перелік посилань
1. “Новые языки программирования и тенденции их развития”, Ушкова В., 2002 р.;
2. Э. Стиллмен, Д. Грин. Изучаем C#. Санкт - Петербург, 2012.
3. Г. Шилдт. Полный справочник по С#. Москва - Санкт-Петербург - Киев: Вильямс, 2002.
4. Г. Шилд. С# 4.0 Полное руководствою. Москва - Санкт-Петербург - Киев: Вильямс, 2012
5. Вікіпедія - Вільна енциклопедія[електронний ресур]:
http://uk.wikipedia.org.
6. Українські підручники онлайн[електронний ресур]:
http://pidruchniki.ws.
7. Бадд Т. Объектно-ориентированное программирование в действии: Пер. с англ./Тимоти Бадд. - СПб.: Питер, 1997.
8. К. Паппас, У. Мюррей. Эффективная работа: Visual C# .NET. - СПб.: Питер, 2002. - 816c.
Додаток А
Відношення діаграм класів Server та Client
Додаток Б
Головне вікно програми
Додаток В
Лістинг програми
namespace kyrsov
{
public partial class Ask : Form
{
public Ask()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ServZpz f = new ServZpz(this);
f.Show();
this.Hide(); }
private void button2_Click(object sender, EventArgs e)
{
ClientZpz f = new ClientZpz(textBox1.Text, this);
f.Show();
this.Hide();
}
}
public partial class ClientZpz : Form
{
public static bool online = false
private IPAddress serverIP
private Socket client;
private int port = 1991;
private Thread for_receiver;
public int MyCount = 0;
public int TargetCount = 0;
public int CountQuestion = 0;
public int SuperWar=0;
Ask parent_form;
public string[] str = new string[] { };
public ClientZpz(string IP, Ask a
{
parent_form = a;
serverIP = IPAddress.Parse(IP);
InitializeComponent();
Connect();
}
private void Connect()
{
try
{
label1.Text = "Client";
label2.Text = "Online";
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(serverIP, port);
online = true;
ReceiverThread();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void ReceiverThread()
{
for_receiver = new Thread(delegate()
{
while (ClientZpz.online)
{
try
{
if (ClientZpz.online) {
byte[] bytes = new byte[1024];
client.Receive(bytes);
if (bytes.Length != 0) повідомлення не пусте
{
string data = Encoding.UTF8.GetString(bytes); fillTxt(data);
}
}
}
catch (Exception ex)
{
}
}
});
for_receiver.Start();
}
private void fillTxt(string value)
{
if (InvokeRequired && ClientZpz.online)
{
this.Invoke(new Action<string>(fillTxt), new object[] { value
return;
}
if (ClientZpz.online)
{
string[] split = value.Split('.');
if (split.Count() < 4)
{
if (split[1] == "proverka") {
this.TargetCount=Convert.ToInt32(split[2]); this.SuperWar = 1;
}
groupBox1.Enabled = true;
string Quest = split[0];
MyAsk.Text = Quest; BoxQuest.Items.Clear();
Encoding enc = Encoding.GetEncoding(1251);
StreamReader ReadAkk = new StreamReader("Account.txt", enc);
while (!ReadAkk.EndOfStream)
{
string[] answer = ReadAkk.ReadLine().Split('.'); if (answer[0] == Quest) { this.str = answer; }
BoxQuest.Items.Add(answer[0]);
}
ReadAkk.Close();
BoxAnswer.Items.Clear();
for (int i = 1; i < this.str.Count(); i++) { BoxAnswer.Items.Add(this.str[i]); }
}
}
}
public void Sender(string msg)
{
try
{
byte[] bytes = new byte[1024];
bytes = Encoding.UTF8.GetBytes(msg);
client.Send(bytes);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void SendBut_Click(object sender, EventArgs e)
{
if (this.SuperWar==1)
{
if (BoxAnswer.Text != "Варианты ответа")
{
if (BoxAnswer.Text == this.str[1]) MyCount += 5;
MyPoint.Text = Convert.ToString(MyCount);
}
else {
answ.Text = "Неправильно";
}
groupBox2.Enabled = true;
groupBox1.Enabled = false;
CountQuestion++;
Hod.Text = Convert.ToString(CountQuestion);
if (MyCount > TargetCount) { MessageBox.Show("Вы победили"); Sender("0..."); this.Close(); }
else if (MyCount < TargetCount) { MessageBox.Show("Вы проиграли"); Sender("1..."); this.Close(); } else { Sender("2..."); MessageBox.Show("Ничья"); this.Close(); }
}
else { MessageBox.Show("Выберите ответ"); })
}
else if (BoxAnswer.Text != "Варианты ответа")
{
if (BoxAnswer.Text == this.str[1]) { MyCount += 5; MyPoint.Text = Convert.ToString(MyCount); }
else { answ.Text = "Неправильно"; }
groupBox2.Enabled = true;
groupBox1.Enabled = false;
CountQuestion++;
Hod.Text = Convert.ToString(CountQuestion);
}
else { MessageBox.Show("Выберите ответ"); }
}
public void stopClient()
{
online = false;
label2.Text = "Off";
client.Close();
}
private void Client_FormClosing(object sender, FormClosingEventArgs e)
{
stopClient(); parent_form.Show();
private void button1_Click(object sender, EventArgs e)
{
}
private void MyTimer_Tick(object sender, EventArgs e)
{
//parent_form.Close();
}
private void account_TextChanged(object sender, EventArgs e)
{
}
private void password_TextChanged(object sender, EventArgs e)
{
}
private void QuestBut_Click(object sender, EventArgs e)
{
if (BoxQuest.Text != "Задать вопрос") {
Sender(BoxQuest.Text + ".");
groupBox2.Enabled = false; }
else { MessageBox.Show("Выберите вопрос"); }
}
private void label2_Click(object sender, EventArgs e)
{
}
private void ClientZpz_Load(object sender, EventArgs e)
{
Encoding enc = Encoding.GetEncoding(1251);
StreamReader ReadAkk = new StreamReader("Account.txt", enc);
//BoxQuest.DropDownStyle = DropDownList();
while (!ReadAkk.EndOfStream)
{
string[] answer = ReadAkk.ReadLine().Split('.');
BoxQuest.Items.Add(answer[0]);
}
ReadAkk.Close();
}
}
public partial class ServZpz : Form
{
public static bool online = false;
private Socket listener;
private Socket guest;
private IPEndPoint Point;
private int port = 1991;
private Thread for_accepter;
private Ask parent_form;
public string[] str = new string[] { };
public int MyCount=0;
public int CountQuestion = 0;
public int CountQuestionLimit = 2;
public ServZpz(Ask a
{
parent_form = a;
InitializeComponentserverStart
}
private void serverStart() {
try
{
label1.Text = "Server";
label2.Text = "Online";
listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
online = true;
Point = new IPEndPoint(IPAddress.Any, port);
listener.Bind(Point);
listener.Listen(10);
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
SocketAccepterThread();
}
private void SocketAccepterThread() {
for_accepter = new Thread(new ParameterizedThreadStart (SocketAccepter));
for_accepter.Start();
}
private void SocketAccepter(object o)
{
while (ServZpz.online && for_accepter.IsAlive) {
try
{
guest = listener.Accept();
MessageReceiver(guest);
}
catch (Exception ex)
{
}
}
}
private void buttonSender_Click(object sender, EventArgs e)
{
// MessageSender(MyTextBox.Text);
}
private void MessageReceiver(Socket client)
{
while (online)
{
byte[] bytes = new byte[1024];
client.Receive(bytes);
if (bytes.Length != 0)
{
string data = Encoding.UTF8.GetString(bytes);
fillTxt(data);
}
}
guest.Shutdown(SocketShutdown.Both);
label1.Text = "Off";
}
public void fillTxt(string value)
{
if (InvokeRequired && ServZpz.online {
this.Invoke(new Action<string>(fillTxt), new object[] { value });
}
if (ServZpz.online
groupBox1.Enabled = true;
string[] split = value.Split('.');
if (split.Count() < 3 ) {
//MessageBox.Show(split.Count()+"");
string Quest = split[0];
MyAsk.Text = Quest;
BoxQuest.Items.Clear();
Encoding enc = Encoding.GetEncoding(1251);
// int l = 0;
StreamReader ReadAkk = new StreamReader("Account.txt", enc);
while (!ReadAkk.EndOfStream)
{
string[] answer = ReadAkk.ReadLine().Split('.');
if (answer[0] == Quest) { this.str = answer; }
BoxQuest.Items.Add(answer[0]);
}
ReadAkk.Close();
BoxAnswer.Items.Clear();
for (int i = 1; i < this.str.Count(); i++) { BoxAnswer.Items.Add(str[i]); }
}
else if(split.Count()==4)
{
if (split[0] == "1") { MessageBox.Show("Вы победили"); this.Close(); }
else if (split[0] == "0") { MessageBox.Show("Вы проиграли"); this.Close(); }
else if (split[0] == "2") { MessageBox.Show("Ничья"); this.Close(); }
}
else { MessageBox.Show("Нарушена структура"); }
}
}
public void MessageSender(string mess)
{
if (ServZpz.online)
{
byte[] bytes = new byte[1024];
bytes = Encoding.UTF8.GetBytes(mess);
try
{
guest.Send(bytes);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
private void serverStop()
{
listener.Close();
online = false;
}
private void ServZpz_FormClosing(object sender, FormClosingEventArgs e)
{
serverStop();
parent_form.Show();
}
private void MyTimer_Tick(object sender, EventArgs e)
{
}
private void ServZpz_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
private void groupBox1_Enter(object sender, EventArgs e)
{
}
private void SendBut_Click(object sender, EventArgs e)
{
if (BoxAnswer.Text != "Варианты ответа")
{
if (BoxAnswer.Text == this.str[1]) { MyCount += 5; MyPoint.Text = Convert.ToString(MyCount); }
else { answ.Text = "Неправильно"; }
groupBox2.Enabled = true;
groupBox1.Enabled = false;
CountQuestion++;
Hod.Text = Convert.ToString(CountQuestion);
}
else { MessageBox.Show("Выберите ответ"); }
}
private void QuestBut_Click(object sender, EventArgs e)
{
if (CountQuestion == CountQuestionLimit)
{
if (BoxQuest.Text != "Задать вопрос") { MessageSender(BoxQuest.Text + ".proverka." + this.MyCount);
groupBox2.Enabled = false; }
else { MessageBox.Show("Выберите вопрос"); }
}
else
{
if (BoxQuest.Text != "Задать вопрос") { MessageSender(BoxQuest.Text + "."); groupBox2.Enabled = false; }
else { MessageBox.Show("Выберите вопрос"); }
}
}
private void BoxQuest_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
}
Размещено на Allbest.ru
...Подобные документы
Розробка програмного додатку - гри "Jump way", яка поєднала в собі сучасні методи побудови 2D ігор. Обґрунтування вибору мови програмування. Проектування UML-діаграм класів. Користувацький інтерфейс. Програмна реалізація гри. Інструкція користувача.
курсовая работа [1,2 M], добавлен 09.01.2017Призначення менеджеру пристроїв. Обґрунтування вибору мови програмування. Розробка структурної схеми і опис діалогового інтерфейсу програми. Блок-схема програмного додатку, основні функції і алгоритм його роботи. Методики і інструкція його тестування.
курсовая работа [3,4 M], добавлен 17.11.2014Програма на мові програмування С++. Аналіз стану технологій програмування та обґрунтування теми. Розробка програми виконання завдання, методу вирішення задачі. Робота з файлами, обробка числової інформації і робота з графікою. Розробка програми меню.
курсовая работа [41,0 K], добавлен 17.02.2009Основні концепції компонентної розробки прикладних задач: com/dcom, Java Beans, corba, .net. Розробка стратегії гри для кожної категорії учасників, компонентів. Програмна реалізація спроектованої системи, обґрунтування вибору використовуваних засобів.
курсовая работа [1,0 M], добавлен 11.11.2014Аналіз особливостей мови програмування Java та середовища Android Studio. Розробка програмного забезпечення для якісного та ефективного вивчення іноземних слів. Побудова базових алгоритмів і структури даних. Вибір мови програмування, реалізація програми.
курсовая работа [335,3 K], добавлен 11.01.2015Особливості системи онлайн-агрегаторів новин, універсальної програмної платформи Microsoft Window. Використання мови програмування C#, створення бази даних. Розробка програмного продукту, алгоритм його створення. Вихідний код та інструкція користувача.
дипломная работа [730,9 K], добавлен 21.01.2016Поняття про сайт, його основні функції, класифікація, програмна розробка та створення сайтів у візуальних редакторах. Програмна реалізація додатку. Розробка адмін-панелі. Вимоги щодо відстані між бічними поверхнями відеотерміналів. Охорона праці.
дипломная работа [2,1 M], добавлен 18.11.2014Побудування блок-схеми рішення завдання зі знайдення центра ваги однорідної усіченої призми. Розробка програми за допомогою язика програмування C++, опис змінних та функцій програми та загальної математичної моделі. Розробка інструкції користувача.
курсовая работа [1,1 M], добавлен 04.01.2012Огляд суті гри "Доміно", характеристика її існуючих програмних реалізацій. Розробка евристичного алгоритму для розв’язання ігрової ситуації "Доміно". Програмна реалізація алгоритму мовою програмування високого рівня C#. Отладка оціночної функції.
курсовая работа [1,4 M], добавлен 14.05.2012Редагування за допомогою текстового редактора NotePad вхідного файлу даних. Програмна реалізація основного алгоритму з використанням засобів об'єктно-орієнтованого програмування. Об’ява та опис класів і об'єктів. Розробка допоміжних програмних засобів.
курсовая работа [69,4 K], добавлен 14.03.2013Сучасні API для програмування тривимірної графіки, математичні основи. Віртуальна камера, конвеєр візуалізації. Вершинні та піксельні шейдери. Розробка та реалізація ігрового додатку. Система постобробки зображення. Реалізація механіки ігрового процесу.
дипломная работа [4,7 M], добавлен 27.06.2013Загальні відомості та геометричний зміст розв'язання задачі Коші. Використання методу Ейлера для розв'язання звичайних диференціальних рівнянь першого порядку. Розробка блок-схеми та реалізація алгоритму в середовищі програмування Borland Delphi 7.0.
курсовая работа [398,1 K], добавлен 14.10.2012Сутність Pascal як алгоритмічної мови програмування універсального призначення. Історія її виникнення і характерні особливості. Специфіка використання середовища розробки програм Borlan Delphi. Реалізація алгоритму визначення n! для великих значень n.
курсовая работа [22,9 K], добавлен 04.01.2014Методика розробки компілятору з вхідної мови програмування Pascal, оболонка, якого розроблена в середовищі програмування Borland C під операційну систему Windows. Блок-схема програми. Розробка оптимізатора та генератора коду. Тестування компілятора.
курсовая работа [218,6 K], добавлен 04.06.2011Створення гнучкої клієнт-серверної системи інформаційної підтримки підвищення кваліфікації персоналу ДП № 9 з застосуванням мови програмування PHP, системи керування базами даних MySQL. Розробка алгоритмів, програмна реалізація основних процедур системи.
дипломная работа [1,8 M], добавлен 26.10.2012Опис мови програмування PHP. Стратегія Open Source. Мова розмітки гіпертекстових документів HTML. Бази даних MySQL. Обґрунтування потреби віддаленого доступу до БД. Веб-сервер Apache. Реалізація системи. Інструкція користувача і введення в експлуатацію.
курсовая работа [42,9 K], добавлен 21.12.2012Проектування бази даних (БД). Проектування логічної моделі БД. Реалізація БД та створення таблиць. Встановлення зв’язків, вибір мови та середовища програмування. Опис функціональних елементів та реалізація програми. Опис та тестовий приклад програми.
дипломная работа [1,6 M], добавлен 07.01.2017Призначення інформаційної системи. Завдання предметної області. Характеристика документів предметної області. Опис і обґрунтування вибору методу організації вихідних даних. Коротка характеристика IBExpert. Програмна реалізація в середовищі Delphi.
дипломная работа [2,8 M], добавлен 25.03.2011Методика створення веб-додатку для визначення рівня інтелекту людини з використанням мови програмування PHP. Загальна характеристика та принципи роботи з засобами адміністрування, за допомогою яких авторизований адміністратор може керувати веб-додатком.
дипломная работа [1,9 M], добавлен 13.10.2010Соціальні медіа, їх функціональні особливості та напрямки вивчення. Вибір мови програмування та загальна структура програми, вимоги до неї, аналіз і зберігання отриманих даних. Розробка моделі поведінки у соціальних медіа, оцінка кількості користувачів.
дипломная работа [2,0 M], добавлен 18.04.2015