rust

2. Programming a Guessing Game

dodogcat 2023. 1. 11. 00:48

랜덤으로 숫자를 뽑은 뒤 사용자가 값을 넣어서 맞추는 프로그램이다.

 

역시 아싸 언어라 선택지에 없다.

use std::io;
use std::cmp::Ordering;
// 기본 라이브러리 집합을 prelude라고 부르기도한다?
use rand::Rng;

fn main() {
    // println! 특) 메크로임
    println!("Guess NUM");

    // rand 를 쓰려면 use도 해야 하지만 Cargo.toml에 추가도 해야함
    // 버전은 알아서 적당히 관리해줌
    let secret_number = rand::thread_rng().gen_range(1..=100);

    println!("secret num is {secret_number}");

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

        // let 으로 변수 선언
        // rust는 기본이 immutable로 상수임.
        let mut guess = String::new();

        // 실패 시 나올거 적어 놔야 함
        io::stdin()
        .read_line(&mut guess)
        .expect("Fail 2 read line");

        // parse의 결과를 match를 통해 컨트롤
        // parse 는 숫자 바꾸기  : u32 라는 타입으로 바꿈
        // trim은 앞 뒤 공백관련 문자들 제거
        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => {
                // println!("{}",_);
                continue;
            },
        };
        
        println!("you guess : {guess}");

        // cmp의 결과들을 match로 컨트롤
        match guess.cmp(&secret_number){
            Ordering::Less => println!("too small!"),
            Ordering::Greater => println!("too big!"),
            Ordering::Equal => {
                println!("perpect");
                break;
            }
        }
    }
}

 

println!을 통한 출력에 변수를 넣으려면 2가지 방식이 있다. {} 안에 변수를 명시하거나 뒤에 인자를 던지는 것.

#![allow(unused)]
fn main() {
    let x = 5;
    let y = 10;

    println!("x = {x} and y + 2 = {}", y + 2);
}

이 외에도 match에서 연결되는 것들을 arm이라 부르거나 Err(_)에서 _가 모든 값을 의미한다고 하는데 자세한 설명이 없기 때문에 넘어가겠다.