2022-03-26

I made a tictactoe game but it is crashing once I click on an empty space

I made a tictactoe game but it is crashing once I click on an empty space.

I used an Arraylist to change the state of the index when the corresponding place is clicked in the tictactoe grid. For example, if I ticked in the top right cell in the grid the index 2 will change to 1 if the current player is 'O' or to 2 if the current player is 'X'.

There is a counter to track who is playing, if the remainder is 0 then 'O' is places or else 'X' is placed.

Also,I used a flag 'gstate' to stop the game when one player wins.

The problem is that in the beginning the game works but when it comes to any part where I make the checking which player is the winner the game crashes.

May anyone please help me.

This is the Main Jave code

package com.example.tictactoe;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
    
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
    
public class MainActivity extends AppCompatActivity {

    public int counter = 0;
    Toast msg;
    ImageView img, img2, img3, img4, img5, img6, img7, img8, img9;


    int o = 1;
    int x = 2;

    List<Integer> winner = new ArrayList<>(9);

    boolean owin, xwin = false;
    boolean gstate = true;

    //oOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoO

    public void isOm() {
        if (counter % 2 != 0 && img5.getDrawable() != null) {
            winner.set(4, 1);
        } else {
        }
    }

    public void isOmr() {
        if (counter % 2 != 0 && img6.getDrawable() != null) {
            winner.set(5, 1);
        } else {
        }
    }

    public void isOml() {
        if (counter % 2 != 0 && img4.getDrawable() != null) {
            winner.set(3, 1);
        } else {
        }
    }

    public void isOru() {
        if (counter % 2 != 0 && img3.getDrawable() != null) {
            winner.set(2, 1);
        } else {
        }
    }

    public void isOmu() {
        if (counter % 2 != 0 && img2.getDrawable() != null) {
            winner.set(1, 1);
        } else {
        }
    }


    public void isOlu() {
        if (counter % 2 != 0 && img.getDrawable() != null) {
            winner.set(0, 1);
        } else {
        }
    }

    public void isOdr() {
        if (counter % 2 != 0 && img9.getDrawable() != null) {
            winner.set(8, 1);
        } else {
        }
    }

    public void isOmd() {
        if (counter % 2 != 0 && img8.getDrawable() != null) {
            winner.set(7, 1);
        } else {
        }
    }

    public void isOdl() {
        if (counter % 2 != 0 && img7.getDrawable() != null) {
            winner.set(6, 1);
        } else {
        }
    }

    //oOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoOoO

    //xXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX

    public void isXm() {
        if (counter % 2 == 0 && img5.getDrawable() != null) {
            winner.set(4, 2);
        } else {
        }
    }

    public void isXmr() {
        if (counter % 2 == 0 && img6.getDrawable() != null) {
            winner.set(5, 2);
        } else {
        }
    }

    public void isXml() {
        if (counter % 2 == 0 && img4.getDrawable() != null) {
            winner.set(3, 2);
        } else {
        }
    }

    public void isXru() {
        if (counter % 2 == 0 && img3.getDrawable() != null) {
            winner.set(2, 2);
        } else {
        }
    }

    public void isXmu() {
        if (counter % 2 == 0 && img2.getDrawable() != null) {
            winner.set(1, 2);
        } else {
        }
    }

    public void isXlu() {
        if (counter % 2 == 0 && img.getDrawable() != null) {
            winner.set(0, 2);
        } else {
        }
    }

    public void isXdr() {
        if (counter % 2 == 0 && img9.getDrawable() != null) {
            winner.set(8, 2);
        } else {
        }
    }

    public void isXmd() {
        if (counter % 2 == 0 && img8.getDrawable() != null) {
            winner.set(7, 2);
        } else {
        }
    }

    public void isXdl() {
        if (counter % 2 == 0 && img7.getDrawable() != null) {
            winner.set(6, 2);
        } else {
        }
    }


    //xXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX

    public boolean oWin() {
        try {
           if(((img.getDrawable() != null) && (img2.getDrawable() != null) && (img3.getDrawable() != null) && ((int)winner.get(0) == 1) && ((int)winner.get(1) == 1) && ((int)winner.get(2) == 1)) || ((img4.getDrawable() != null) && (img5.getDrawable() != null) && (img6.getDrawable() != null) && ((int)winner.get(3) == 1) && ((int)winner.get(4) == 1) && ((int)winner.get(5) == 1)) || ((img7.getDrawable() != null) && (img8.getDrawable() != null) && (img9.getDrawable() != null) && ((int)winner.get(6) == 1) && ((int)winner.get(7) == 1) && ((int)winner.get(8) == 1)) || ((img.getDrawable() != null) && (img4.getDrawable() != null) && (img7.getDrawable() != null) && ((int)winner.get(0) == 1) && ((int)winner.get(3) == 1) && ((int)winner.get(6) == 1)) || ((img2.getDrawable() != null) && (img5.getDrawable() != null) && (img8.getDrawable() != null) && ((int)winner.get(1) == 1) && ((int)winner.get(4) == 1) && ((int)winner.get(7) == 1)) || ((img3.getDrawable() != null) && (img6.getDrawable() != null) && (img9.getDrawable() != null) && ((int)winner.get(2) == 1) && ((int)winner.get(5) == 1) && ((int)winner.get(8) == 1)) || ((img.getDrawable() != null) && (img5.getDrawable() != null) && (img9.getDrawable() != null) && ((int)winner.get(0) == 1) && ((int)winner.get(4) == 1) && ((int)winner.get(8) == 1)) || ((img3.getDrawable() != null) && (img5.getDrawable() != null) && (img7.getDrawable() != null) && ((int)winner.get(2) == 1) && ((int)winner.get(4) == 1) && ((int)winner.get(6) == 1))){
                owin = true;
            }
            return owin;
        }
        catch(Exception e) {
            //Toast.makeText(this,"An image is not here",Toast.LENGTH_SHORT).show();
            return owin;
        }
    }

    public boolean xWin() {
        try {
            if (((img.getDrawable() != null) && (img2.getDrawable() != null) && (img3.getDrawable() != null) && ((int)winner.get(0) == 2) && ((int)winner.get(1) == 2) && ((int)winner.get(2) == 2)) || ((img4.getDrawable() != null) && (img5.getDrawable() != null) && (img6.getDrawable() != null) && ((int)winner.get(3) == 2) && ((int)winner.get(4) == 2) && ((int)winner.get(5) == 2)) || ((img7.getDrawable() != null) && (img8.getDrawable() != null) && (img9.getDrawable() != null) && ((int)winner.get(6) == 2) && ((int)winner.get(7) == 2) && ((int)winner.get(8) == 2)) || ((img.getDrawable() != null) && (img4.getDrawable() != null) && (img7.getDrawable() != null) && ((int)winner.get(0) == 2) && ((int)winner.get(3) == 2) && ((int)winner.get(6) == 2)) || ((img2.getDrawable() != null) && (img5.getDrawable() != null) && (img8.getDrawable() != null) && ((int)winner.get(1) == 2) && ((int)winner.get(4) == 2) && ((int)winner.get(7) == 2)) || ((img3.getDrawable() != null) && (img6.getDrawable() != null) && (img9.getDrawable() != null) && ((int)winner.get(2) == 2) && ((int)winner.get(5) == 2) && ((int)winner.get(8) == 2)) || ((img.getDrawable() != null) && (img5.getDrawable() != null) && (img9.getDrawable() != null) && ((int)winner.get(0) == 2) && ((int)winner.get(4) == 2) && ((int)winner.get(8) == 2)) || ((img3.getDrawable() != null) && (img5.getDrawable() != null) && (img7.getDrawable() != null) && ((int)winner.get(2) == 2) && ((int)winner.get(4) == 2) && ((int)winner.get(6) == 2))){
                xwin = true;
            }
            return xwin;
        }
        catch(Exception e) {
            //Toast.makeText(this,"An image is not here",Toast.LENGTH_SHORT).show();
            return xwin;
        }
    }

    public void greset(View view) {
        counter = 0;
        //img = (ImageView) findViewById(R.id.imageView);
        img.setImageResource(0);
        //img2 = (ImageView) findViewById(R.id.imageView2);
        img2.setImageResource(0);
        //img3 = (ImageView) findViewById(R.id.imageView3);
        img3.setImageResource(0);
        //img4 = (ImageView) findViewById(R.id.imageView4);
        img4.setImageResource(0);
        //img5 = (ImageView) findViewById(R.id.imageView5);
        img5.setImageResource(0);
        //img6 = (ImageView) findViewById(R.id.imageView6);
        img6.setImageResource(0);
        //img7 = (ImageView) findViewById(R.id.imageView7);
        img7.setImageResource(0);
        //img8 = (ImageView) findViewById(R.id.imageView8);
        img8.setImageResource(0);
        //img9 = (ImageView) findViewById(R.id.imageView9);
        img9.setImageResource(0);
        gstate = true;
    }

    public void pgame(View view) {
        ImageView image = (ImageView) view;

        img = (ImageView) findViewById(R.id.imageView);
        img2 = (ImageView) findViewById(R.id.imageView2);
        img3 = (ImageView) findViewById(R.id.imageView3);
        img4 = (ImageView) findViewById(R.id.imageView4);
        img5 = (ImageView) findViewById(R.id.imageView5);
        img6 = (ImageView) findViewById(R.id.imageView6);
        img7 = (ImageView) findViewById(R.id.imageView7);
        img8 = (ImageView) findViewById(R.id.imageView8);
        img9 = (ImageView) findViewById(R.id.imageView9);

        if (image.getDrawable() != null) {
            msg = Toast.makeText(this, "Please select another space", Toast.LENGTH_SHORT);
            msg.show();
            if((ImageView)view == img){
                winner.set(0, 1);
            }
            else if((ImageView)view == img2){
                winner.set(1, 1);
            }
            else if((ImageView)view == img3){
                winner.set(2, 1);
            }
            else if((ImageView)view == img4){
                winner.set(3, 1);
            }
            else if((ImageView)view == img5){
                winner.set(4, 1);
            }
            else if((ImageView)view == img6){
                winner.set(5, 1);
            }
            else if((ImageView)view == img7){
                winner.set(6, 1);
            }
            else if((ImageView)view == img8){
                winner.set(7, 1);
            }
            else if((ImageView)view == img9){
                winner.set(8, 1);
            }
            else if((ImageView)view == img){
                winner.set(0, 2);
            }
            else if((ImageView)view == img2){
                winner.set(1, 2);
            }
            else if((ImageView)view == img3){
                winner.set(2, 2);
            }
            else if((ImageView)view == img4){
                winner.set(3, 2);
            }
            else if((ImageView)view == img5){
                winner.set(4, 2);
            }
            else if((ImageView)view == img6){
                winner.set(5, 2);
            }
            else if((ImageView)view == img7){
                winner.set(6, 2);
            }
            else if((ImageView)view == img8){
                winner.set(7, 2);
            }
            else if((ImageView)view == img9){
                winner.set(8, 2);
            }

            if (counter > 5 && counter < 9){
                this.xWin();
                this.oWin();
            }

            if (owin) {
                msg = Toast.makeText(this, "\'O\' is the winner, press the reset button", Toast.LENGTH_SHORT);
                msg.show();
                xwin = false;
                gstate = false;
            }

            if (xwin) {
                msg = Toast.makeText(this, "\'X\' is the winner, press the reset button", Toast.LENGTH_SHORT);
                msg.show();
                xwin = false;
                gstate = false;
            }

        }

        if (image.getDrawable() == null) {
            if (counter % 2 == 0) {
                image.setImageResource(R.drawable.o);
                counter += 1;

            } else {
                image.setImageResource(R.drawable.x);
                counter += 1;

            }

            image.setTranslationY(-1500);
            image.animate().translationYBy(1500).setDuration(500);




        }


    }



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
}

The xml code is as following

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/cardview_light_background"
tools:context=".MainActivity">

<androidx.gridlayout.widget.GridLayout
    android:id="@+id/gridLayout"
    android:layout_width="420dp"
    android:layout_height="420dp"
    android:background="@drawable/grid"
    app:columnCount="3"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.555"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.733"
    app:rowCount="3">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:onClick="pgame"
        app:layout_column="0"
        app:layout_row="0" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_marginLeft="22dp"
        android:onClick="pgame"
        app:layout_column="1"
        app:layout_row="0" />

    <ImageView
        android:id="@+id/imageView3"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_marginLeft="18dp"
        android:onClick="pgame"
        app:layout_column="2"
        app:layout_row="0" />

    <ImageView
        android:id="@+id/imageView4"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_marginTop="23dp"
        android:onClick="pgame"
        app:layout_column="0"
        app:layout_row="1" />

    <ImageView
        android:id="@+id/imageView5"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_marginLeft="22dp"
        android:layout_marginTop="23dp"
        android:onClick="pgame"
        app:layout_column="1"
        app:layout_row="1" />

    <ImageView
        android:id="@+id/imageView6"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="23dp"
        android:onClick="pgame"
        app:layout_column="2"
        app:layout_row="1" />

    <ImageView
        android:id="@+id/imageView7"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_marginTop="23dp"
        android:onClick="pgame"
        app:layout_column="0"
        app:layout_row="2" />

    <ImageView
        android:id="@+id/imageView8"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_marginLeft="22dp"
        android:layout_marginTop="23dp"
        android:onClick="pgame"
        app:layout_column="1"
        app:layout_row="2" />

    <ImageView
        android:id="@+id/imageView9"
        android:layout_width="125dp"
        android:layout_height="125dp"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="23dp"
        android:onClick="pgame"
        app:layout_column="2"
        app:layout_row="2" />
</androidx.gridlayout.widget.GridLayout>

<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="90dp"
    android:layout_marginBottom="45dp"
    android:onClick="greset"
    android:text="Reset"
    app:layout_constraintBottom_toTopOf="@+id/gridLayout"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.498"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.0" />

</androidx.constraintlayout.widget.ConstraintLayout>


No comments:

Post a Comment