Programación de juegos de backgammon (VB)
Hay un dicho en el concepto de backgammon de IA que dice que "las autoridades están confundidas, pero los espectadores lo tienen claro. Sin embargo, esta frase no es cierta para los jugadores de computadora controlados por IA, porque la computadora". debe conocer las formas de ganar y calcular la probabilidad de ganar de cada movimiento a cualquier casilla del tablero de ajedrez, es decir, un concepto completo de IA de backgammon debe:
1. conocer todas las combinaciones ganadoras; 2. Crear y utilizar la tabla ganadora; 3. Establecer el puntaje ganador; 4. Darle a la computadora la capacidad de atacar y defender; 1. Encontrar la combinación ganadora de backgammon; La computadora debe saber qué combinaciones ganadoras hay, por lo que debemos encontrar el número total de combinaciones ganadoras. Suponemos que el tablero de ajedrez actual es de 10*10. (1) Calcule el número de combinaciones ganadoras en dirección horizontal. Las combinaciones ganadoras en cada columna son: 6, ***10 columnas, por lo que el número de combinaciones ganadoras en dirección horizontal es: 6*10=60 (2) Calcule el número total de combinaciones ganadoras en la dirección vertical, las combinaciones ganadoras en cada fila son: 6, ***10 filas, entonces el número de combinaciones ganadoras en la dirección vertical es: 6*10=60 (3) Calcule el número total de combinaciones ganadoras en la dirección diagonal, en la diagonal El número total de combinaciones ganadoras es 6 (5 4 3 2 1) * 2 = 36 (4) Calcule el número total de combinaciones ganadoras en la dirección anti-diagonal. El número total de combinaciones ganadoras en la línea antidiagonal es 6 (5 4 3 2 1) * 2 = 36, de modo que el número de todas las combinaciones ganadoras es: 60 60 36 36 = 192 2. Establezca y utilice la tabla ganadora. Hemos calculado que un tablero de backgammon de 10*10 tendrá 192 formas de ganar, por lo que podemos usar la matriz para construir la mesa ganadora. Las funciones principales de la mesa ganadora son: 1. Determinar si el método ganador actual es válido; Para determinar cuántas piezas del método ganador actual caen en la combinación ganadora. El uso detallado se verá en los siguientes procedimientos. 3. Configuración de la puntuación Para que la computadora determine el mejor movimiento para el siguiente paso del juego, primero debe calcular la puntuación de cualquier espacio en el tablero de ajedrez que juegue la computadora, y la puntuación más alta es la mejor jugada para la computadora. para el siguiente paso. Principio: Determinamos cuántas formas de ganar entre el espacio actualmente discutido y el punto actualmente discutido. Si hay varias formas de ganar el espacio, sumaremos puntos. Este principio puede parecer imposible al principio, pero no importa. Comprenderá este principio de toma de decisiones cuando comprenda nuestros procedimientos posteriores. Este tipo de toma de decisiones tiene algunos defectos, porque si se diseña basándose únicamente en este modelo, es posible que cuando la computadora o el jugador tenga tres piezas en línea, la computadora no pueda juzgarlas. son las mejores posiciones actuales para ganar sin atacar ni defender. No importa, podemos cambiar completamente la situación de puntuación actual mediante un algoritmo de fortalecimiento. Es decir, cuando la computadora o el jugador tiene tres o cuatro piedras conectadas en una línea, utilizamos el algoritmo de fortalecimiento para cambiar la puntuación actual. el espacio relacionado con las tres o cuatro piedras El valor aumenta para compensar esta deficiencia. 4. Ataque y defensa En el método anterior, de hecho, la computadora solo calcula la mejor posición de ataque. Para defender, también debemos calcular la mejor posición de ataque del jugador actual. ¿De qué sirve esto? La razón es muy simple. Si la puntuación de la mejor posición de ataque del jugador es mayor que la puntuación de la mejor posición de ataque de la computadora, entonces la computadora colocará la siguiente pieza de ajedrez en la mejor posición de ataque del jugador para evitar el ataque del jugador. la computadora moverá la pieza de ajedrez desde tu mejor posición de ataque. De hecho, este concepto de IA es muy poderoso. Si no eres un muy buen jugador de backgammon, la computadora puede derrotarte muy rápidamente. Soy un jugador de ajedrez intermedio en Lianzhong y mi tasa de victorias no es muy alta cuando juego contra este concepto. Utilice vb.net para escribir Gobang 1. Preparación antes de escribir: 1. Utilice el pensamiento informático para describir todo el proceso de juego de ajedrez. Considere los pasos: (1) Para simplificar, podemos dejar que la computadora haga el primer movimiento cada vez. La computadora hace un movimiento. Esto bloqueará muchas situaciones ganadoras posibles para los jugadores. (2) Cuando un jugador mueve ajedrez, primero debemos considerar la legalidad del movimiento del jugador. (3) Si es legal, los jugadores también bloquearán muchas posibles situaciones ganadoras para las computadoras.
(4) La ruta de pensamiento de la computadora: primero, determine si todas las combinaciones ganadoras del jugador actual y la computadora necesitan mejorarse.
Sí, se realizan asignaciones mejoradas; de lo contrario, se realizan asignaciones normales. (5) Compare el jugador actual y la computadora para ver quién tiene la puntuación más alta. El punto con la puntuación más alta se utiliza como siguiente movimiento de la computadora. 2. Utilice formularios y herramientas gráficas de vb.net para crear una interfaz de tablero de backgammon (1) Agregue un control de cuadro de imagen para dibujar piezas de ajedrez y tableros de ajedrez (2) Agregue un control de etiqueta para mostrar la marca ganadora actual, que es la marca ganadora actual. Esta etiqueta se muestra cuando un lado gana o empata. (3) Agregar un control del menú principal Función: controlar el inicio o el final del juego (4) Agregar un componente de reproducción multimedia Función: habilitar el programa para reproducir música. 3. Establezca el precio general del marco. Utilizamos un tablero de ajedrez de 10*10 como plataforma principal. Utilice matrices para definir todo el tablero de ajedrez y utilice matrices para definir combinaciones ganadoras y signos ganadores, etc. 2. Declare la matriz global y las variables para definir el escritorio virtual: Dim table(9, 9) As Integer Defina la puntuación del espacio de escritorio del reproductor actual: Dim pscore(9, 9) As Integer Defina la puntuación del escritorio de la computadora actual espacio: Dim cscore(9, 9) Como entero: define la combinación ganadora del jugador: Dim pwin(9, 9, 191) Como booleano: define la combinación ganadora de la computadora: Dim cwin(9, 9, 191) Como booleano: define el indicador de combinación ganadora del jugador: Dim pflag(191) Como booleano Defina el indicador de combinación ganadora de la computadora:
Dim cflag(191) Como booleano Defina el indicador válido del juego: Dim theplayflag como booleano 3. Inicialice el juego'* ******************* ********************************** ****************** ****************
'** Nombre del módulo: initplayenvironment p>
'**
'** Descripción: Las funciones principales de esta función son las siguientes:
'** 1. Establecer música de fondo.
'** 2. Establece que el estado del juego sea válido.
'** 3. Inicializa la etiqueta de estado del juego.
'** 4. Especifique directamente el primer movimiento del ordenador.
'** 5. Inicialice el escritorio de partitura básica.
'** 6. Se inicializan las banderas ganadoras de la computadora y del jugador.
'** 7. Inicializa todas las combinaciones ganadoras.
'** 8. Restablecer la bandera ganadora del jugador.
'**
'********************************* ** **********************************************
Sub initplayenvironment()
player.FileName = ".\music\zhyu01.mid"
player.Play()
theplayflag = True
p>
'El juego es válido
Label1.Visible = False
'No se muestra la etiqueta de estado del juego
PictureBox1.Refresh()
'Borrar el contenido de Picturebox1
yuandian(130, 130)
'Llame a la función de dibujo para dibujar la posición donde La computadora actual va primero
Atenuar i, j, m, n como entero
Para i = 0 a 9
Para j = 0 a 9
table(i, j) = 0
Siguiente
Siguiente
'Inicialización del escritorio
Para i = 0 A 191
pflag(i) = Verdadero
p>
cflag(i) = Verdadero
Siguiente
'Bandera ganadora inicialización
table(4, 4) = 1
'Dado que configuramos la computadora para que vaya primero y apostamos 4,4, establecemos su valor en 1
''' ******** Inicializa la combinación ganadora***** ***
n = 0
Para i = 0 a 9
Para j = 0 a 5
Para m = 0 a 4
pwin(j m, i, n) = Verdadero
cwin(j m , i, n) = Verdadero
Siguiente
n = n 1
Siguiente
Siguiente
Para i = 0 a 9
Para j = 0 a 5
Para m = 0 a 4
pwin(i, j m, n) = Verdadero p>
cwin(i, j m, n) = Verdadero
Siguiente
n = n 1
Siguiente
Siguiente
Para i = 0 a 5
Para j = 0 a 5
Para m = 0 a 4
pwin(j m, i m, n) = Verdadero
cwin(j m, i m, n) = Verdadero
Siguiente
n = n 1
Siguiente
Siguiente
Para i = 0 a 5
Para j = 9 a 4 Paso -1
Para m = 0 a 4
pwin(j - m, i m, n) = Tru
e
cwin(j - m, i m, n) = Verdadero
Siguiente
n = n 1
Siguiente
Siguiente
''' ******** La combinación ganadora de inicialización finaliza*******
Para i = 0 a 191 p>
Si pwin(4, 4, i) = Verdadero Entonces
pflag(i) = Falso
Finalizar si
Siguiente
'Dado que la computadora ha descargado 4,4 bits, necesitamos restablecer la bandera ganadora del jugador
End Sub
Cuatro, manejar eventos del mouse'**** * ************************************************** ***********************
'** Nombre del módulo: themedown
'**
'** Descripción: Esta función realiza principalmente las siguientes funciones:
'** 1. Determinar si la bandera del juego actual es válida.
'** 2. Convierte las coordenadas reales en coordenadas virtuales.
'** 3. Dibuja las piezas del jugador.
'** 4. Ejecute la función de ganar cheque.
'** 5. Ejecutar funciones de algoritmo informático.
'**
'********************************* ** **********************************************
Sub themousedown(ByVal x As Integer, ByVal y As Integer)
Si theplayflag = False Then
Salir de Sub
End If
'Comprueba si el estado del juego es válido
Dim i, j As Integer
Dim zhx, zhy As Integer
zhx = Int(( x - 10) / 30)
zhy = Int((y - 10) / 30)
Para i = 0 a 9
Para j = 0 A 9
p>
Si table(zhx, zhy) gt 0 Entonces
Salir de Sub
Fin
Siguiente
Siguiente
'Compruebe si la cuadrícula actualmente en la que hace clic con el mouse es válida
Atenuar mycolor como color
Atenuar como sistema .Drawing.Graphics
g = PictureBox1.CreateGraphics
mycolor = Color.White
Atenuar pincel1 como System.Drawing.Brush = Nuevo SolidBrush(mycolor)
g.FillEllipse(brush1, zhx * 30 10, zhy * 30 10, 30, 30)
'Dibuja las piezas del jugador
table(zhx, zhy ) = 2
Para i = 0 a 191
Si cwin(zhx, zhy, i) = Verdadero entonces
cflag(i) = Falso p>
End If
Siguiente
'Restablecer la bandera ganadora de la computadora
checkwin()
'Comprueba si el actual el jugador ganó
diannao()
'Algoritmo informático de llamada
End Sub 5. Algoritmo de verificación ganadora. '************************************************ * ***************************
'** Nombre del módulo: checkwin
' * *
'** Descripción: Este módulo realiza las siguientes funciones:
'** 1. Comprobar si hay empate.
'** 2. Comprueba si el ordenador gana.
'** 3. Comprueba si el jugador ganó.
'**
'********************************* ** **********************************************
Sub checkwin()
Atenuar i, j, k, m, n como entero
Atenuar ca como entero
Atenuar pa como entero
Dim cnormal como entero = 0
Para i = 0 a 191
Si cflag(i) = False Entonces
cnormal = cnormal 1
Fin si
Siguiente
Si cnormal = 190 Entonces
Etiqueta1.Visible = Verdadero
Etiqueta1 .Text = "Empate, ¡comienza de nuevo!"
PictureBox1.Refresh()
theplayflag = False
Salir Sub
Fin Si
'Establecer reglas de sorteo
Para i = 0 a 191
Si cflag(i) = True Entonces
ca = 0
Para j = 0 a 9
Para k = 0 a 9
Si tabla(j, k) = 1 Entonces
Si cwin(j, k, i) = True Entonces
ca = ca 1
Finalizar si
Finalizar si
Siguiente
Siguiente
Si ca = 5 Entonces
Label1.Visible = True
Label1.Text = "La computadora ganó, comience de nuevo "
PictureBox1.Refresh()
theplayflag = False
Salir Sub
Finalizar si
Finalizar si
Siguiente
'Comprueba si la computadora gana
For i = 0 To 191
Si pflag(i) = True Entonces
p>
pa = 0
Para j = 0 a 9
Para k = 0 a 9
Si tabla( j, k) = 2 Entonces
Si pwin(j, k, i) = Verdadero Entonces
pa = pa 1
Fin si
Finalizar si
Siguiente
Siguiente
Si pa = 5 Entonces
Etiqueta1.Visible = Verdadero
Label1.Text = "El jugador ganó, por favor comienza de nuevo"
PictureBox1.Refresh()
theplayflag = False
Salir Sub
Finalizar si
Finalizar si
Siguiente
'Comprueba si el jugador ganó p >
Fin Sub 6. Algoritmo informático'*************************************** ****************************************
'** Nombre del módulo: diannao
'**
'** Descripción: Este programa realiza principalmente las siguientes funciones:
'** 1. Inicializar el sistema de asignación .
'** 2. Algoritmo de mejora de asignaciones.
'** 3. Calcula las mejores posiciones de ataque para el ordenador y el jugador.
'** 4. Compara las mejores posiciones de ataque de la computadora y del jugador y determina la mejor estrategia de la computadora.
'** 5. Ejecute la función de ganar cheque.
'**
'********************************* ************************************************* Sub diannao()
Atenuar i, j, k, m, n como entero
Atenuar dc como entero
Atenuar cab como entero
Dim pab como entero
Para i = 0 a 9
Para j = 0 a 9
pscore(i, j) = 0
cscore (i, j) = 0
Siguiente
Siguiente
'Inicializar matriz de asignación
''' ** **** **Algoritmo mejorado por computadora********
Para i = 0 a 191
Si cflag(i) = True Entonces
cab = 0
Para j = 0 a 9
Para k = 0 a 9
Si tabla(j, k) = 1 Entonces p>
Si cwin(j, k, i) = True Entonces
cab = cab 1
Fin si
Fin si
Siguiente
Siguiente
Seleccione Caso cab
Caso 3
Formulario m = 0 a 9
Para n = 0 a 9
Si table(m, n) = 0 entonces
Si cwin(m, n, i) = True entonces
cscore(m, n) = cscore(m, n) 5
Finalizar si
Finalizar si
Siguiente
Siguiente p>
Caso 4
Para m = 0 a 9
Para n = 0 a 9
Si tabla(m, n) = 0 Entonces
Si cwin(m, n, i) = Verdadero entonces
yuandian(m * 30 10, n * 30 10)
table(m, n ) = 1
Para dc = 0 a 191
Si pwin(m, n, dc) = True Entonces
pflag(dc) = False p>
checkwin()
Salir Sub
Finalizar si
Siguiente
Finalizar si
Finalizar si
p>
Siguiente
Siguiente
Finalizar Seleccionar
Finalizar si
Siguiente
Para i = 0 a 191
Si pflag(i) = Verdadero entonces
pab = 0
Para
j = 0 a 9
Para k = 0 a 9
Si table(j, k) = 2 Entonces
Si pwin(j, k, i ) = Verdadero Entonces
pab = pab 1
Finalizar si
Finalizar si
Siguiente
Siguiente
Seleccione el caso pab
Caso 3
Para m = 0 a 9
Para n = 0 a 9
Si tabla(m, n) = 0 Entonces
Si pwin(m, n, i) = Verdadero Entonces
pscore(m, n) = pscore(m, n) 30
Finalizar si
Finalizar si
Siguiente
Siguiente
Caso 4
Para m = 0 a 9
Para n = 0 a 9
Si tabla(m, n) = 0 Entonces
Si pwin(m, n , i) = Verdadero Entonces
yuandian(m * 30 10, n * 30 10)
table(m, n) = 1
Para dc = 0 a 191
Si pwin(m, n, dc) = True Entonces
pflag(dc) = False
checkwin()
Salir Sub
Finalizar si
Siguiente
Finalizar si
Finalizar si
Siguiente
Siguiente
Fin Seleccionar
Finalizar si
Siguiente
''' ******** Computadora Fin del algoritmo mejorado ******** ' ******** Sistema de asignación ********
Para i = 0 a 191
Si cflag(i) = True Entonces
Para j = 0 a 9
Para k = 0 a 9
Si table(j, k) = 0 Entonces
Si cwin(j, k, i) = True Entonces
Para m = 0 a 9
Para n = 0 a 9
Si tabla(m, n) = 1 Entonces
Si cwin(m, n, i) = Verdadero Entonces
cscore(j, k) = cscore(j , k) 1
Fin si
Fin si
Siguiente
Siguiente
Fin si
Finalizar si
Siguiente
Siguiente
Finalizar si
Siguiente
Para i = 0 A 191
Si pflag(i) =
Verdadero Entonces
Para j = 0 a 9
Para k = 0 a 9
Si tabla(j, k) = 0 Entonces
Si pwin(j, k, i) = True Entonces
Para m = 0 a 9
Para n = 0 a 9
Si table( m, n) = 2 Entonces
Si pwin(m, n, i) = Verdadero Entonces
pscore(j, k) = pscore(j, k) 1
Finalizar si
Finalizar si
Siguiente
Siguiente
Finalizar si
Finalizar si
Siguiente
Siguiente
Finalizar si
Siguiente
''' ******** Sistema de fin de tarea********
''' ******** Algoritmo de comparación de puntuación********
Dim a , b, c, d Como número entero
Dim cs como número entero = 0
Dim ps como número entero = 0
Para i = 0 a 9
Para j = 0 a 9
Si cscore(i, j) gt entonces
cs = cscore(i, j)
a = i
b = j
Finalizar si
Siguiente
Siguiente
Para i = 0 A 9
Para j = 0 a 9
Si pscore(i, j) gt; ps Entonces
ps = pscore(i, j)
c = i
d = j
Finalizar si
Siguiente
Siguiente
Si cs gt; ps Entonces
yuandian(a * 30 10, b * 30 10)
tabla(a, b) = 1
Para i = 0 Hasta 191
Si pwin(a, b, i) = True Entonces
pflag(i) = False
Fin
Siguiente
Else
yuandian(c * 30 10, d * 30 10)
table(c, d) = 1
Para i = 0 a 191
Si pwin(c, d, i) = True Entonces
pflag(i) = False
Fin si
Siguiente
End If
''' ******** Fin del algoritmo de comparación de puntuación*********
checkwin()
End Sub 7. Dibujar piezas de ajedrez'************************
************************************************** * *******
'** Nombre del módulo: yuandian
'**
'** Descripción: Esta función realiza principalmente el procesamiento del sorteo de piezas de ajedrez por computadora.
'**
'********************************* ** ********************************************** Sub yuandian( ByVal x As Integer, ByVal y As Integer)
Atenuar mycolor Como Color
Atenuar Como System.Drawing.Graphics
g = PictureBox1.CreateGraphics p>
Dim zhx, zhy como entero
zhx = Int((x - 10) / 30)
zhy = Int((y - 10) / 30)
mycolor = Color.Black
Atenuar pincel1 como System.Drawing.Brush = Nuevo SolidBrush(mycolor)
g.FillEllipse(brush1, zhx * 30 10, zhy * 30 10, 30, 30)
End Sub