tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
341
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Ratloser Tutorials.de Gastzugang
    Hi also ich wollte mein geschriebenes TicTacToe nun so erweiter, dass ich es per Netzwerk auf zwei Rechnern spielen kann.

    Eigentlich dachte ich mir ich mache das so:
    Ich habe 2 Clients und schicke jeweils die Information an den Server welches Feld/Knopf gedrückt wurde von den 9, der Server sendet das dann auch an den zweiten Client, ich synchronisiere quasi das Spielfeld immer und muss dann natürlich auch nach jedem Zug überprüfen lassen ob ein Spieler gewonnen hat.

    Ich habe auch schon einen ChatServer für die Konsole programmier gehabt als ich gelernt habe was man alles für die Netzwerkprogrammierung braucht... Aber ich stehe jetzt iwie auf dem Schlauch wie ich das für mein TicTacToe mache..

    Hier ist mein TicTacToe: (funktioniert prima, man kann halt gegen sich selber spielen momentan )
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    
    package ptictactoe;
     
    import java.awt.event.*; // Für den ActionListener.
    // Quelle: http://java.sun.com/docs/books/tutorial/uiswing/events/actionlistener.html
     
    import javax.swing.JOptionPane; // Für das PopUp Fenster, bei einem Sieg oder Remis.
    // Quelle: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JOptionPane.html
     
    import basis.*; // Für die Knöpfe und das Fenster.
     
    public class TicTacToe implements ActionListener {  // Klasse TicTacToe mit implementierten
                                                       // ActionListener, siehe Quelle oben.
     
        // Deklaration
        private Fenster mf;
        private Knopf mk1, mk2, mk3, mk4, mk5, mk6, mk7, mk8, mk9;
        private String spieler;
        private int spielzuege;
        private boolean sieg;
     
        public TicTacToe() { // Konstruktor der Klasse TicTacToe().
     
            // Konstruktion
            mf = new Fenster();
            mf.setzeTitel("SPIELER X IST DRAN ");
            mf.setzeGroesse(300, 300);
            mk1 = new Knopf("", 0, 0, 100, 100);
            mk1.setzeHintergrundFarbe(Farbe.WEISS);
            mk2 = new Knopf("", 100, 0, 100, 100);
            mk2.setzeHintergrundFarbe(Farbe.WEISS);
            mk3 = new Knopf("", 200, 0, 100, 100);
            mk3.setzeHintergrundFarbe(Farbe.WEISS);
            mk4 = new Knopf("", 0, 100, 100, 100);
            mk4.setzeHintergrundFarbe(Farbe.WEISS);
            mk5 = new Knopf("", 100, 100, 100, 100);
            mk5.setzeHintergrundFarbe(Farbe.WEISS);
            mk6 = new Knopf("", 200, 100, 100, 100);
            mk6.setzeHintergrundFarbe(Farbe.WEISS);
            mk7 = new Knopf("", 0, 200, 100, 100);
            mk7.setzeHintergrundFarbe(Farbe.WEISS);
            mk8 = new Knopf("", 100, 200, 100, 100);
            mk8.setzeHintergrundFarbe(Farbe.WEISS);
            mk9 = new Knopf("", 200, 200, 100, 100);
            mk9.setzeHintergrundFarbe(Farbe.WEISS);
            spieler = "X";
            spielzuege = 0;
            sieg = false;
     
            // ActionListener zu den Knöpfen hinzufügen.
            mk1.addActionListener(this);
            mk2.addActionListener(this);
            mk3.addActionListener(this);
            mk4.addActionListener(this);
            mk5.addActionListener(this);
            mk6.addActionListener(this);
            mk7.addActionListener(this);
            mk8.addActionListener(this);
            mk9.addActionListener(this);
        }
     
        private void AktiverSpieler() {
            
            // Für Spieler X, der anfängt.
            if (spielzuege == 1 || spielzuege == 3 || spielzuege == 5
                    || spielzuege == 7 || spielzuege == 9) {
                spieler = "X";
                mf.setzeTitel("SPIELER O IST DRAN ");
            }
            // Für Spieler O, der immer nach Spieler X setzt.
            if (spielzuege == 2 || spielzuege == 4 || spielzuege == 6
                    || spielzuege == 8 || spielzuege == 10) {
                spieler = "O";
                mf.setzeTitel("SPIELER X IST DRAN ");
            }
        }
     
        private void Gewinnmöglichkeiten() {
     
            // horizantal prüfen.
            if (mk1.text() == mk2.text() && mk2.text() == mk3.text()) {
                sieg = true;
            } else if (mk4.text() == mk5.text() && mk5.text() == mk6.text()) {
                sieg = true;
            } else if (mk7.text() == mk8.text() && mk8.text() == mk9.text()) {
                sieg = true;
            }
     
            // vertikal prüfen.
            if (mk1.text() == mk4.text() && mk4.text() == mk7.text()) {
                sieg = true;
            } else if (mk2.text() == mk5.text() && mk5.text() == mk8.text()) {
                sieg = true;
            } else if (mk3.text() == mk6.text() && mk6.text() == mk9.text()) {
                sieg = true;
            }
     
            // diagonal prüfen.
            if (mk1.text() == mk5.text() && mk5.text() == mk9.text()
                    && mk1.text() != "") {
                sieg = true;
            } else if (mk3.text() == mk5.text() && mk5.text() == mk7.text()
                    && mk3.text() != "") {
                sieg = true;
            } else {
                sieg = false;
            }
        }
     
        private void SiegOderRemis() {
            
            // Meldung, wenn ein Spieler gewonnen hat.
            if (sieg == true) {
                JOptionPane.showMessageDialog(null, spieler + " WINS!");
                Hilfe.warte(500);
                mf.gibFrei();
            }
            // Meldung, falls kein Spieler nach 9 Zügen gewonnen hat.
            if (spielzuege == 9 && sieg == false) {
                JOptionPane.showMessageDialog(null, "Remis! Kein Gewinner.");
                Hilfe.warte(500);
                mf.gibFrei();
            }
        }
     
        public void actionPerformed(ActionEvent a) {
            spielzuege++; // Die Variable wird jedes mal um 1 erhöht, wenn die
            // Methode aufgerufen wird.
            
            this.AktiverSpieler(); // Bestimmung, wer am Zug ist.
            
            // Zeichenzuweisung der Knöpfe. Zeichen jenachdem, welcher Spieler am
            // Zug war.
              if (a.getSource() == mk1) {
                mk1.setzeText(spieler);
                mk1.setzeBenutzbar(false);}
              if (a.getSource() == mk2) {
                mk2.setzeText(spieler); 
                mk2.setzeBenutzbar(false);}
              if (a.getSource() == mk3) {
                mk3.setzeText(spieler); 
                mk3.setzeBenutzbar(false);}
              if (a.getSource() == mk4) {
                mk4.setzeText(spieler);
                mk4.setzeBenutzbar(false);}
              if (a.getSource() == mk5) {
                mk5.setzeText(spieler);
                mk5.setzeBenutzbar(false);}
              if (a.getSource() == mk6) {
                mk6.setzeText(spieler);
                mk6.setzeBenutzbar(false);}
              if (a.getSource() == mk7) {
                mk7.setzeText(spieler);
                mk7.setzeBenutzbar(false);}
              if (a.getSource() == mk8) {
                mk8.setzeText(spieler);
                mk8.setzeBenutzbar(false);}
              if (a.getSource() == mk9) {
                mk9.setzeText(spieler);
                mk9.setzeBenutzbar(false);}
     
            this.Gewinnmöglichkeiten(); // Bestimmung der Gewinnmöglichkeiten.
            this.SiegOderRemis();       // Erzeugen eines PopUp Fensters, falls jemand gewonnen hat, oder es
                                       // Unentschieden steht.
        }
    }

    Kann mir evtl einer sagen was an meinem Konzept falsch gedacht ist oder ob ich was bei meinem TicTacToe umschreiben muss? Weil ich nicht so ganz weiß was ich zum Server senden soll...
    Bei nem Chatserver war es ja einfach nur ein String..
    Hoffe mir kann geholfen werden
     

  2. #2
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Sende doch einfach per Object I/O Stream einen Point.
    Schreib Methodennamen aber besser klein.
     

  3. #3
    Ratloser Tutorials.de Gastzugang
    Hm ich versteh das iwie nicht wie das funktionieren soll auf beiden Clients zu aktualisieren welche Buttons jetzt von wem belegt worden sind..
    Nen Objekt schicken gut, aber iwie ist mir das trotzdem noch nicht ganz klar..
    Beim Chatprogramm dacht ich eigtl ich hätte Netzwerkprogrammierung verstanden.. aber wohl doch nich :/
     

  4. #4
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Leg doch für jeden Spieler einen von 4 Status fest. (Wait, Select Field, Die, Terminated.)
    Die letzten beiden brauchst du nur, wenn du sie als Thread realisierst. (Den letzten garnicht, geht auch über das Thread-Object, aber mache es trotzdem gerne. Der Vorletzte regelt das Verlassen der Schleife, brauchst du z. B. um beim beenden alle Threads runterzufahren, damit das Programm beendet.)
    Erstelle einen neuen Thread, der auf reinkommende Daten wartet. Kommen Daten an, werden sie Vertifiziert (p.x und p.y müssen beide kleiner oder gleich 2 sein), und wenn der Spieler-Status auf Wait steht, wird das jeweilige Kästchen als belegt markiert, getestet ob verlohren wurde, und der Spieler auf "Select Field" gesetzt. Danach folgt natürlich die Feldauswahl, wurde die Wahl getroffen, wird ein Point-Instance mit den Feldkoordinaten generiert und über den ObjectOutputStream am anderen Spieler gesendet. (Das andere Programm setzt nun (mehr oder weniger) paralell bei " Kommen Daten an..." ein.) Dann wird getestet ob gewonnen wurde, und falls nicht, wird der Spieler auf Wait gesetzt, wärend der andere mit "Select Field" am Zug ist.
     

  5. #5
    Ratloser Tutorials.de Gastzugang
    Also jetzt mal konkrete Fragen..

    Mein Konzept:
    Client soll lediglich eine Nachricht senden, wenn ein ein Knopf gedrückt wurde.
    Z.B oben links wird gedrückt.... send("ol")...
    Ebenfalls soll der Client auf Nachrichten warten und danach auch handeln...
    falls er "1" zugeschickt bekommt wird der Btn oben links auf nicht benutzbar gesetzt.
    Falls der Server X,O, oder R sendet wurde ein Sieg oder ein Remis festgestellt vom Server und die Anwendung zeigt dies an.

    Der Server soll alles verwalten, Gewinnabfragen, welcher Client dran ist und welcher Btn von welchem Spieler belegt wurde.

    Mein Problem ist jetzt wie mache ich den Client klar, dass er 1x setzen darf und dann 1x warten muss?

    Hier ist mein Code den ich bis jetzt habe:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    
    package ptictactoe;
     
    import java.awt.event.*;
    import java.io.*;
    import java.net.Socket;
    import javax.swing.JOptionPane;
    import basis.*;
     
    public class TicTacToe implements ActionListener, Runnable {
     
        private Fenster mf;
     
        private Knopf mk1, mk2, mk3, mk4, mk5, mk6, mk7, mk8, mk9;
     
        private String spieler;
     
        private Socket socket;
     
        private DataInputStream din;
     
        private DataOutputStream dout;
     
        public TicTacToe(String host, int port) {
     
            try {
                socket = new Socket(host, port);
                din = new DataInputStream(socket.getInputStream());
                dout = new DataOutputStream(socket.getOutputStream());
            } catch (IOException ie) {
            }
     
            mf = new Fenster();
            mf.setzeTitel("TicTacToe");
            mf.setzeGroesse(300, 300);
            mk1 = new Knopf("", 0, 0, 100, 100);
            mk1.setzeHintergrundFarbe(Farbe.WEISS);
            mk2 = new Knopf("", 100, 0, 100, 100);
            mk2.setzeHintergrundFarbe(Farbe.WEISS);
            mk3 = new Knopf("", 200, 0, 100, 100);
            mk3.setzeHintergrundFarbe(Farbe.WEISS);
            mk4 = new Knopf("", 0, 100, 100, 100);
            mk4.setzeHintergrundFarbe(Farbe.WEISS);
            mk5 = new Knopf("", 100, 100, 100, 100);
            mk5.setzeHintergrundFarbe(Farbe.WEISS);
            mk6 = new Knopf("", 200, 100, 100, 100);
            mk6.setzeHintergrundFarbe(Farbe.WEISS);
            mk7 = new Knopf("", 0, 200, 100, 100);
            mk7.setzeHintergrundFarbe(Farbe.WEISS);
            mk8 = new Knopf("", 100, 200, 100, 100);
            mk8.setzeHintergrundFarbe(Farbe.WEISS);
            mk9 = new Knopf("", 200, 200, 100, 100);
            mk9.setzeHintergrundFarbe(Farbe.WEISS);
     
            mk1.addActionListener(this);
            mk2.addActionListener(this);
            mk3.addActionListener(this);
            mk4.addActionListener(this);
            mk5.addActionListener(this);
            mk6.addActionListener(this);
            mk7.addActionListener(this);
            mk8.addActionListener(this);
            mk9.addActionListener(this);
        }
     
        private void send(String output) {
            try {
                dout.writeUTF(output);
            } catch (IOException e) {
            }
        }
     
        public void run() {
            try {
                while (true) {
                    String input = din.readUTF();
                    if (input.equals("1")) {
                        mk1.setzeBenutzbar(false);
                    }
                    if (input.equals("2")) {
                        mk1.setzeBenutzbar(false);
                    }
                    if (input.equals("3")) {
                        mk1.setzeBenutzbar(false);
                    }
                    if (input.equals("4")) {
                        mk1.setzeBenutzbar(false);
                    }
                    if (input.equals("5")) {
                        mk1.setzeBenutzbar(false);
                    }
                    if (input.equals("6")) {
                        mk1.setzeBenutzbar(false);
                    }
                    if (input.equals("7")) {
                        mk1.setzeBenutzbar(false);
                    }
                    if (input.equals("8")) {
                        mk1.setzeBenutzbar(false);
                    }
                    if (input.equals("9")) {
                        mk1.setzeBenutzbar(false);
                    }
                    if(input.equals("X")){
                        JOptionPane.showMessageDialog(null, "Spieler X gewinnt.");
                        Hilfe.warte(500);
                        mf.gibFrei();
                    }
                    if(input.equals("O")){
                        JOptionPane.showMessageDialog(null, "Spieler O gewinnt.");
                        Hilfe.warte(500);
                        mf.gibFrei();
                    }
                    if(input.equals("R")){
                        JOptionPane.showMessageDialog(null, "Remis! Kein Gewinner.");
                        Hilfe.warte(500);
                        mf.gibFrei();
                    }
                }
            } catch (IOException ie) {
            }
        }
     
        public void actionPerformed(ActionEvent btn) {
            if (btn.getSource() == mk1) {
                send("ol");
            }
            if (btn.getSource() == mk2) {
                send("om");
            }
            if (btn.getSource() == mk3) {
                send("or");
            }
            if (btn.getSource() == mk4) {
                send("ml");
            }
            if (btn.getSource() == mk5) {
                send("mm");
            }
            if (btn.getSource() == mk6) {
                send("mr");
            }
            if (btn.getSource() == mk7) {
                send("ul");
            }
            if (btn.getSource() == mk8) {
                send("um");
            }
            if (btn.getSource() == mk9) {
                send("ur");
            }
        }
     
    }
     

  6. #6
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Du kannst irgendetwas senden. Strings sind serializable, also könntest du einfach "Turndata;1;1" per OI/OS senden (alternative wäre PrintWriter), der Client zerlegt es per Pattern.compile(";").split(string, 0);, und reagiert auf den Befehl "Turndata" (Rundendaten) mit 1 Zug und 1 Warten (Wobei warten egal ist, sobald der Gegenüber fertig ist kommen eh die neuen Rundendaten rein, und damit ist klar dass es jetzt wieder weitergeht.)
    Ich schreibe mir meistens für sowas eine eigene Klasse:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    public class Command implements Serializable, CommandConstante
    {
        private String command;
        private List<String> parameterList;
     
        public Command(String command)
        {
            super();
            this.command = command;
            this.parameterList = new ArrayList<String>();
        }
        public void addParameter(String parameter)
        {
            parameterList.add(parameter);
        }
        public String getCommand()
        {
            return(command);
        }
        public String getParameter(int i)
        {
            return(parameterList.get(i));
        }
    }

    Das Versenden erfolgt dann so:

    Code java:
    1
    2
    3
    4
    
    Command command = new Command("Login");
    command.addParameter(loginname);
    command.addParameter(md5Password);
    send(command);

    Der Server empfängt es, prüft den Befehl-String (z. B. um einen Gamejoin anzufragen muss man authentifiziert sein), ruft je nach dem eine statische Methode auf (dafür eventuell zusätzlicher String, um die Commands zu gruppieren), die dann die gewünschten Änderungen durchzieht. Das Interface CommandConstante wird mit statischen Methoden vollgestopft, die den Zugriff auf die Parameter etwas klarer machen.
     

  7. #7
    FrankBooth FrankBooth ist offline Mitglied Gold
    Registriert seit
    Sep 2008
    Ort
    Osnabrück (Niedersachsen)
    Beiträge
    243
    Hallo,

    arbeitet doch zusammen

    http://www.tutorials.de/forum/java-g...rkspieles.html

    Vielleicht habt ihr ja sogar die gleiche Aufgabenstellung und den gleichen Lehrer.
    Hoffentlich kann der nicht mit google umgehen.
     

  8. #8
    Ratloser Tutorials.de Gastzugang
    Hi also ich habe jetzt ein funktionierendes Spiel endlich codiert bekommen:
    Hab nur noch 2 kleine Probleme:
    1) Wenn der Client dran ist (beim Server umgekehrt), soll oben als Fenstertitel stehen, "Sie sind dran", hab das schon bei manchen Stellen eingefügt, aber das klappt iwie nicht. Wo muss das dann hin?
    2) Die Gewinnabfrage beim Server funktioniert noch nicht so sauber, wenn einer gewonnen hat, wartet er erst bis zum nächsten Zug und zeigt dann an, dass man gewonnen hat.

    Client:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    
    package ttt;
     
    import java.awt.event.MouseListener; // Für den MouseListener
    import java.awt.event.MouseEvent; // Für den MouseListener
    import java.io.DataInputStream; // Zur Datenübertragung
    import java.io.DataOutputStream; // Zur Datenübertragung
    import java.net.Socket; // Zur Datenübertragung
    import javax.swing.JOptionPane; // Für das PopUpFenster bei einem Sieg oder einem Remis
    import basis.*; // Für die Knöpfe und das Fenster
     
    // Mit der Klasse wird der MouseListener implementiert, um das Drücken der Knöpfe zu verwalten
    public class TTTClient implements MouseListener {
     
    //  Deklaration
        private Fenster mf;
     
        private Knopf[] mk;
     
        private DataOutputStream dos;
     
        private DataInputStream dis;
     
        private Socket Client;
     
        private int Index, btncount;
     
        private boolean bTurn, bGame;
     
        // Konstruktor
        public TTTClient() {
     
            mf = new Fenster("TicTacToe, have fun!", 300, 300);
            mk = new Knopf[9];
            mk[0] = new Knopf("", 0, 0, 100, 100);
            mk[1] = new Knopf("", 100, 0, 100, 100);
            mk[2] = new Knopf("", 200, 0, 100, 100);
            mk[3] = new Knopf("", 0, 100, 100, 100);
            mk[4] = new Knopf("", 100, 100, 100, 100);
            mk[5] = new Knopf("", 200, 100, 100, 100);
            mk[6] = new Knopf("", 0, 200, 100, 100);
            mk[7] = new Knopf("", 100, 200, 100, 100);
            mk[8] = new Knopf("", 200, 200, 100, 100);
            bTurn = false;
            bGame = true;
            btncount = 0;
     
            // MouseListener zu den Knöpfen hinzufügen.
            for (int i = 0; i < 9; i++) {
                mk[i].addMouseListener(this);
                mk[i].setzeHintergrundFarbe(Farbe.WEISS);
            }
     
            Verbinden(); // Methode zur Verbindungsherstellung, s.u.
            Spielzuege(); // Methode zur Überwachachung der max. Spielzüge und zur Anzeige, falls einer gewonnen hat.
        }
     
        private void Spielzuege() {
            boolean found = false;
            while (btncount < 9) {
                Empfangen();
                for (int i = 0; i < mk.length; i++) {
                    if (mk[i].text() == "") {
                        found = true;
                        break;
                    }
                }
                if (!found)
                    bGame = false;
     
            }
            JOptionPane.showMessageDialog(null, "Game Over !");
        }
     
        private void Verbinden() {
            try {
                Client = new Socket("localhost", 5000);
                dos = new DataOutputStream(Client.getOutputStream());
                dis = new DataInputStream(Client.getInputStream());
            } catch (Exception e) {
            }
        }
     
        private void Senden() { // Datenübertragung an den Server 
            try {
                dos.writeInt(Index);
                dos.flush();
                Index = -1;
                bTurn = false;
            } catch (Exception e) {
            }
        }
     
        public void Empfangen() { // Verwaltung der Daten die vom Server empfangen werden
            try {
                Index = -1;
                {
                    Index = dis.readInt();
                }
                mk[Index].setzeText("0");
                mk[Index].setzeBenutzbar(false);
                bTurn = true;
                Index = -1;
            } catch (Exception e) {
            }
        }
     
        public void mouseReleased(MouseEvent e) {
            Knopf pressed = (Knopf) e.getSource();
            if ((bTurn == true) && (pressed != null)) {
                for (int k = 0; k < 9; k++) {
                    if (mk[k].equals(pressed) == true) {
                        Index = k;
                        break;
                    }
                }
                Senden();
            } else
                JOptionPane.showMessageDialog(null, "Server ist am Zug");
        }
     
        public void mousePressed(MouseEvent e) {
            Knopf pressed = (Knopf) e.getSource();
            if ((bTurn == true) && (pressed != null)) {
                pressed.setzeText("X");
                pressed.setEnabled(false);
     
            }
        }
        
        public static void main(String[] args) { // Zum Starten der Anwendung
            TTTClient cs = new TTTClient();
        }
     
        public void mouseClicked(MouseEvent arg0) {
        }
        public void mouseEntered(MouseEvent arg0) {
        }
        public void mouseExited(MouseEvent arg0) {
        }
     
    }

    Server:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    
    package ttt;
     
    import java.awt.event.MouseListener; // Für den MouseListener
    import java.awt.event.MouseEvent; // Für den MouseListener
    import java.io.DataInputStream; // Zur Datenübertragung
    import java.io.DataOutputStream; // Zur Datenübertragung
    import java.net.ServerSocket; // Zur Datenübertragung
    import java.net.Socket; // Zur Datenübertragung
    import javax.swing.JOptionPane; // Für das PopUpFenster bei einem Sieg oder einem Remis
    import basis.*; // Für die Knöpfe und das Fenster
     
    //Mit der Klasse wird der MouseListener implementiert, um das Drücken der Knöpfe zu verwalten
    public class TTTServer implements MouseListener {
        
        //Deklaration
        private Fenster mf;
     
        private Knopf mk[];
     
        private DataOutputStream dos;
     
        private DataInputStream dis;
     
        private ServerSocket TTTServer;
     
        private Socket Client;
     
        private int Index, btncount;
     
        private boolean bTurn, bGame;
     
        private boolean bstatus;
     
        // Konstruktor
        public TTTServer() {
     
            mf = new Fenster("TicTacToe, have fun!", 300, 300);
            mk = new Knopf[9];
            mk[0] = new Knopf("", 0, 0, 100, 100);
            mk[1] = new Knopf("", 100, 0, 100, 100);
            mk[2] = new Knopf("", 200, 0, 100, 100);
            mk[3] = new Knopf("", 0, 100, 100, 100);
            mk[4] = new Knopf("", 100, 100, 100, 100);
            mk[5] = new Knopf("", 200, 100, 100, 100);
            mk[6] = new Knopf("", 0, 200, 100, 100);
            mk[7] = new Knopf("", 100, 200, 100, 100);
            mk[8] = new Knopf("", 200, 200, 100, 100);
            bTurn = true;
            bGame = true;
            btncount = 0;
     
            // MouseListener zu den Knöpfen hinzufügen.
            for (int i = 0; i < 9; i++) {
                mk[i].addMouseListener(this);
                mk[i].setzeHintergrundFarbe(Farbe.WEISS);
            }
            
            Verbinden(); // Methode zur Verbindungsherstellung, s.u.
            Spielzuege(); // Methode zur Überwachachung der max. Spielzüge und zur Anzeige, falls einer gewonnen hat.
        }
     
        private void Spielzuege() {
            boolean found = false;
            bstatus = false;
            while ((btncount < 9) && (!bstatus)) {
                bstatus = Empfangen();
                for (int i = 0; i < mk.length; i++) {
                    if (mk[i].text() == "") {
                        found = true;
                        break;
                    }
                }
                if (!found)
                    bGame = false;
            }
            JOptionPane.showMessageDialog(null, "Game Over !");
        }
     
        private void Verbinden() {
            try {
                TTTServer = new ServerSocket(5000);
                mf.setzeTitel("Warte auf Client.");
                {
                    Client = TTTServer.accept();
                }
                mf.setzeTitel("TicTacToe, have fun!");
                dos = new DataOutputStream(Client.getOutputStream());
                dis = new DataInputStream(Client.getInputStream());
            } catch (Exception e) {
            }
        }
     
        private void Senden() { // Datenübertragung an den Server 
            try {
                dos.writeInt(Index);
                dos.flush();
                Index = -1;
                bTurn = false;
                btncount += 2;
                bstatus = Gewinnabfrage();
            } catch (Exception e) {
            }
        }
     
        private boolean Empfangen() { // Verwaltung der Daten die vom Server empfangen werden
            try {
                Index = -1;
                {
                    Index = dis.readInt();
                }
                mk[Index].setzeText("X");
                mk[Index].setzeBenutzbar(false);
                if (Gewinnabfrage())
                    return true;
                bTurn = true;
                Index = -1;
                return false;
            } catch (Exception e) {
                return false;
            }
        }
     
        private boolean Gewinnabfrage() { // Überprüfung, ob einer gewonnen hat.
            for (int i = 0; i < 9; i += 3) {
                if ((mk[i].text() != "") && (mk[i].text().equals(mk[i + 1].text()))
                        && (mk[i].text().equals(mk[i + 2].text())))
                    return true;
            }
            for (int i = 0; i < 3; i++) {
                if ((mk[i].text() != "") && (mk[i].text().equals(mk[i + 3].text()))
                        && (mk[i].text().equals(mk[i + 6].text())))
                    return true;
            }
     
            if ((mk[0].text() != "") && (mk[0].text().equals(mk[4].text()))
                    && (mk[0].text().equals(mk[8].text())))
                return true;
     
            if ((mk[2].text() != "") && (mk[2].text().equals(mk[4].text()))
                    && (mk[2].text().equals(mk[6].text())))
                return true;
            System.out.println("Status-returning true");
            return false;
        }
     
        public void mousePressed(MouseEvent e) {
            Knopf pressed = (Knopf) e.getSource();
            if ((bTurn == true) && (pressed != null)) {
                pressed.setzeText("O");
                pressed.setEnabled(false);
            }
        }
     
        public void mouseReleased(MouseEvent e) {
            Knopf pressed = (Knopf) e.getSource();
            if ((bTurn == true) && (pressed != null)) {
                for (int k = 0; k < 9; k++) {
                    if (mk[k].equals(pressed) == true) {
                        Index = k;
                        break;
                    }
                }
                Senden();
            } else
                JOptionPane.showMessageDialog(null, "Client ist am Zug");
        }
        
        public static void main(String[] args) { // Zum Starten der Anwendung
            TTTServer ss = new TTTServer();
        }
     
        public void mouseClicked(MouseEvent arg0) {
        }
        public void mouseEntered(MouseEvent arg0) {
        }
        public void mouseExited(MouseEvent arg0) {
        }
     
    }
     

Ähnliche Themen

  1. Das Konzept von Plugins
    Von Unicate im Forum Java
    Antworten: 14
    Letzter Beitrag: 22.04.10, 16:54
  2. Konzept ORM im Framework
    Von Pius Hermit im Forum PHP
    Antworten: 4
    Letzter Beitrag: 09.02.10, 14:53
  3. Umsetzungsproblem - siehe Bild - sowas wie Rastereffekt
    Von Jens-Jensen im Forum Vektor-Programme
    Antworten: 3
    Letzter Beitrag: 21.07.06, 15:22
  4. Konzept
    Von webhoster im Forum PHP
    Antworten: 1
    Letzter Beitrag: 10.07.04, 02:59
  5. Konzept W-LAN
    Von blonde im Forum Netzwerke
    Antworten: 0
    Letzter Beitrag: 06.03.04, 14:24