Bonjour a tous !
Le projet que je souhaite réaliser est un projet très complexe et peut etre vraiment dur a mettre en place (mais vous etes là !!).
Alors, j'ai codé un 'petit' programme qui permet de jouer au puissance 4 contre l'arduino avec l'interface du moniteur série. Ici, l'arduino joue totalement aléatoirement (pseudo-aleatoirement en fait...) ; et bien moi ce que je voudrais c'est que l'arduino joue d'une maniere plus competitive et plus avancé pour etre tres forte (voir peut etre quasi-imbattable). Mes recherches m'ont deja conduit au minimax mais je suis pas bien arriver. Pourriez-vous m'aider s'il vous plait, je sais très bien qu'il s'agit d'un projet tres complexe (surtout sur un petit microcontroleur) mais je cherche les pistes possibles. Voici le code que j'ai fait :
char joueur = 'X';
char emplacement[6][7] = {
{' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' '},
{' ', ' ', ' ', ' ', ' ', ' ', ' '}
};
void setup() {
joueur = 'X';
randomSeed(analogRead(A0));
Serial.begin(9600);
Serial.println(" ~~~~~~~~ PUISSANCE 4 ~~~~~~~~");
Serial.println("");
afficher_puissance();
Serial.println("C'est a vous !");
// randomSeed(analogRead(A0));
}
void loop() {
if (joueur == 'O') {
// Ici c'est le tour de l'arduino
int colonne = random(6);
int ligne;
for (ligne = 5; ligne >= 0; ligne--) {
if (emplacement[ligne][colonne] == ' ') {
break;
}
}
emplacement[ligne][colonne] = 'O';
if (verifier_victoire(ligne, colonne)) {
if (joueur == 'O') {
afficher_puissance();
Serial.println("L'ordinateur a gagne !");
while (1);
}
// Réinitialisez le jeu ou effectuez d'autres actions après la victoire
} else {
joueur = 'X';
afficher_puissance();
Serial.println("L'ordinateur a joue.");
Serial.println("C'est a vous !");
}
}
if (Serial.available() > 0) {
String input = Serial.readStringUntil('\n'); // Lire l'entrée jusqu'au caractère de nouvelle ligne
// Vérifier si l'entrée est valide (1 lettre)
if (input.length() == 1 && isalpha(input.charAt(0))) {
char lettre = tolower(input.charAt(0)); // Convertir en minuscule pour gérer les majuscules
int colonne = lettre - 'a'; // Convertir la lettre en indice de colonne (A=0, B=1, ...)
// Trouver la première case vide dans la colonne choisie
int ligne;
for (ligne = 5; ligne >= 0; ligne--) {
if (emplacement[ligne][colonne] == ' ') {
break;
}
}
// Vérifier si les coordonnées sont valides
if (colonne >= 0 && colonne < 7 && ligne >= 0 && ligne < 6) {
emplacement[ligne][colonne] = joueur; // Modifier le tableau
// Afficher le tableau mis à jour
if (verifier_victoire(ligne, colonne)) {
if (joueur == 'X') {
afficher_puissance();
Serial.println("Vous avez gagne !");
}
while (1);
// Réinitialisez le jeu ou effectuez d'autres actions après la victoire
} else {
joueur = 'O';
}
} else {
Serial.println("Coordonnees invalides / Case PLEINE !");
}
} else {
Serial.println("Format des coordonnees invalide !");
}
// Demander de nouvelles coordonnées à l'utilisateur
}
}
void afficher_puissance () {
Serial.println("");
Serial.println(" ___________________________");
Serial.println(" | A | B | C | D | E | F | G |");
for (int i = 0; i < 6; i++) {
// Numéro de ligne
Serial.print(" | ");
for (int j = 0; j < 7; j++) {
Serial.print(emplacement[i][j]); // Affichage du caractère
Serial.print(" | ");
}
Serial.println(); // Nouvelle ligne à la fin de chaque ligne du tableau
}
}
bool verifier_victoire(int ligne, int colonne) {
char joueur_actuel = emplacement[ligne][colonne];
// Vérification horizontale
int compteur = 0;
for (int i = -3; i <= 3; i++) {
if (colonne + i >= 0 && colonne + i < 7 && emplacement[ligne][colonne + i] == joueur_actuel) {
compteur++;
if (compteur >= 4) return true;
} else {
compteur = 0;
}
}
// Vérification verticale
compteur = 0;
for (int i = -3; i <= 3; i++) {
if (ligne + i >= 0 && ligne + i < 6 && emplacement[ligne + i][colonne] == joueur_actuel) {
compteur++;
if (compteur >= 4) return true;
} else {
compteur = 0;
}
}
compteur = 0;
// Vérification diagonale (vers le bas à droite)
for (int i = -3; i <= 3; i++) {
if (ligne - i >= 0 && ligne - i < 6 && colonne + i >= 0 && colonne + i < 7 && emplacement[ligne - i][colonne + i] == joueur_actuel) {
compteur++;
if (compteur >= 4) return true;
} else {
compteur = 0;
}
}
// Vérification diagonale (vers le bas à gauche)
for (int i = -3; i <= 3; i++) {
if (ligne - i >= 0 && ligne - i < 6 && colonne - i >= 0 && colonne - i < 7 && emplacement[ligne - i][colonne - i] == joueur_actuel) {
compteur++;
if (compteur >= 4) return true;
} else {
compteur = 0;
}
}
// Vérification diagonale (vers le bas à gauche)
compteur = 0;
for (int i = -3; i <= 3; i++) {
if (ligne + i >= 0 && ligne + i < 6 && colonne - i >= 0 && colonne - i < 7 && emplacement[ligne + i][colonne - i] == joueur_actuel) {
compteur++;
if (compteur >= 4) return true;
} else {
compteur = 0;
}
}
return false;
}
Merci beaucoup d'avance pour vos réponses