Avatar billede tinaw25 Nybegynder
17. marts 2015 - 22:53 Der er 13 kommentarer og
1 løsning

Problem i battleship opgave

Hejsa

Jeg er i gang med at lave et simpelt battleship spil over netværk, men er stødt lidt ind i en mur hvor jeg ikke helt ved hvordan jeg skal komme videre.

Jeg har en server, som jeg skal kører først. Når jeg kører client programmet placere jeg mine skibe, hvilket også fungere og jeg har en chat funktion hvor man skriver også kan alle clienter se hvilken bruger der skriver og beskeder bliver vist på alle client programmer.

Jeg har så lavet et andet textField med en knap som jeg vil bruge til at skrive mine kordinater ned og trykke på knappen skyd.
Min spørgsmål er så hvordan får textField til at sende kordinater afsted til serveren og sende til clienten som så skal tjekke om man har ramt. Det der er problemet er jo at jeg kan jo skrive hele tiden og det er jo planen at man har en tur pr. mand.

Håber at nogle kan komme med lidt hjælp til at guide mig videre med opgaven.

Mvh,

Tina
Avatar billede arne_v Ekspert
18. marts 2015 - 02:40 #1
Hver client skal have en state som angiver om det er tur eller ej.

Den state saettes til true ved besked fra server.

Naar true saa enables send.

Efter send saettes til false.
Avatar billede arne_v Ekspert
18. marts 2015 - 02:41 #2
Hvis du vil til at bekymre dig om mulighed for snyd, saa skal server checke om client der har sendt er i rigtig state.
Avatar billede tinaw25 Nybegynder
18. marts 2015 - 09:59 #3
Hej Arne

Er det at jeg laver en Boolean variabel eller er states noget der findes når man snakker om socket programmering?

Mvh,

Tina
Avatar billede tinaw25 Nybegynder
18. marts 2015 - 11:13 #4
Jeg så lige at der var noget der hedder state patterne, er det det du tænker på at jeg skal bruge?
Avatar billede arne_v Ekspert
18. marts 2015 - 17:54 #5
En boolean variabel er saamaend nok.

Jeg tror ikke at state pattern er noedvendigt her.
Avatar billede arne_v Ekspert
18. marts 2015 - 17:55 #6
Korrektion: jeg tror ikke at state pattern er noedvendig client side - server side er jeg ikke sikker.
Avatar billede tinaw25 Nybegynder
18. marts 2015 - 18:36 #7
Så det vil sige at jeg sætter en boolean på min client side, som jeg så sender videre til serveren. Og når serveren modtager beskeden sætter den til false på den client som har skrevet beskeden. Men hvordan tjekker jeg hvilken client der skriver er det så på et brugernavn?

Er det så muligt ved siden af at have en anden textbox som så styre en chat hvor man kan blive ved med at skrive?
Avatar billede arne_v Ekspert
18. marts 2015 - 18:46 #8
Nej.

client med tur=true sender move til server of saetter tur=false

server sender "dintur" til den client hvis tur det nu er

den client processer "dintur" og saetter tur=true
Avatar billede tinaw25 Nybegynder
18. marts 2015 - 22:33 #9
Jeg har siddet og prøvet at rode med forslaget du skrev.

Denne her kode er på min ClientThread hvor jeg har connect til server og skal sende beskeden til serveren.

Er det den korrekte måde at jeg sender en boolean med??

    Socket socket;
    Socket socketNew;
    PrintWriter out;
    Scanner in;
    PrintWriter outt;
    Scanner inn;
    Scanner Send = new Scanner(System.in);   
    boolean tur = true;
   
    public ThreadClient(Socket socket)
    {
        this.socket = socket;   
       
    }
    @Override
    public void run()
    {
        try
        {
            try
            {
                out = new PrintWriter(socket.getOutputStream(), true);
                in = new Scanner(socket.getInputStream());
             
                   
                out.flush();
                checkStream();
               
               
            }
            finally
            {
                socket.close();
            }
        }
        catch (Exception e)
        {
            System.out.println(socket);
        }
    }
    private void checkStream()
    {
        while(true)
        {
            recieve();
        }   
    }
    private void recieve()
    {
        if (in.hasNext())
        {
            String message = in.nextLine();       
                   
        }
    }
   
    public void SendShoot(String string) throws IOException
    {
           
              out.println(string);
              out.print(tur);
           
              out.flush();   
           
    }
    public void print(boolean b)
    {
        out.print(b);
    }   

}

Hvordan skal jeg modtage denne boolean værdi på serveren så jeg kan gøre noget med den og sørge for at den ikke bliver sendt videre tilbage til den client igen??

Her er min server kode som modtager fra clienterne :

@Override
    public void run()
    {
   
        try
        {
            try
            {
                String message = null;
               
                //Read message from clients
               
                in = new BufferedReader(new InputStreamReader(request.getInputStream()));
               
                out = new PrintWriter(request.getOutputStream());
               
           
               
                while (true)
                {
                   
                   
                    message =  in.readLine();
               
                    System.out.println(message);
                   
                    for (int i = 1; i <= ThreadServer.clients.size(); i++)
                    {
                        Socket tempSock = (Socket) ThreadServer.clients.get(i-1);
                        PrintWriter tempOut = new PrintWriter(tempSock.getOutputStream()); 
                        tempOut.println(message);
                        tempOut.flush();
                    }
                   
                }       
            }
            finally
            {
                request.close();
            }
           
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
   
}
Avatar billede arne_v Ekspert
19. marts 2015 - 01:07 #10
Hvorfor vil du sende status fra client til server?
Avatar billede arne_v Ekspert
19. marts 2015 - 01:52 #11
Til inspiration:


package gamesim;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {
    private int expected;
    private List<Client> cli = new ArrayList<Client>();
    private int curr;
    public Server(int expected) {
        this.expected = expected;
    }
    public void runGame() {
        try {
            ServerSocket ss = new ServerSocket(12345);
            while(cli.size() < expected) {
                Socket s = ss.accept();
                cli.add(new Client(s));
            }
            curr = 0;
            updateState();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    private void updateState() {
        cli.get(curr).send("Your turn");
    }
    private void next() {
        curr = (curr + 1) % cli.size();
        updateState();
    }
    public static void main(String[] args) {
        Server srv = new Server(2);
        srv.runGame();
    }
    public class Client {
        private PrintWriter pw;
        private BufferedReader br;
        public Client(Socket s) {
            try {
                pw = new PrintWriter(s.getOutputStream());
                br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                (new ReadFromClient()).start();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        public void send(String msg) {
            pw.println(msg);
            pw.flush();
        }
        public class ReadFromClient extends Thread {
            public void run() {
                try {
                    String line;
                    while((line = br.readLine()) != null) {
                        switch(line) {
                            case "Move" : next();
                                          break;
                            default: // ignore
                                    break;
                        }
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }
}



package gamesim;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Client extends JFrame {
    private static final long serialVersionUID = 1L;
    private JButton move;
    private boolean myturn;
    Socket s;
    private PrintWriter pw;
    private BufferedReader br;
    public Client() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Client");
        getContentPane().setLayout(new BorderLayout());
        move = new JButton("Move");
        myturn = false;
        updateState();
        move.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                pw.println("Move");
                pw.flush();
                myturn = false;
                updateState();
            }
        });
        getContentPane().add(move, BorderLayout.CENTER);
        pack();
        try {
            s = new Socket("localhost", 12345);
            pw = new PrintWriter(s.getOutputStream());
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));
            (new ReadFromServer()).start();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    private void updateState() {
        move.setEnabled(myturn);
        move.setBackground(myturn ? Color.GREEN : Color.RED);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new Client();
                f.setVisible(true);
            }
        });
    }
    public class ReadFromServer extends Thread {
        public void run() {
            try {
                String line;
                while((line = br.readLine()) != null) {
                    switch(line) {
                        case "Your turn" : myturn = true;
                                          updateState();
                                          break;
                        default: // ignore
                                break;
                    }
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

Avatar billede arne_v Ekspert
19. marts 2015 - 01:53 #12
Bemaerk ovenstaaende kode er kangtfra komplet. Den illustrerer bare skiftende tur logikken.
Avatar billede tinaw25 Nybegynder
19. marts 2015 - 09:55 #13
takker for hjælpen smid et svar
Avatar billede arne_v Ekspert
19. marts 2015 - 13:47 #14
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester