3目並べ1手詰めの問題があったので作ってみました👑
正規表現などを使うのが筋のような気がしますが、関数で作ります
Rust 関数の特徴
returnは最後の行に return ; をつけないでそのものだけ記述(9行目)
随時 return 使えません
&str Stringがややこしいのです
プログラムの内容
1) 問題の場面でoの置ける位置すべてに置く
2) 勝利できるパターンとマッチするか判定
3)マッチすればその置いた場面を表示
ソースリスト
//3目並べで勝つ(一手読み)
fn match_board(board: &str, check: &str) -> i32 {
let mut r = 1;
for (b,c) in board.chars().zip(check.chars()){
if c=='o' && b !='o'{
r = 0;
}
}
r
}
fn print_board(board: & str){
println!("{}\n{}\n{}\n ", &board[..3], &board[3..6], &board[6..]);
}
fn to_win(board: & str) {
println!("** board **");
print_board(board);
println!("-- to win --");
let mut win_sw = 0;
let check = &vec!["ooo......", "...ooo...", "......ooo",
".o..o..o.", "..o..o..o", "o..o..o..",
"..o.o.o..", "o...o...o"];
for i in 0..9{
if &board[i..i+1] == "."{
let next_board = &format!("{}{}{}", &board[..i], "o", &board[i+1..]);
for check_board in check{
if match_board(next_board, check_board) == 1{
print_board(next_board);
win_sw = 1;
}
}
}
}
if win_sw == 0{
println!("NONE...");
}
}
fn main() {
to_win("oo.xx....");
to_win("oox.oxx..");
to_win("o........");
}