はじめに
最近諸理由あってRustを勉強していたのですが、一通りThe Rust Programming Languageを終えたのでなんか作ってみよう、というノリで作り始めました。
記事としては内容が薄くなってしまったのでご了承ください。
完成物
コード全体はここに置いてあります。
自分で書いておいてなんですが、可読性を気にせずに書いたので割とスパゲッティコード…反省はしています。
改善点
石の置く位置を入力するときに1文字以下だとpanicが起こる
文字列長を確認せずに1, 2文字目を参照しようとしているために起こります。逆に3文字以上を入力しても特に問題はないです。
確認すればいいだけなんですが治すのが面倒くさくて放置をしています。
たとえば入力値s
に対して
if s.len() == 2 {
/* hogehoge */
}
などとしてあげれば簡単に直せそうです。
入力をミスらなければヨシ!
石をひっくり返す判定が汚い
fn upper_placeable(field: &mut [[Stone; size!()]; size!()], x: u32, y: u32, stone: Stone) -> u32 {
let mut i = 2;
loop {
if y < i {
return 0;
}
if field[(y - 1) as usize][x as usize] == stone.enemy()
&& field[(y - i) as usize][x as usize] == stone
{
return i;
} else if field[(y - i) as usize][x as usize] == Stone::Empty {
return 0;
}
i += 1;
}
}
こういう感じの処理が8個あります。
正直汚いし、似たような処理なので纏められないかなぁと思ってかなり考えたんですが結局いい解決策を思いつきませんでした。
アルゴリズムとか勉強するとできるようになるのかなぁ。みんなどうやっているんだろう。
処理を変えて冗長になったところを直そう
let left = left_placeable(field, x, y, stone);
let right = right_placeable(field, x, y, stone);
let upper = upper_placeable(field, x, y, stone);
let lower = lower_placeable(field, x, y, stone);
let left_upper = left_upper_placeable(field, x, y, stone);
let right_upper = right_upper_placeable(field, x, y, stone);
let left_lower = left_lower_placeable(field, x, y, stone);
let right_lower = right_lower_placeable(field, x, y, stone);
left != 0
|| right != 0
|| upper != 0
|| lower != 0
|| left_upper != 0
|| right_upper != 0
|| left_lower != 0
|| right_lower != 0
もともと*_placeable
関数に石をひっくり返す処理を含めていたので、全部の関数を評価してほしくてこうなったのですが、あとからその処理を別に分けたので不要になりました。
あとがき
改善点はもっとあるような気がしていたけど、やっていることが単純な処理なので現状の自分ではそこまでみつからなかったです。来年とかに見るとまた面白い気がする来年の自分に期待したいです。
色々問題はあるけど動いてるからヨシ!