Vidéo: Coding Challenge #3: The Snake Game 2024
Le défi de programmation Java s'appuie 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 Java Programming Challenge: un jeu simple de Tic-Tac-Toe et un défi de programmation Java: Ajouter une classe au programme simple Tic-Tac-Toe, vous êtes invité à écrire un programme pour jouer au jeu simple de Tic-Tac-Toe.
En tant que jeu, Tic-Tac-Toe réclame l'utilisation d'un tableau pour représenter l'état du jeu. Sans tableaux, vous devez utiliser une variable distincte pour représenter chaque carré du tableau. Avec un tableau, vous pouvez utiliser une seule variable pour représenter tous les neuf carrés.
Ce défi de programmation est simple: écrire une version améliorée du programme qui utilise des tableaux. Vous devez utiliser au moins deux tableaux dans votre solution:
-
Vous devez utiliser un tableau pour représenter le tableau. Très probablement, vous voudrez utiliser un tableau unidimensionnel avec neuf éléments, comme suit:
0 | 1 | 2 --- | --- | --- 3 | 4 | 5 --- | --- | --- 6 | 7 | 8
En d'autres termes, le carré en haut à gauche (A1) est stocké dans l'élément de tableau 0, et le carré en bas à droite (C3) est stocké dans l'élément de tableau 8.
-
Vous devez également utiliser un tableau pour représenter les huit vecteurs de trois rangs possibles.
Vous pouvez ensuite utiliser ce tableau pour déterminer si l'un des joueurs a gagné la partie. Très probablement, vous voudrez utiliser un tableau à deux dimensions pour cette tâche. Le tableau contiendra huit tableaux à trois éléments, chacun représentant les trois indices d'un vecteur particulier à trois rangs.
Le tableau complet contiendrait les données suivantes:
0 1 2 3 4 5 6 7 8 0 3 6 1 4 7 2 5 8 0 4 8 2 4 6
Une autre exigence de ce programme est que la classe TicTacToeBoard que vous créez pour ce défi doit être complètement compatible avec la classe que vous avez créée pour le défi précédent. En d'autres termes, il doit implémenter exactement les mêmes méthodes. Pour votre commodité, ces méthodes sont répétées dans le tableau suivant.
Parce que ces méthodes se réfèrent aux carrés du tableau tac-tac-toe en utilisant des désignations de lignes-colonnes telles que A1 ou B2, votre implémentation devra mapper ces désignations aux numéros d'index. Par exemple, si la chaîne A1 est passée à la méthode playAt, le programme doit marquer la lecture à l'index 0 dans le tableau.
Constructeur | Description |
---|---|
TicTacToeBoard | Crée un nouveau TicTacToeBoard avec tous les carrés vides. |
Méthode | Description |
void reset () | Réinitialise l'état de chaque carré à vider. |
void playAt (Chaîne carrée, int joueur) | Marque le carré spécifié (A1, A2, A3, B1, B2, B3, C1, C2 ou C3) pour le joueur spécifié (1 pour X, 2 pour O). Lance IllegalArgumentException si square n'est pas une des valeurs autorisées, le joueur n'est pas 1 ou 2, ou le carré spécifié n'est pas vide. |
int isGameOver () | Détermine si la partie est terminée. Renvoie 0 si la partie n'est pas terminée, 1 si X a gagné la partie, 2 si O a gagné la partie, et 3 si la partie est nulle. Les conditions de fin de jeu sont les suivantes:
1: Si une ligne, une colonne ou une diagonale contient tous les X. 2: Si une ligne, une colonne ou une diagonale contient tous les O. 3: S'il n'y a pas de cases vides et que ni X ni O n'ont gagné. |
int getNextMove () | Retourne un entier représentant le coup suivant pour l'adversaire de l'ordinateur. Cette méthode devrait faire un effort rudimentaire pour sélectionner un bon coup, selon la stratégie suivante:
* Si le centre (carré B2) est vide, jouez le carré central. * Si le centre n'est pas vide mais que l'un des quatre coins (carrés A1, A3, C1 ou C3) est vide, jouez un des coins (peu importe lequel). * Si le centre n'est pas vide et qu'aucun coin n'est vide, lisez l'un des bords (carrés A2, B1, B3 ou C2). |
String toString () | Renvoie une chaîne représentant l'état actuel du tableau. La chaîne inclut des caractères de nouvelle ligne pour afficher les lignes ainsi que des lignes de séparation sur des lignes de console séparées, comme dans cet exemple:
O | | O - | - | - | X | - | - | - | X | |
Comme défi supplémentaire, pour cette version du défi TicTacToeBoard, le joueur informatique devrait utiliser une stratégie plus intelligente contre l'adversaire humain. Déterminez le jeu de l'ordinateur comme suit:
-
S'il est possible que l'ordinateur gagne lors de son prochain jeu, l'ordinateur doit jouer dans le carré gagnant.
-
S'il est possible pour l'adversaire humain de gagner lors de son prochain jeu, l'ordinateur devrait jouer dans la case gagnante de l'adversaire humain pour bloquer la victoire.
-
Si le carré central est disponible, l'ordinateur doit prendre le carré central.
-
Si un coin est disponible, l'ordinateur doit jouer dans l'un des coins disponibles.
-
L'ordinateur doit jouer dans un carré de bord disponible.
Notez que pour implémenter cette stratégie, vous devez développer une routine qui peut déterminer si un joueur peut gagner lors de son prochain mouvement. Pour ce faire, vous devrez regarder chacun des huit vecteurs de trois rangs pour déterminer si le vecteur contient un carré vide et si chacun des deux autres carrés contient des marques pour le même adversaire (que est, deux X ou deux O).
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 nécessiterait une logique assez compliquée - quelque chose comme ça serait nécessaire, en supposant que s1, s2, et s3 sont des entiers contenant le contenu des trois carrés de l'un des huit vecteurs trois-de-ligne:
if (s1 == 0 & s2 == 1 & s3 == 1) // X peut gagnez en jouant en s1 si (s2 == 0 & s1 == 1 & s3 == 1) // X peut gagner en jouant en s2 si (s3 == 0 & s1 == 1 & s2 == 1) // X peut gagner en jouant dans s3
Voici donc un conseil: Au lieu d'utiliser 0, 1 et 2 pour représenter un carré vide, un X et un O, utilisez plutôt les nombres premiers 2, 3 et 5.Ensuite, pour déterminer si un joueur peut gagner sur un vecteur donné, il suffit de multiplier les trois valeurs pour ce vecteur. Si le résultat est 18, X peut gagner (233 = 18). Si le résultat est 50, O peut gagner (255 = 50).
Notez également que bien que cette stratégie soit une amélioration par rapport à la stratégie utilisée pour les versions précédentes du programme, elle n'est toujours pas une stratégie parfaite: vous pouvez toujours battre l'ordinateur avec la bonne séquence de jeux. Si vous voulez un défi supplémentaire, réfléchissez à la stratégie supplémentaire qui serait nécessaire pour rendre le jeu impossible à gagner, puis élaborez un moyen d'implémenter la nouvelle stratégie.
Vous pouvez trouver la solution à ce problème dans l'onglet Téléchargements de la page du produit Java Tout-en-un pour les nuls, 4e édition.
Bonne chance!