Desafío de programación Java: la adición de matrices para el programa de tic-tac-toe sencilla

Este desafío de programación Java se basa en los desafíos anteriores de esta serie Tic-Tac-Toe y pone a prueba su capacidad de utilizar matrices - dos de ellos, de hecho.

En Java Programming Challenge: A Simple Tic-Tac-Toe juego y Desafío de programación Java: Adición de clase al Programa de Tic-Tac-Toe simple que tienen el reto de escribir un programa para jugar el simple juego de Tic-Tac-Toe.

Como un juego, Tic-Tac-Toe clama por el uso de una matriz para representar el estado del juego. Sin matrices, debe utilizar una variable independiente para representar cada casilla del tablero. Con una matriz, se puede utilizar una sola variable para representar a todos los nueve cuadrados.

Este reto de programación es simple: Escribir una versión mejorada del programa que hace uso de arrays. Debe utilizar al menos dos matrices en su solución:

  1. Usted debe utilizar una matriz para representar el tablero. Lo más probable es que usted tendrá que usar una matriz unidimensional con nueve elementos, de la siguiente manera:

     0 | 1 | 2 --- | --- | --- 3 | 4 | 5 --- | --- | --- 6 | 7 | 8

    En otras palabras, la parte superior cuadrada (de izquierdaA1) Se almacena en elemento de la matriz 0, y la plaza de abajo a la derecha (C3) Se almacena en elemento de la matriz 8.

  2. También debe utilizar una matriz para representar los ocho posibles vectores de tres en raya.

    A continuación, puede utilizar esta matriz para determinar si alguno de los jugadores ha ganado la partida. Lo más probable es que usted tendrá que usar una matriz bidimensional para esta tarea. El conjunto tendrá ocho, matrices de tres elementos, cada uno de los cuales representa los tres índices de un vector particular de tres en una fila.

    La gama completa contendrá los siguientes datos:

     0 1 23 4 56 7 80 3 61 4 72 5 80 4 82 4 6 

Un requisito adicional de este programa es que el TicTacToeBoard clase que cree para este desafío debe ser totalmente compatible con la clase que ha creado para el reto anterior. En otras palabras, debe aplicar los mismos métodos exactas. Para su comodidad, estos métodos se repiten en la siguiente tabla.

Debido a que estos métodos se refieren a las casillas del tablero tic-tac-toe utilizando denominaciones fila-columna como A1 o B2, su aplicación deberá mapear estas designaciones de números índices. Por ejemplo, si la cadena A1 se pasa a la método playAt, el programa debe marcar el juego en el índice 0 de la matriz.

La Clase TicTacToeBoard
ConstructorDescripción
TicTacToeBoard
Crea un nuevo TicTacToeBoard con todos los cuadrados vacíos.
ProcedimientoDescripción
void reset ()Restablece el estado de cada plaza de vacío.
anular playAt (plaza String, int jugador)Marca el cuadrado especificado (A1, A2, A3, B1, B2, B3, C1, C2, o C3) Para el jugador especificado (1 de X, 2 para O). Lanza IllegalArgumentException si la plaza no es uno de los valores permitidos, reproductor no es 1 o 2, o la plaza especificada no está vacía.
int isGameOver ()Determina si el juego ha terminado. Devuelve 0 si el juego no ha terminado, 1 si X ha ganado la partida, 2 si O ha ganado la partida, y 3 si el juego es un empate. El juego termina condiciones son las siguientes:
1: Si cualquier fila, columna o diagonal contiene todas las equis.
2: Si cualquier fila, columna o diagonal contiene todos ceros.
3: Si no hay plazas vacías y ni X ni O ha ganado.
int getNextMove ()Devuelve un entero que representa el próximo paso para el opositor de la computadora. Este método debe hacer un esfuerzo rudimentario para seleccionar un buen movimiento, de acuerdo con la siguiente estrategia:
* Si el centro (plaza B2) Está vacía, el juego de la plaza central.
* Si el centro no está vacío pero cualquiera de las cuatro esquinas (cuadrados A1, A3, C1, o C3) Están vacías, jugar una de las esquinas (no importa cuál).
* Si el centro no está vacío y no hay esquinas están vacías, jugar a uno de los bordes (cuadrados A2, B1, B3, o C2).
String toString ()Devuelve una cadena que representa el estado actual de la junta directiva. La cadena incluye caracteres de nueva línea para mostrar las filas, así como líneas de separación de las líneas de consola por separado, como en este ejemplo:
O | | O
---| --- | ---
| X |
---| --- | ---
| X |

Como un reto aún más, para esta versión del desafío TicTacToeBoard, el jugador de la computadora debe utilizar una estrategia más inteligente contra el oponente humano. Determinar el juego del equipo de la siguiente manera:

  1. Si es posible que el equipo para ganar en su siguiente jugada, el equipo debe jugar en la plaza ganar.

  2. Si es posible que el oponente humano para ganar en su siguiente jugada, el equipo debe jugar en la plaza rival humana ganar para bloquear la victoria.

  3. Si la plaza central se encuentra disponible, el equipo debe tomar la plaza central.

  4. Si alguna casilla de la esquina se encuentra disponible, el equipo debe jugar en una de las esquinas disponibles.

  5. El equipo debe jugar en una plaza borde disponible.

Nótese que para poner en práctica esta estrategia, que tendrá que desarrollar una rutina que puede determinar si cualquiera de los jugadores puede ganar en su siguiente movimiento. Para ello, tendrás que mirar en cada una de las ocho, vectores de tres en una fila para determinar si el vector contiene una casilla vacía y si el de cada uno de los otros dos cuadrados contienen marcas para el mismo oponente (que es decir, dos de X o de dos ceros).

Puede hacerlo mediante el uso de 0 a representar a una casilla vacía, 1 para representar una X, y 2 para representar una O. Pero eso requeriría la lógica bastante complicado - algo como esto sería necesario, en el supuesto de que s1, s2, y s3 son números enteros que contienen los contenidos de las tres plazas de uno de los vectores ocho, tres en una fila:

si (== s1 0 s2 == 1 s3 == 1) // X puede ganar jugando en s1if (s2 == 0 s1 == 1 s3 == 1) // X puede ganar jugando en s2if (s3 == 0 s1 == 1 s2 == 1) // X puede ganar jugando en s3

Así que aquí va un consejo: En vez de usar 0, 1 y 2 para representar una casilla vacía, una X y un O, utilice los números primos 2, 3, y 5 en lugar. A continuación, para determinar si un jugador puede ganar en un vector dado, simplemente multiplique los tres valores para ese vector. Si el resultado es 18, X puede ganar (233 = 18). Si el resultado es 50, O puede ganar (255 = 50).

Tenga en cuenta también que a pesar de esta estrategia es una mejora con respecto a la estrategia empleada para las versiones anteriores del programa, todavía no es una estrategia perfecta: Todavía se puede vencer a la computadora con la secuencia correcta de las obras. Si quieres un reto adicional, considere lo que sería necesario para hacer el juego imposible de ganar estrategia adicional, y luego idear una manera de poner en práctica la nueva estrategia.

Usted puede encontrar la solución a este reto en el Descargas pestaña de El Java All-in-One For Dummies, Página cuarto producto Edition.

¡Buena suerte!




» » » » Desafío de programación Java: la adición de matrices para el programa de tic-tac-toe sencilla