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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    317,51 Кб
  • Опубликовано:
    2015-04-15
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Министерство обрaзовaния и нaуки Российской Федерации

Федерaльное госудaрственное бюджетное обрaзовaтельное учреждение
высшего профессионального обрaзовaния

«Оренбургский государственный педагогический университет»

Физико-мaтемaтический факультет

Кaфедрa информaтики и методики преподaвaния информaтики






Курсовая рaботa

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

Мищенко Сергей Геннадьевич

Форма обучения: дневная

Мищенко Сергей Геннадьевич

Научный руководитель:

Ст. преподaвaтель Гaрмaш М.И.





Оренбург 2013

Введение


Использование локального программирования на Java широко распространено. На основе технологий Java работают приставки, принтеры, веб-камеры, игры, навигационные системы для автомобилей, терминалы для проведения лотерей, медицинские устройства, автоматы для оплаты парковки и многое другое. Но со временем локальное программирование все чаще вытесняется сетевым программированием. Это на данный момент очень актуально, и я решил показать это на примере реализации сетевой игры пинг-понг.

Цель работы:

Написать игру пинг-понг на языке Java с используя технологию сокетов.

Для достижения этой цели были поставлены следующие задачи:

. Рассмотреть сетевые возможности разных языков программирования;

. Изучить работу с графикой на Java;

. Рассмотреть возможности использования Java-апплетов;

. Продемонстрировать работу с сокетами;

. Реализовать программу.

Глава 1. Сетевые возможности разных языков программирования

 

.1 Сетевое программирование в C#


Среда .NET предоставляет два пространства имен: System.Net и System.Net.Sockets для работы с сетью. Эти пространства имен содержат классы и методы, которые позволяют легко создавать программы, которые могут взаимодействовать через сеть.

Взаимодействие может осуществляться как с постоянным подключением по сети, так и без него. Также можно работать как с потокоориентированными данными так и с датаграммами. Наиболее распростанены протоколы TCP (использует потокоориентированное подключение) и UDP (приложения, ориентированные на датаграммы).

Класс System.Net.Sockets.Socket - это основной класс из пространства имен System.Net.Sockets. Экземпляр класса Socket имеет локальную и удаленную точку подключения, через которые он работает. Локальная точка подключения содержит информацию о подключении текущего состояния сокета.

Также существует несколько вспомогательных классов, таких как IPEndPoint, IPAdress, SocketException и др., которые используют при создании сетевых программ. Среда .NET поддерживает синхронное и асинхронное подключения между клиентом и сервером. Для этих двух типов взаимодействия по сети используются различные методы.

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

Пространство имен System.Net предоставляет класс Dns, с помощью которого можно создавать и посылать запросы для получения информации о хосте сервера через Службу Доменных Имен Интернета (Internet Domain Name Service)класс

Этот класс является контейнером для информации о адресах хостов Интернета. Он не содержит гарантий потокобезопасности. Ниже описаны наиболее интересные члены этого класса.класс

Этот класс реализует абстрактных класс EndPoint. IPEndPoint класс представляет собой сетевую точку как IP адрес и номер порта.

 

.2 Сетевое программирование в Python


Большинство необходимых вам функций обеспечивается тремя модулями: HTTPLIB, URLLIB и новым дополнением, XMLRPCLIB. В истинно Питоновском стиле каждый модуль надстроен над своим предшественником, обеспечивая таким образом прочную, хорошо спроектированную базу для ваших приложений.представляет собой простую обертку вокруг модуля socket. Из трех упомянутых библиотек, HTTPLIB обеспечивает наибольший контроль при обращении к web-сайту. Это дается за счет увеличения объема работы, необходимого для выполнения задачи. Протокол http не имеет текущего состояния ("stateless") и поэтому ничего не помнит о ваших предыдущих запросах. При соединении с Web-сайтом для каждого запроса нужно построить новый объект HTTPLIB. Эти запросы образуют диалог с Web-сервером, подражая Web-браузеру.

Диалог начинается с построения серии предложений, определяющих сначала, какое действие вы хотите предпринять, а затем идентифицирующее вас для Web-сервера:

import httplib= 'www.oreillynet.com'= httplib.HTTP(host).putrequest('GET', '/meerkat/?_fl=minimal').putheader('Host', host).putheader('User-agent', 'python-httplib').endheaders()

Запрос GET сообщает серверу, какую страницу вы хотите получить. Заголовок Host сообщает ему имя запрашиваемого вами домена. Современные сервера, использующие HTTP 1.1, могут иметь несколько доменов по одному и тому же адресу. Если вы не говорите им, какой домен вам нужен, в качестве кода возврата вы получите код переадресации '302'. Заголовок User-agent сообщает серверу, к какому типу клиента вы относитесь, чтобы знать, что он может вам посылать, а что нет. Это вся информация, необходимая для обработки запроса Web-сервером. Далее запрашиваем ответ:

, returnmsg, headers = h.getreply()returncode == 200: #OK= h.getfile()f.read()

В результате этого будет распечатана текущая страница Meerkat в минимальном виде. Заголовок отклика и содержимое возвращаются отдельно друг от друга, что помогает как в определении и устранении проблем, так и в разборе данных. Если хотим увидеть заголовки отклика, нужно использовать print headers.скрывает механику программирования сокетов, и использование им файлового объекта для буферизации позволяет применять привычный подход к манипуляции данными. HTTPLIB оснащен полезной возможностью отладки. Доступ к ней получаем, вызывая метод h.set_debuglevel(1) в любой момент после инициализации объекта (строка h = httplib.HTTP(host) в нашем примере). С уровнем отладки 1, модуль будет дублировать на экран запросы и результаты любых обращений к getreply().обеспечивает изощренный интерфейс к функциональности HTTPLIB. Лучше всего использовать его непосредственно для получения данных, а не для анализа Web-сайта. Здесь представлено то же взаимодействие, что и выше, но с использованием URLLIB:

urllib=urllib.urlopen('#"784985.files/image001.gif">

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

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

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

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

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

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

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

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

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

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

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

В примере задан чисто синий цвет, т.к. значения других составляющих равны нулю. Вот чисто красный цвет:newColor = new Color(255, 0, 0);

А это чисто зеленый цвет:newColor = new Color(0, 255, 0);

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

Светло-синий цвет, который мы использовали для заливки прямоугольника:= new Color(0, 215, 255);

Задать цвет фона можно методом setBackground:.setBackground(Color.white);

Нарисовать треугольник можно методом drawRect класса Graphics:.drawRect(20, 40, 340, 20);

, 40 - это координаты верхнего левого угла прямоугольника;

- длина;20 - высота прямоугольника.

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

aPoint = new Point(50, 190);

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

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

poly = new Polygon(arrayX, arrayY, 8);.drawPolygon(poly);aPoint = new Point(50, 190);(poly.contains(aPoint))

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

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

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

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

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

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

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

- высота шрифта.

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

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

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

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

он требует установки 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. Разработка программы

 

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


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

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

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

server = new ServerSocket(3128);socket = server.accept();

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

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

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

ipAddress = InetAddress.getByName(address);

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

socket = new Socket(ipAddress, serverPort);

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

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

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

in = new DataInputStream(sin);out = new DataOutputStream(sout);

 

.2 Проектирование и реализация


Для начала нам нужно подключить все необходимые библиотеки классов.

java.applet.

Библиотека классов java.applet

Библиотека классов java.applet инкапсулирует поведение аплетов Java. Когда вы будете создавать свои аплеты, вам будет нужен класс Applet, расположенный в этой библиотеке классов. Дополнительно в библиотеке классов java.applet определены интерфейсы для подключения аплетов к содержащим их документам и классы для проигрывания звуковых фрагментов.

java.awt.*;java.awt.event.*;

Для создания пользовательского интерфейса аплеты Java могут и должны использовать библиотеку классов java.awt. AWT - это сокращение от Abstract Window Toolkit (инструментарий для работы с абстрактными окнами).

Классы, входящие в состав библиотеки java.awt, предоставляют возможность создания пользовательского интерфейса способом, не зависящим от платформы, на которой выполняется аплет Java. Вы можете создавать обычные окна и диалоговые панели, кнопки, переключатели, списки, меню, полосы просмотра, однострочные и многострочные поля для ввода текстовой

java.io.InputStream;java.io.OutputStream;

Библиотека классов java.io

В библиотеке классов java.io собраны классы, имеющие отношение к вводу и выводу данных через потоки. Заметим, что с использованием этих классов можно работать не только с потоками байт, но также и с потоками данных других типов, например числами int или текстовыми строками.

java.net.InetAddress;

java.net.Socket; - этот класс реализует клиентские сокеты. Сокет представляет собой конечную точку для связи между двумя машинами.java.net.ServerSocket; - этот класс реализует серверный сокет. Серверный сокет ожидает запросы, приходящие по сети от клиентов и может, при необходимости отправлять ответ.

Библиотека классов java.net

Язык программирования Java разрабатывался в предположении, что им будут пользоваться для создания сетевых приложений. Поэтому было бы странно, если бы в составе среды разработки приложений Java не поставлялась библиотека классов для работы в сети. Библиотека классов java.net предназначена как раз для этого. Она содержит классы, с помощью которых можно работать с универсальными сетевыми адресами URL, передавать данные с использованием сокетов TCP и UDP, выполнять различные операции с адресами IP.

Эта библиотека содержит также классы для выполнения преобразований двоичных данных в текстовый формат, что часто бывает необходимо.

Ниже будут представлены куски кода с кратким описанием выполняемых ими действий в данной программе, а так же некоторые экранные снимки.

.setBounds((screenWidth - buttonWidth) / 2, 20, buttonWidth, buttonHeight);.setBounds((screenWidth - buttonWidth) / 2, 70, buttonWidth, buttonHeight);.setBounds((screenWidth - buttonWidth) / 2, 120, buttonWidth, buttonHeight);

Задает границы и место размещение кнопок.

void addButtons() {= new JButton("Создать игру");= new JButton("Подключиться к игре");= new JButton("Выход");

}

Добавляет кнопки к JFrame и задает название кнопок.

void addActions() {.addActionListener(new ActionListener() {void actionPerformed(ActionEvent e) {();CreateServer();

}

});

Кнопка «Создать игру»..addActionListener(new ActionListener() {void actionPerformed(ActionEvent e) {();ClientPlayer();

}

});.addActionListener(new ActionListener() {void actionPerformed(ActionEvent e) {.exit(0);

}

});

Кнопки «Подключиться к игре» и «Выход» соответственно.

Рис.2.1 Главное меню

class CreateServer extends Canvas implements Runnable, KeyListener

Создание сервера.

void requestInformation() {{= Integer.parseInt(JOptionPane.showInputDialog("Какой порт задействовать? (убедитесь, что он открыт)"));

} catch (Exception e) {.printStackTrace();

}

Подключение порта.

Рис.2.2 Выбор порта

Вводим порт и появляется вот такое окно:

Рис. 2.3 Игрок 1

Чтобы второму игроку подключиться ему нужно в меню выбрать пункт «Подключиться к игре».

Рис.2.4 IP-адрес сервера

Вводим IP сервера, жмем на кнопку «OK»? подключается следующее окно:

Рис.2.5 Порт сервера

Вводим порт, жмем «ОК» и наслаждаемся игрой.

Рис.2.6 Игрок 2

Заключение


В ходе работы были выполнены все поставленные задачи. Выяснили какие средства используются для сетевого программирования в различных языках, таких как C#, Perl и Python. Рассмотрели примеры.

Так же в ходе работы выяснилось, что на языке Java удобно работать с графикой. К примеру по средствам класса Graphics. Еще на Java часто используются Апплеты - прикладные программы. И благодаря платформенной независимости языка, апплеты могут выполняться с помощью плагинов браузерами многих платформ.

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

сокетный сервер графика java

Список используемой литературы


1.      Берд Б. Программирование на Java для чайников,- М.: «Диалектика» <http://ru.wikipedia.org/w/index.php?title=%D0%94%D0%B8%D0%B0%D0%BB%D0%B5%D0%BA%D1%82%D0%B8%D0%BA%D0%B0_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2013. - 384 с.

2.   Блох. Д. Java. Эффективное программирование- М.: Лори, 2002. 224 с.

3.      Лонг Ф, Дхрув М, Сикорд Р.С, Дин Ф. Сазерленд, Свобода Д. Руководство для программиста на Java . - М.: «Вильямс», 2014. - 256 с.

4.      Нейгел К. C# 5.0 и платформа .NET 4.5 для профессионалов - М.: «Диалектика» <http://ru.wikipedia.org/w/index.php?title=%D0%94%D0%B8%D0%B0%D0%BB%D0%B5%D0%BA%D1%82%D0%B8%D0%BA%D0%B0_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2013. - 1440 с.

.        Сузи Р. А. Язык программирования Python. - М.: «Лаборатория знаний», 2006. - 328 с.

6.   Хорстманн К.С, Корнелл Г. Java. Библиотека профессионала, том 1. - М.: «Вильямс», 2013. - 864 с.

7.      Шварц Р. Л., Феникс Т, Фой Б. Д. Изучаем Perl <http://www.books.ru/books/izuchaem-perl-5-e-izdanie-666334/>. М.: «Символ» <http://ru.wikipedia.org/w/index.php?title=%D0%A1%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB-%D0%9F%D0%BB%D1%8E%D1%81_(%D0%B8%D0%B7%D0%B4%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE)&action=edit&redlink=1>, 2009.С. 377.

Приложение 1

java.awt.BorderLayout;java.awt.Canvas;java.awt.Color;java.awt.Dimension;java.awt.Graphics;java.awt.event.KeyEvent;java.awt.event.KeyListener;java.awt.image.BufferStrategy;java.awt.image.BufferedImage;java.io.DataInputStream;java.io.DataOutputStream;java.io.IOException;java.net.Socket;javax.swing.JFrame;javax.swing.JOptionPane;

class ClientPlayer extends Canvas implements Runnable, KeyListener {static final long serialVersionUID = 1L;out;in;serverIP;serverPort;socket;frame;width = 600;height = 400;final Dimension gameDim = new Dimension(width, height);image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);pWidth = 15;pHeight = 45;xPos;yPos;sXPos;int sYPos;moveUp = false;moveDown = false;int serverScore = 0;int clientScore = 0;int bX;int bY;bSize = 8;int ticks = 0;int frames = 0;int FPS = 0;int UPS = 0;double delta;limitFrameRate = false;shouldRender;

void run() {lastTime = System.nanoTime();nsPerTick = 1000000000D / 60D;lastTimer = System.currentTimeMillis();= 0D;(true) {now = System.nanoTime();+= (now - lastTime) / nsPerTick;= now;= false;(delta >= 1) {++;();-= 1;= true;

}(!limitFrameRate && ticks > 0)= true;(shouldRender) {++;();

}(System.currentTimeMillis() - lastTimer >= 1000) {+= 1000;= frames;= ticks;= 0;= 0;

}

}

}void requestInformation() {= JOptionPane.showInputDialog("IP-адрес сервера.");= Integer.parseInt(JOptionPane.showInputDialog("Порт сервера."));

}void createFrame() {(gameDim);(gameDim);(gameDim);= new JFrame("Клиент");.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);.setLayout(new BorderLayout());.add(this, BorderLayout.CENTER);.pack();.setResizable(false);.setLocationRelativeTo(null);.setVisible(true);

= frame.getWidth() - pWidth - 15;= frame.getHeight() / 2 - pHeight;= 15;= frame.getHeight() / 2 - pHeight;(this);();thread = new Thread(this);.start();

}void handShake() {{= new Socket(serverIP, serverPort);= new DataOutputStream(socket.getOutputStream());= new DataInputStream(socket.getInputStream());{.writeUTF("это идёт к подключенному игроку");

} catch (IOException e1) {.printStackTrace();

} catch (IOException e) {.out.println("Соединение разорвано.");

}

}ClientPlayer() {();();();

}void movement() {(moveUp && yPos > 0) {-= 3;

}(moveDown && yPos + pHeight < getHeight()) {+= 3;

}

}void tick() {();{.writeInt(yPos);

} catch (IOException e) {.printStackTrace();

}

}void render() {bs = getBufferStrategy();

(bs == null) {(3);;

}g = bs.getDrawGraphics();.drawImage(image, 0, 0, getWidth(), getHeight(), null);.setColor(Color.WHITE);.fillRect(xPos, yPos, pWidth, pHeight);.fillRect(sXPos, sYPos, pWidth, pHeight);.fillOval(bX, bY, bSize, bSize);.drawString("P1 Score: " + serverScore, 40, 10);.drawString("P2 Score: " + clientScore, getWidth() - 105, 10);.dispose();.show();

}void keyPressed(KeyEvent e) {(e.getKeyCode() == KeyEvent.VK_W) {= true;

}void keyReleased(KeyEvent e) {(e.getKeyCode() == KeyEvent.VK_W) {= false;

}void keyTyped(KeyEvent e) {

}

}Input implements Runnable {in;Input(DataInputStream in) {.in = in;

}void run() {(true) {{.bX = in.readInt();.bY = in.readInt();.sYPos = in.readInt();.serverScore = in.readInt();.clientScore = in.readInt();

} catch (IOException e) {.out.println("Соединение потеряно.");.exit(0);

}

}

}

}

Приложение 2

java.awt.BorderLayout;java.awt.Canvas;java.awt.Color;java.awt.Dimension;java.awt.Graphics;java.awt.Rectangle;java.awt.event.KeyEvent;java.awt.event.KeyListener;java.awt.image.BufferStrategy;java.awt.image.BufferedImage;java.io.DataInputStream;java.io.DataOutputStream;java.io.IOException;java.net.ServerSocket;java.net.Socket;javax.swing.JFrame;javax.swing.JOptionPane;class CreateServer extends Canvas implements Runnable, KeyListener {static final long serialVersionUID = 1L;b;out;in;serverSocket;socket;serverPort;frame;width = 600;height = 400;final Dimension gameDim = new Dimension(width, height);image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);pWidth = 15;pHeight = 45;xPos;yPos;cXPos;int cYPos;moveUp = false;moveDown = false;serverRect;clientRect;serverScore = 0;clientScore = 0;int ticks = 0;int frames = 0;int FPS = 0;int UPS = 0;double delta;limitFrameRate = false;shouldRender;void requestInformation() {{= Integer.parseInt(JOptionPane.showInputDialog("Какой порт задействовать? (убедитесь, что он открыт)"));

} catch (Exception e) {.printStackTrace();

}

}void run() {lastTime = System.nanoTime();nsPerTick = 1000000000D / 60D;lastTimer = System.currentTimeMillis();= 0D;(true) {now = System.nanoTime();+= (now - lastTime) / nsPerTick;= now;= false;(delta >= 1) {++;();-= 1;= true;

}(!limitFrameRate && ticks > 0)= true;(shouldRender) {++;();

}(System.currentTimeMillis() - lastTimer >= 1000) {+= 1000;= frames;= ticks;= 0;= 0;

}

}

}void createFrame() {(gameDim);(gameDim);(gameDim);= new JFrame("Сервер");.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);.setLayout(new BorderLayout());.add(this, BorderLayout.CENTER);.pack();.setResizable(false);.setLocationRelativeTo(null);.setVisible(true);= 15;= frame.getHeight() / 2 - pHeight;= frame.getWidth() - pWidth - 15;= frame.getHeight() / 2 - pHeight;= new Rectangle(xPos, yPos, pWidth, pHeight);= new Rectangle(cXPos, cYPos, pWidth, pHeight);= new Ball(this);(this);();thread = new Thread(this);.start();

}void handShake() {{= new ServerSocket(serverPort);= serverSocket.accept();(out == null || in == null) {= new DataOutputStream(socket.getOutputStream());= new DataInputStream(socket.getInputStream());

}cp = new ConnectedPlayer(out, in);userThread = new Thread(cp);.out.println("Пользователь подключен");.start();

} catch (IOException e) {.printStackTrace();

}

}CreateServer() {();();();

}void movement() {(moveUp && yPos > 0) {-= 3;

}(moveDown && yPos + pHeight < getHeight()) {+= 3;

}

}void tick() {();.setBounds(xPos, yPos, pWidth, pHeight);.setBounds(cXPos, cYPos, pWidth, pHeight);.tick();{.writeInt(b.x);.writeInt(b.y);.writeInt(yPos);.writeInt(serverScore);.writeInt(clientScore);

} catch (Exception e) {}

}void render() {bs = getBufferStrategy();(bs == null) {(3);;

}g = bs.getDrawGraphics();.drawImage(image, 0, 0, getWidth(), getHeight(), null);.setColor(Color.WHITE);.fillRect(xPos, yPos, pWidth, pHeight);.fillRect(cXPos, cYPos, pWidth, pHeight);.render(g);.drawString("Счёт игрока 1: " + serverScore, 40, 10);.drawString("Счёт игрока 2: " + clientScore, getWidth() - 105, 10);.dispose();.show();

}void keyPressed(KeyEvent e) {(e.getKeyCode() == KeyEvent.VK_W) {= true;

}(e.getKeyCode() == KeyEvent.VK_S) {= true;

}

}void keyReleased(KeyEvent e) {(e.getKeyCode() == KeyEvent.VK_W) {= false;

}(e.getKeyCode() == KeyEvent.VK_S) {= false;

}

}void keyTyped(KeyEvent e) {

}

}

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!