Home Foros Foro dudas Foro de Android Problema en el último video del ejercicico tres en raya

Problema en el último video del ejercicico tres en raya

Viendo 2 entradas - de la 1 a la 2 (de un total de 2)
  • Autor
    Entradas
  • #9785

    blown
    Participante

    Buenos días, he estado siguiendo video a video el ejercicio del tres en raya y al finalizar cada video comprobaba que funcionaba perfectamente, iba entendiendo todo bastante bien a pesar de que no tengo mucha base en programación, pero llegado al último video, si elijo el nivel normal o dificil, en cuanto todo una de las casillas, la app se cierra dándome un error. En el logcat me dice todo esto, pero no logro dar con el error. ¿alguien me podría ayudar por favor?

    Process: com.desarrollador.ejerciciotresenraya, PID: 31354
    java.lang.IllegalStateException: Could not execute method for android:onClick
    at android.view.View$DeclaredOnClickListener.onClick(View.java:4458)
    at android.view.View.performClick(View.java:5204)
    at android.view.View$PerformClick.run(View.java:21153)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at android.view.View$DeclaredOnClickListener.onClick(View.java:4453)
    at android.view.View.performClick(View.java:5204)
    at android.view.View$PerformClick.run(View.java:21153)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    Caused by: java.lang.ArrayIndexOutOfBoundsException: length=9; index=-1
    at com.desarrollador.ejerciciotresenraya.Partida.comprueba_casilla(Partida.java:28)
    at com.desarrollador.ejerciciotresenraya.MainActivity.toque(MainActivity.java:135)
    at java.lang.reflect.Method.invoke(Native Method)
    at android.view.View$DeclaredOnClickListener.onClick(View.java:4453)
    at android.view.View.performClick(View.java:5204)
    at android.view.View$PerformClick.run(View.java:21153)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

    Este es mi archivo Mainactivity.java

     @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    //Iniciamos el array casillas para identificar cada casilla
    
    CASILLAS= new int[9];
    
    CASILLAS[0]=R.id.a1;
    CASILLAS[1]=R.id.a2;
    CASILLAS[2]=R.id.a3;
    CASILLAS[3]=R.id.b1;
    CASILLAS[4]=R.id.b2;
    CASILLAS[5]=R.id.b3;
    CASILLAS[6]=R.id.c1;
    CASILLAS[7]=R.id.c2;
    CASILLAS[8]=R.id.c3;
    
    }
    
    public void aJugar(View vista){
    
    ImageView imagen; //con esto ponemos en blanco las casillas
    
    for(int cadaCasilla:CASILLAS){
    
    imagen=(ImageView)findViewById((cadaCasilla));
    
    imagen.setImageResource(R.drawable.casilla);//casilla en blanco que se asigna a cada casilla
    
    }
    
    jugadores=1; //jugadores es igual a 1 a no ser que le pases en la siguiente instrucción el valor 2
    
    if (vista.getId()==R.id.dosjug){
    
    jugadores=2;
    
    }
    
    RadioGroup configDificultad=(RadioGroup)findViewById(R.id.configD);
    
    int id=configDificultad.getCheckedRadioButtonId();
    
    int dificultad=0;
    
    if(id==R.id.normal) {
    
    dificultad=1;
    
    }else if(id==R.id.imposible){
    
    dificultad=2;
    }
    
    partida=new Partida(dificultad);
    
    ((Button)findViewById(R.id.unjug)).setEnabled(false); //inhabilitamos boton un jugador
    
    ((RadioGroup)findViewById(R.id.configD)).setAlpha(0);
    
    ((Button)findViewById(R.id.dosjug)).setEnabled(false);//inhabilitamos boton dos jugadores
    
    }
    
    public void toque(View mivista){
    
    if(partida==null){ //mientras se cumpla no sigue el código
    
    return;
    
    }
    
    int casilla=0; //con este for vamos comprobando en qué casilla hemos picado
    
    for (int i=0;i<9;i++){ if(CASILLAS[i]==mivista.getId()){ casilla=i; break; } } //con esto mostramos un mensaje emergente con el la casilla que estamos tocando /*Toast toast=Toast.makeText(this,"Has pulsado la casilla " + casilla, Toast.LENGTH_LONG); toast.setGravity(Gravity.CENTER,0,0); toast.show();*/ if(partida.comprueba_casilla(casilla)==false) {//antes de nada comprobamos si la casilla está libre return; } marca(casilla); //llama a la función marca y sabemos en qué casilla dibujó partida.turno(); /* int resultado=partida.turno(); //cambia el jugador que dibuja if(resultado>0){ //gana jugador 1 ó 2 ó empate
    
    termina(resultado);
    
    return;
    
    }*/
    
    casilla=partida.ia(); // el PC dibuja en una casilla
    
    while(partida.comprueba_casilla(casilla)!=true){ //si se cumple que ya se utilizó esta casilla
    
    casilla=partida.ia(); // piensa otra casilla
    
    }
    
    marca(casilla);
    
    partida.turno();
    
    /*resultado=partida.turno(); //cambia el jugador que dibuja
    
    if(resultado>0){ //gana jugador 1 ó 2 ó empate
    
    termina(resultado);
    
    }*/
    
    }
    
    /*private void termina(int resultado){
    
    String mensaje;
    
    if(resultado==1) mensaje="Ganan los círculos";
    
    else if (resultado==2) mensaje="Ganan las aspas";
    
    else mensaje="empate";
    
    Toast toast=Toast.makeText(this,mensaje, Toast.LENGTH_LONG);
    toast.setGravity(Gravity.CENTER,0,0);
    toast.show();
    
    partida=null;
    
    ((Button)findViewById(R.id.unjug)).setEnabled(true); //habilito botón jugador 1
    ((RadioGroup)findViewById(R.id.configD)).setAlpha(1); //dar opacidad a los botón jugador
    ((Button)findViewById(R.id.dosjug)).setEnabled(true); //habilito botón jugador 2
    
    }*/
    
    private void marca(int casilla){ //poner circulo o aspa, recibe el número de la casilla
    
    ImageView imagen;
    
    imagen=(ImageView)findViewById(CASILLAS[casilla]);
    
    if(partida.jugador==1){ //si el jugador 1 toca la pantalla pone un O en la casilla correspondiente
    
    imagen.setImageResource(R.drawable.circulo);
    
    }else{ // si no es jugador 1 pone X
    
    imagen.setImageResource(R.drawable.aspa);
    
    }
    
    }
    
    private int jugadores;
    
    private int[] CASILLAS;
    
    private Partida partida;
    
    }
    

    Este es mi archivo partida.java

    public class Partida {
    
    public Partida(int dificultad){
    
    this.dificultad = dificultad;
    
    jugador=1; //empieza jugando el jugador 1
    
    casillas=new int[9]; //creamos un array para poner todas las casillas con valor inicial 0
    
    for(int i=0;i<9;i++){
    
    casillas[i]=0;
    }
    
    }
    
    public boolean comprueba_casilla(int casilla){
    
    if(casillas[casilla]!=0) {
    
    return false; //compruebo el valor de la casilla
    
    }else{
    
    casillas[casilla]=jugador; //
    
    }
    
    return true;
    }
    
    public int turno(){
    
    boolean empate=true;
    
    boolean ult_movimiento=true;
    
    for (int i=0;i<COMBINACIONES.length;i++){ // revisa el array para saber los valores de las casillas for(int pos:COMBINACIONES[i]){ // System.out.println("Valor en posición " + i + " " + casillas[pos]); System.out.println("Valor en posición " + pos + " " + casillas[pos]); if(casillas[pos]!=jugador)ult_movimiento=false; if(casillas[pos]==0){ empate=false; } }// cierra for anidado System.out.println("----------------------------"); if(ult_movimiento)return jugador; ult_movimiento=true; }// cierra for principal if(empate){ return 3; } jugador++; //introducimos cambio de turno en jugadores if(jugador>2){
    
    jugador=1;
    
    }
    
    return 0;
    
    }
    
    public int dosEnRaya(int jugador_en_turno){ //método para avisar de casillas importantes a ocupar por el otro jugador
    
    int casilla=-1; // ¿qué casilla es la que hace 3 en raya?
    
    int cuantas_lleva=0; // ¿que jugador lleva dos en raya?
    
    for (int i=0;i<COMBINACIONES.length;i++) { // revisa el array para saber los valores de las casillas for (int pos : COMBINACIONES[i]) { // el for dura mientras dure la dimensión del array if(casillas[pos]==jugador_en_turno) cuantas_lleva++; //si la casilla está marcada por ese jugador cuantas_lleva++ if(casillas[pos]==0) casilla=pos; //anota en casilla el valos de la posición si se cumple } if(cuantas_lleva==2 && casilla!=-1) return casilla; // dame el valor de la casilla clave casilla=-1; cuantas_lleva=0; } return -1; } public int ia(){ //para introducir aleatoriedad de la casilla donde dibuja el PC int casilla; casilla=dosEnRaya(2); //¿puede hacer el jugador 2, 2 en raya? if(casilla!=-1) return casilla; //si no es igual a -1 devuelve valor de casilla if (dificultad>0){
    
    casilla=dosEnRaya(1); //¿puede hacer el jugador 1, 2 en raya?
    
    if(casilla!=1) return casilla;
    
    }
    
    if(dificultad==2){ //nivel imposible
    
    if (casillas[0]==0) return 0;
    
    if (casillas[2]==0) return 2;
    
    if (casillas[6]==0) return 6;
    
    if (casillas[8]==0) return 8;
    
    }
    
    Random casilla_azar=new Random(); //marca una casilla al azar
    
    casilla=casilla_azar.nextInt(9);
    
    return casilla;
    
    }
    
    public final int dificultad;
    
    public int jugador;
    
    private int [] casillas;
    
    private final int[] [] COMBINACIONES={{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}};
    
    }
    
    #14917

    jesus alejandro
    Participante

    Te recomiendo echarle un vistazo a esas variables ya que te dejas algunas mal puestas, por lo demás bien, cuando estaba en Cybermindsec seguíamos una estructura similar de desarrollo en python.

Viendo 2 entradas - de la 1 a la 2 (de un total de 2)
  • Debes estar registrado para responder a este debate.