Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
66
Добавлен:
18.12.2017
Размер:
14.5 Кб
Скачать
package Lab8;

import Lab7.Game;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class BirdsDialog extends JFrame {
private JPanel contentPane;
private JButton buttonOK;
private JButton buttonCancel;
private JPanel game_panel;
private JTextField textFieldAngle;
private JTextField textFieldSpeed;
private JLabel label_status;
public JCheckBox serverCheckBox;
private JTextField ipTextField;
private JButton launchButton;
private JLabel lab;

private boolean isServer = false;
private boolean serverIsRunning = false;

private Thread serverThread;
private Thread clientThread;
private ServerSocket server;
private Socket client;
private Socket socket;

//private BufferedReader reader;
private BufferedWriter writer;


private boolean myIsReady = false;
private int mySpeed, myAngle;

private boolean otherIsReady = false;
private int otherSpeed, otherAngle;

private JLabel l1, l2;
private Game b1, b2;

private int W, H, w;

public BirdsDialog() {
setContentPane(contentPane);
getRootPane().setDefaultButton(buttonOK);
pack();
setTitle("Клиент");
launchButton.setText("Подключиться");
game_panel.setLayout(null);

H = game_panel.getHeight();
W = game_panel.getWidth();
w = 60;

try {

BufferedImage img = null;
img = ImageIO.read(new File("bird.png"));
Image im = img.getScaledInstance(w, w, Image.SCALE_SMOOTH);
l1 = new JLabel(new ImageIcon(im));
l1.setSize(w,w); l1.setLocation(0,H-w);
game_panel.add(l1);

img = ImageIO.read(new File("bird2.png"));
im = img.getScaledInstance(w, w, Image.SCALE_SMOOTH);
l2 = new JLabel(new ImageIcon(im));
l2.setSize(w,w); l2.setLocation(w,H-w);
game_panel.add(l2);


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

JLabel lfin = new JLabel("-------------");
lfin.setSize(w,20);
lfin.setLocation(W-w, H-20);
game_panel.add(lfin);

serverCheckBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
isServer = true;
setTitle("Сервер");
ipTextField.setText("127.0.0.1");
ipTextField.setEditable(false);
launchButton.setText("Запустить");

} else {
isServer = false;
setTitle("Клиент");
ipTextField.setText("127.0.0.1");
ipTextField.setEditable(true);
launchButton.setText("Подключиться");

};
}
});
launchButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (isServer) {
if (launchButton.getText().contentEquals("Остановить") || launchButton.getText().contentEquals("Отключиться") ){
try {
label_status.setText("Соперник: не готов");
if (isServer) {
launchButton.setText("Запустить");
} else {
launchButton.setText("Подключится");
}
serverIsRunning = false;
if (serverThread!= null) serverThread.interrupt();
if (clientThread!= null) clientThread.interrupt();
client = null; socket = null;

if (server != null) server.close();
server = null;
}catch (IOException ex) {}
return;
}
serverThread = new Thread(new Runnable() {
public void run() {
try {
server = new ServerSocket(1234);
serverIsRunning = true;
System.out.println("Сервер запущен.");
launchButton.setText("Остановить");
while (serverIsRunning) {
System.out.println("Ожидание подключения...");
client = server.accept();
writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
String msg = reader.readLine();
while (msg != null) {
System.out.println("Сервер получил сообщение: " + msg);
if (msg.contentEquals("connected")) {
label_status.setText("Соперник: подключен");
} else if (msg.startsWith("speed=")) {
String s = msg.substring("speed=".length());
otherSpeed = Integer.parseInt(s);
} else if (msg.startsWith("angle=")) {
String s = msg.substring("angle=".length());
otherAngle = Integer.parseInt(s);
} else if (msg.contentEquals("ready")) {
label_status.setText("Соперник: готов");
otherIsReady = true;
start(false);
}
msg = reader.readLine();
}
}
}
catch (IOException ex) { System.out.println("Ошибка: " + ex); }
}
});
serverThread.start();
}else{
launchButton.setText("Отключиться");
clientThread = new Thread(new Runnable() {
public void run() {
try {
String ip = ipTextField.getText();
socket = new Socket(ip, 1234);
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("connected");
writer.newLine();
writer.flush();
label_status.setText("Соперник: подключен");
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg = reader.readLine();
while (msg != null) {
System.out.println("Клиент получил сообщение: " + msg);
if (msg.startsWith("speed=")) {
String s = msg.substring("speed=".length());
otherSpeed = Integer.parseInt(s);
} else if (msg.startsWith("angle=")) {
String s = msg.substring("angle=".length());
otherAngle = Integer.parseInt(s);
} else if (msg.contentEquals("ready")) {
label_status.setText("Соперник: готов");
otherIsReady = true;
start(false);
}
msg = reader.readLine();
}
} catch (IOException ex) {
System.out.println("Ошибка: " + ex);
}
}
});
clientThread.start();
}
}
});


buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onOK();
}
});

buttonCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onCancel();
}
});

// call onCancel() when cross is clicked
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
onCancel();
}
});

// call onCancel() on ESCAPE
contentPane.registerKeyboardAction(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onCancel();
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
}

public void setIconToLabel(JLabel l, boolean isDead){
BufferedImage img = null;
try {
int w = 60;
if (l == l1) { // Первая птица
if (isDead) {
img = ImageIO.read(new File("deadbird.png"));
} else {
img = ImageIO.read(new File("bird.png"));
}
}else { // Вторая
if (isDead) {
img = ImageIO.read(new File("deadbird2.png"));
} else {
img = ImageIO.read(new File("bird2.png"));
}
}
Image im = img.getScaledInstance(w, w, Image.SCALE_SMOOTH);
l.setIcon(new ImageIcon(im));
}catch (IOException ex) {
ex.printStackTrace();
}
}
public void stopFlight(JLabel winner) {
if (winner == l1) {
lab.setText("Красная птица упала");
setIconToLabel(l1, true);
} else if(winner == l2) {
lab.setText("Зелёная птица упала");
setIconToLabel(l2, true);
}
if (W-3*w/2 <=winner.getLocation().x && winner.getLocation().x <= W - w/2) {
if (winner == l1) {
lab.setText("Красная птица выйграла");
game_panel.setBackground(new Color(239, 194, 183));
}else {
lab.setText("Зелёная птица выйграла");
game_panel.setBackground(new Color(189, 255, 168));
}
}else {
winner = null;
}
if (winner != null) {
if (b1 != null) b1.interrupt();
if (b2 != null) b2.interrupt();
}


}

void start(boolean shouldSend){
lab.setText("Полетели...");
game_panel.setBackground(new Color(215,240,240));
setIconToLabel(l1, false);
setIconToLabel(l2, false);

if(myIsReady) {
if (b1 != null) b1.interrupt();
b1 = new Game(1, mySpeed, myAngle, 0, 0, l1, H);
b1.onFinish = (ev) -> { stopFlight((JLabel)ev.getSource()); };
b1.start();
try {
if (shouldSend) {
if ((client != null && client.isConnected()) || socket != null && socket.isConnected()) {
writer.write("speed=" + mySpeed);
writer.newLine();
writer.write("angle=" + myAngle);
writer.newLine();
writer.write("ready");
writer.newLine();
writer.flush();
}
else {
System.out.println("Отсутсвует соединение");
}
}
} catch (IOException ex) {
}
}
if (otherIsReady) {
if (b2 != null) b2.interrupt();
b2 = new Game(1, otherSpeed, otherAngle, 0, 0, l2, H);
b2.onFinish = (ev) -> { stopFlight((JLabel)ev.getSource()); };
b2.start();
}
}

private void onOK() {
try {
mySpeed = Integer.parseInt(textFieldSpeed.getText());
if (mySpeed < 0 || mySpeed > 200) { throw new java.lang.Exception("Некорректное значение скорости"); }
myAngle = Integer.parseInt(textFieldAngle.getText());
if (myAngle < -90 || myAngle > 90) {throw new java.lang.Exception("Некорректное значение угла"); }
myIsReady = true;
start(true);

} catch (java.lang.Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "Некорректные данные \n"+e.getMessage());
}
}

private void onCancel() {
dispose();
System.exit(0);
}

public static void main(String[] args) {
BirdsDialog d = new BirdsDialog();
d.setVisible(true);

}
}
Соседние файлы в папке Lab8