TicTacToe Problem bei kontrolle

Jak111

Mitglied
Hallo,

Ich habe die Methode "kontrolle" erstellt, welche kontrollieren soll ob X,O Senkrecht, Waagrecht oder Diagonal gewonnen hat. Aus irgendeinem Grund funktioniert es jedoch nicht. Was mache ich falsch?

Java:
package com.example.jonas.tictactoe;

import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MainActivity extends ActionBarActivity {
    int count = 0;
    Button[][] buttons = new Button[3][3];
    @Override
    protected void onNewIntent(Intent intent) {

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("TicTacToe");
        int z = 1;
        for (int i = 0; i <= 2; i++) {
            for(int j = 0; j <=2; j++){
                String buttonID = "button" + z;
                int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
                buttons[i][j] = (Button) findViewById(resID);
                buttons[i][j].setOnClickListener(listener);
                z++;

            }
    }

    }
    public boolean kontrolle (String sp){       //sp = Spieler (X,O)
        for(int i = 0; i < 3; i++) {
            //Kontrolle der Zeilen
            if (buttons[i][0].getText().equals(sp)&&buttons[i][1].getText().equals(sp)&&buttons[i][2].equals(sp)) {
                return true;
            }
        }

        //Kontrolle der Spalten
        for(int i = 0; i < 3; i++) {
            if (buttons[0][i].getText().equals(sp) && buttons[1][i].getText().equals(sp) && buttons[2][i].equals(sp)) {
                return true;
            }
        }

        //Kontrolle der Diagonalen
        if(buttons[0][0].getText().equals(sp)&&buttons[1][1].getText().equals(sp)&&buttons[2][2].equals(sp)){
            return true;
        }
        if(buttons[2][0].getText().equals(sp)&&buttons[1][1].getText().equals(sp)&&buttons[0][2].equals(sp)){
            return true;
        }

        return false;
    }
    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
{
                Button pressedButton = (Button) findViewById(v.getId());
                if (pressedButton.getText().equals("")) {
                    pressedButton.setClickable(false);
                    String zeichen;
                    if (count % 2 == 0) {
                        pressedButton.setBackgroundColor(Color.RED);
                        zeichen = "X";
                    } else {
                        pressedButton.setBackgroundColor(Color.BLUE);
                        zeichen = "O";
                    }
                    pressedButton.setText(zeichen);
                    count++;

                    if (kontrolle("X")) {             // X hat gewonnen
                        count = 0;
                        System.out.println("X hat gewonnen");
                        for (int i = 0; i < 3; i++) {
                            for (int j = 0; j < 3; j++) {
                                buttons[i][j].setText("");
                            }
                        }
                    } else if (kontrolle("O")) {
                            count = 0;
                        System.out.println("O hat gewonnen");
                        for (int i = 0; i < 3; i++) {
                            for (int j = 0; j < 3; j++) {
                                buttons[i][j].setText("");
                            }
                        }
                    } else if (count == 9) {
                        count = 0;
                        System.out.println("Unentschieden!");
                        for (int i = 0; i < 3; i++) {
                            for (int j = 0; j < 3; j++) {
                                buttons[i][j].setText("");
                                buttons[i][j].setBackgroundColor(Color.WHITE);
                                buttons[i][j].setClickable(true);
                            }
                        }
                }

                }

            }
        }
    };
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
 
Moin,

was genau steht denn jeweils in "button[n][m]" ??
IMHO setzt Du die Werte 'X' und 'O' zwar so: "pressedButton.setText(zeichen)", aber nie in das Array !

Wie @thecain schon schrieb: versuch' es mal mit dem Debugger 🙂

Gruß Klaus
 
Grundsätzlich Falsch ist, dass du soviel in einer Methode machst 🙂
Versuche doch mal deine Methode in kleinere Methoden zu kapseln.

Wenn du zum Beispiel jeweils einen Methode erstellst, die prüft ob ein Spieler in einer Zeile, Spalte oder Diagonal gewonnen hat.

Dadurch könntest du auch deutlich schneller herausfinden wo der Fehler liegt.

Du hast es ja auch schon selbst gemerkt, da du Kommentare benutzt hast, dort wo die Kommentare stehen könntest du den Austausch vornehmen.
 
Wo wir bei grundlegenden Fehlern sind:
In meinen Augen ist es auch falsch, eine Benutzeroberfläche und Business-Daten zu mischen. Deine Benutzeroberfläche sollte nur irgendwas anzeigen, was in den Business-Daten steckt. Aber der Text eines Buttons ist nicht gedacht, Business-Daten zu speichern.

Daher erst einmal die reinen Business-Daten / Klassen definieren und testen (Unit Tests sind da sinnvoll). Dann hast Du ein universelles Tic-Tac-Toe Spiel und Du kannst jederzeit irgendwelche UIs dafür bauen. Sei es reine Consolen-Spiele, Swing, AWT, JavaFX, Webseiten, .... egal.

Also sauber objektorientiert könntest Du erst einmal eine Enumeration erstellen mit Feldwerten: Die sind dann x, o oder leer. Dann kannst Du hin gehen und Dein Spielfeld definieren und da hast Du dann Felder mit solchen Werten. Das Spielfeld kannst Du löschen, Felder setzen u.s.w. Und Du kannst prüfen, ob das Spiel beendet ist, wer gewonnen hat u.s.w.

Und wenn Du dann die Oberfläche baust kann es ganz einfach sein, weil Du mit etwas Glück nur für die Bindings sorgen musst. je nach Technologie geht das dann ganz trivial und schnell. Und du hast auch sofort die Separation of Concerns und nicht alles in einem File oder so.

Aber das nur ganz am Rande und als kleiner Hinweis für die Zukunft.
 
Moin,

was genau steht denn jeweils in "button[n][m]" ??
IMHO setzt Du die Werte 'X' und 'O' zwar so: "pressedButton.setText(zeichen)", aber nie in das Array !

Wie @thecain schon schrieb: versuch' es mal mit dem Debugger 🙂

Gruß Klaus

Ich habe es jetzt mit dem Debugger versucht. Es scheint tatsächlich ein Problem mit der Zuweisung der Werte und dem Array zu liegen, weil die Methode kontrolle("X") oder kontrolle("O") nie true wird. Wie kann ich das Problem beheben ?

Danke für eure Hilfe🙂
 
Moin,

ist zum einen mal die Frage, was zu dem Zeitpunkt wirklich auf allen Feldern von "buttons" steht, sprich: ob eine der Bedingungen überhaupt zutrifft!

Sodann ist mir eben aufgefallen, dass Du beiden Vergleichen
Java:
if (buttons[i][0].getText().equals(sp)&&buttons[i][1].getText().equals(sp)&&buttons[i][2].equals(sp))
nur bei den ersten beiden jeweils wirklich den Text holst!!
Ein "buttons[n][m].equals(sp)" wird wohl nicht funktionieren 😉

Gruß Klaus
 

Zurück
Oben