“El lecho de roca de tu mente … ¿axiomas? ¿Arquetipos? Llámalos ‘ladrillos’. Para realizar la semántica, su mente debe hacer coincidir un texto entrante con uno o más de sus ladrillos. Si no coincide perfectamente con ninguno de ellos, debe difuminar en un MEDIO entre los ladrillos existentes. Eso es lo que significa “significar”. cómo AI puede encontrar significado en el texto “. ~ Roger Davis 2018-03-12
————————-
Discutiré un robot que escribí para jugar el juego de dados “Super Farkle” en Facebook. Los mejores puntajes por humanos se acercaron a 60K. ¡Mi Farkle_bot obtuvo 12,345,670! (Lo admito, detuve Farkle_bot en 12,300,000 e intenté escabullirlo manualmente hasta 12,345,678, en lugar de escribir código complejo para hacer esa pieza simple).
Esta respuesta mostrará una descripción simplificada del juego Farkle, una descripción general de las secciones de código y luego una descripción detallada del Analizador. Ahí es donde vive la IA. Finalmente, una discusión sobre cómo hacer que Farkle_bot sea más inteligente.
La palabra “dados” se usará tanto para significado singular como plural.
EL JUEGO (reglas simplificadas, incompletas).
En Farkle, una ronda comienza con un lanzamiento de los 6 dados. [1] y [5] son golpes, suman puntos. Tú los guardas. Todos los demás dados, si los lanzas, puedes ganar más puntos. Pero una tirada sin golpes te da 0 puntos para la ronda, incluso pierdes tus golpes. La gran decisión es si arriesgarse a rodar nuevamente o, en su lugar, depositar sus puntajes totales.
ESQUEMA DEL CÓDIGO
Los principales módulos de código fueron:
La captura de pantalla
Llame a esta rutina para crear PIXA.bmp a partir de una captura de pantalla del tablero de dados configurada por Board_Top, Board_Left, Board_Bottom, Board_Right.
Cursor_click
Este proceso puede mover el cursor a cualquier posición de pantalla configurada y hacer clic con el mouse, bajo el control del proceso del Analizador.
Analizador
Descubre el recuento de pips para cada dado y cuenta el número de dados de cada valor nominal, como “2 de [1], 1 de [2], 0 de [3], 0 de [4], 0 de [5] , 3 de [6] “.
ANALIZADOR DETALLES DEL PROCESO
El analizador quiere encontrar los bordes superior, inferior, izquierdo y derecho de cada dado, por lo que escanea el tablero de dados en PIXA.bmp un píxel a la vez. El origen cartesiano está en la esquina superior izquierda del tablero de dados.
El escaneo primero se ejecuta de arriba a abajo en la columna más a la izquierda, luego de arriba a abajo en la segunda columna, etc.
1) Para cada píxel, primero pregunta “¿Eres rojo?” Más específicamente, lee tres bytes consecutivos del BMP, así: 00 00 FF. Un byte para verde, azul y rojo, en ese orden. En este caso, todo rojo, sin verde, sin azul. Eso daría un SÍ por “¿Eres rojo?”
a) Para cada píxel rojo, pregunta “¿El píxel que está encima de usted es verde?” Si encima de vecino es verde, verás, entonces este píxel rojo se encuentra en el borde SUPERIOR de los dados. Mantenga las coordenadas del borde descubierto en una variable indexada por orden encontrado, primero, segundo, etc., para que las posiciones puedan analizarse en pasos posteriores.
b) Una vez que haya encontrado un borde superior, continúe escaneando la columna con solo esta nueva pregunta: “¿Está verde?” Una respuesta SÍ, SOY VERDE significa que este píxel es un borde INFERIOR de los dados. Mantenga las coordenadas del borde descubierto en la misma variable indexada utilizada para los píxeles del borde SUPERIOR.
Nota: PIXA.bmp se editó inicialmente para incluir la línea blanca horizontal, que el código usa para analizar el tablero de dados en dos mitades, usando dos escaneos separados, de modo que no haya dos dados en la misma línea vertical.
3) Habiendo encontrado todos los bordes superior e inferior, ahora queremos escanear nuevamente, de izquierda a derecha esta vez, para descubrir los bordes izquierdo y derecho. No escanearemos toda la mitad del tablero de dados, pero el escaneo analizará solo los píxeles que se encuentran en las columnas específicas donde se encontró un borde superior o inferior.
a) Las filas a escanear se calculan utilizando la coordenada y del punto medio entre el borde superior y el borde inferior de cada dado.
b) Ahora hemos definido un área cuadrada que incluye la cara del dado.
c) Hemos omitido el algoritmo para determinar qué borde superior o inferior pertenece a qué dado, por simplicidad.
4) Para cada dado, debemos contar los pips. Inicialmente imaginé un proceso que definiría los bordes de cada pip, tal como lo hicimos para los bordes de los dados, pero encontré una forma más simple: cuente cuántos píxeles blancos existen en la parte superior “que muestra” los dados, luego convierta ese recuento de píxeles a un puntaje de dados como [1] a [6], de acuerdo con una tabla de valores descubiertos por pruebas repetidas. Si bien un humano puede ver los pips en las caras laterales como “blancos”, en realidad son grises, por lo que estamos contando solo los píxeles puros FF FF FF. Cada pip contiene aproximadamente 200 píxeles blancos, por lo que 200 +/- 40 es un [1], 400 +/- 40 es un [2], etc., lo que proporciona una resolución inequívoca.
5) Ahora que conocemos los valores nominales de cada dado, usamos un bloque IF condicional largo para decidir cómo responder, por ejemplo:
SI los 6 dados son [1] o [5] ENTONCES haga clic (ROLLO GRATIS).
.
.
.
SI dice (1) _value = 1 y dice (2) _ value = 5 y dice (3) _value = 2 y dice (4) _value = 3 y dice (5) _value = 3 y dice (6) _value = 4 ENTONCES volver a enrollar (3,4,5,6)
.
.
MEJORAR EL PROCESO DE ANALIZADOR
La sección ANALIZAR DETALLES DEL PROCESO simplificó la prueba de identificación de color de píxeles. Para mejorar, en lugar de decir SÍ para “¿Eres rojo?” solo para 00 00 FF, indique SÍ para (azul <40 y verde <40 y rojo> C9), por ejemplo.
Cuando el desarrollador de Super Farkle cambia la proporción del tablero de dados, o el tamaño o el color de los dados, usted, el humano, podría analizar los nuevos gráficos y ajustar laboriosamente los valores de muchas constantes en su código. En cambio, cambie esas constantes a variables y escriba código adicional para analizar la pantalla y llenar las nuevas variables, de modo que Farkle_bot pueda continuar funcionando con éxito después de los cambios gráficos. Este nuevo código, por ejemplo, escanea toda la pantalla y descubre los bordes del tablero de dados, y hace un reconocimiento óptico de caracteres para leer todos los botones, luego descubre su punto central de clic.
En lugar de precodificar el bloque de decisión de acuerdo con los mejores algoritmos de reglas de juego descubiertos por el jugador humano, deje que Farkle_bot seleccione al azar de una lista de todas las reacciones posibles (por ejemplo, “Volver a tirar dados [2] y [3] “) y realizar un seguimiento de los resultados. Después de registrar una gran base de datos de resultados, Farkle_bot comenzaría a elegir reacciones basadas en los mejores resultados registrados.
Si ha leído hasta aquí, recompense mis esfuerzos con un clic hacia arriba, ¡incluso si ya ha hecho clic en otras respuestas!