[Hướng dẫn Rust] Bài 2.3: Game đoán số phần 3 - So sánh input với số ngẫu nhiên

07 tháng 4, 2026·4 phút đọc

Bài viết hướng dẫn cách sử dụng cú pháp match trong Rust để so sánh số đoán của người chơi với số ngẫu nhiên. Các khái niệm shadowing biến, ép kiểu dữ liệu và sử dụng kiểu enum Ordering được trình bày chi tiết, giúp bạn hiểu cách xử lý logic trong game đoán số.

[Hướng dẫn Rust] Bài 2.3: Game đoán số phần 3 - So sánh input với số ngẫu nhiên

[Hướng dẫn Rust] Bài 2.3: Game đoán số phần 3 - So sánh input với số ngẫu nhiên

Trong bài viết này, chúng ta sẽ tiếp tục triển khai game đoán số viết bằng Rust với các kỹ thuật quan trọng như sử dụng match để so sánh giá trị, shadowing biến, ép kiểu dữ liệu và làm quen với kiểu enum Ordering.

Tóm tắt nội dung chính

  • Cách sử dụng biểu thức match trong Rust để so sánh hai giá trị.
  • Khái niệm shadowing: định nghĩa lại biến cùng tên che khuất biến cũ.
  • Ép kiểu dữ liệu từ chuỗi thành số nguyên.
  • Sử dụng enum Ordering với ba giá trị: Less, Greater, Equal.

Mục tiêu game

  • Phát sinh ngẫu nhiên một số nguyên trong khoảng từ 1 đến 100.
  • Yêu cầu người chơi nhập giá trị đoán.
  • So sánh số đoán với số bí mật và thông báo số đoán lớn hay nhỏ hơn số thật.
  • Nếu đoán đúng, in thông báo thắng cuộc.

Cách triển khai code

Trước hết, chương trình tạo ra số ngẫu nhiên và yêu cầu người dùng nhập số đoán dưới dạng chuỗi:

use std::io;
use rand::Rng;

fn main() {
    let range_number = rand::thread_rng().gen_range(1..101);
    println!("Number Guessing Game");
    println!("Guess a number");

    let mut guess = String::new();
    io::stdin().read_line(&mut guess).expect("Could not read the line");

    println!("The number you guessed is:{}", guess);
    println!("The secret number is: {}", range_number);
}

Bước 1: Ép kiểu dữ liệu và shadowing biến

Biến guess ban đầu là chuỗi. Để so sánh được với số kiểu u32, ta cần chuyển chuỗi thành số nguyên không dấu 32-bit. Rust cho phép ta định nghĩa lại biến guess cùng tên, gọi là shadowing, giúp biến mới có kiểu khác mà không gây lỗi:

let guess: u32 = guess.trim().parse().expect("Please enter a number");
  • guess.trim() loại bỏ khoảng trắng và xuống dòng thừa.
  • .parse() chuyển chuỗi thành số, trả về kiểu Result chứa Ok hoặc Err.
  • .expect() dừng chương trình nếu parse không thành công và in lỗi.
  • Biến guess mới sẽ được dùng cho các thao tác sau.

Ví dụ minh họa shadowing:

fn main() {
    let a = 1;
    println!("{}", a);
    let a = "one";
    println!("{}", a);
}

Kết quả sẽ in lần lượt 1 rồi "one" vì biến thứ hai che khuất biến đầu.

Bước 2: So sánh hai số với match và enum Ordering

Rust cung cấp kiểu enum Ordering với 3 giá trị:

  • Ordering::Less (bé hơn)
  • Ordering::Greater (lớn hơn)
  • Ordering::Equal (bằng nhau)

Ta dùng phương thức .cmp() để so sánh guessrange_number, trả về một trong 3 enum trên. Cú pháp match giúp xử lý từng trường hợp dễ dàng:

use std::cmp::Ordering;

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

Ở đây:

  • .cmp(&range_number) so sánh guess với tham chiếu đến range_number.
  • match lần lượt kiểm tra enum trả về để chạy câu lệnh phù hợp.

IDE cũng hỗ trợ suy luận kiểu: nhờ biến guess kiểu u32, biến range_number cũng được suy ra đúng kiểu để so sánh.

Mã nguồn hoàn chỉnh

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

fn main() {
    let range_number = rand::thread_rng().gen_range(1..101);

    println!("Number Guessing Game");
    println!("Guess a number");

    let mut guess = String::new();
    io::stdin().read_line(&mut guess).expect("Could not read the line");

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

    println!("The number you guessed is:{}", guess);

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

    println!("The secret number is: {}", range_number);
}

Kết quả

Chương trình sẽ đọc số nhập từ người dùng, sau đó in ra kết quả so sánh với số bí mật. Ví dụ:

  • Nếu đoán nhỏ hơn số bí mật, in "Too small".
  • Nếu đoán lớn hơn, in "Too big".
  • Nếu đúng, in "You win".

Hiển thị kết quả chương trìnhHiển thị kết quả chương trình


Bài học này giúp bạn làm quen với các cú pháp quan trọng của Rust để xử lý kiểu dữ liệu, so sánh và điều khiển luồng chương trình. Đây là nền tảng để phát triển các ứng dụng tương tác và game đơn giản.

Bài viết được tổng hợp và biên soạn bằng AI từ các nguồn tin tức công nghệ. Nội dung mang tính tham khảo. Xem bài gốc ↗