Список использованных источников




 

Для запуска программы дважды щелкните мышью по пиктограмме файла Keyboard Racer.

 

Рисунок 1 - Меню программы

 

При запуске игры вы попадете в меню приложения, здесь можно осуществлять выбор нужного вам действия: Играть как сервер, Играть как клиент, показать окно "О программе", а также закрыть приложение. Здесь присутствует настройка сетевого соединения для клиента, которая позволяет задать IP и PORT для подключения к серверу.

При нажатии на кнопку "О программе" появляется окно с информацией о программе.

При нажатии на кнопку "Играть как сервер" появляется окно, которое позволяет задать параметр игры: вводимый текст.

После нажатия клавиши "ОК", откроется главное окно программы, также это окно откроется сразу, если в меню выбрать пункт "Играть как клиент", это связано с тем, что текст клиента подгружается по сети от сервера, что делает их идентичными.

Во время открытия этого окна, происходит начальная установка всех параметров. Текст загружается в форму, гоночные машинки устанавливаются в положение старта. До старта игры статусам присвоены значения ожидания, а счетчик ошибок, времени и скорости равен 0.

Теперь нажимая на клавишу "СТАРТ!" можно начать игру, это автоматически приведет к старту игры у вашего противника, для того чтобы соперничество происходило в реальном времени.

В процессе игры, в статусе гонки, можно наблюдать на сколько символов вы отстаете или опережаете своего противника. А также видеть его прогресс, который отображается с помощью гоночной машинки. Статус текста меняет свое значение, с "Набирайте текст" на "Исправьте ошибку", если был допущен не верный ввод, что также увеличит количество ошибок на единицу. После верного ввода, можно дальше продолжать набирать текст. Также ведется учет потраченного на набор текста времени (в секундах), и скорость набора символов в минуту. Если символ был набран с первого раза верно, то он примет синий цвет, если же первый ввод был ошибочный, то красный.

Игра считается законченной, когда вы, либо ваш противник введет последний символ текста. За этим сразу же последует вывод окна "Finish", которое сообщит вам результаты игры. Закрыв его, можно вернуться на главное окно и посмотреть статистику, либо начать игру заново, кликнув по кнопке "СТАРТ!".

Клик по кнопке "Меню" приведет к возврату в меню программы.

Остальные свойства программы достаточно очевидны и традиционны для графического пользовательского интерфейса.


Заключение

 

В результате выполнения курсового проекта была разработана игра "Keyboard Racer", с поддержкой многопоточности, обладающая интуитивно понятным интерфейсом и возможностью играть со своим соперником по сети.

Идея данной игры является оригинальной. Главные особенности данной игры:

А. Маленький размер;

Б. Не требовательность к ресурсам компьютера;

В. Простой и понятный интерфейс;

Г. Нет необходимости в установке дополнительного ПО;

Д. Обладает "обучающими" свойствами, которые улучшат вашу скорость печати.

Программа может быть улучшена путём добавления различных функций, например:

А. Добавление возможности играть более чем с одним соперником.

Б. Реализация достижений и наград за них.

В. Возможность сохранения статистики.

При разработке проекта были значительным образом закреплены знания, полученные на лекциях по программированию, а так же знания о работе с различными компонентами в Visual Studio 2013.


Список использованных источников

 

1. Троелсен Э. - Язык программирования C# 2010 и платформа.net 4 - 2010

. А. Хейлсберг, М. Торгерсен, С. Вилтамут, П. Голд. Язык программирования C#.

. Чарльз Петцольд. Microsoft Windows Presentation Foundation. Базовый курс.

. Мак-Дональд, Мэтью. Windows Presentation Foundation в.net 4.0 с примерами на С# 2010 для профессионалов

. Справка MSDN.


Приложение A

 

Исходный код программы:

using System;System. Collections. Generic;System.componentModel;System. Data;System. Drawing;System. Linq;System. Text;System. Threading. Tasks;System. Windows. Forms;System. Threading;Клавагонки

{partial class MenuForm: Form

{public MenuForm myMenu;MenuForm ()

{();= this;

}void button1_Click (object sender, EventArgs e)

{(MainForm. whoI == "client"). clientThread. Abort ();(MainForm. whoI == "server")

{. Stop ();

}. Exit ();

}void button2_Click (object sender, EventArgs e)

{. Visible = false;myFile = new FileForm ();. ShowDialog ();

}void ClientButton_Click (object sender, EventArgs e)

{. address = IPBOX. Text. ToString ();. port = Convert. ToInt32 (PortBox. Text);. Visible = false;client = new Client ();. Sleep (1000);(Client. mainForm. Visible == false). mainForm. Visible = true;. mainForm. ShowDialog ();

}void AboutButton_Click (object sender, EventArgs e)

{. Visible = true;

(new About ()). ShowDialog ();

}

}

}partial class MainForm: Form

{

// Global varpublic string pathFile = "F: \\Универ 3 курс\\Курсовой_проект\\Клавагонки\\Клавагонки\\bin\\Debug\\text. txt";text; // текст из файлаtr; // потом чтения текста из файлаprivate int i = 0; // количество верых вводовerrorCount = 0; // количество ошибочных вводовerrorEnter = false;

// int speed = 0; // скорость машиныspeedOfPrint = 0; // скорость печатиtime = 0; // время в секундахpath;leftOffset;public string whoI = "empty";youLocation; // положение нашей машиныopponentLocation; // машина оппонентаstring finish;bool singleFinish;void TextGo ()

{. CheckForIllegalCrossThreadCalls = false;. Text = "READY!!!";. Sleep (1000);. Text = "STEADY!!!";. Sleep (1000);. Text = "GO!";

// textThread. Abort ();

}MainForm ()

{();

}void MenuButton_Click (object sender, EventArgs e)

{. Visible = false;. myMenu. Visible = true;

}void MainForm_Load (object sender, EventArgs e)

{(whoI == "server")

{. Enabled = true;= new StreamReader (pathFile, ASCIIEncoding. ASCII);= tr. ReadToEnd ();. gameText = text;. Close ();

}(whoI == "client")

{. Enabled = true;= ThreadChat. gameText;

}. Text = text;. X = 20;. Y = 67;. Location = youLocation;. X = 20;. Y = 116;. Location = opponentLocation;. HideSelection = false;. youStartGame = false;

}void GetSpeed (int i) // скорость машины

{= i / (text. Length *1.0);= (int) (20 + (850-55) * path);

}double GetSpeedOfPrint () // скорость печати (символов в минуту)

{= ((i / (double) time) * 60);= Math. Round (speedOfPrint);speedOfPrint;

}public int GetI ()

{i;

}void ChangeLocation (PictureBox car, Point location, int i, bool youCar) // перемещение машины

{(i);= car. Location;. X = leftOffset;. Location = location;(youCar). youCar = location. X;

}bool CheckFinish () // проверка на конец игры

{(i == text. Length)

{true;

}false;

}void Start () // начало игры

{

// ThreadChat. youStartGame = false;

// ThreadChat. oppStartGame = false;= false;= 0;= 0;= 0;= 0;. Focus ();

// GetSpeed ();. Text = ThreadChat. gameText;. SelectAll ();. SelectionColor = Color. Black;. SelectAll ();. SelectionColor = Color. Black;. Select (i, 1);. Interval = 1000;. Interval = 10;. X = 20;. Y = 67;. Location = youLocation;. X = 20;. Y = 116;. Location = opponentLocation;. Text = time. ToString ();. Enabled = true;. Text = errorCount. ToString ();(i, ThreadChat. oppI);. Text = "READY!!!";

}void Finish () // последствия конца игры

{. Focus ();. Enabled = false;. Text = "Гонка завершена!";(GetI () == RichTextBox. TextLength)= "win";= "lose";finishForm = new Finish (finish);. ShowDialog ();

}void RichTextBox_KeyPress (object sender, KeyPressEventArgs e) // обработка ввода текста

{(RichTextBox. Text [i] == e. KeyChar)

{. Text = "Набирайте текст";(errorEnter == false)

{. SelectionColor = Color. Blue;

}++;= false;(Car1, youLocation, i, true);. Select (i, 1);(CheckFinish ())

{();

}

}

{. Select (i, 1);. SelectionColor = Color. Red;++;= true;. Text = errorCount. ToString ();. Text = "Исправьте ошибку";

}

}void StartButton_Click (object sender, EventArgs e)

{();. youStartGame = true;

}void MainForm_FormClosed (object sender, FormClosedEventArgs e)

{(whoI == "client"). clientThread. Abort ();(whoI == "server")

{. Stop ();

}. Exit ();

}void RichTextBox_Click (object sender, EventArgs e)

{. Focus ();

}void GameTimer_Tick (object sender, EventArgs e) // обработчик таймера

{++;. Text = time. ToString ();. Text = GetSpeedOfPrint (). ToString ();

}void LanTimer_Tick (object sender, EventArgs e)

{(ThreadChat. oppStartGame)

{. oppStartGame = false;();

}(ThreadChat. oppI == RichTextBox. TextLength && singleFinish == false)

{= true;();

}(Car2, opponentLocation, ThreadChat. oppI, false);(i, ThreadChat. oppI);

// PositionLabel. Text =

}void PositionLabelText (int youI, int oppI)

{(youI > oppI)

{. Text = "Вы лидируете на " + (youI - oppI) + " символ (ов)!";. ForeColor = Color. Blue;

}(youI < oppI)

{. Text = "Вы отстаете на " + (oppI - youI) + " символ (ов)!";. ForeColor = Color. Green;

}(youI == oppI && youI! = 0)

{. Text = "ВКЛЮЧАЙ НИТРО";. ForeColor = Color. Red;

}(youI == oppI && youI == 0)

{. Text = "Ждем старта";. ForeColor = Color. Black;

}

}

}partial class FileForm: Form

{FileForm ()

{();

}void FileButton_Click (object sender, EventArgs e)

{. ShowDialog ();. Text = openFileDialog1. FileName;

}void DoneButton_Click (object sender, EventArgs e)

{. pathFile = PathBox. Text;. Visible = false;server = new Server ();(Server. mainForm. Visible == false). mainForm. Visible = true;. mainForm. ShowDialog ();

}

}partial class Finish: Form

{string status;int count = 0;Finish (string status)

{();. status = status;

}void Finish_Load (object sender, EventArgs e)

{(status == "win"). Text = "ВЫ\nПОБЕДИТЕЛЬ!";. Text = "ВЫ\nПРОИГРАВШИЙ!";. Enabled = true;

}void Finish_FormClosed (object sender, FormClosedEventArgs e)

{. Enabled = false;

}void FinishTimer_Tick (object sender, EventArgs e)

{(count == 0)

{. BackColor = Color. White;. FinishLabel. ForeColor = Color. Black;

}(count == 4)

{. BackColor = Color. Green;. FinishLabel. ForeColor = Color. Yellow;

}(count == 8)

{. BackColor = Color. Red;. FinishLabel. ForeColor = Color. Blue;

}(count == 12)

{. BackColor = Color. Yellow;. FinishLabel. ForeColor = Color. Red;

}++;(count > 16)= 0;

}

}class Server

{public MainForm mainForm = new MainForm ();public System. Threading. Thread serverThread;private bool isStiop;Server ()

{

// Control. CheckForIllegalCrossThreadCalls = false;. whoI = "server";= new Thread (RunServer);. IsBackground = true;. Start ();

}void RunServer ()

{

// Устанавливаем для сокета локальную конечную точку

// Restart:ipHost = Dns. GetHostEntry ("localhost");ipAddr = ipHost. AddressList [0];ipEndPoint = new IPEndPoint (ipAddr, 11000);

// Создаем сокет Tcp/IpsListener = new Socket (ipAddr. AddressFamily, SocketType. Stream, ProtocolType. Tcp);

// Назначаем сокет локальной конечной точке и слушаем входящие сокеты

{. Bind (ipEndPoint);. Listen (10);

// Начинаем слушать соединения(isStiop==false)

{

// mainForm. testWORKING = 1;. showMessage = "Ожидаем соединение через порт {0}" + ipEndPoint;

// Программа приостанавливается, ожидая входящее соединениеhandler = sListener. Accept ();data = null;

// Мы дождались клиента, пытающегося с нами соединиться[] bytes = new byte [1024];bytesRec = handler. Receive (bytes);= Encoding. UTF8. GetString (bytes, 0, bytesRec);(data == "text"). syncText = true;

{(data == "start"). oppStartGame = true;. oppI = Convert. ToInt32 (data);

}

// Показываем данные на консоли

// ThreadChat. showMessage = "Полученный текст: " + data + "\n\n";

// Отправляем ответ клиенту\reply;(data == "text")

{= ThreadChat. gameText;

}

{(ThreadChat. youStartGame)

{= "start";. youStartGame = false;

}= MainForm. GetI (). ToString ();

}[] msg = Encoding. UTF8. GetBytes (reply);. Send (msg);(data. IndexOf ("<TheEnd>") > - 1)

{. showMessage = "Сервер завершил соединение с клиентом. ";

}. Sleep (10);. Shutdown (SocketShutdown. Both);. Close ();

}

}(Exception ex)

{. showMessage = ex. ToString ();

}

}static void Stop ()

{= true;

}

}class Client

{public MainForm mainForm = new MainForm ();public System. Threading. Thread clientThread;static string address;int port;Client ()

{= ThreadChat. address;. port = ThreadChat. port;= new Thread (RunClient);. Start ();. TypeLabel. Text = "I'm a client, \n BABY!";. whoI = "client";

}void RunClient ()

{

{(port);

}(Exception ex)

{. showMessage = ex. ToString ();

}

{

// mainForm. testWORKING = "end";

}

}void SendMessageFromSocket (int port)

{

// Буфер для входящих данных[] bytes = new byte [1024];data;

// Соединяемся с удаленным устройством

// Устанавливаем удаленную точку для сокетаipHost = Dns. GetHostEntry (address);ipAddr = ipHost. AddressList [0];ipEndPoint = new IPEndPoint (ipAddr, port);sender = new Socket (ipAddr. AddressFamily, SocketType. Stream, ProtocolType. Tcp);

// Соединяем сокет с удаленной точкой. Connect (ipEndPoint);message;(ThreadChat. syncText == false)

{= "text";

}

{(ThreadChat. youStartGame)

{= "start";. youStartGame = false;

}= MainForm. GetI (). ToString ();

}

// ThreadChat. showMessage = "Сокет соединяется с {0} " + sender. RemoteEndPoint. ToString ();[] msg = Encoding. UTF8. GetBytes (message);

// Отправляем данные через сокетbytesSent = sender. Send (msg);

// MainForm. sendMessage = false;

// Получаем ответ от сервераbytesRec = sender. Receive (bytes);= Encoding. UTF8. GetString (bytes, 0, bytesRec);(ThreadChat. syncText == false)

{. gameText = data;. syncText = true;

}

{(data == "start"). oppStartGame = true;. oppI = Convert. ToInt32 (data);

}. Sleep (10);

// Используем рекурсию для неоднократного вызова SendMessageFromSocket ()(message. IndexOf ("<TheEnd>") == - 1)(port);

// Освобождаем сокет. Shutdown (SocketShutdown. Both);. Close ();

}

}class ThreadChat

{public static bool sendMessage = false;public static string showMessage = "Сообщение сети";public static string outMessage = "lol";public static string gameText = "ada";public static bool syncText = false;public bool youStartGame = false;volatile public bool oppStartGame = false;public static int youCar = 20;public static int opponentCar = 20;public static int oppI = 0;public static int port = 11000;public static string address = "127.0.0.1";

}class Program

{

// / <summary>

// / Главная точка входа для приложения.

// / </summary>

[STAThread]void Main ()

{. EnableVisualStyles ();. SetCompatibleTextRenderingDefault (false);.run (new MenuForm ());

}

}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-04-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: