2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Qiita全国学生対抗戦Advent Calendar 2022

Day 16

Rustで簡単なオセロを作った

Last updated at Posted at 2022-12-15

はじめに

最近諸理由あってRustを勉強していたのですが、一通りThe Rust Programming Languageを終えたのでなんか作ってみよう、というノリで作り始めました。

記事としては内容が薄くなってしまったのでご了承ください。

完成物

よくあるターミナルで遊べるオセロです。
Peek 2022-12-15 16-03.gif

コード全体はここに置いてあります。

自分で書いておいてなんですが、可読性を気にせずに書いたので割とスパゲッティコード…反省はしています。

改善点

石の置く位置を入力するときに1文字以下だとpanicが起こる

Peek 2022-12-15 16-04.gif

文字列長を確認せずに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関数に石をひっくり返す処理を含めていたので、全部の関数を評価してほしくてこうなったのですが、あとからその処理を別に分けたので不要になりました。

あとがき

改善点はもっとあるような気がしていたけど、やっていることが単純な処理なので現状の自分ではそこまでみつからなかったです。来年とかに見るとまた面白い気がする来年の自分に期待したいです。

色々問題はあるけど動いてるからヨシ!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?