Défi de programmation Java: l'ajout de tableaux pour le programme de tic-tac-toe simples

Ce défi de programmation Java se fonde sur les défis précédents de cette série Tic-Tac-Toe et teste votre capacité à utiliser des tableaux - deux d'entre eux, en fait.

Dans Programmation Java Défi: Un Tic-Tac-Toe Jeu Simple et Java Défi de programmation: Ajout de la classe à l'Tic-Tac-Toe programme simple vous êtes mis au défi d'écrire un programme pour jouer le simple jeu de Tic-Tac-Toe.

Comme un jeu, Tic-Tac-Toe crie pour l'utilisation d'un réseau pour représenter le statut du jeu. Sans tableaux, vous devez utiliser une variable distincte pour représenter chaque case de l'échiquier. Avec un tableau, vous pouvez utiliser une seule variable pour représenter l'ensemble des neuf carrés.

Ce défi de programmation est simple: Ecrire une version améliorée du programme qui rend l'utilisation de tableaux. Vous devez utiliser au moins deux tableaux dans votre solution:

  1. Vous devez utiliser un tableau pour représenter le Conseil. Très probablement, vous aurez envie d'utiliser un tableau à une dimension avec neuf éléments, comme suit:

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

    En d'autres termes, en haut à gauche carré (A1) Est stocké dans un élément de tableau 0, et le carré en bas à droite (C3) Est stocké dans l'élément de tableau 8.

  2. Vous devez également utiliser un tableau pour représenter les huit vecteurs possibles de trois-en-a-row.

    Vous pouvez ensuite utiliser ce tableau pour déterminer si l'un des joueurs a gagné la partie. Très probablement, vous aurez envie d'utiliser un tableau à deux dimensions pour cette tâche. Le réseau tiendra huit tableaux, à trois éléments, dont chacun représente les trois indices d'un vecteur de trois-dans-un-rangée particulière.




    La gamme complète devrait contenir les données suivantes:

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

Une exigence supplémentaire de ce programme est que la TicTacToeBoard classe que vous créez pour ce défi doit être totalement compatible avec la classe que vous avez créé pour le défi précédent. En d'autres termes, il doit mettre en oeuvre les mêmes méthodes exactes. Pour votre commodité, ces méthodes sont répétées dans le tableau suivant.

Parce que ces méthodes se rapportent aux cases de l'échiquier tic-tac-toe en utilisant les désignations ligne-colonne comme A1 ou B2, votre mise en œuvre devra cartographier ces désignations à des numéros d'index. Par exemple, si la chaîne A1 est transmise à la méthode playat, le programme doit marquer le jeu à l'index 0 dans le tableau.

La classe TicTacToeBoard
ConstructeurDescription
TicTacToeBoard
Crée un nouveau TicTacToeBoard avec toutes les cases vides.
MéthodeDescription
void reset ()Réinitialise le statut de chaque carré à vide.
annuler playat (carré String, lecteur int)Marque la place indiquée (A1, A2, A3, B1, B2, B3, C1, C2, ou C3) Pour le joueur spécifié (1 pour X, 2 O). Lance IllegalArgumentException si la place ne fait pas partie des valeurs admissibles, joueur est pas 1 ou 2, ou sur la place spécifiée est pas vide.
int isGameOver ()Détermine si le jeu est terminé. Retourne 0 si le jeu est pas fini, 1 si X a gagné la partie, 2 si O a gagné le jeu, et 3 si le jeu est un match nul. Le jeu se terminant conditions sont les suivantes:
1: Si une ligne, une colonne ou diagonale contient tous les X.
2: Si une ligne, une colonne ou diagonale contient toutes les O.
3: Si il n'y a pas des cases vides et ni X ni O a gagné.
int getNextMove ()Renvoie un entier représentant le prochain mouvement de l'adversaire d'ordinateur. Cette méthode devrait faire un effort rudimentaire pour sélectionner un bon mouvement, selon la stratégie suivante:
* Si le centre (place B2) Est vide, jouer le carré central.
* Si le centre ne soit pas vide, mais aucun des quatre coins carrés ( A1, A3, C1, ou C3) Sont vides, jouer l'un des coins (il n'a pas d'importance).
* Si le centre est pas vide et pas de coins sont vides, jouer l'un des bords (carrés A2, B1, B3, ou C2).
String toString ()Retourne une chaîne qui représente l'état actuel de la carte. La chaîne comprend des caractères de nouvelle ligne pour afficher les lignes ainsi que les lignes de séparation sur les lignes de la console séparées, comme dans cet exemple:
O | | O
---| --- | ---
| X |
---| --- | ---
| X |

Comme un autre défi, pour cette version du défi TicTacToeBoard, le joueur de l'ordinateur doit utiliser une stratégie plus intelligente contre l'adversaire humain. Déterminer le jeu de l'ordinateur comme suit:

  1. Si il est possible que l'ordinateur pour gagner sur son prochain jeu, l'ordinateur devrait jouer dans le carré gagnant.

  2. Si il est possible pour l'adversaire humain à gagner sur sa prochaine pièce, l'ordinateur devrait jouer dans le carré gagnant de l'adversaire humaine pour bloquer la victoire.

  3. Si la place du centre est disponible, l'ordinateur doit prendre la place du centre.

  4. Si un carré de coin est disponible, l'ordinateur doit jouer dans l'un des coins disponibles.

  5. L'ordinateur devrait jouer dans un carré de bord disponibles.

Notez que pour mettre en œuvre cette stratégie, vous aurez besoin de développer une routine qui peut déterminer si l'un des joueurs peut gagner sur son prochain mouvement. Pour ce faire, vous aurez à regarder chacun des huit vecteurs, trois-en-a-row pour déterminer si le vecteur contient un carré vide et si le chacune des deux autres carrés contiennent marques pour le même adversaire (que est, deux X ou O de deux).

Vous pouvez le faire en utilisant 0 pour représenter un carré vide, 1 pour représenter un X, et 2 pour représenter un O. Mais cela exigerait une logique assez compliqué - quelque chose comme cela serait nécessaire, en supposant que s1, s2, et s3 sont des nombres entiers qui contiennent le contenu des trois carrés de l'un des vecteurs huit, trois-dans-un-rangée:

si (s1 == 0 s2 == 1 s3 == 1) // X peut gagner en jouant dans s1if (s2 == 0 s1 == 1 s3 == 1) // X peut gagner en jouant dans s2if (s3 == 0 s1 == 1 s2 == 1) // X peut gagner en jouant dans s3

Alors, voici une astuce: Au lieu d'utiliser 0, 1 et 2 pour représenter un carré vide, un X, et un joint, utiliser les nombres premiers 2, 3, et 5 au lieu. Ensuite, pour déterminer si un joueur peut gagner sur un vecteur donné, il suffit de multiplier les valeurs de trois que vecteur. Si le résultat est de 18, X peut gagner (233 = 18). Si le résultat est de 50, O peut gagner (255 = 50).

Notez également que même si cette stratégie est une amélioration par rapport à la stratégie employée pour les versions précédentes du programme, il est pas encore une stratégie parfaite: Vous pouvez toujours battre l'ordinateur avec la bonne séquence de pièces de théâtre. Si vous voulez un défi supplémentaire, examiner ce que serait la stratégie supplémentaire nécessaire pour rendre le jeu impossible à gagner, et ensuite trouver un moyen de mettre en œuvre la nouvelle stratégie.

Vous pouvez trouver la solution à ce défi sur le Téléchargements onglet du Java All-in-One For Dummies, 4ème page de produits d'édition.

Bon chance!


» » » » Défi de programmation Java: l'ajout de tableaux pour le programme de tic-tac-toe simples