Java - 5 en raya

 
Vista:
Imágen de perfil de Joan Josep

5 en raya

Publicado por Joan Josep (5 intervenciones) el 18/04/2014 19:52:48
Muy buenas, mi duda surge al pensar el algoritmo para comprobar si en un tablero 15x15, se ha realizado un 5 en raya, horizontal, vertical o diagonal.
He pensado en hacerlo así :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private boolean Revisar() {
        boolean guanyat=false;
        int SumaBlanc=0;
        int SumaNegre=0;
        int Suma=0;
        for(int i=0;i<15;i++){
            for (int j = 0; j < 4; j++) {
                if(TABLERO[i][j+1].OcupadaBlanca==true){
                    SumaBlanc ++;
                }
                else if(TABLERO[i][j+1].OcupadaNegra==true){
                    SumaNegre ++;
                }
            }
 
        }
        if(SumaBlanc==5){
            System.out.println("Blanco gana");
            guanyat=true;
        }
        else if(SumaNegre==5){
            System.out.println("Negro gana");
            guanyat=true;
        }
        return guanyat;
    }



Aquí solo miro de tratar para el caso en Horizontal, y sí, funciona, pero si pongo otros puntos que no sean horizontales, pero sí a sus alrededores, funciona. Mi pregunta sería: ¿Cómo lo haríais vosotros?

Muchas gracias por anticipado!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

5 en raya

Publicado por Mario (26 intervenciones) el 21/04/2014 19:34:17
q tal algo así:
(no lo probé, espero te de una idea al menos para vertical y horizontal)
(el problema en el tuyo es que no estás iniciando las variables que hacen el conteo nuevamente en el primer for)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//Horizontales
int SumaBlancHor = 0;
int SumaNegreHor = 0;
//Verticales
int SumaBlancVer = 0;
int SumaNegreVer = 0;
//Banderas para saber si la casilla anteriormente revisada estaba seleccionada o no
boolean banderaHorBlanco = false;
boolean banderaHorNegro = false;
boolean banderaVerBlanco = false;
boolean banderaVerNegro = false;
for (int x = 0; x < 15; x++) {
	for (int y = 0; y < 15; y++) {
		if(SumaBlancHor >= 5 || SumaBlancVer >= 5) {
			System.out.println("Blanco gana");
			return true;
		}
		if(SumaNegreHor >= 5 || SumaNegreVer >= 5) {
			System.out.println("Negro gana");
			return true;
		}
		if (!banderaHorBlanco) {
			SumaBlancHor = 0;
		}
		if (!banderaHorNegro) {
			SumaNegreHor = 0;
		}
		if (!banderaVerBlanco) {
			SumaBlancVer = 0;
		}
		if (!banderaVerNegro) {
			SumaNegreVer = 0;
		}
		banderaHorBlanco = false;
		banderaHorNegro = false;
		if (TABLERO[i][j].OcupadaBlanca) {
			SumaBlancHor++;
			banderaHorBlanco = true;
		} else if(TABLERO[i][j].OcupadaNegra) {
			SumaNegreHor++;
			banderaHorNegro = true;
		}
		banderaVerBlanco = false;
		banderaVerNegro = false;
		if (TABLERO[j][i].OcupadaBlanca) {
			SumaBlancVer++;
			banderaVerBlanco = true;
		} else if(TABLERO[j][i].OcupadaNegra) {
			SumaNegreVer++;
			banderaVerNegro = true;
		}
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joan Josep

5 en raya

Publicado por Joan Josep (5 intervenciones) el 21/04/2014 20:25:21
Muchisimas gracias Mario, lo he probado y va genial, aunque si pongo x, y como coordenadas me funciona en horizontal, si pongo y, x, en vertical, así que lo haré por casos separados. Mi pregunta ahora sería, con x+1, y+1, se podría comprobar la diagonal?

Me has ayudado mucho, si puedo darte puntos o como vaya esto basta me digas como hacerlo!

Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

5 en raya

Publicado por Mario (26 intervenciones) el 21/04/2014 21:18:55
Sería muy similar:
con esto se evalua la diagonal:
X
..X
....X
......X
........X

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
int SumaBlanc1 = 0;
int SumaNegre1 = 0;
int SumaBlanc2 = 0;
int SumaNegro2 = 0;
boolean banderaBlanco1 = false;
boolean banderaNegro1 = false;
boolean banderaBlanco2 = false;
boolean banderaNegro2 = false;
for (int x = 0; x < 15; x++) {
	int y = 0;
	for (int x1 = x; x1 < 15; x1++) {
		if(SumaBlanc1 >= 5 || SumaBlanc2 >= 5) {
			System.out.println("Blanco gana");
			return true;
		}
		if(SumaNegre1 >= 5 || SumaNegro2 >= 5) {
			System.out.println("Negro gana");
			return true;
		}
		if (!banderaBlanco1) {
			SumaBlanc1 = 0;
		}
		if (!banderaNegro1) {
			SumaNegre1 = 0;
		}
		if (!banderaBlanco2) {
			SumaBlanc2 = 0;
		}
		if (!banderaNegro2) {
			SumaNegro2 = 0;
		}
		banderaBlanco1 = false;
		banderaNegro1 = false;
		if (TABLERO[x1][y].OcupadaBlanca) {
			SumaBlanc1++;
			banderaBlanco1 = true;
		} else if(TABLERO[x1][y].OcupadaNegra) {
			SumaNegre1++;
			banderaNegro1 = true;
		}
		banderaBlanco2 = false;
		banderaNegro2 = false;
		if (TABLERO[y][x1].OcupadaBlanca) {
			SumaBlanc2++;
			banderaBlanco2 = true;
		} else if(TABLERO[y][x1].OcupadaNegra) {
			SumaNegro2++;
			banderaNegro2 = true;
		}
 
		y++;
	}
}


hay que hacer lo mismo para la diagonal:
........X
......X
....X
..X
X
para este otro caso el for de la x ya iniciaría en retroceso de 14 a 0
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Joan Josep

5 en raya

Publicado por Joan Josep (5 intervenciones) el 21/04/2014 21:54:31
Muchísimas gracias amigo, me has sido de gran utilidad, puesto que has disipado mis dudas, si puedo hacer algo por ti me gustaría ayudar! De todos modos, me gustaría mucho añadirte a mis amigos de google plus por si alguna vez podríamos comentar dudas en general en cuanto a la programación, aunque no creas que quiera aprovecharme de tu conocimiento y tu gran amabilidad.

Muchas gracias, mi correo es [email protected]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar