🙇

数当てゲームを作って学ぶプログラミングの基本

に公開

最近Rustにハマっている初学者です。

今回は、Rust公式チュートリアルでも紹介されている「数当てゲーム」を作りながら、Rustの基本を体験してみます。

この記事では、初心者の私でも理解できるように一歩ずつ備忘録として書いています!


1. プロジェクトの準備

まずはRustのプロジェクトを作成します。

cargo new guessing_game
cd guessing_game

作成直後は src/main.rs に「Hello, world!」が入っています。

試しに実行してみます。

cargo run

ターミナルに Hello, world! と表示されればOKです!


2. ユーザー入力を受け取る

ゲームなので「プレイヤーが数字を入力できる」ようにします。

Rustで入力を受け取るには std::io を使います。

use std::io;

fn main() {
    println!("数を予想してみて!");
    
    let mut guess = String::new();
    
    io::stdin()
        .read_line(&mut guess)
        .expect("入力の読み込みに失敗しました");
    
    println!("あなたの予想は: {}", guess);
}

ポイント解説:

  • let mut guess = String::new();
    → 入力を保存する変数を作成(可変=mut)
  • io::stdin().read_line(&mut guess)
    → 標準入力から読み込んで、guessに格納
  • .expect(...)
    → 万が一エラーになった時にメッセージを表示

これで数字を入力すると、そのまま表示されます!


3. ランダムな答えを作る

数当てゲームの肝は「隠された答え」です。

Rustでは rand という外部ライブラリを使って乱数を作ります。

まずは Cargo.toml に追加

[dependencies]
rand = "0.8"

乱数を生成

use rand::Rng;

fn main() {
    let secret_number = rand::thread_rng().gen_range(1..101);
    println!("秘密の数: {}", secret_number); // デバッグ用
}

これで1〜100の乱数が生成されます。

実際のゲームでは答えは見せませんが、開発中は表示しておくと便利です。


4. 入力と答えを比較する

次は「当たり・ハズレ」を判定しましょう。

比較には std::cmp::Ordering を使います。

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

fn main() {
    let secret_number = rand::thread_rng().gen_range(1..101);
    
    println!("数を予想してみて!");
    
    let mut guess = String::new();
    
    io::stdin()
        .read_line(&mut guess)
        .expect("入力エラー");
    
    let guess: u32 = guess.trim().parse().expect("数字を入力してください");
    
    println!("あなたの予想: {}", guess);
    
    match guess.cmp(&secret_number) {
        Ordering::Less => println!("小さいです!"),
        Ordering::Greater => println!("大きいです!"),
        Ordering::Equal => println!("正解!!"),
    }
}

ポイント解説:

  • guess.trim().parse()
    → 入力文字列を数値(u32)に変換
  • match guess.cmp(&secret_number)
    → 比較結果に応じて処理を分岐

これで「小さい/大きい/正解!」が出るようになりました。


5. 何度でも挑戦できるようにする

ゲームは一度だけじゃつまらないので、ループを追加します。

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

fn main() {
    let secret_number = rand::thread_rng().gen_range(1..101);
    
    loop {
        println!("数を予想してみて!");
        
        let mut guess = String::new();
        
        io::stdin()
            .read_line(&mut guess)
            .expect("入力エラー");
        
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue, // 数字以外ならスキップ
        };
        
        println!("あなたの予想: {}", guess);
        
        match guess.cmp(&secret_number) {
            Ordering::Less => println!("小さすぎ!"),
            Ordering::Greater => println!("大きすぎ!"),
            Ordering::Equal => {
                println!("正解!!");
                break;
            }
        }
    }
}

ポイント解説:

  • loop { ... }
    → 無限ループ
  • continue
    → 無効な入力をスキップして再度挑戦
  • break
    → 正解したらゲーム終了

これで完成です!


6. まとめ

今回作った数当てゲームで学べること

  • Cargoを使ったプロジェクトの作成
  • ユーザー入力の受け取り方
  • 外部クレート(rand)の利用方法
  • 数値変換(parse)とエラーハンドリング
  • ループと条件分岐

Rustは「型が厳密」「エラー処理がしっかり」しているので、最初は少し面倒に感じるかもしれません。でも逆に言えば、安全に動くプログラムを自然に書けるようになります。


7. 次のステップ

  • 入力回数をカウントして「○回で正解!」と表示してみる
  • 範囲を変更(例:1〜1000にする)
  • 難易度選択を追加して遊びやすくする

Rustを学ぶ第一歩として、このゲームはとても良い教材です。

ぜひ自分なりにアレンジして楽しんでみてください!

Discussion