Yo estoy haciendo un S en línea, es decir, que el juego permita elegir cuántos signos debe haber en la línea (y qué tan grande es el tablero).
Anduve pensando cual es el método más eficiente de ver si alguien ganó.
Se me ocurrieron 2 métodos.
El 1ero es bastante bruto, más o menos así:
Código:
Se apunta al superior izquierdo.
Repetir:
Si no está vacío:
Se miran sus contiguos de diagonal derecha-arriba:
Si no hay o no marcan victoria:
Se miran sus contiguos de la derecha:
Si no hay o no marcan victoria:
Se miran sus contiguos de diagonal derecha-abajo:
Si no hay o no marcan victoria:
Se miran sus contiguos de abajo:
Si no hay o no marcan victoria:
Si hay un casillero hacia abajo:
Se empieza a mirar ese.
sino si hay casilleros en la derecha:
Se empieza a mirar el superior de esa columna.
No es necesario que los ifs se repitan, sólo que al escribirlo así nomás quedaba más claro.Repetir:
Si no está vacío:
Se miran sus contiguos de diagonal derecha-arriba:
Si no hay o no marcan victoria:
Se miran sus contiguos de la derecha:
Si no hay o no marcan victoria:
Se miran sus contiguos de diagonal derecha-abajo:
Si no hay o no marcan victoria:
Se miran sus contiguos de abajo:
Si no hay o no marcan victoria:
Si hay un casillero hacia abajo:
Se empieza a mirar ese.
sino si hay casilleros en la derecha:
Se empieza a mirar el superior de esa columna.
El otro método intentaba usar menos repeticiones o variaciones de variables, pero a medida que lo analicé llegó un punto en que me parecía igual. En la misma repetición, se apunta a 2 casilleros (al principio son el mismo), y en cada repetición se varía a cual se apunta (y analiza como puse arriba), el 1ero es cada vez más hacia la derecha y el 2ndo hacia abajo. Cuando no quedan, se apunta al diagonal derecho-abajo y se repite el proceso hasta que el apuntado sea el inferior derecho.
Empecé a aplicar el método 1:
Código
// Por practicidad al calcular, las filas se cuentan desde 0: Fila = -1; // Las columnas no, desde 1: Columna = 0; do { Fila++; SemiReferenciaAlCas = "Casillero"+Fila+"_"; do { Columna++; // Si el casillero no está vacío: if (eval(SemiReferenciaAlCas+Columna != 2)) { // Esto va variando qué siguientes... // casilleros se analizan: Extra = 0; do { Extra++; //
Ahí iría lo de analizar hacia la diagonal arriba-derecha, y el resto de las cosas. Pero siento que es tan poco eficiente que prefiero que me digan algo mejor, que probablemente haya. Sino, más adelante le pregunto a GPT.
Por cierto, tengo pensado que la máquina aprenda a jugar experimentando, por eso los valores de los casilleros están grabados de 2 formas, por ejemplo el superior izquierdo:
// 2 es vacío, 1 es cruz, 0 es 0.
Casillero1 = 2;
Casillero1_1 = 2;
Porque al hacer referencia a una situación es más fácil variar sólo una variable (no fila y columna).
Lo necesito para hacer árboles, no sé cómo lo hacen uds, hablaremos en otra ocasión de eso.
Mientras hacía el tema me di cuenta que alcanza con analizar solamente las líneas que impliquen al casillero recién modificado
