Вход

Разработка сетевой игры «змейка» на основе технологии клиент-сервер

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

Описание

Разработка серверного модуля:
Приложение выполняет следующие функции:
• прием/передача сообщений по протоколу ТСР
• коммутация сообщений между клиентами
• отображать информацию о подключенных в данный момент пользователях
• отслеживание состояния пользователей
• информировать о текущем счете каждого пользователя
----------------------------------------------------------------------------------
Разработка клиентского модуля:
Клиентский модуль реализует логику игры «Змейка».
Игра в змейку строится по принципу функционирования «игрового мира» не только в результате действий игрока, но самостоятельно (действия по умолчанию и в результате действий других игроков). ...

Содержание

Введение 1
1. Теоретическая часть 2
Протокол ТСР 2
Сокеты 6
2. Специальная часть 8
1. Использование сокетов 8
2. Разработка серверного модуля 9
3. Разработка клиентского модуля 9
4. Описание работы приложения 10
Вывод 13
Список использованной литературы 13
3. Приложение 14
1. Модули сервера 14
2. Модули клиента 18

Введение

Сервер - это специальная программа, обычно запущенная на отдельном компьютере (хосте, от слова host (eng.) - хозяин), и выполняющая некий круг задач. Клиент, в свою очередь - программа, которая запрашивает сервер выполнить то или иное действие (задачу) и вернуть полученные данные клиенту. На хосте для работы сервера обычно выделяется порт. К этому порту и должен будет обращаться клиент. Клиент для связи с портом хоста, который соединен в свою очередь с нужным сервером (программой), создаёт сокет.

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

ochki2++;
lab2.Text = ochki2.ToString();
}
}
/// <summary>
/// отправляет сообщение другому игроку
/// </summary>
/// <param name="soc">кто отправил</param>
public void Redirect(Socket soc)
{
if(soc==client1)
SendMessage(client2);
else
SendMessage(client1);
}
public void Connected1(Socket soc)
{
try
{
while (true)
GetMessage(soc);
}
catch
{
ConntctionReady = false;
status.Text = "Невозможно установить соединение...";
return;
}
}
public void Connected2(Socket soc)
{
while (true)
SendMessage(soc);
}
private void SendMessage(Socket soc)
{
try
{
// отправка ответа
if (AnswerReady == true && SendStr != "")
{
// отправка ответа
byte[] service = Encoding.Default.GetBytes(SendStr);
SendStr = "";
soc.Send(service, service.Length, 0);
AnswerReady = false;
}
}
catch
{
}
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace ZmeykaServer
{
public partial class Form1 : Form
{
// делегат для ожидания соединения
public delegate void Connect();
TcpServer TCPSERVER1;
public Form1()
{
InitializeComponent();
listBox1.Items.Clear();
TCPSERVER1 = new TcpServer(label1, listBox1, label5, label6);
// чтобы не ругалось на то, что компоненты формы
// используются в другом потоке

Control.CheckForIllegalCrossThreadCalls = false;
}
}
}
2. Модули клиента
Snake.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace Zmeyka
{
public class Snake
{
public List<Rectangle> kvadrats;
public List<Rectangle> apples;
public Rectangle BattleField;
//public String Status;
public Pen border; //для рисования звеньев
public Brush fill; //для рисования звеньев
public enum Direction { Up, Down, Left, Right };
public Direction direction;
public enum Status { Norm, Lose, Lose2, Win};
public Status status;
private int size;
public Point loc;
public Snake(Point l, int s, Point Fieldloc, int FieldWidth, int FieldHeight)
{
loc = l;
size = s;
status = Status.Norm;
BattleField = new Rectangle(Fieldloc.X, Fieldloc.Y, FieldWidth*size, FieldHeight*size);
border = new Pen(Color.Black, 2);
fill = new SolidBrush(Color.Green);
kvadrats = new List<Rectangle>();
apples = new List<Rectangle>();
kvadrats.Add(new Rectangle(loc.X, loc.Y, size, size)); //это голова
kvadrats.Add(new Rectangle(loc.X-size, loc.Y, size, size));
kvadrats.Add(new Rectangle(loc.X - 2*size, loc.Y, size, size));
kvadrats.Add(new Rectangle(loc.X - 3 * size, loc.Y, size, size));
kvadrats.Add(new Rectangle(loc.X - 4 * size, loc.Y, size, size));
direction = Direction.Right;
}
public void Draw(Graphics g)
{

//рисуем змею
int c = 0;
foreach (Rectangle i in kvadrats) //пробегаем по всем "звеньям" змейки
{
g.DrawRectangle(border, i); //рисуем все "звенья"
if (c == 0)
g.FillRectangle(fill, i); //а голову еще и закрашиваем
c++;
}
}
public void Move()
{
Rectangle r=new Rectangle();
for (int i = kvadrats.Count - 1; i > 0; i--)
{
r = kvadrats[i];
r.Offset(kvadrats[i - 1].Location.X - kvadrats[i].Location.X, kvadrats[i - 1].Location.Y - kvadrats[i].Location.Y);
kvadrats[i] = r;
}
switch (direction)
{
case Direction.Up:
r = kvadrats[0];
r.Offset(0, -r.Height);
kvadrats[0] = r;
break;
case Direction.Down:
r = kvadrats[0];
r.Offset(0, r.Height);
kvadrats[0] = r;
break;
case Direction.Left:
r = kvadrats[0];
r.Offset(-r.Height, 0);
kvadrats[0] = r;
break;
case Direction.Right:
r = kvadrats[0];
r.Offset(r.Height, 0);
kvadrats[0] = r;
break;
};
if (!BattleField.Contains(kvadrats[0].Location)) //проверка на выход за границу поля
status=Status.Lose;
//проверка на столкновение с самим собой
int c = 0;
foreach (Rectangle i in kvadrats) //пробегаем по всем "звеньям" змейки
{
if (c == 0)
r = i;
else
if(i.IntersectsWith(r))
status = Status.Lose;
c++;
}
}
public void AddKvadrat() //добавляем новое звено так, чтобы оно было "продолжением" последних двух
{
if (kvadrats[kvadrats.Count - 1].Location.X == kvadrats[kvadrats.Count - 2].Location.X) //2 последних расположены по вертикали
{
if (kvadrats[kvadrats.Count - 1].Location.Y < kvadrats[kvadrats.Count - 2].Location.Y) //последний выше предпоследнего
kvadrats.Add(new Rectangle(kvadrats[kvadrats.Count - 1].Location.X, kvadrats[kvadrats.Count - 1].Location.Y - kvadrats[0].Height, kvadrats[0].Height, kvadrats[0].Height));
else
kvadrats.Add(new Rectangle(kvadrats[kvadrats.Count - 1].Location.X, kvadrats[kvadrats.Count - 1].Location.Y + kvadrats[0].Height, kvadrats[0].Height, kvadrats[0].Height));
}
else //2 последних расположены по горизонтали
{
if (kvadrats[kvadrats.Count - 1].Location.X < kvadrats[kvadrats.Count - 2].Location.X) //последний левее предпоследнего
kvadrats.Add(new Rectangle(kvadrats[kvadrats.Count - 1].Location.X - kvadrats[0].Height, kvadrats[kvadrats.Count - 1].Location.Y, kvadrats[0].Height, kvadrats[0].Height));
else
kvadrats.Add(new Rectangle(kvadrats[kvadrats.Count - 1].Location.X + kvadrats[0].Height, kvadrats[kvadrats.Count - 1].Location.Y + kvadrats[0].Height, kvadrats[0].Height, kvadrats[0].Height));
}
}
public void SetLocation(int x,int y)
{
kvadrats.Clear();
kvadrats.Add(new Rectangle(x, y, size, size)); //это голова
kvadrats.Add(new Rectangle(x - size, y, size, size));
kvadrats.Add(new Rectangle(x - 2 * size, y, size, size));
kvadrats.Add(new Rectangle(x - 3 * size, y, size, size));
kvadrats.Add(new Rectangle(x - 4 * size, y, size, size));
}
public void AddApple(int x, int y)
{
apples.Add(new Rectangle(loc.X+x*size, loc.Y+y*size, size, size));
}
}
}
ZmeykaGame.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace Zmeyka
{
public class ZmeykaGame
{
Pen line;
public Snake SNAKE;
public Snake OPPONENT;
public ZmeykaGame(Point loc, int size, Point Fieldloc, int FieldWidth, int FieldHeight)
{
line = new Pen(Color.Gold, 2);
line.DashStyle = DashStyle.Dot;
//для размещения змеек игроков в разных углах
if (loc.Y < Fieldloc.Y + FieldHeight * size / 2) //если мы в "нижней половине"
{
OPPONENT = new Snake(new Point(loc.X, Fieldloc.Y + FieldHeight*size - size), size, Fieldloc, FieldWidth, FieldHeight);
OPPONENT.direction = Snake.Direction.Right;
OPPONENT.fill = new SolidBrush(Color.Red);
}
else
{
OPPONENT = new Snake(new Point(loc.X, Fieldloc.Y + size), size, Fieldloc, FieldWidth, FieldHeight);
OPPONENT.direction = Snake.Direction.Right;
OPPONENT.fill = new SolidBrush(Color.Red);
}
SNAKE = new Snake(loc, size, Fieldloc, FieldWidth, FieldHeight);
SNAKE.direction = Snake.Direction.Right;

}

public void Draw(Graphics g)
{
//рисуем сетку
int Width = SNAKE.BattleField.Width / SNAKE.kvadrats[0].Width;
int Height = SNAKE.BattleField.Height / SNAKE.kvadrats[0].Height;
for (int i = SNAKE.BattleField.Location.X; i <= SNAKE.BattleField.Location.X + SNAKE.BattleField.Width; i += SNAKE.kvadrats[0].Width)
g.DrawLine(line, new Point(i, SNAKE.BattleField.Y), new Point(i, SNAKE.BattleField.Y + SNAKE.BattleField.Height));
for (int i = SNAKE.BattleField.Location.Y; i <= SNAKE.BattleField.Location.Y + SNAKE.BattleField.Height; i += SNAKE.kvadrats[0].Height)
g.DrawLine(line, new Point(SNAKE.BattleField.X, i), new Point(SNAKE.BattleField.X + SNAKE.BattleField.Width, i));
SNAKE.Draw(g);
OPPONENT.Draw(g);
}
public void Move()
{
SNAKE.Move();
Peresec();
OPPONENT.Move();
if (SNAKE.status == Snake.Status.Norm)
Peresec();
}
private void Peresec()
{
int c = 0;
if (SNAKE.kvadrats[0].IntersectsWith(OPPONENT.kvadrats[0])) //оба столкнулись головами и оба проиграли
{
SNAKE.status = Snake.Status.Lose2;
return;
}
foreach (Rectangle i in SNAKE.kvadrats)
{
foreach (Rectangle j in OPPONENT.kvadrats)
if (c != 0) //если противник врезался в SNAKE
{
if (i.IntersectsWith(j))
{
SNAKE.status = Snake.Status.Win;
return;
}
}
c++;
} //а если мы врезались в противника, то об этом сообщит сервер
}
public void SetLocation()
{
Point p = OPPONENT.loc;
OPPONENT.SetLocation(SNAKE.loc.X, SNAKE.loc.Y);
SNAKE.SetLocation(p.X, p.Y);
}
public void AddApple(int x, int y)
{
SNAKE.AddApple(x, y);
OPPONENT.AddApple(x, y);
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
namespace Zmeyka
{
// структура сообщения:
// ид-р отправителя*ид-р получателя(соперника)*команда сервера*статус отправителя
public partial class Form1 : Form
{
int ID;
int OppID;
TcpClient TCPCLIENT;
//TcpListener TCPLISTENER;
//TcpClient SERVER;
Socket client;
//Socket server;
EndPoint EndP;
bool GameBegin;
delegate void Connect();
//delegate void Recive();
ZmeykaGame GameSNAKE;
public Form1()
{
InitializeComponent();
// чтобы не ругалось на то, что компоненты формы
// используются в другом потоке
Control.CheckForIllegalCrossThreadCalls = false;
GameBegin = false;
GameSNAKE = new ZmeykaGame(new Point(60, 20), 20, new Point(20, 20), 15, 10);
GameSNAKE.SNAKE.direction = Snake.Direction.Right;
GameSNAKE.OPPONENT.direction = Snake.Direction.Right;
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text != "" && textBox2.Text != "" && textBox3.Text != "")
{
if (TCPCLIENT==null)
{
TCPCLIENT = new TcpClient(textBox3.Text, 8080);
client = TCPCLIENT.Client;
ID = Convert.ToInt32(textBox1.Text);
OppID = Convert.ToInt32(textBox2.Text);
SendMessage(ID, OppID, "Reg", Snake.Status.Norm);
label4.Text = "Соединение с сервером...";
}
}
//String str = richTextBox1.Text;
//byte[] service = new byte[1000];
//service = Encoding.Default.GetBytes(str);
//client.Send(service, service.Length, 0);
IPAddress ip = IPAddress.Any;
// созаем параметр для привязки сокета к адресу
IPEndPoint ipe = new IPEndPoint(ip, 8080);

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

1. http://ru.wikipedia.org/wiki/Сокет_(программный_интерфейс)
2. http://www.javaportal.ru/java/articles/ClientServer.html
3. http://msdn.microsoft.com/library/bb383962.aspx
4. http://msdn.microsoft.com/ru-ru/library/bb655891(v=VS.90).aspx
Очень похожие работы
Пожалуйста, внимательно изучайте содержание и фрагменты работы. Деньги за приобретённые готовые работы по причине несоответствия данной работы вашим требованиям или её уникальности не возвращаются.
* Категория работы носит оценочный характер в соответствии с качественными и количественными параметрами предоставляемого материала. Данный материал ни целиком, ни любая из его частей не является готовым научным трудом, выпускной квалификационной работой, научным докладом или иной работой, предусмотренной государственной системой научной аттестации или необходимой для прохождения промежуточной или итоговой аттестации. Данный материал представляет собой субъективный результат обработки, структурирования и форматирования собранной его автором информации и предназначен, прежде всего, для использования в качестве источника для самостоятельной подготовки работы указанной тематики.
bmt: 0.00501
© Рефератбанк, 2002 - 2024