[Rust] Condition de victoire d'un Morpion ne fonctionnant que pour un joueur.

a marqué ce sujet comme résolu.

Bonjour,

Je poste ce message car je suis en train de coder un petit Morpion en console en Rust mais je suis confronté à un problème après avoir essayé de séparer mon code en fonctions (j’avais fait presque sans la 1ère fois ^^) : ma fonction permettant de vérifier si il y a une victoire (ou une égalité) ne marche que pour la victoire du joueur 1, alors que celle du joueur 2 est un copier-coller de la 1ère et ma fonction permettant de vérifier si il y a une égalité ne marche plus également… Voici ce que j’ai :

Victoire du joueur 1 (correct)
Victoire du joueur 1 (correct)
Victoire du joueur 2 (le jeu continue alors que la partie est censé être finie)
Victoire du joueur 2 (le jeu continue alors que la partie est censé être finie)
Il y a égalité mais le jeu continue...
Il y a égalité mais le jeu continue...

Et voici mon code :

use std::io ;

fn main() {

    let mut actual_player: u8 ;

    println!("\nPlayer 1 : X") ;
    println!("Player 2 : O\n") ;

    let mut game_tab = ["1", "2", "3",
                                "4", "5", "6",
                                "7", "8", "9"] ;

    println!("The tab is :\n") ;

    print_tab(&mut game_tab) ;

    while !is_win(&mut game_tab).0 {

        actual_player = 1 ;

        play(&mut game_tab, actual_player) ;

        if !is_win(&mut game_tab).0 {
            actual_player = 2 ;
            play(&mut game_tab, actual_player) ;
        }

    }

    if is_win(&mut game_tab).1 == 0 {
        println!("\nThe game is finished, EQUALITY !") ;
    } else if is_win(&mut game_tab).1 == 1 {
        println!("\nThe game is finished, CONGRATULATIONS Player 1 (X) for your win !") ;
    } else {
        println!("\nThe game is finished, CONGRATULATIONS Player 2 (O) for your win !") ;
    }

}


fn play(game_tab: &mut [&str; 9], actual_player: u8) {

    let mut num_case = String::new() ;
    let mut index: usize ;

    loop {

        num_case.clear() ;

        if actual_player == 1 {
            println!("Player {}, please type the case where you want place 'X' : ", actual_player) ;
        } else {
            println!("Player {}, please type the case where you want place 'O' : ", actual_player) ;
        }

        io::stdin().read_line(&mut num_case)
            .expect("Failed to read line") ;

        index = match num_case.trim().parse() {

            Ok(num) => num,
            Err(_) => continue,

        };

        index -= 1 ;

        if index >= game_tab.len() {
            continue ;

        } else if game_tab[index].eq("X") || game_tab[index].eq("O") {
            println!("This case is already used !") ;
            continue ;

        } else {
            if actual_player == 1 {
                game_tab[index] = "X" ;
            } else {
                game_tab[index] = "0" ;
            }

            break ;

        }
    }

    print_tab(game_tab) ;

}

fn print_tab(tab: &mut [&str; 9]) {

    println!("+---+----+--+") ;
    println!("| {} | {} | {} |", tab[0], tab[1], tab[2]) ;
    println!("+---+---+---+") ;
    println!("| {} | {} | {} |", tab[3], tab [4], tab[5]) ;
    println!("+---+----+---+") ;
    println!("| {} | {} | {} |", tab[6], tab[7], tab[8]) ;
    println!("+---+---+---+\n") ;

}

fn is_win(tab: &mut [&str; 9]) -> (bool, u8) {

    let mut all = true ;

    // Victoire du joueur 1

    if tab[0] == "X" && tab[1] == "X" && tab[2] == "X"
        || tab[3] == "X" && tab[4] == "X" && tab[5] == "X"
        || tab[6] == "X" && tab[7] == "X" && tab[8] == "X"
        || tab[0] == "X" && tab[3] == "X" && tab[6] == "X"
        || tab[1] == "X" && tab[4] == "X" && tab[7] == "X"
        || tab[2] == "X" && tab[5] == "X" && tab[8] == "X"
        || tab[0] == "X" && tab[4] == "X" && tab[8] == "X"
        || tab[2] == "X" && tab[4] == "X" && tab[6] == "X" {

        (true, 1)

    // Victoire du joueur 2

    } else if tab[0] == "O" && tab[1] == "O" && tab[2] == "O"
        || tab[3] == "O" && tab[4] == "O" && tab[5] == "O"
        || tab[6] == "O" && tab[7] == "O" && tab[8] == "O"
        || tab[0] == "O" && tab[3] == "O" && tab[6] == "O"
        || tab[1] == "O" && tab[4] == "O" && tab[7] == "O"
        || tab[2] == "O" && tab[5] == "O" && tab[8] == "O"
        || tab[0] == "O" && tab[4] == "O" && tab[8] == "O"
        || tab[2] == "O" && tab[4] == "O" && tab[6] == "O" {

        (true, 2)

    // Egalité

    } else {

        for i in 0..tab.len() {

            if tab[i] != "X" && tab[i] != "O" {
                all = false ;
            }

        }

        if all {
            (true, 0)
        } else {
            (false, 0)
        }

    }
}

Cordialement et Merci d’avance ! :)

PS : Je viens de remarquer avec les images le décalage de mon tableau, j’ai rectifié ça ^^.

+0 -0

En fait le player 2 ne marchera pas. Parce que O et 0 ce n’est pas pareil :)

Sinon quelques trucs en vrac:

if all {
            (true, 0)
        } else {
            (false, 0)
        }

// =>
(all, 0)
  • Tes conditions dans le if sont vraiment redondantes, tu peux juste faire des fonctions pour un peu améliorer ce point.

Salut,

Sinon plutôt que de faire des tests pour chaque joueur, tu peux tester si les trois cases alignées sont les mêmes.

if tab[0] == tab[1] && tab[1] == tab[2] 
|| ... 
|| tab[2] == tab[4] && tab[4] == tab[6]
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte