Реализация игры pong на языке Java с помощью технологии Socket

Автор работы: Пользователь скрыл имя, 07 Ноября 2014 в 18:50, курсовая работа

Краткое описание

Цель работы:
Написать игру пинг-понг на языке Java с используя технологию сокетов.
Для достижения этой цели были поставлены следующие задачи:
1. Рассмотреть сетевые возможности разных языков программирования;
2. Изучить работу с графикой на Java;

Содержание

Оглавление 2
Введение 3
Глава 1. Сетевые возможности разных языков программирования 3
1.1. Сетевое программирование в C# 3
1.2. Сетевое программирование в Python 3
1.3. Сетевое программирование в Perl 3
1.4. Графика в Java 3
1.5. Аплеты в Java 3
Глава 2. Разработка программы 3
2.1. Программирование сокетов 3
2.2.Проектирование и реализация 3
Заключение 3

Прикрепленные файлы: 1 файл

Курсовая ..docx

— 182.63 Кб (Скачать документ)

          int[] yArray={350,345, 340, 310, 290, 280, 275, 273, 271, 269};

          int nPoint = 10;

          g.setColor(newColor);

          g.drawPolyline(xArray, yArray, nPoint);

         g.setColor(oldColor);

          g.drawString("y = f(x)", 180, 267);

 
                 

                    Рис 1.1 Пример работы с графикой

Метод drawLine класса Graphics начертит прямую линию:

g.drawLine(20, 30, 360, 30);

здесь 20, 30 — это координаты x, y начала линии, 
360, 30 — координаты конца линии.

Метод setColor класса Graphics сделает текущим новый цвет:

Запоминаем исходный цвет; 
Color oldColor = g.getColor();

Создаём синий цвет; 
Color newColor = new Color(0, 0, 255); 

Устанавливаем синий цвет; 
g.setColor(newColor);

Чертим линию синим цветом; 
g.drawLine(20, 30, 360, 30);

Восстанавливаем исходный цвет; 
g.setColor(oldColor);

Аргументы конструктора new Color(0, 0, 255) — это красный, зелёный и синий цвета соответственно (rgb).

В примере задан чисто синий цвет, т.к. значения других составляющих равны нулю. Вот чисто красный цвет:

Color newColor = new Color(255, 0, 0);

А это чисто зеленый цвет:

Color newColor = new Color(0, 255, 0);

Значения составляющих цвета изменяются от 0 до 255.

Светло-синий цвет, который мы использовали для заливки прямоугольника:

newColor = new Color(0, 215, 255);

Задать цвет фона можно методом setBackground:

mainFrame.setBackground(Color.white);

Нарисовать треугольник можно методом drawRect класса Graphics:

g.drawRect(20, 40, 340, 20);

20, 40 — это координаты верхнего  левого угла прямоугольника; 
340 — длина;20 — высота прямоугольника.

Что бы залить прямоугольник цветом понадобится методом fillRect класса Graphics:

newColor = new Color(0, 215, 255); 
g.setColor(newColor); 
g.fillRect(21, 41, 339, 19); 
g.setColor(oldColor);

Что бы нарисовать прямоугольник с закругленными углами нужен метод drawRoundRect класса Graphics.

Сопряжение, т.е. закругление на углах, делается с помощью частей овала.

g.drawRoundRect(20, 70, 340, 30, 20, 15);

первые 4 аргумента как у обычного прямоугольника. Пятый аргумент— 20 — это ширина прямоугольника, в который вписана часть овала сопряжения. Шестой аргумент — 15 — это высота прямоугольника, в который вписана часть овала сопряжения.

Для того, чтобы нарисовать овал воспользуемся методом drawOval класса Graphics:

g.drawOval(20, 110, 150, 60);

Аргументы определяют прямоугольник, в который вписан овал.

Чтобы нарисовать окружность воспользуемся тем же методом, что и для овала.

Методом drawOval класса Graphics:

g.drawOval(200, 110, 60, 60);

Аргументы определяют прямоугольник, в который вписана окружность. Здесь рисуем овал, но длина и высота описанного прямоугольника равны, что и даёт окружность.

Для того, чтобы нарисовать дугу воспользуемся методом drawArc класса Graphics:

g.drawArc(280, 110, 80, 60, 0, 180);

Первые 4 аргумента как у обычного прямоугольника. Пятый аргумент— 0 — это угол, от которого отсчитывается угол самой дуги. 180 — это угол дуги. Углы отсчитывают от горизонтальной оси: по часовой стрелке отрицательное направление, протв — положительное. В примере 180 градусов (величина дуги) отсчитываем от горизонтальной линии.

Многоугольник можно нарисовать с помощью методом drawPolygon класса Graphics:

int[] arrayX = {20, 100, 100, 250, 250, 20, 20, 50}; 
int[] arrayY = {180, 180, 200, 200, 220, 200, 200, 190}; 
Polygon poly = new Polygon(arrayX, arrayY, 8); 
g.drawPolygon(poly);

Здесь создаём объект класса Polygon. arrayX — это х-координаты вершин многоугольника, arrayY — это y-координаты вершин многоугольника, 8 — число вершин многоугольника.

Для создания объекта «точка» используется класс Point:

Point aPoint = new Point(50, 190);

аргументы — это x, y координаты.

Чтобы определить, принадлежит ли точка многоугольнику нужно:

Polygon poly = new Polygon(arrayX, arrayY, 8); 
g.drawPolygon(poly); 
Point aPoint = new Point(50, 190); 
if(poly.contains(aPoint)) 
{  g.drawString("Yes", 50, 190); }

Чтобы вывести строку используем методом drawString класса Graphics:

g.drawString("Yes", 50, 190);

строка "Yes" будет выведена от точки с координатами 50, 190.

Для того, чтобы задать шрифт используем класс Font:

Font font = new Font("Tahoma", Font.BOLD|Font.ITALIC, 40);

где "Tahoma" — название шрифта,  
Font.BOLD|Font.ITALIC — жирный шрифт с наклоном,  
40 — высота шрифта.

После задания шрифта мы делаем его текущим и выводим строку этим шрифтом:

g.setFont(font);  
g.drawString("SBP", 270, 220);

Чтоб задать цвет текста создадим и установим в графический контекст новый цвет:

newColor = new Color(0, 0, 255);  
g.setColor(newColor);

Здесь мы создали чисто синий цвет. А теперь выводим строку синим цветом:

g.drawString("SBP", 270, 220);

Для того, чтобы начертить график функции сначала начертим координатные оси:

 Draw axes;  
g.drawLine(20, 220, 20, 350);  
g.drawLine(20, 350, 360, 350);  
g.drawString("Y", 25, 230);  
g.drawString("X", 350, 346);

А теперь построить график функции можно просто. Для этого используем метод drawPolyline класса Graphics:

 Draw a curve;  
int[] xArray = {20,40,60,80,100,120,130,140,280,332};  
int[] yArray = {350,345,340,310,290,280,275,273,271,269};  
int nPoint = 10;  
g.setColor(newColor);  
g.drawPolyline(xArray, yArray, nPoint);  
g.setColor(oldColor);  
g.drawString("y = f(x)", 180, 267);

График строим по точкам, xArray — это x-координаты точек, yArray — y-координаты точек графика, nPoint — это число точек.

Наш график являет собой кривую намагничивания. Что бы график не был таким угловатым, можно взять больше точек, после чего график будет более плавным.

1.5. Аплеты в Java

Java-апплет — прикладная программа, чаще всего написанная на языке  программирования Java в форме байт-кода. Java-апплеты выполняются в веб-обозревателе  с использованием виртуальной Java машины (JVM), или в Sun's AppletViewer, автономном  средстве для испытания апплетов. Java-апплеты были внедрены в  первой версии языка Java в 1995 году. Java-апплеты обычно пишутся на  языке программирования Java, но могут  быть написаны и на других  языках, которые компилируются в  байт‐код Java, таких, как Jython.

Апплеты используются для предоставления интерактивных возможностей веб-приложений, которые не могут быть предоставлены HTML. Так как байт-код Java платформо-независим, то Java-апплеты могут выполняться с помощью плагинов браузерами многих платформ, включая Microsoft Windows, UNIX, Apple Mac OS и GNU/Linux. Такие программы с открытым исходным кодом, как applet2app[1], могут быть использованы для преобразования апплета в самостоятельные программы на Java или исполняемые файлы Linux и Windows.

Java Servlet иногда неофициально сравнивают  с серверным апплетом, но он  отличается своим языком, функциями  и каждой из описанных здесь  характеристик апплетов.

Java-апплеты в большинстве браузеров  выполняются в «песочнице», предотвращая  их доступ к локальным данным. Код апплета загружается с  веб-сервера, и браузер либо вставляет  апплет в веб-страницу, либо открывает  новое окно с собственным пользовательским  интерфейсом апплета. Апплет может  быть отображен на веб-странице  путем использования устаревшего HTML элемента applet, или рекомендуемого элемента object. Этим определяется месторасположение и источник апплета.

Главный класс апплета расширяет класс java.applet.Applet или, если создаётся Swing апплет, javax.swing.JApplet. Класс должен переопределить методы создания пользовательского интерфейса внутри себя. (Applet является потомком Panel, который, в свою очередь, является потомком Container).

Преимущества использования Java-апплетов

- кроссплатформенность

- апплет может работать на  «всех» установленных к этому  времени версиях Java, а не только  с последней версией; однако, если  апплет требует последнюю версию JRE, то клиент будет вынужден  ждать более длительной загрузки;

- апплет поддерживается большинством браузеров;

- он кэшируется в большинстве  браузеров, а потому будет быстро  загружаться при возвращении  на веб-страницу; но апплет может  сохраняться в кэше и создавать  проблемы после выхода новых  версий;

- он может иметь полный доступ  к машине, на которой выполняется, если пользователь согласен на  это;

- апплет может улучшить использование: после первого запуска апплета, когда JVM уже выполняется и быстро  запускается, преимущественно у  постоянных пользователей Java, однако JVM придется перезапускать каждый  раз, когда запускается новый  браузер.

- он может запуститься с сопоставимой (но обычно медленнее) скоростью  на других компилируемых языках, таких как C++, но во много раз  быстрее, чем JavaScript

- он может перенести работу  с сервера к клиенту, делая  Интернет-решение с, большим числом  пользователей / клиентов.

Java-апплет  обладает следующими недостатками:

- он требует установки Java-расширения (plug-in), которое не во всех браузерах  доступно по умолчанию;

- он не может запуститься  до тех пор, пока не запустится  виртуальная Java-машина, и это может  занять значительное время при  первом запуске;

- создание и дизайн хорошего  пользовательского интерфейса с  использованием апплетов считается  более сложной задачей, чем с  помощью технологии, основанной  на HTML;

- некоторые организации допускают  только программное обеспечение, установленное администраторами. В  результате многие пользователи  не могут видеть апплеты по  умолчанию.

- апплеты могут потребовать  использования определенного JRE.

Однако, доступны свободно распространяемые реализации, такие как GCJ-plugin, Blackdown Java-plugin.

Вопросы совместимости

Компания Sun предприняла значительные усилия для обеспечения совместимости между Java-версиями по мере их появления. Например, Microsoft Internet Explorer, самый популярный браузер с конца 1990х, имел обыкновение загружать собственную JVM для Microsoft по умолчанию. MS JVM имеет ряд дополнительных функций, не входящих в Java, которые, будучи использованы, будут препятствовать выполнению MS JVM-апплетам в среде Sun’s Java (но не наоборот). Sun предъявила Microsoft иск за нарушение прав на товарный знак, так как суть Java заключается в том, что не должно быть никакого собственного расширения и что код должен работать везде. Развитие MS JVM было заморожено до правового урегулирования, оставив многих пользователей с чрезвычайно устаревшими виртуальными Java-машинами. Позже, в октябре 2001 года, MS остановил включение Java в Windows, и в течение ряда лет было оставлено на усмотрение производителей компьютеров устанавливать Java или нет, независимо от операционной системы. Большинство новых машин сейчас поставляется с официальной Sun Java.

Некоторые браузеры (в частности, Netscape) не очень хорошо обеспечивают 100%-ую совместимость, что затрудняет выполнение апплета большинством браузеров (JavaScript может с трудом использоваться для этой цели). Поскольку апплет создает свое собственное главное окно, это не является хорошим решением, так как это оставляет окно браузера в значительной степени бесполезным и приводит к тому, что увеличивается шанс непреднамеренного закрытия апплета пользователем путем закрытия исходного окна браузера.

Альтернативы

Существуют альтернативные технологии (например, DHTML, Microsoft Silverlight и Adobe Flash), которые реализуют некоторые возможности апплетов.

Ещё одной альтернативой апплетов для клиента Java является Java Web Start, который запускается вне браузера. В дополнение к функциям, доступным в апплете, простой доступ к полям предоставляет программам Java Web Start доступ по чтению и-или записи определенных файлов, хранящихся у клиента, а также к буферу обмена клиента.

 

Глава 2.  Разработка программы

2.1. Программирование сокетов

Сокетное соединение с сервером создается клиентом с помощью объекта класса Socket. При этом указывается IP-адрес сервера и номер порта. Если указано символьное имя домена, то Java преобразует его с помощью DNS-сервера к IP-адресу. Например, если сервер установлен на этом же компьютере, соединение с сервером можно установить из приложения клиента с помощью инструкции:

Socket socket = new Socket("ИМЯ_СЕРВЕРА", 3128);

Сервер ожидает сообщения клиента и должен быть заранее запущен с указанием определенного порта. Объект класса ServerSocket создается с указанием конструктору номера порта и ожидает сообщения клиента с помощью метода accept()класса ServerSocket, который возвращает сокет клиента:

ServerSocket server = new ServerSocket(3128);

Socket socket = server.accept();

Таким образом, для установки необходимо установить IP-адрес и номер порта сервера, IP-адрес и номер порта клиента. Обычно порт клиента и сервера устанавливаются одинаковыми. Клиент и сервер после установления сокетного соединения могут получать данные из потока ввода и записывать данные в поток вывода с помощью методов getInputStrеam() и getOutputStrеam() или к PrintStream для того, чтобы программа могла трактовать поток как выходные файлы.

Класс ServerSocket немного отличается от класса Socket. Класс Socket – это и есть сокет. Главное отличие ServerSocket заключается в том, что он умеет заставлять программу ждать подключений от клиентов. Когда вы его создаете, нужно указывать порт, с которым он будет работать, и вызвать его метод accept(). Этот метод заставляет программу ждать подключений по указанному порту. Исполнение программы зависает в этом месте, пока клиент не подключится. После успешного подключения клиентом, создается нормальный Socket объект, который вы можете использовать для выполнения все существующий операций с сокетом. Заметим также, что этот Socket объект отображает другой конец соединения. Если вы хотите отослать данные клиенту, то вы не можете использовать для этого ваш собственный сокет.

Следующим рассмотрим Socket класс. Вы можете создать Socket объект, указав IP-адрес и порт. Вы можете использовать InetAddress класс для отображения IP-адреса (этот способ более предпочтительный). Для создания InetAddress объекта используйте следующий метод:

InetAddress ipAddress = InetAddress.getByName(address);

После того как мы создали InetAddress, то можно создать Socket:

Socket socket = new Socket(ipAddress, serverPort);

После создания Socket объекта, можно взять входной и выходной потоки сокета. Входной поток позволит вам читать с сокета, а выходной поток дает возможность писать в сокет.

InputStream sin = socket.getInputStream(); 
OutputStream sout = socket.getOutputStream();

Следующие строки просто конвертируют потоки в другие типы потоков. После этого нам легче будет работать с String объектами. Этот код ничего не делает с сетью.

Информация о работе Реализация игры pong на языке Java с помощью технологии Socket