Rust 数当てゲーム

Rust

前回の続きから。

今回は数当てゲームを作成してみます。

プログラムは1から100の間のあるランダムな数字を生成します。 そしてその値の予想値の入力を促します。 予想値を入力すると大きすぎるあるいは小さすぎると教えてくれます。 当たったらおめでとうと言ってくれます。

この内容です。

Sponsored Link


ソースコード

extern crate rand;

use std::io;
use std::cmp::Ordering;
use rand::Rng;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1, 101);

    loop {
        println!("Please input your guess.");

        let mut guess = String::new();

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

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("You guessed: {}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less    => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal   => {
                println!("You win!");
                break;
            }
        }
    }
}

let

変数を束縛するのはletキーワードを使います。

let foo = bar;

ただ、letだけだとイミュータブル(不変)になります。これに mut というキーワードをつけるとミュータブル(可変)になります。

let mut bar = 5;

静的メソッド

以下のように”::”で静的メソッドを呼び出します。以下はStringのnew()の静的メソッドを呼び出しています。

String::new();

普通にメソッドは”.”繋がりで呼び出します。

prelude

Rustが全てのプログラムにデフォルトで読み込むライブラリは少しだけで、「prelude(プレリュード)」というものを読み込みます。ここにないライブラリは use を使って読み込みます。以下のような感じですね。

use std::io;

expect

expect()メソッドが定義されていて、それが呼び出された値が成功でなければ与えたメッセージと共にpanic!します。 このような panic! はメッセージを表示してプログラムをクラッシュさせます。

引数のプレースフォルダ

println!("x and y: {} and {}", x, y);

extern crate

以下のようにdependenciesで指定したものは

[dependencies]
rand="0.3.0"

extern crate で使用できます。

extern crate rand

型変換

let guess: u32 = guess.trim().parse()
        .expect("Please type a number!");

文字列の parse() メソッドは文字列を何かの数値へとパースします

matchの使い方

        match guess.cmp(&secret_number) {
            Ordering::Less    => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal   => {
                println!("You win!");
                break;
            }
        }

cmp で比較して、Ordering::Lessなどで条件分岐。

エラー処理

let guess: u32 = match guess.trim().parse() {
    Ok(num) => num,
    Err(_) => continue,
};

parse() の返す値は Ordering と同じような enum。
Ok, Errで受け取って、正常系と、以上系の処理を行う

動作確認

$ cargo run
   Compiling guessing_game v0.1.0 (/Users/shohu33/substrate/substrate-package/rust-tutorial/guessing_game)
    Finished dev [unoptimized + debuginfo] target(s) in 3.61s
     Running `target/debug/guessing_game`
Guess the number!
Please input your guess.
o
Please input your guess.
a
Please input your guess.
1
You guessed: 1
Too small!
Please input your guess.
100
You guessed: 100
Too big!
Please input your guess.
50
You guessed: 50
Too small!
Please input your guess.
70
You guessed: 70
Too big!
Please input your guess.
60
You guessed: 60
Too small!
Please input your guess.
65
You guessed: 65
You win!

補足

https://play.rust-lang.org/
というサイトがあって、ブラウザ上でrustを実行できるサイトがあります。
ちょっとしたプログラムを動かすにはこのサイトは活用できそうですね。

Sponsored Link
コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Rust
Rust 所有権

Rustに所有権という考え方があるのですがややこしいのでまとめておきました。 Rust所有権の説明ペ …

Rust
Rustを学ぶ

Substrateのチュートリアルを見ていてRustの理解が必要不可欠な気がしたのでRustを少し学 …