Rücksetzen Tic Tac Toe

  • Hallo, ich habe folgendes Problem, ich habe eine Tic Tac Toe App gebastelt, die auch soweit funktioniert. Wenn ich allerdings über den "Nochmal Spielen" Button die playAgain Methode aufrufe, stürtzt meine App ab.
    Das Abstürzen kann ich auf folgenden Befehl zurückführen:


    GridLayout spielfeldLayout = findViewById(R.id.spielfeldLayout);


    Die komplette playAgain Methode:


    //Erneut spielen


    public void playAgain (View view){


    playAgainButton.setVisibility(View.INVISIBLE);
    winnerTextView.setVisibility(View.INVISIBLE);


    GridLayout spielfeldLayout = findViewById(R.id.spielfeldLayout);


    for (int i = 0; i < spielfeldLayout.getChildCount(); i++){


    ImageView counter = (ImageView) spielfeldLayout.getChildAt(i);


    counter.setImageDrawable(null);


    }
    for (int i = 0; i<status.length; i++){
    status[i] = 2;
    }
    spieler = 0;
    spielAktiv = true;
    }


    Zurückgesetzt werden müsste eigentlich nur dieser Integer Array:


    int[] status = {2,2,2,2,2,2,2,2,2};


    Leider funktioniert das mit diesem einfachen Befehl nicht:


    status = {2,2,2,2,2,2,2,2,2};


    Leider bin ich noch Anfänger und weiß daher nicht wie ich mein Spiel sonst zurücksetzen kann und versuche nun hier Hilfe zu finden.Vielen Dank für jede Hilfe!

  • Hallo
    Hier zu GridLayout spielfeldLayout = findViewById(R.id.spielfeldLayout);
    Caste es mal zu einem GridLayout.
    GridLayout spielfeldLayout = ( GridLayout) findViewById(R.id.spielfeldLayout);


    int[] status = {2,2,2,2,2,2,2,2,2}; kannst du nur beim erstellen des Array machen.
    Im Programm geht das nicht.
    Setze die werte mit einer for Schleife.


    for (int i = 0; i<9; i++){
    status [i]= 2;
    }

  • Caste es mal zu einem GridLayout.


    GridLayout spielfeldLayout = ( GridLayout) findViewById(R.id.spielfeldLayout);

    Hallo jogimuc,


    vielen Dank für deine schnelle Hilfe, aber es wird ausgegraut.


    App stürzt nach wie vor ab.


    Ich muss es irgendwie hinbekommen, die ImageViews innerhalb des GridLayouts zu leeren,


    ohne den Befehl:


    GridLayout spielfeldLayout = findViewById(R.id.spielfeldLayout);


    ebenso habe ich schon versucht das GridLayout in der public class zu erstelln, doch dann stürzt die App sofort beim Starten ab, so sah das ganze dann aus:


    GridLayout spielfeldLayout;


    und dann wurde das GridLayout folgendermaßen in der playAgain Methode initialisiert:


    spielfeldLayout = findViewById(R.id.spielfeldLayout);


    wobei der Absturz auf diese Zeile zurückzuführen ist:


    GridLayout spielfeldLayout;


    Das hier steht im Logcat:


    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)

  • wie sieht den das layout aus? Ist R.id.spielfeldLayout auch in dem aktuell geladenen layout vorhanden und vor allen ist das auch ein Gridlayout.


    Ich glaube weniger das es an dem findViewById ligt auch wenn die id nicht gefunden wird stürzt die app nicht ab. Sie gibt dann eben einen nullpointer zurück.
    Und im weiteren Verlauf des Programm wenn du auf die view ( grid layout)zugreifen willst stürz sie ab.


    Wo in der Klasse hast du denn die Definition stehen?
    GridLayout spielfeldLayout;
    Diese Zeile alleine kann nie und nimmer für den Absturz verantwortlich sein.
    Dann eher der weitere Verlauf der app.


    Du sprichst von mehreren Klassen in welcher klasse bist du mit deiner Methode?



    vielen Dank für deine schnelle Hilfe, aber es wird ausgegraut.
    Was meinst du damit?

  • Hi ich noch mal zeige mal dein Gradle File. Hast du überhaupt die supportlib
    com.android.support:gridlayout-v7:27.1.1 mit eingebunden?

    Hallo jogimuc,


    hier mein build.gradle:


    apply plugin: 'com.android.application'


    android {
    compileSdkVersion 28
    defaultConfig {
    applicationId "games.schellej.tictactoe"
    minSdkVersion 26
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    }
    }


    dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0-alpha1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support:gridlayout-v7:28.0.0-alpha1'


    Als letzter Punkt ist die implementation vorhanden.

    wie sieht den das layout aus? Ist R.id.spielfeldLayout auch in dem aktuell geladenen layout vorhanden und vor allen ist das auch ein Gridlayout.

    Hier das GridLayout in der Activity_Main:


    <android.support.v7.widget.GridLayout
    android:id="@+id/spielfeldLayout"
    android:layout_width="368dp"
    android:layout_height="368dp"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:background="@drawable/spielfeldfertig"
    app:columnCount="3"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:rowCount="3">

    Die playAgain Methode befindet sich in der public class TicTacToe_Code extends AppCompatActivity {}


    Ich habe nur diese Klasse, dort befindet sich der komplette Code.

    vielen Dank für deine schnelle Hilfe, aber es wird ausgegraut.


    Was meinst du damit?

    Der derzeitige Befehl um das GridLayout zu initialisieren in meiner playAgain Methode:


    GridLayout spielfeldLayout = findViewById(R.id.spielfeldLayout);


    Dein Vorschlag es als GridLayout zu definieren:


    GridLayout spielfeldLayout = (GridLayout)findViewById(R.id.spielfeldLayout);


    (GridLayout) wird ausgegraut.


    Ich weiß es ist ein harter Brocken und ich bin dich echt dankbar für deine Hilfe! (zumindest für mich ist es ein harter Brocken)

  • Hi
    also das grau sagt das du die Variable zwar estellst aber nicht in deiner App verwendest.


    wenn du zB. in der onCreate
    GridLayout spielfeldLayout = (GridLayout)findViewById(R.id.spielfeldLayout);
    Screibst ist das eine Lokale Variable die nur in der onCreate sichtbar ist.


    Deine Vielleicht Global im KlassenRumf erstellet Variable hat den gleichen Namen ist aber nicht die gleiche Variable.
    GridLayout spielfeldLayout;


    Wenn du nun zb. im Onklick listner auf die Variable zugreifen willst, greifst du auf die globale nicht und lehre variable zu und deine App türtzt ab.



    also erstelle am besten die Variable im Klassenrumpf global und Inizalisire sie in der onCreat ohne den VVariablen Typ anzugeben.
    spielfeldLayout = (GridLayout)findViewById(R.id.spielfeldLayout);



    somit kannst du von überall in der Klasse auf die Variable zugreifen.


    dann wird sie auch nicht mehr grau sein.

  • Moin moin,


    ich habe das GrinLayout jetzt in der public class initialisiert.


    GridLayout spielfeldLayout;


    Die App startet einwandfrei.


    Dementsprechend lautet der Befehl in der playAgain Methode jetzt:


    spielfeldLayout = (GridLayout)findViewById(R.id.spielfeldLayout);


    Allerdings ist hier das (GridLayout) ausgegraut und die App stürzt nach wie vor ab, wenn ich nochmal spielen möchte.


    Habe ich das auch so umgesetzt wie es deine Lösung vorgibt? Evtl. habe ich ja etwas falsch verstanden?


    Die angelegten Variablen in der public class:


    public class TicTacToe_Code extends AppCompatActivity {
    //Button onClick Methode Start
    Button startbutton;
    //Musik
    Button music;
    boolean hintergrundmusik;
    MediaPlayer hintergrundmusik1 = new MediaPlayer();
    //Spiel, 0: Chinese, 1: Marcel Davis, 2: leer
    int spieler = 0;
    int[] status = {2,2,2,2,2,2,2,2,2};
    int[][] siegesbedingungen = {{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}};
    boolean spielAktiv = true;
    Button playAgainButton;
    TextView winnerTextView;
    GridLayout spielfeldLayout;


    Die komplette playAgain Methode:


    //Erneut spielen


    public void playAgain (View view){


    playAgainButton.setVisibility(View.INVISIBLE);
    winnerTextView.setVisibility(View.INVISIBLE);


    spielfeldLayout = (GridLayout)findViewById(R.id.spielfeldLayout);


    for (int i = 0; i < spielfeldLayout.getChildCount(); i++){


    ImageView counter = (ImageView) spielfeldLayout.getChildAt(i);


    counter.setImageDrawable(null);


    }


    for (int i = 0; i<status.length; i++){
    status[i] = 2;
    }


    spieler = 0;
    spielAktiv = true;


    }


    Ich weiß echt nicht weiter, alles andere funktoniert.

  • Hi erstens gehört die findviewbyid in die onCreate und nicht in die playagain Methode.
    Auch den Mediaplayer solltest du in der onCreate inizalisiren und nicht im Klassenrumpf. Da solte man nur primitive datentypen zuweisen. Wenn du mal eine zweite activity einbindest wistu Probleme damit haben. Mache es gleich richtig.
    Kennst du dich mit dem Debugger aus denn damit kannst du herausfinden wo bei welcher Zeile deine app abstürzt.


    Gehe ich richtig auf in der Annahme das die app beim ersten Durchlauf richtig funktioniert?

  • Hi erstens gehört die findviewbyid in die onCreate und nicht in die playagain Methode.
    Auch den Mediaplayer solltest du in der onCreate inizalisiren und nicht im Klassenrumpf. Da solte man nur primitive datentypen zuweisen. Wenn du mal eine zweite activity einbindest wistu Probleme damit haben. Mache es gleich richtig.
    Kennst du dich mit dem Debugger aus denn damit kannst du herausfinden wo bei welcher Zeile deine app abstürzt.


    Gehe ich richtig auf in der Annahme das die app beim ersten Durchlauf richtig funktioniert?

    Salli,


    packe ich diesen Befehl in die onCreate Methode stürzt die App bei Appstart ab:


    spielfeldLayout = (GridLayout)findViewById(R.id.spielfeldLayout);


    also habe ich diesen Befehl in der playAgain Methode gelassen.


    Jetzt führe ich die App wieder aus und spiele bis zu dem Zeitpunk, dass man auf nochmal spielen drücken muss.


    Debugger Konsole spuckt zum Zeitpunkt an dem der "playAgainButton" betätigt wird aus:


    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: **************, PID: 8276java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
    at android.view.View.performClick(View.java:6256)at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
    Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
    at android.view.View.performClick(View.java:6256)
    at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
    Caused by: java.lang.ClassCastException: android.support.v7.widget.GridLayout cannot be cast to android.widget.GridLayoutat games.*******.tictactoe.TicTacToe_Code.playAgain(TicTacToe_Code.java:153)
    at java.lang.reflect.Method.invoke(Native Method)
    at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
    at android.view.View.performClick(View.java:6256) at android.view.View$PerformClick.run(View.java:24701)
    at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
    Disconnected from the target VM, address: 'localhost:8607', transport: 'socket'


    Ja Die App läuft einwandfrei, bis zum Aufrufen der playAgain Methode über den "playAgainButton". ;(

  • mal ehrlich was bringt es dir wenn es in der oncreate abstürzt es in die Playagain zu setzen.da stürzt sie auch ab. Dann stimmt was mit deinem layout nicht.
    Es giebtt auch eine neue Support lib.
    Zeige mal die onCreate.
    Wo hast du noch die findViewById.. Aufgerufen?
    Irgendwo musst du ja schon mal das layout benutzen sonst könntentest du nicht die erste Runde spielen und genau das will ich wissen. Sonst kann ich dort nicht weiter helfen.

  • Hallo,


    zunächst mal vielen Dank für deine Hilfe.


    Weil ich allerdings schon 3 Tage meiner "Programmier Zeit" da reingesteckt habe, habe ich es aufgegeben, zumal genau der selbe Code in einer anderen Anwendung funktioniert.
    Es ist mir also nicht klar, wieso er in dieser Anwendung nicht funktioniert. Einmal komplett neu die Anwendung aufgesetzt und es funktioniert.


    Ich habe das jetzt so gemacht, weil ich gerne andere Sachen programmieren will und nicht immer am selben "Projekt" hängen und Fehler suchen, die gar nicht da sind.


    Ich habe die Zeile in die playAgain Methode, damit ich das Spiel wenigstens testen konnte.


    Danke nochmals für deine Hilfe!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!