-
AutorEntradas
-
13 abril, 2019 a las 8:11 pm #9785
blownParticipanteBuenos 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}}; }
7 septiembre, 2020 a las 2:41 am #14917
jesus alejandroParticipanteTe 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.
-
AutorEntradas
- Debes estar registrado para responder a este debate.