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

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

博客内容主要围绕:

5G/6G协议讲解

高级C语言讲解

Rust语言讲解

文章目录

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

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

一、 Rust Cargo.toml配置文件

yaml 复制代码
[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。值越大越往右边偏移;
rust 复制代码
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语言绘制一个动态的圣诞树吧》


相关推荐
W_326009 分钟前
Python文件进阶:一维数据与 CSV 文件读写
开发语言·python
桦说编程9 分钟前
记一次 Coding Agent 改动带来的bug与启示
后端·agent·vibecoding
302wanger11 分钟前
Mole-在终端里给Mac做减法
后端
Tyler_TXZ25 分钟前
C++C语言之——二叉树
c语言·开发语言·数据结构·c++·二叉树
一心只读圣贤书30 分钟前
本地后端环境与前端联调总结(前端小白视角)
后端
不会代码的小猴1 小时前
C++新增关键字
开发语言·c++·笔记
yaoxin5211231 小时前
497. Java 反射 - 使用反射读取注解
java·开发语言·python
2019一路前行1 小时前
Python 函数式编程
开发语言·python
杨利杰YJlio1 小时前
KB5121003更新详解:安全启动证书、AI组件、资源管理器与安装验证
前端·javascript·后端
忙碌碌粒粒橙1 小时前
《用户付一次钱,你的系统为什么处理了两遍:Webhook 重复投递避坑指南》
后端