【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语言绘制一个动态的圣诞树吧》


相关推荐
道友可好2 小时前
AI 怎么自己跑完一个 6 小时的任务?
前端·人工智能·后端
稷下元歌2 小时前
python核心基础,这关于基于Moveltg加 Ros2实战Python编程基础实课
开发语言·python
java1234_小锋2 小时前
Spring Boot 中 Starter 是什么?它的核心规范有哪些?请说明如何自定义一个 Starter。
java·spring boot·后端
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第114题】【并发篇】第14题:说一下悲观锁的优点和缺点?
java·开发语言·面试
雪隐2 小时前
AI股票小助手09-结果展示
人工智能·后端
盒马盒马2 小时前
Rust:Vec
开发语言·rust
doiito2 小时前
【Agent Harness实战】认清现实吧,LLM就是个“超级赌场”,而我们需要的是一套“紧箍咒”
架构·rust
devilnumber2 小时前
Java 迭代器(Iterator)完全指南:从入门到实战
java·开发语言·迭代器
罗超驿2 小时前
13.Java多线程进阶:手动实现线程池与定时器机制详解
开发语言·面试·javaee
VitoChang2 小时前
前端也能快速入门后端! NestJS前台和后台的Auth认证
前端·后端