博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持!
博主链接



一起用Rust绘制一颗圣诞树吧

又是一年圣诞节,我们使用Rust的控制台输出来绘制一颗动态的圣诞树,效果如下:

【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧-LMLPHP

一、 Rust Cargo.toml配置文件

[package]
name = "helloworld"
version = "0.1.0"
edition = "2021"

[dependencies]
text-colorizer = "1.0.0"
rand = "0.8.5"
clearscreen = "3.0.0"

二、代码实现

  • print_rand_leaf():随机化树叶的形状;
  • triangle():绘制圣诞树的每一层;
  • print_tree():调用triangle()完成整个树冠的绘制;
  • print_log():完成整个树杆的绘制;

几个关键常量含义如下:

  • REF_RATE:圣诞树的刷新频率,越小刷新越快;
  • RANDOMNESS:控制树叶中‘ * ’的密度,越大密度越高;
  • WIDTH_FACTOR:控制圣诞树在窗口中的位置,最小值为2。值越大越往右边偏移;
use text_colorizer::*;
use std::thread::sleep;
use std::time::Duration;
use rand::Rng;

static RANDOMNESS:u8 = 5; // 越高树叶越少
static REF_RATE:u64 = 500;
static WIDTH_FACTOR:u16 = 4;

fn print_rand_leaf()
{
    let leaf_types:[&str;5] = [".", "*", "⭐", "🍎", "0"];
    let mut rng = rand::thread_rng();
    let temp = rng.gen_range(0..RANDOMNESS);

    // Giving preference to *
    if temp == 1
    {
        let other = rng.gen_range(0..leaf_types.len());

        if other == 3
        {
            print!("{} ", leaf_types[other].red());
        }
        else if other == 2
        {
            print!("{} ", leaf_types[other].yellow());
        }
        else
        {
            print!("{} ", leaf_types[other]);
        }
    }
    else
    {
        print!("{} ", leaf_types[1].green());
    }

}

fn triangle(f:u16, n:u16, toth:u16)
{
    let _i = WIDTH_FACTOR * toth - 2;
    let _j = WIDTH_FACTOR * toth - 2;
    let mut k = WIDTH_FACTOR * toth - 2;

    for _i in 0..f-1
    {
       k -= 1;
    }

    // number of rows
    for i in f - 1..n
    {
        // space handler
        for _j in 0..k
        {
            print!(" ");
        }

        // decrementing k after each loop
        k = k - 1;

        // number of columns, printing stars
        for _j in 0..=i
        {
            print_rand_leaf();
        }

        print!("\n");
    }
}

// Prints bottom part.
fn print_log(n:u16)
{
    let _i = WIDTH_FACTOR * n - 4;
    let _j = WIDTH_FACTOR * n - 4;
    let k = WIDTH_FACTOR * n - 4;

    for _i in 1..7
    {
        // space handler
        for _j in 0..k
        {
            print!(" ");
        }

        for _j in 1..7
        {
            print!("\x1b[38;5;58m#\x1b[0m");
        }

        print!("\n");
    }
}


// Prints multiple triangles
fn print_tree(h:u16)
{
    let mut start = 1;
    let mut stop = 0;
    let mut diff = 3;

    while stop < h + 1
    {
        stop = start + diff;
        triangle(start, stop, h);
        diff += 1;
        start = stop - 2;
    }
}


fn main() {

    let ht:u16 = 9;

    println!("\n*********MERRY CHRISTMAS*********\n\n");

    loop {
        clearscreen::clear().expect("failed to clear screen");
        print!("\n\n\n");

        print_tree(ht);
        print_log(ht);

        sleep(Duration::from_millis(REF_RATE));
    }
}

祝各位读者,圣诞节快乐

《【2023】Merry Christmas!一起用C语言绘制一个动态的圣诞树吧》



【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧-LMLPHP

12-25 13:10