#tetris #game #command-line #rust

app tetris-rs

基于终端的俄罗斯方块游戏,用Rust编写

4个版本

0.1.4 2023年2月7日
0.1.3 2023年2月3日
0.1.2 2023年2月3日
0.1.0 2023年2月3日

#412 in 游戏

MIT 许可证

34KB
872

tetris-rs

基于命令行的Rust版俄罗斯方块

Rust初学者的好例子 + 项目架构开发

项目结构

├── Cargo.lock
├── Cargo.toml
├── readme.md //this document
├── src
│   ├── bricks.rs
│   ├── display.rs //display game core
│   ├── env.rs // Environment Variable structure
│   ├── game.rs //game core
│   ├── main.rs //entry 
│   └── record.rs //score computing & statistics
└── target
    ├── CACHEDIR.TAG
    ├── debug
    ├── package
    └── release

tetris-rs

开始

将可执行命令添加到您的路径中

cargo install tetris-rs

执行编译后的命令 tetris

tetris

或者,如果您不想让tetris成为全局可识别的可执行命令,您可以下载源文件并手动编译

git clone https://github.com/kunieone/tetris_rs && cd tetris_rs
cargo run .

配置

设置环境变量以进行自定义

# defaults:
FEATURE_BRICK=true #bool

ACCELERATE_MODE=true #bool

WIDTH=13 #number

HEIGHT=20  #number

TEXTURE_FULL='#'  #char
TEXTURE_WALL='O' #char
TEXTURE_EMPTY=' ' #char
TEXTURE_SHADOW='+' #char

示例

TEXTURE_FULL='%' FEATURE_BRICK=false tetris 

砖块

pub enum BrickType {
    // 7 classic bricks
    I,
    O,
    T,
    S,
    Z,
    L,
    J,
    // FEATURE_BRICK to enable feature bricks
    // #
    Dot,
    // # #
    // ###
    Desk,
    // #
    // ##
    Angle,
    // #
    // ##
    //  ##
    W,
    // ##
    Bean,
}

得分计算

  • 消除一行,您将获得 200 分。

  • 每次组合将额外获得 60 分。

  • 每次加速,您将获得 1 分。

impl Record {
    pub fn compute(&mut self, rows_num: usize) {
        if rows_num == 0 {
            self.combo = 0;
            return;
        }
        for _ in 0..rows_num {
            self.combo_once()
        }
    }

    fn combo_once(&mut self) {
        self.score += 200 + (self.combo * 60) as i64;
        self.eliminate_rows += 1;
        self.combo += 1;
        // 计算历史最高连击
        if self.combo > self.high_combo {
            self.high_combo = self.combo
        }
    }
}

加速模式

根据您的分数增加更新频率

pub fn update_by(&mut self, counter: i32) {
    match self.cfg.accelerate {
        true => {
            let time = match self.record.score {
                0..=5999 => 100,
                6000..=9999 => 70,
                10000..=24999 => 60,
                25000..=39999 => 50,
                40000..=59999 => 45,
                _ => 40,
            };
            if counter % (time) == 0 {
                self.update()
            }
        }
        false => {
            if counter % (100) == 0 {
                self.update()
            }
        }
    }
}

依赖项

~3–12MB
~127K SLoC