Автор работы: Пользователь скрыл имя, 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
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);
Для начала нам нужно подключить все необходимые библиотеки классов.
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.
} catch (Exception e) {
e.printStackTrace();
}
Подключение порта.
Рис.2.2 Выбор порта
Вводим порт и появляется вот такое окно:
Чтобы второму игроку подключиться ему нужно в меню выбрать пункт «Подключиться к игре».
Рис.2.4 IP-адрес сервера
Вводим IP сервера, жмем на кнопку «OK»? подключается следующее окно:
Вводим порт, жмем «ОК» и наслаждаемся игрой.
В ходе работы были выполнены все поставленные задачи. Выяснили какие средства используются для сетевого программирования в различных языках, таких как C#, Perl и Python. Рассмотрели примеры.
Так же в ходе работы выяснилось, что на языке Java удобно работать с графикой. К примеру по средствам класса Graphics. Еще на Java часто используются Апплеты – прикладные программы. И благодаря платформенной независимости языка, апплеты могут выполняться с помощью плагинов браузерами многих платформ.
Изучена и рассмотрена технология использования сокетов на Java. С помощью всех полученных знаний была создана сетевая игра. В ходе тестирования были обнаружены небольшие недоработки, после чего все было исправлено и налажено.
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("
serverPort = Integer.parseInt(JOptionPane.s
}
private void createFrame() {
setMinimumSize(gameDim);
setMaximumSize(gameDim);
setPreferredSize(gameDim);
frame = new JFrame("Клиент");
frame.
frame.setLayout(new BorderLayout());
frame.add(this, BorderLayout.CENTER);
frame.pack();
frame.setResizable(false);
frame.setLocationRelativeTo(nu
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.
in = new DataInputStream(socket.
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)
}
}
}
}
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.s
} 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.
frame.setLayout(new BorderLayout());
frame.add(this, BorderLayout.CENTER);
frame.pack();
frame.setResizable(false);
frame.setLocationRelativeTo(nu
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.
in = new DataInputStream(socket.
}
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