Вход

Разработка сетевой игры «Морской бой» в MS Visual Studio 2010 на C# через UDP клиент

Рекомендуемая категория для самостоятельной подготовки:
Курсовая работа*
Код 356904
Дата создания 16 июня 2013
Страниц 46
Мы сможем обработать ваш заказ (!) 25 апреля в 12:00 [мск]
Файлы будут доступны для скачивания только после обработки заказа.
2 150руб.
КУПИТЬ

Описание

В результате выполнения данной курсовой работы было разработано оконное клиент-серверное приложение, реализующее сетевую игру морской бой. Так же был подробно рассмотрен стек протоколов TCP/IP, приведено сравнение TCP и UDP сокетов, и подробная реализация всех алгоритмов рассмотренных в программе. ...

Содержание

Введение 4
Теоретическая часть 5
1. Стек протоколов TCP/IP 5
1.1 Уровень межсетевого взаимодействия 5
1.2 Основной уровень 6
1.3 Прикладной уровень 7
1.4 Уровень сетевых интерфейсов 7
1.5 Соответствие уровней стека TCP/IP уровням модели OSI. 8
1.6 Единицы данных протоколов стека TCP/IP 8
1.7 Сравнение протоколов TCP и UDP 9
2. Сокеты 10
2.1. Функциональные возможности 10
2.2 Модель "клиент-сервер" 11
2.3 Принципы применения 13
2.4 Отладка программ 13
2.5 Асинхронные сокеты 14
Практическая часть 15
1. Задание на курсовую работу 15
2. Постановка задачи 15
3. Разработка приложения 15
3.1. Классы используемые в клиентской части 15
3.2 Работа с сокетами 21
3.3 Разработка интерфейса клиент-серверного приложения 22
4. Инструкция по использованию приложения 24
Заключение 27
Список источников 28
Приложение 2

Введение

В настоящее время компьютерные сети используются повсеместно, позволяя пользователям объединять вычислительные и дорогостоящие ресурсы для совместного решения различных задач. Например, очень часто используются сетевые принтеры.
Работа в рамках компьютерной сети потребовала создания ряда протоколов для организации взаимодействия между компьютерами в рамках сети. И одним из наиболее популярных в настоящее время стеков (наборов) таких протоколов является стек протоколов TCP/IP.
Для построения программ, работающих с сетью и предоставляющих конечным пользователям какие-либо сервисы используется архитектура «клиент-сервер». Эта популярная парадигма основана на понятиях «сервера» (пассивный компонент, обслуживающий запросы от клиентов) и «клиента» (активный компонент, обращающийся с каким-либо з апросом к серверу).
Стандартные средства Visual Studio и библиотеки языка C# позволяют организовать разработку клиент-серверных приложений на базе сетей TCP/IP.
В ходе выполнения данной курсовой работы необходимо решить учебную задачу, разработав клиент-серверное приложение для игры морской бой

Фрагмент работы для ознакомления

{
if (st[0] == "spisok")
{
listBox1.Items.Clear();
for (int i = 0; i < Convert.ToInt32(st[1]); i++)
{
int j = 2;
if ((!listBox1.Items.Contains(st[j + i])) && st[j + i]!=name)
{
listBox1.Items.Add(st[j + i]);
}
}
}
}
if (str == "connect" && !soedinenie)
{
soedinenie = true;
string H = "connect";
massage = "Отсылаемый пакет содержит: " + H;
// Преобразование пакетов в массив байтов
data = System.Text.Encoding.ASCII.GetBytes(H);
// Отправка пакетов в серверное приложение на порт 8888
client.Send(data, data.Length, "1-ПК", 8888);
massage += " Пакет отослан ";
AddItem();
MessageBox.Show("Соединение с соперником установлено начинайте расстановку");
listBox1.Visible = false;
button6.Visible = false;
label1.Visible = false;
this.Refresh();
}
if (str == "end" )
{
protivnikvse = true;
MessageBox.Show("Противник закончил расстановку");
end = true;

this.Refresh();
}
if (str == "battle")
{
MessageBox.Show("Соперник расставил корабли и готов играть");
}
if (st[0] == "shot")
{
shot[0] = Convert.ToInt32(st[1]);
shot[1] = Convert.ToInt32(st[2]);
sh = true;
for (int j = 0; j < 10; j++)
{
if (Korabli[j].Popadanievkorabl(p.c[shot[0], shot[1]].Location) == 1)
{
p.c[shot[0], shot[1]].SetTip(8);
}
else
{
p.c[shot[0], shot[1]].SetTip(7);
break;
}
}
Battle();
}
if (st[0] == "popal")
{
pop[0] = Convert.ToInt32(st[1]);
pop[1] = Convert.ToInt32(st[2]);
popal = true;
Battle();
u++;
if (u > 19)
{
MessageBox.Show("Поздравляем, Вы победили");
this.Close();
}
}
if (st[0] == "mimo")
{
mim[0] = Convert.ToInt32(st[1]);
mim[1] = Convert.ToInt32(st[2]);
mimo = true;
Battle();
}
if (st[0] == "xod")
{
xod = !Convert.ToBoolean(st[1]);
}
// Вывод пакета данных в текстовое поле
massage = "Пакет принят: " +
" Длина: " + shot[0] + " Содержащий: " +
shot[1] + " ";
AsyncHandler ah = SomeAsyncMethod; // ассинхронно выводим сообщение на сервере
ah.BeginInvoke(null, null);
this.Refresh();
}

}
private delegate void AsyncHandler();
private void SomeAsyncMethod()
{
if (this.displayTextBox1.InvokeRequired)
{
this.displayTextBox1.Invoke(new AsyncHandler(AddItem));
}
else
{
AddItem();
}
}
private void AddItem()
{
this.displayTextBox1.BeginUpdate();
this.displayTextBox1.Items.Add(massage);
this.displayTextBox1.EndUpdate();
}
public void DisplayMessage()
{
AsyncHandler ah = SomeAsyncMethod;
ah.BeginInvoke(null, null);
}
private void button1_Click(object sender, EventArgs e)
{
string H = textBox1.Text;
massage = "Отсылаемый пакет содержит: " + " " + H;
// Преобразование пакетов в массив байтов
byte[] data = System.Text.Encoding.ASCII.GetBytes(H);
// Отправка пакетов в серверное приложение на порт 8888li
client.Send(data, data.Length, "1-ПК", 8888);
massage += " Пакет отослан ";
AddItem();
textBox1.Clear();

}
public bool KorablMinus(int dlina)
{
if (korablim[dlina - 1] > 0)
{
korablim[dlina - 1]--;
return true;
}
else
{
MessageBox.Show("Такие корабли закончились");
return false;
}
}
public bool Vsekorabli()
{
if (korablim[0] == korablim[1] && korablim[0] == korablim[2] && korablim[0] == korablim[3] & korablim[0] == 0)
{
return false;
}
return true;
}
private void Client_MouseDown(object sender, MouseEventArgs e)
{
if (!rasstanovkazak)
{
bool ok = true;
if (Vsekorabli())
{
Korabl k = new Korabl(Convert.ToInt32(comboBox2.Text));
if (p.Popadanie(e.X, e.Y)[0] != -1)
{
for (int i = 0; i < Convert.ToInt32(comboBox2.Text); i++)
{
if (p.Popadanie(e.X, e.Y)[1] + Convert.ToInt32(comboBox2.Text) < 11)
{
if (comboBox1.Text == "Вертикально" && !k.Pop(p.c[p.Popadanie(e.X, e.Y)[0], p.Popadanie(e.X, e.Y)[1] + i]))
{
ok = false;
break;
}
}
if (p.Popadanie(e.X, e.Y)[0] + Convert.ToInt32(comboBox2.Text) < 11)
{
if (comboBox1.Text == "Горизонтально" && !k.Pop(p.c[p.Popadanie(e.X, e.Y)[0] + i, p.Popadanie(e.X, e.Y)[1]]))
{
ok = false;
break;
}
}
}
int ia = p.Popadanie(e.X, e.Y)[0];
int ib = p.Popadanie(e.X, e.Y)[1];
if (ok)
{
if (comboBox1.Text == "Вертикально")
{
int x = 2;
if (p.Popadanie(e.X, e.Y)[1] + Convert.ToInt32(comboBox2.Text) > 9)
{
x = 1;
}
if (p.Popadanie(e.X, e.Y)[1] + Convert.ToInt32(comboBox2.Text) < 11)
{
if (KorablMinus(Convert.ToInt32(comboBox2.Text)))
{
for (int i = 0; i < Convert.ToInt32(comboBox2.Text) + x; i++)
{
if (p.Popadanie(e.X, e.Y)[0] - 1 > -1 && p.Popadanie(e.X, e.Y)[1] + i - 1 > -1)
{
k.Okruga(p.c[p.Popadanie(e.X, e.Y)[0] - 1, p.Popadanie(e.X, e.Y)[1] + i - 1]);
}
if (p.Popadanie(e.X, e.Y)[1] + i - 1 > -1)
{
k.Okruga(p.c[p.Popadanie(e.X, e.Y)[0], p.Popadanie(e.X, e.Y)[1] + i - 1]);
}
if (p.Popadanie(e.X, e.Y)[0] + 1 < 10 && p.Popadanie(e.X, e.Y)[1] + i - 1 > -1)
{
k.Okruga(p.c[p.Popadanie(e.X, e.Y)[0] + 1, p.Popadanie(e.X, e.Y)[1] + i - 1]);
}
}
for (int i = 0; i < Convert.ToInt32(comboBox2.Text); i++)
{
k.Per(p.c[p.Popadanie(e.X, e.Y)[0], p.Popadanie(e.X, e.Y)[1] + i]);
}
Korabli.Add(k);
}
}
else
{
MessageBox.Show("корабль выходит за границу поля");
}
}
else
{
int x = 2;
if (p.Popadanie(e.X, e.Y)[0] + Convert.ToInt32(comboBox2.Text) > 9)
{
x = 1;
}
if (p.Popadanie(e.X, e.Y)[0] + Convert.ToInt32(comboBox2.Text) < 11)
{
if (KorablMinus(Convert.ToInt32(comboBox2.Text)))
{
for (int i = 0; i < Convert.ToInt32(comboBox2.Text) + x; i++)
{
if (p.Popadanie(e.X, e.Y)[0] + i - 1 > -1)
{
k.Okruga(p.c[p.Popadanie(e.X, e.Y)[0] + i - 1, p.Popadanie(e.X, e.Y)[1]]);
}
if (p.Popadanie(e.X, e.Y)[0] + i - 1 > -1 && p.Popadanie(e.X, e.Y)[1] - 1 > -1)
{
k.Okruga(p.c[p.Popadanie(e.X, e.Y)[0] + i - 1, p.Popadanie(e.X, e.Y)[1] - 1]);
}
if (p.Popadanie(e.X, e.Y)[0] + i - 1 > -1 && p.Popadanie(e.X, e.Y)[1] + 1 < 10)
{
k.Okruga(p.c[p.Popadanie(e.X, e.Y)[0] + i - 1, p.Popadanie(e.X, e.Y)[1] + 1]);
}
}
for (int i = 0; i < Convert.ToInt32(comboBox2.Text); i++)
{
k.Per(p.c[p.Popadanie(e.X, e.Y)[0] + i, p.Popadanie(e.X, e.Y)[1]]);
}
Korabli.Add(k);
}
}
else
{
MessageBox.Show("корабль выходит за границу поля");
}
}
}
}
}
else
{
MessageBox.Show("все корабли расставлены");
}
this.Refresh();
}
if (battle)
{
if (xod)
{
if (p2.Popadanie(e.X, e.Y)[0] != -1)
{
string H = "shot" + "," + p2.Popadanie(e.X, e.Y)[0] + "," + p2.Popadanie(e.X, e.Y)[1];
massage = "Отсылаемый пакет содержит: " + H;
// Преобразование пакетов в массив байтов
byte[] data = System.Text.Encoding.ASCII.GetBytes(H);
// Отправка пакетов в серверное приложение на порт 8888
client.Send(data, data.Length, "1-ПК", 8888);
massage += " Пакет отослан ";
AddItem();
}
}
int u = 0;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (p.c[i, j].Tip == 7)
{
u++;
}
if (u > 19)
{
MessageBox.Show("Вы проиграли");
this.Close();
}
}
}
}
}
private void button3_Click(object sender, EventArgs e)
{
if (!Vsekorabli())
{
rasstanovkazak = true;
}
else
{
MessageBox.Show("Расставте корабли");
}
}
private void Client_Paint(object sender, PaintEventArgs e)
{
if (soedinenie)
{
comboBox1.Visible = true;
comboBox2.Visible = true;
button3.Visible = true;

if (rasstanovkazak)
{
comboBox1.Visible = false;
comboBox2.Visible = false;
button3.Visible = false;
button2.Visible = true;
}
p2.Paint(e.Graphics);
p.Paint(e.Graphics);
for (int i = 0; i < Korabli.Count; i++)
{
Korabli[i].Paint(e.Graphics);
}
}
else
{
comboBox1.Visible = false;
comboBox2.Visible = false;
button3.Visible = false;
}
if (xod)
{
this.Text =textBox2.Text+ "Ваш ход";
}
else
{
this.Text = textBox2.Text;
}
}
private void button3_Click_1(object sender, EventArgs e)
{
if (!Vsekorabli())
{
rasstanovkazak = true;
string H = "end";
massage = "Отсылаемый пакет содержит: " + H;
// Преобразование пакетов в массив байтов
byte[] data = System.Text.Encoding.ASCII.GetBytes(H);
// Отправка пакетов в серверное приложение на порт 8888
client.Send(data, data.Length, "1-ПК", 8888);
massage += " Пакет отослан ";
AddItem();
}
else
{
MessageBox.Show("Расставте корабли");
}
// Вывод пакета данных в текстовое поле
}
private void button2_Click(object sender, EventArgs e)
{
battle = true;
xod = false;
string H = "battle";
massage = "Отсылаемый пакет содержит: " + H;
// Преобразование пакетов в массив байтов
byte[] data = System.Text.Encoding.ASCII.GetBytes(H);
// Отправка пакетов в серверное приложение на порт 8888
client.Send(data, data.Length, "1-ПК", 8888);
massage += " Пакет отослан ";
AddItem();
H = "xod"+","+xod;
massage = "Отсылаемый пакет содержит: " + H;
// Преобразование пакетов в массив байтов
data = System.Text.Encoding.ASCII.GetBytes(H);
// Отправка пакетов в серверное приложение на порт 8888
client.Send(data, data.Length, "1-ПК", 8888);
massage += " Пакет отослан ";
AddItem();
}
private void timer1_Tick(object sender, EventArgs e)
{
}
private void Battle()
{
if (sh)
{
bool popa = false;
for (int i = 0; i < 10; i++)
{
if (Korabli[i].Popadanievkorabl(p.c[shot[0], shot[1]].Location) == 0)
{
popa = true;
}
}
this.Refresh();
if (popa)
{
string H = "popal" + "," + shot[0] + "," + shot[1];
massage = "Отсылаемый пакет содержит: " + H;
// Преобразование пакетов в массив байтов
byte[] data = System.Text.Encoding.ASCII.GetBytes(H);
// Отправка пакетов в серверное приложение на порт 8888
client.Send(data, data.Length, "1-ПК", 8888);
massage += " Пакет отослан ";
}
else
{
string H = "mimo" + "," + shot[0] + "," + shot[1];
massage = "Отсылаемый пакет содержит: " + H;
// Преобразование пакетов в массив байтов
byte[] data = System.Text.Encoding.ASCII.GetBytes(H);
// Отправка пакетов в серверное приложение на порт 8888
client.Send(data, data.Length, "1-ПК", 8888);
massage += " Пакет отослан ";
}
this.Refresh();
}
if (popal)
{
p2.c[pop[0], pop[1]].SetTip(5);
}
if (mimo)
{
xod = false;
p2.c[mim[0], mim[1]].SetTip(2);
string H = "xod" + "," + xod;
massage = "Отсылаемый пакет содержит: " + H;
// Преобразование пакетов в массив байтов
byte[] data = System.Text.Encoding.ASCII.GetBytes(H);
// Отправка пакетов в серверное приложение на порт 8888
client.Send(data, data.Length, "1-ПК", 8888);
massage += " Пакет отослан ";

Список литературы

1) Сокеты. http://www.find-info.ru/doc/cpp/009/sockets.htm
2) Структура стека TCP/IP. http://kunegin.narod.ru/ref3/tcp/glava1.htm
3) Модели «Клиент-сервер». http://en.wikipedia.org/wiki/Client–server_model
4) Работа с сокетами на VS. http://msdn.microsoft.com/ru-ru/library/system.net.sockets.udpclient.aspx
Очень похожие работы
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00499
© Рефератбанк, 2002 - 2024