MiprimerjuegoOnline.java

IS4kO

Wenas pues vereis me he puesto a hacer un jueguecillo on-line con j2se, al ser el primero pues una cosa experimental muy basica se trata de las 3 en raya.

Ya lo tengo acabado, bueno,casi, me falta crearme un algoritmo que me compruebe cuando se han realizado las tres en raya.

En realidad ya tengo echo uno pero es harto complicado ya que se basa en comprobar el valor de las las celdas que hay al rededor de una posicion, dependiendo de donde este esa posicion en el tablero (ya que si pongo ficha en la casilla central recorro 8 posiciones a su al rededor, mienras que si lo hago de alguna de las esquinas pues solo 3, nose si me explico...), el tema es que creo que consumo mas recursos de los que deberia, asi que como un buen capullo pues me estoy comiendo la cabeza para conseguir el metodo que menos recursos consuma cada vez que pongo una ficha en el tablero (que es una matriz 3*3).

ALguna sugerencia?

P.D: Si a alguien le mola el tema ya que aqui no se trata mucho el java, pues que se ponga en conact with me actualmente, toy trabajando en hacer el mitico PONG a modo online, tb he terminado un messenger en j2se, asi que algo puedo freewarear :D

x2

que quieres hacer exactamente ?
Ten en cuenta que para comprobar los resultados te vas a hartar de usar condifcional (una vez creada la matriz de valores) y deberas usar un boolean indicando si hay 3 en una posicion o no (pasando por todos los valores de la matriz) La verdad es que es algo engorroso.

Yo programé uno (no on-line ni en JAVA) en c++ y tuve q pasarme algun tiempo para detectar quien habia ganado ya que tuve q recorrer y comprobar todos la valores de la matriz.

guner

lo 1º, ke no tengo ni idea de java, asi ke si es una mala idea, sorry X)

mi idea es darle un valor a cada celda
1 2 3
4 5 6
7 8 9

y... piensa que solo hay 8 convinaciones:
123, 456, 789, 147, 258, 369, 159,753 (y con el orden inverso), yo, comprovaría, después de poner una ficha si se cumple que hay tres fichas del mismo color ocupando alguna de esas convinaciones, bueno, solo una idea. ^^

IS4kO

#2 Si, como bien dices tendre que usar un boolean y me jartare de condiciones, y precisamente lo que quiero es reducir lo mas minimo el numero de estas, o en el caso de que no tenga mas huevos que hacerlo, pues que no se ejecuten todas siempre, sino que para cada posicion tenga un metodo de comprobacion distinto.

#3 asi es como lo tengo echo mas o menos pero lo que pasa es que siempre que pongas una ficha tienes que hacer todas las comprobaciones cuando no seria necesario.

Me explico

1a 2a 3a
1b 2b 3b
1c 2c 3c

Hasta ahora tengo dos opciones y la tercera (que es en la que estoy trabajando ahora para ver si puedo ahorrar algo):

1ª comprobar siempre todos los valores de la matriz (lo que conlleva a un consumo innecesario de recursos)

2ª cada posicion de la Matriz la tengo asociada a un metodo distinto de comprobacion, es decir si pulso 1a me mira 2a y 1b. cada posicion tiene su metodo distinto. De esta forma el programa no tendra que realizar todas las comprobaciones cada vez que pongo una ficha.

3ª Tener un metodo de Verticales otro para horizontales y otro para diagonales y dependiendo del boton al que pulse y de las fichas que le rodean pues me hace un metodo u otro, es decir, si pulso 1a pues me hara la horizontal 1a2a3a la vertica 1a1b1c y la diagonal 1a2b3c y asi con todos. Nose iwal me estoy comiendo la cabeza demasiado por unos miseros recursos. A find e cuentas tanto la 1ª opcion como la 2ª funcionan.....

Carcass

Sólo hay que optimizar cuando hace falta. Si el algoritmo que usas hace la comprobación en un tiempo razonable, déjalo así y no te comas la cabeza. Es absurdo perder el tiempo en esas cosas... ¿Y comprobar ocho casos te parece un trabajo excesivo? Válgame X-D

I

Un consejo:

Si quieres efectividad 100 % y poco codigo hazte el algoritmo recursivo y usando tecnica back-tracking

Si quieres que consuma menos.. tendras que evitar la recursividad, pero el codigo sera mas grande y tardaras mas en sacar el codigo.

Saludos

IS4kO

no controlo mucho de backtracking, es lo de la memoria de por donde pasas y tal no????.

La tipica serpiente que la sueltas en un laberinto y tiene que memorizar por donde ha pasado, alguien que controle de esto????

LOc0

Mira en www.algoritmia.net (página muy útil), aunque ya te adelanto que no podrás optimizarlo casi nada (o nada) :(...

Salu2 ;)

Ins3rtKoin

Hay varias formas de hacerlo. Con el método recursivo por ejemplo mirarás la última casilla seleccionada y el valor de su vecina, ascendiendo hasta llegar a la otra punta sin tener que mirar la matriz entera saliendo antes del bucle.
Para ganar más tiempo y no chupar recursos como dices puedes currartelo para que el programa sepa qué casillas producen un 3 en raya tirando de un array de vectores, por ejemplo. Si al seleccionar una casilla y recorrer el array das con un vector que va a cumplir el 3 en raya, llamas al algoritmo recursivo para verificarlo, o incluso ni tienes que llamarlo porque ya sabes que ahi se ha producido un 3 en raya; al ser array de vectores sabes a quien corresponde ganar. Si se pincha en una casilla que no produce 3 en raya no habrá que entrar en el algoritmo recursivo para comprobar, ni lo necesitas, pero si que hay que tener otro algoritmo que quite del vector los casos que antes producían 3 en raya y que después de la última casilla seleccionada ya no lo producirán, por lo que el array irá reduciendo su tamaño, los recorridos son más rápidos, y ya que el segundo algoritmo va descartando opciones se llega a saber cuándo se acaba la partida incluso sin terminar de rellenar el tablero porque ya no quedan opciones ganadoras en el array.

Es una rallada, y un 3 en raya no requiere comerse el bolo de esa manera, pero a mi por ejemplo me gusta rallarme un poquito con esas cosas porque a la hora de enfrentarte con algo realmente complicado no te asustas xdd. Saludos.

IS4kO

Bueno thx a todos los que se han interesado al final lo he arreglao con 7 metodos simples mirando todas las diagonales, verticales y horizontales, de tal forma que como mucho cuando pulso a un boton me llamara a 4 metodos que será la casilla central

un ejem de los metodos, solo os pongo el desarrollo de dos para no liar mucho el codigo, sorry por las tabulaciones:

private void PrimeraHorizontal()
{
if ((posi[0][0].equals(posi[0][1])) && (posi[0][0].equals(posi[0][2])))
{
win();
}
}

private void SegundaHorizontal()
private void TerceraHorizontal()

private void PrimeraVertical()
private void SegundaVertical()
private void TerceraVertical()

private void PrimeraDiagonal()

private void SegundaDiagonal()
{

if ((posi[0][2].equals(posi[1][1])) && (posi[0][2].equals(posi[2][0])))
}

DReD

La solución está en comprobar si has hecho 3 en raya
en la última tirada.

-Inicializas una variable con el jugador que pone ficha

-Cuando recibes el evento clic examinas qué posición ha sido clicada y actualizas el tablero

-Sabiendo el último clic (x,y) haces tres comprobaciones

Comprobación horizontal:
i=0;
ok=true;
while((ok)&&(i<3)) {
ok=(posicion[y]==jugadorActual)
i++
}
return ok


Comprobación vertical:
i=0;
ok=true;
while((ok)&&(i<3)) {
ok=(posicion[x]==jugadorActual)
i++
}
return ok


Comprobación diagonal:
i=0;
ok=true;
while((ok)&&(i<3)) {
ok=(posicion==jugadorActual)
i++
}
if(!ok) {
i=0;
ok=true;
while((ok)&&(i<3)) {
ok=(posicion[2-i]==jugadorActual)
i++
}
}
return ok


-Pasas el turno al siguiente jugador.

El método diagonal es más sencillo hacerlo en dos
pasos que buscarle una alternativa.

AvariciA

Acabamos de entregar esa practica en Java, Cuatro en Raya para dos jugadores creando el tablero dinamicamente. Esta realizado en modo texto, pero puedes cambiarlo a interface grafica. Si quieres los codigos fuente mandame un msj con tu correo y te lo mando. Un saludo ;)

IS4kO

#12 Si el programa ya esta hecho :) pero gracias por el ofrecimiento

Usuarios habituales

  • IS4kO
  • AvariciA
  • DReD
  • Ins3rtKoin
  • LOc0
  • Carcass
  • guner