2008-10-14 89 views
6

He estado pensando en comenzar un proyecto paralelo en casa para ejercitar mi cerebro un poco. Reversi parece un juego simple, donde la movilidad tiene un efecto profundo en el juego. Es al menos un paso adelante de la punta tres en tic tac. Este sería un jugador individual contra una IA de algún tipo.¿Cómo harías para implementar el juego reversi? (othello)

Estoy pensando en probar esto en C++ en una PC.

¿Qué problemas me puedo encontrar?

¿Qué biblioteca de gráficos recomendaría usted?

¿Qué preguntas no soy lo suficientemente inteligente como para preguntarme?

+1

¿Estás hablando de implementar una estrategia para la reversión o simplemente dejar que dos jugadores jueguen en la computadora? – Barth

+0

una estrategia. buena pregunta. – EvilTeach

Respuesta

2

En general, los problemas que terminará corriendo dependerán de usted y sus enfoques. Friend tiende a decir que el complejo es simple desde una perspectiva diferente.

La elección de la biblioteca de gráficos depende del tipo de juego que va a escribir? OpenGL es una opción común en este tipo de proyectos, pero también podría usar alguna biblioteca de GUI o directamente usar las propias bibliotecas de windows o xorg. Si te va a encantar, simplemente usa OpenGL.

Preguntas que debéis preguntar:

es C++ elección sensata para este proyecto? Considera C y/o python también.Mi respuesta a esto sería que si solo quieres escribir reversi, ve a Python. Pero si quiere aprender un idioma de bajo nivel, primero haga C. C++ es una extensión a C, por lo tanto, hay más para aprender allí que en C. Y a mi juicio, cuanto más se tiene que aprender en C++ no vale la pena el esfuerzo.

¿Cómo se usa la biblioteca de gráficos? Si va a hacer efectos de fantasía, vaya al gráfico de escena. En su lugar, puede renderizar la cuadrícula reversei con botones.

¿Cómo debe implementar la interfaz de usuario, debe utilizar los conceptos de interfaz de usuario común? Los conceptos de UI habituales (ventanas, marcos, botones, barras de menú, diálogos) no son tan buenos como la gente cree que son, hay mucho trabajo para implementarlos correctamente. Aplica el gráfico de escena para interpretar la entrada y prueba diferentes formas inteligentes de controlar el juego. Evite los menús de introducción (son un trabajo tonto e inútil), use argumentos de línea de comando para la mayoría de las configuraciones.

todavía a dar algunas ideas para empezar:

mesa Othello es 8x8, 64 células en general. Puede asignar un byte por cada celda, lo que lo convierte en 64 bytes por cada estado de la placa. Son 8 entradas largas, ¡no mucho! Puede almacenar todo el progreso del juego y el jugador ni siquiera puede notarlo. Por lo tanto, se recomienda implementar el tablero othello como una estructura inmutable que copia siempre cuando cambia un estado. También lo ayudará más adelante con su IA e implementando una función 'deshacer'.

Como un byte puede almacenar más información que solo tres estados (VACÍO, NEGRO, BLANCO), le aconsejo que también proporcione dos estados adicionales (BLACK_ALLOWED, WHITE_ALLOWED, BOTH_ALLOWED). Puede calcular estos valores mientras copia el nuevo estado.

Algoritmo para verificar dónde puede poner un bloque, puede ir al tablero uno por uno, luego rastrear desde celdas vacías a cada dirección para patrones regex: B + W => W ^, W + B => B^De esta manera puedes encapsular las reglas del juego dentro de una interfaz simple que se ocupa de todo.

+1

Un mal consejo. C++ no es solo una extensión, es un enfoque diferente. Lo único que realmente comparten es una sintaxis, no más que C++ comparte con javascript. C++ le daría una tonelada de beneficios, como una mejor administración de la memoria (incluso mediante un impulso), plantillas, objetos, etc., que lo ayudarán. Es más difícil rastrear un estado de programa sin un objeto para ayudar, porque no puede tener datos independientes, ya sea global o en la pila en C. –

3

Problemas ...

Bueno, sólo asegúrese al escribir la parte de la estrategia del juego, no sólo a hacer la jugada que le da la mayoría de las piezas. También debe dar peso a la posición de la tabla. Por ejemplo, si se le da la oportunidad de colocar una pieza en una esquina de la mesa, debe tener prioridad sobre cualquier otra jugada (además de ganar el juego) ya que esa pieza nunca podrá volverse atrás. Y colocar una pieza adyacente a un punto de esquina es casi el peor movimiento que puedes hacer (si el espacio de la esquina está abierto).

Espero que esto ayude!

2

A medida que los chicos estaban sugiriendo mi idea de que le dice por pensar en primer lugar para los algoritmos y la lógica del juego. la siguiente respuesta para mí fue la biblioteca de gráficos, depende de la plataforma de destino, el lenguaje de programación, el marco, etc. Pero como sugiero es utilizar C# con la biblioteca de gráficos Cairo 2D, que puede lograr utilizando el marco Mono (que luego puede orientar a los tres principales sistemas operativos para que tu juego funcione) -> www.mono-project.org. Mientras tanto, encontré esto. Creo que este tipo de recurso te ayudará: http://home.datacomm.ch/t_wolf/tw/misc/reversi/html/index.html. Pero si terminas esto, puedes intentar implementar Sudoku.

2

Querrá examinar el minimax con poda alfa-beta si escribe un AI para jugar en contra. Su motor de búsqueda favorito tendrá mucho que decir sobre el tema.

2

Después de haber dado un golpe en la lógica del juego usted mismo, vaya a leer el capítulo 18 del excelente libro de Peter Norvig Paradigms of AI Programming. (Código de origen here.) Tiene un programa bastante corto y extremadamente legible que puede patear casi cualquier trasero humano; deberías aprender mucho comparando tu solución con eso.

0

Reversi debería ser un juego muy simple de implementar. Es perfecto para aprender algunos algoritmos básicos de teoría de juegos (específicamente min-max) durante la implementación de la IA.

Una cosa a tener en cuenta en la IA es que es perfectamente posible hacer una IA perfecta para Reversi (una que siempre gana sin importar los movimientos de su oponente). Entonces en el lado de la estrategia, si su IA pierde, todavía tiene trabajo que hacer :)

+0

No estoy seguro de si esto es completamente cierto si el oponente también es un AI . Wikipedia dice que el juego perfecto con este juego se cree que termina en empate. – Cheery

+0

No recuerdo exactamente, pero me parece que con dos jugadores de IA, uno de los colores siempre gana (no sé si es blanco o negro) exactamente en un punto. –

+0

Eso no es verdad. Reversi no está resuelto. –

0

Escribí un juego reversi hace muchos años, cuando todavía estaba en la escuela. Su estrategia fue muy simple, solo fue por la cantidad máxima de piezas, pero ponderada por lo que prefirió los bordes y particularmente las esquinas y no le gustaron los cuadrados que arriesgaban a ceder las esquinas.

Esto funcionó bastante bien contra personas que aún no habían descubierto lo que estaba haciendo, pero una vez que lo tenías era muy fácil usar su estrategia en contra de eso. No estoy orgulloso de decir, sin embargo, que me golpeó las primeras veces, ¡aunque lo había escrito!

Una IA adecuada con algunos movimientos de búsqueda anticipada es mucho más complicada. Debería ser un problema interesante, pero en ese momento estaba más interesado en la interfaz de usuario.

+0

La maximización conduce directamente a una pérdida temprana. – EvilTeach

1

Existen muchas bibliotecas pero, por lo que puedo pensar, su juego va a necesitar bibliotecas de eventos y gráficos ... ¡y una biblioteca de sonidos para más diversión! Allegro 5 es la mejor opción ... Es una biblioteca All in one. http://liballeg.org/ Aunque está escrito en lenguaje C, puede crear programas orientados a objetos.

y un tutorial para esto ...

http://fixbyproximity.com/2d-game-development-course/

o puede utilizar las API de bajo nivel como .. OpenGL para gráficos. OpenAL para sonido. glfw para eventos.

pero OpenGL es un gran problema porque tienes que crear tu propio manejador de hojas de sprites y todo eso 2d.

Vaya con allegro ... ¡Complete su juego y luego vaya por OpenGL!

Cuestiones relacionadas