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 :
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