From e5476a4f36551f11db0dc33e972a906adf0e0b5b Mon Sep 17 00:00:00 2001 From: cirakg Date: Fri, 30 Dec 2022 07:27:32 +0100 Subject: Omoguceno slanje zahteva za igru. Omoguceno accept i refuse zahteva(TODO ISPRAVITI). --- src/main/java/models/ComboBoxUser.java | 6 ++ src/main/java/models/GameStatus.java | 9 +++ src/main/java/pokemon/Game.java | 65 +++++++++++++++++---- src/main/java/pokemon/Server.java | 88 +++++++++++++++++++++++++++- src/main/java/ui/ChooseOpponentPanel.java | 26 +++++++++ src/main/java/ui/MainFrame.java | 54 +++++++++++++++++ src/main/java/ui/OpponentConfirmation.java | 93 ++++++++++++++++++++++++++++++ 7 files changed, 330 insertions(+), 11 deletions(-) create mode 100644 src/main/java/models/GameStatus.java create mode 100644 src/main/java/ui/OpponentConfirmation.java diff --git a/src/main/java/models/ComboBoxUser.java b/src/main/java/models/ComboBoxUser.java index 562f882..91e444d 100644 --- a/src/main/java/models/ComboBoxUser.java +++ b/src/main/java/models/ComboBoxUser.java @@ -2,6 +2,12 @@ package models; public class ComboBoxUser { User user; + public User getUser() { + return user; + } + public void setUser(User user) { + this.user = user; + } @Override public String toString() { return user.getUsername(); diff --git a/src/main/java/models/GameStatus.java b/src/main/java/models/GameStatus.java new file mode 100644 index 0000000..0230b8b --- /dev/null +++ b/src/main/java/models/GameStatus.java @@ -0,0 +1,9 @@ +package models; + +public enum GameStatus { + WAITING_FOR_SECOND_PLAYER, + PLAYING, + FINISHED, + NOT_IN_GAME, + RECEIVING_GAME_REQUEST +} diff --git a/src/main/java/pokemon/Game.java b/src/main/java/pokemon/Game.java index fa08a1b..57af464 100644 --- a/src/main/java/pokemon/Game.java +++ b/src/main/java/pokemon/Game.java @@ -1,24 +1,27 @@ package pokemon; +import java.beans.XMLEncoder; +import java.io.ByteArrayOutputStream; import java.io.Serializable; import java.nio.channels.SocketChannel; import java.util.ArrayList; +import models.GameStatus; import models.MonsterViewModel; public class Game implements Runnable, Serializable { - boolean player1Turn; - long player1Id; - long player2Id; - MonsterViewModel monster1; - MonsterViewModel monster2; - int currentHp1; - int currentHp2; - int shield1; - int shield2; - SocketChannel []players; + public boolean player1Turn; + public long player1Id; + public long player2Id; + public MonsterViewModel monster1; + public MonsterViewModel monster2; + public int currentHp1; + public int currentHp2; + public int shield1; + public int shield2; + GameStatus status; public Game() { super(); @@ -109,5 +112,47 @@ public class Game implements Runnable, Serializable { this.shield2 = shield2; } + public boolean isPlayer1Turn() { + return player1Turn; + } + + public void setPlayer1Turn(boolean player1Turn) { + this.player1Turn = player1Turn; + } + + public GameStatus getStatus() { + return status; + } + + public void setStatus(GameStatus status) { + this.status = status; + } + + @Override + public String toString() + { + XMLEncoder coder = null; + String xmlString = null; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + try + { + coder = new XMLEncoder(baos); + coder.writeObject(this); + + } + catch(Exception e) + { + System.out.println(e); + } + finally + { + coder.close(); + } + + xmlString = new String(baos.toByteArray()); + + return xmlString.replace("\n", " "); + } } diff --git a/src/main/java/pokemon/Server.java b/src/main/java/pokemon/Server.java index 2e51a69..555d040 100644 --- a/src/main/java/pokemon/Server.java +++ b/src/main/java/pokemon/Server.java @@ -15,13 +15,14 @@ import java.util.Iterator; import java.util.Map.Entry; import models.CONSTS; +import models.GameStatus; import models.User; import models.UserListWrapper; public class Server implements Runnable { private ServerSocketChannel serverSocketChannel; private Selector selector; - private ArrayList games; + private ArrayList games=new ArrayList<>(); HashMap players = new HashMap(); ArrayList inGame=new ArrayList(); IService s; @@ -138,6 +139,7 @@ public class Server implements Runnable { else { if(!res.admin) { message="ACCEPTED"+":"+res.id; + System.out.println(message); players.put(sc,res.id); ByteBuffer buff = ByteBuffer.wrap(message.getBytes()); sc.write(buff); @@ -170,6 +172,90 @@ public class Server implements Runnable { sc.write(buff); + }else if(msg[0].equals("SELECTOPPONENT")) { + long opponentId=Long.parseLong(msg[1]); + SocketChannel opponentSocket=null; + for(Entry player : players.entrySet()) { + if(player.getValue()==opponentId) { + opponentSocket=player.getKey(); + break; + } + } + inGame.add(sc); + inGame.add(opponentSocket); + sendAvailablePlayers(); + User player1=s.getUserById(players.get(sc)); + User player2=s.getUserById(opponentId); + System.out.println(player1); + Game game=new Game(); + game.setPlayer1Id(player1.id); + game.setPlayer2Id(player2.id); + game.player1Turn=true; + game.status=GameStatus.WAITING_FOR_SECOND_PLAYER; + game.monster1=s.getMonsterViewModel(player1.monsterId); + game.monster2=s.getMonsterViewModel(player2.monsterId); + game.currentHp1=game.monster1.hp; + game.currentHp2=game.monster2.hp; + game.shield1=0; + game.shield2=0; + games.add(game); + System.out.println(game); + ByteBuffer buff = ByteBuffer.wrap(("GAMEREQUEST:"+player1.id).getBytes()); + opponentSocket.write(buff); + + + } + else if(msg[0].equals("ACCEPTOPPONENT")) { + long opponentId=Long.parseLong(msg[1]); + SocketChannel opponentSocket=null; + for(Entry player : players.entrySet()) { + if(player.getValue()==opponentId) { + opponentSocket=player.getKey(); + break; + } + } + System.out.println(opponentId); + Game game=null; + for(Game tempGame :games) { + if(tempGame.player1Id==opponentId) + game=tempGame; + break; + } + game.status=GameStatus.PLAYING; + ByteBuffer buff = ByteBuffer.wrap(game.toString().getBytes()); + sc.write(buff); + buff = ByteBuffer.wrap(game.toString().getBytes()); + opponentSocket.write(buff); + + + } + else if(msg[0].equals("REFUSEOPPONENT")) { + long opponentId=Long.parseLong(msg[1]); + Game game=null; + for(Game tempGame :games) { + if(tempGame.player1Id==opponentId) + game=tempGame; + break; + } + SocketChannel opponentSocket=null; + for(Entry player : players.entrySet()) { + if(player.getValue()==opponentId) { + opponentSocket=player.getKey(); + break; + } + } + + inGame.remove(sc); + inGame.remove(opponentSocket); + games.remove(game); + sendAvailablePlayers(); + ByteBuffer buff = ByteBuffer.wrap("REFUSEGAME".getBytes()); + sc.write(buff); + ByteBuffer buff1 = ByteBuffer.wrap("REFUSEGAME".getBytes()); + opponentSocket.write(buff1); + + + } diff --git a/src/main/java/ui/ChooseOpponentPanel.java b/src/main/java/ui/ChooseOpponentPanel.java index 196477f..c318aaf 100644 --- a/src/main/java/ui/ChooseOpponentPanel.java +++ b/src/main/java/ui/ChooseOpponentPanel.java @@ -35,12 +35,38 @@ public class ChooseOpponentPanel extends JPanel { setLayout(null); btnSendGameRequest = new JButton("Send Game Request"); + btnSendGameRequest.setBounds(134, 153, 166, 23); add(btnSendGameRequest); comboBox = new JComboBox(); comboBox.setBounds(134, 101, 166, 22); add(comboBox); + + btnSendGameRequest.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(comboBox.getItemCount()==0) + return; + User opponent=((ComboBoxUser)comboBox.getSelectedItem()).getUser(); + String msg="SELECTOPPONENT:"+opponent.id; + ByteBuffer bb=ByteBuffer.wrap(msg.getBytes()); + MainFrame topFrame=(MainFrame) SwingUtilities.getAncestorOfClass(MainFrame.class, ChooseOpponentPanel.this); + try { + SocketChannel client=topFrame.getClient(); + client.write(bb); + topFrame.getContentPane().removeAll(); + topFrame.opponentConfirmation.getBtnAccept().setVisible(false); + topFrame.opponentConfirmation.getBtnRefuse().setVisible(false); + topFrame.opponentConfirmation.setOpponentId(opponent.id); + topFrame.opponentConfirmation.lblNewLabel.setText("Wait for opponent"); + topFrame.getContentPane().add(topFrame.opponentConfirmation,BorderLayout.CENTER); + SwingUtilities.updateComponentTreeUI(topFrame); + } catch (Exception e1) { + e1.printStackTrace(); + } + + } + }); } diff --git a/src/main/java/ui/MainFrame.java b/src/main/java/ui/MainFrame.java index 2aac225..8b3e949 100644 --- a/src/main/java/ui/MainFrame.java +++ b/src/main/java/ui/MainFrame.java @@ -8,8 +8,10 @@ import javax.swing.border.EmptyBorder; import models.CONSTS; import models.ComboBoxUser; +import models.GameStatus; import models.User; import models.UserListWrapper; +import pokemon.Game; import javax.swing.JTextField; import javax.swing.SwingUtilities; @@ -42,14 +44,18 @@ public class MainFrame extends JFrame implements Runnable { public SocketChannel client; public LoginPanel loginPanel=null; public ChooseOpponentPanel chooseOpponentPanel=null; + public OpponentConfirmation opponentConfirmation=null; GamePanel gamePanel=null; public long userId=-1; public boolean run=true; + public GameStatus status; + public Game game; public MainFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 727, 429); loginPanel=new LoginPanel(); chooseOpponentPanel=new ChooseOpponentPanel(); + opponentConfirmation=new OpponentConfirmation(); gamePanel=new GamePanel(); getContentPane().setLayout(new BorderLayout(0, 0)); add(loginPanel,BorderLayout.CENTER); @@ -110,6 +116,20 @@ public class MainFrame extends JFrame implements Runnable { }else if(response[0].trim().equals("BADLOGINADMIN")){ System.out.println("Bad Login"); this.loginPanel.warningTextArea.setText("Admin nema pristup aplikaciji"); + }else if(response[0].trim().equals("GAMEREQUEST")){ + System.out.println("Game Request"); + this.getContentPane().removeAll(); + this.opponentConfirmation.getBtnAccept().setVisible(true); + this.opponentConfirmation.getBtnRefuse().setVisible(true); + this.opponentConfirmation.lblNewLabel.setText("Game Request"+"id:"+response[1].trim()); + this.opponentConfirmation.setOpponentId(Long.parseLong(response[1].trim())); + this.getContentPane().add(this.opponentConfirmation,BorderLayout.CENTER); + SwingUtilities.updateComponentTreeUI(this); + }else if(response[0].trim().equals("REFUSEGAME")){ + System.out.println("REFUSEGAME"); + this.getContentPane().removeAll(); + this.getContentPane().add(this.chooseOpponentPanel,BorderLayout.CENTER); + SwingUtilities.updateComponentTreeUI(this); }else { //XML OBJECTS XMLDecoder decoder = null; @@ -128,6 +148,16 @@ public class MainFrame extends JFrame implements Runnable { } catch (Exception e) { System.out.println("Nije refresh"); } + try { + game=(Game) decoder.readObject(); + decoder.close(); + this.getContentPane().removeAll(); + this.getContentPane().add(this.gamePanel,BorderLayout.CENTER); + SwingUtilities.updateComponentTreeUI(this); + + } catch (Exception e) { + System.out.println("Nije GAME"); + } } @@ -182,5 +212,29 @@ public class MainFrame extends JFrame implements Runnable { public void setUserId(long userId) { this.userId = userId; } + public OpponentConfirmation getOpponentConfirmation() { + return opponentConfirmation; + } + public void setOpponentConfirmation(OpponentConfirmation opponentConfirmation) { + this.opponentConfirmation = opponentConfirmation; + } + public boolean isRun() { + return run; + } + public void setRun(boolean run) { + this.run = run; + } + public GameStatus getStatus() { + return status; + } + public void setStatus(GameStatus status) { + this.status = status; + } + public Game getGame() { + return game; + } + public void setGame(Game game) { + this.game = game; + } } diff --git a/src/main/java/ui/OpponentConfirmation.java b/src/main/java/ui/OpponentConfirmation.java new file mode 100644 index 0000000..d0c2a95 --- /dev/null +++ b/src/main/java/ui/OpponentConfirmation.java @@ -0,0 +1,93 @@ +package ui; + +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +import models.ComboBoxUser; +import models.User; + +import javax.swing.JLabel; +import javax.swing.JButton; +import java.awt.event.ActionListener; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; +import java.awt.BorderLayout; +import java.awt.event.ActionEvent; + +public class OpponentConfirmation extends JPanel { + public JLabel lblNewLabel; + public JButton btnAccept; + public JButton btnRefuse; + public long opponentId; + + public OpponentConfirmation() { + setLayout(null); + + lblNewLabel = new JLabel("New label"); + lblNewLabel.setBounds(95, 66, 208, 98); + add(lblNewLabel); + + btnAccept = new JButton("Accept"); + btnAccept.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String msg="ACCEPTOPPONENT:"+opponentId; + ByteBuffer bb=ByteBuffer.wrap(msg.getBytes()); + MainFrame topFrame=(MainFrame) SwingUtilities.getAncestorOfClass(MainFrame.class, OpponentConfirmation.this); + try { + SocketChannel client=topFrame.getClient(); + client.write(bb); + SwingUtilities.updateComponentTreeUI(topFrame); + } catch (Exception e1) { + e1.printStackTrace(); + } + + + } + }); + btnAccept.setBounds(92, 194, 89, 23); + add(btnAccept); + + btnRefuse = new JButton("Refuse"); + btnRefuse.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String msg="REFUSEOPPONENT:"+opponentId; + ByteBuffer bb=ByteBuffer.wrap(msg.getBytes()); + MainFrame topFrame=(MainFrame) SwingUtilities.getAncestorOfClass(MainFrame.class, OpponentConfirmation.this); + try { + SocketChannel client=topFrame.getClient(); + client.write(bb); + SwingUtilities.updateComponentTreeUI(topFrame); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + }); + btnRefuse.setBounds(214, 194, 89, 23); + add(btnRefuse); + + } + public long getOpponentId() { + return opponentId; + } + public void setOpponentId(long opponentId) { + this.opponentId = opponentId; + } + public JLabel getLblNewLabel() { + return lblNewLabel; + } + public void setLblNewLabel(JLabel lblNewLabel) { + this.lblNewLabel = lblNewLabel; + } + public JButton getBtnAccept() { + return btnAccept; + } + public void setBtnAccept(JButton btnAccept) { + this.btnAccept = btnAccept; + } + public JButton getBtnRefuse() { + return btnRefuse; + } + public void setBtnRefuse(JButton btnRefuse) { + this.btnRefuse = btnRefuse; + } +} -- cgit v1.2.3