Реализация игры 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 Кб (Скачать документ)

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

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

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

import java.applet.

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

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

import java.awt.*;

import java.awt.event.*;

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

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

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

import java.io.InputStream;

import java.io.OutputStream;

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

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

import java.net.InetAddress;

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

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

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

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

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

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

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

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

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

private void addButtons() {

Host = new JButton("Создать игру");

Connect = new JButton("Подключиться к игре");

Quit = new JButton("Выход");

}

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

 

 

private void addActions() {

Host.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

dispose();

new CreateServer();

}

});

Кнопка «Создать игру».

Connect.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

dispose();

new ClientPlayer();

}

});

Quit.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

System.exit(0);

}

});

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

               

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

public class CreateServer extends Canvas implements Runnable, KeyListener

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

private void requestInformation() {

try {

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

} catch (Exception e) {

e.printStackTrace();

}

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

   

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

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

                                       Рис.2.3 Игрок 1

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

            

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

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

 

                         

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

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

                                                    Рис.2.6 Игрок 2

 

 

Заключение

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

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

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

 

 

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

  1. Берд Б. Программирование на Java для чайников,— М.: «Диалектика», 2013. — 384 с. 
  2. Блох. Д. Java. Эффективное программирование— М.: Лори, 2002. — 224 с.
  3. Лонг Ф, Дхрув М, Сикорд Р.С, Дин Ф. Сазерленд, Свобода Д. Руководство для программиста на Java . — М.:  «Вильямс», 2014. — 256 с.
  4. Нейгел К.  C# 5.0 и платформа .NET 4.5 для профессионалов  — М.: «Диалектика», 2013. — 1440 с. 
  5. Сузи Р. А. Язык программирования Python. — М.: «Лаборатория знаний», 2006. — 328 с.
  6. Хорстманн К.С, Корнелл Г. Java. Библиотека профессионала, том 1. — М.: «Вильямс», 2013. — 864 с.
  7. Шварц Р. Л., Феникс Т, Фой Б. Д.  Изучаем Perl. — М.:  «Символ», 2009. — С. 377.

 

 

 

 

Приложение 1

import java.awt.BorderLayout;

import java.awt.Canvas;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.awt.image.BufferStrategy;

import java.awt.image.BufferedImage;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.Socket;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

 

public class ClientPlayer extends Canvas implements Runnable, KeyListener {

private static final long serialVersionUID = 1L;

DataOutputStream out;

DataInputStream in;

String serverIP;

int serverPort;

Socket socket;

JFrame frame;

int width = 600;

int height = 400;

public final Dimension gameDim = new Dimension(width, height);

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

int pWidth = 15;

int pHeight = 45;

int xPos;

int yPos;

int sXPos;

static int sYPos;

boolean moveUp = false;

boolean moveDown = false;

static int serverScore = 0;

static int clientScore = 0;

static int bX;

static int bY;

int bSize = 8;

private int ticks = 0;

private int frames = 0;

private int FPS = 0;

private int UPS = 0;

public double delta;

boolean limitFrameRate = false;

boolean shouldRender;

 

public void run() {

long lastTime = System.nanoTime();

double nsPerTick = 1000000000D / 60D;

long lastTimer = System.currentTimeMillis();

delta = 0D;

while (true) {

long now = System.nanoTime();

delta += (now - lastTime) / nsPerTick;

lastTime = now;

shouldRender = false;

while (delta >= 1) {

ticks++;

tick();

delta -= 1;

shouldRender = true;

}

if (!limitFrameRate && ticks > 0)

shouldRender = true;

if (shouldRender) {

frames++;

render();

}

if (System.currentTimeMillis() - lastTimer >= 1000) {

lastTimer += 1000;

FPS = frames;

UPS = ticks;

frames = 0;

ticks = 0;

}

}

}

private void requestInformation() {

serverIP = JOptionPane.showInputDialog("IP-адрес сервера.");

serverPort = Integer.parseInt(JOptionPane.showInputDialog("Порт сервера."));

}

private void createFrame() {

setMinimumSize(gameDim);

setMaximumSize(gameDim);

setPreferredSize(gameDim);

frame = new JFrame("Клиент");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(this, BorderLayout.CENTER);

frame.pack();

frame.setResizable(false);

frame.setLocationRelativeTo(null);

frame.setVisible(true);

 

xPos = frame.getWidth() - pWidth - 15;

yPos = frame.getHeight() / 2 - pHeight;

sXPos = 15;

sYPos = frame.getHeight() / 2 - pHeight;

addKeyListener(this);

requestFocus();

Thread thread = new Thread(this);

thread.start();

}

private void handShake() {

try {

socket = new Socket(serverIP, serverPort);

out = new DataOutputStream(socket.getOutputStream());

in = new DataInputStream(socket.getInputStream());

try {

out.writeUTF("это идёт к подключенному игроку");

} catch (IOException e1) {

e1.printStackTrace();

}

Input serverIn = new Input(in);

Thread inputThread = new Thread(serverIn);

inputThread.start();

} catch (IOException e) {

System.out.println("Соединение разорвано.");

}

}

public ClientPlayer() {

requestInformation();

handShake();

createFrame();

}

private void movement() {

if (moveUp && yPos > 0) {

yPos -= 3;

}

if (moveDown && yPos + pHeight < getHeight()) {

yPos += 3;

}

}

private void tick() {

movement();

try {

out.writeInt(yPos);

} catch (IOException e) {

e.printStackTrace();

}

}

private void render() {

BufferStrategy bs = getBufferStrategy();

 

if (bs == null) {

createBufferStrategy(3);

return;

}

Graphics g = bs.getDrawGraphics();

g.drawImage(image, 0, 0, getWidth(), getHeight(), null);

g.setColor(Color.WHITE);

g.fillRect(xPos, yPos, pWidth, pHeight);

g.fillRect(sXPos, sYPos, pWidth, pHeight);

g.fillOval(bX, bY, bSize, bSize);

g.drawString("P1 Score: " + serverScore, 40, 10);

g.drawString("P2 Score: " + clientScore, getWidth() - 105, 10);

g.dispose();

bs.show();

}

public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_W) {

moveUp = true;

}

public void keyReleased(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_W) {

moveUp = false;

}

public void keyTyped(KeyEvent e) {

}

}

class Input implements Runnable {

DataInputStream in;

public Input(DataInputStream in) {

this.in = in;

}

public void run() {

while (true) {

try {

ClientPlayer.bX = in.readInt();

ClientPlayer.bY = in.readInt();

ClientPlayer.sYPos = in.readInt();

ClientPlayer.serverScore = in.readInt();

ClientPlayer.clientScore = in.readInt();

} catch (IOException e) {

System.out.println("Соединение потеряно.");    System.exit(0);

}

}

}

}

 

Приложение 2

import java.awt.BorderLayout;

import java.awt.Canvas;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.awt.image.BufferStrategy;

import java.awt.image.BufferedImage;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

public class CreateServer extends Canvas implements Runnable, KeyListener {

private static final long serialVersionUID = 1L;

Ball b;

DataOutputStream out;

DataInputStream in;

ServerSocket serverSocket;

Socket socket;

int serverPort;

JFrame frame;

int width = 600;

int height = 400;

public final Dimension gameDim = new Dimension(width, height);

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

int pWidth = 15;

int pHeight = 45;

int xPos;

int yPos;

int cXPos;

static int cYPos;

boolean moveUp = false;

boolean moveDown = false;

Rectangle serverRect;

Rectangle clientRect;

int serverScore = 0;

int clientScore = 0;

private int ticks = 0;

private int frames = 0;

private int FPS = 0;

private int UPS = 0;

public double delta;

boolean limitFrameRate = false;

boolean shouldRender;

private void requestInformation() {

try {

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

} catch (Exception e) {

e.printStackTrace();

}

}

public void run() {

long lastTime = System.nanoTime();

double nsPerTick = 1000000000D / 60D;

long lastTimer = System.currentTimeMillis();

delta = 0D;

while (true) {

long now = System.nanoTime();

delta += (now - lastTime) / nsPerTick;

lastTime = now;

shouldRender = false;

while (delta >= 1) {

ticks++;

tick();

delta -= 1;

shouldRender = true;

}

if (!limitFrameRate && ticks > 0)

shouldRender = true;

if (shouldRender) {

frames++;

render();

}

if (System.currentTimeMillis() - lastTimer >= 1000) {

lastTimer += 1000;

FPS = frames;

UPS = ticks;

frames = 0;

ticks = 0;

}

}

}

private void createFrame() {

setMinimumSize(gameDim);

setMaximumSize(gameDim);

setPreferredSize(gameDim);

frame = new JFrame("Сервер");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.add(this, BorderLayout.CENTER);

frame.pack();

frame.setResizable(false);

frame.setLocationRelativeTo(null);

frame.setVisible(true);

xPos = 15;

yPos = frame.getHeight() / 2 - pHeight;

cXPos = frame.getWidth() - pWidth - 15;

cYPos = frame.getHeight() / 2 - pHeight;

serverRect = new Rectangle(xPos, yPos, pWidth, pHeight);

clientRect = new Rectangle(cXPos, cYPos, pWidth, pHeight);

b = new Ball(this);

addKeyListener(this);

requestFocus();

Thread thread = new Thread(this);

thread.start();

}

private void handShake() {

try {

serverSocket = new ServerSocket(serverPort);

socket = serverSocket.accept();

if (out == null || in == null) {

out = new DataOutputStream(socket.getOutputStream());

in = new DataInputStream(socket.getInputStream());

}

ConnectedPlayer cp = new ConnectedPlayer(out, in);

Thread userThread = new Thread(cp);

System.out.println("Пользователь подключен");

userThread.start();

} catch (IOException e) {

e.printStackTrace();

}

}

public CreateServer() {

requestInformation();

handShake();

createFrame();

}

private void movement() {

if (moveUp && yPos > 0) {

yPos -= 3;

}

if (moveDown && yPos + pHeight < getHeight()) {

yPos += 3;

}

}

private void tick() {

movement();

serverRect.setBounds(xPos, yPos, pWidth, pHeight);

clientRect.setBounds(cXPos, cYPos, pWidth, pHeight);

b.tick();

try {

out.writeInt(b.x);

out.writeInt(b.y);

out.writeInt(yPos);

out.writeInt(serverScore);

out.writeInt(clientScore);

} catch (Exception e) {}

}

private void render() {

BufferStrategy bs = getBufferStrategy();

if (bs == null) {

createBufferStrategy(3);

return;

}

Graphics g = bs.getDrawGraphics();

g.drawImage(image, 0, 0, getWidth(), getHeight(), null);

g.setColor(Color.WHITE);

g.fillRect(xPos, yPos, pWidth, pHeight);

g.fillRect(cXPos, cYPos, pWidth, pHeight);

b.render(g);

g.drawString("Счёт игрока 1: " + serverScore, 40, 10);

g.drawString("Счёт игрока 2: " + clientScore, getWidth() - 105, 10);

g.dispose();

bs.show();

}

public void keyPressed(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_W) {

moveUp = true;

}

if (e.getKeyCode() == KeyEvent.VK_S) {

moveDown = true;

}

}

public void keyReleased(KeyEvent e) {

if (e.getKeyCode() == KeyEvent.VK_W) {

moveUp = false;

}

if (e.getKeyCode() == KeyEvent.VK_S) {

moveDown = false;

}

}

public void keyTyped(KeyEvent e) {

}

}


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