#blocks #game #piece #single-threaded #falling #game-state #tetromino

blocks_lib

仅用于简单基于四联块的落下游戏的游戏逻辑库

4个版本

0.3.3 2024年2月28日
0.3.2 2024年2月16日
0.3.1 2024年2月16日
0.3.0 2024年2月16日

#147 in 游戏


rustblocks 中使用

MIT 许可证

36KB
712

blocks_lib

⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜
⬜🟨🟨⬜⬜🟪⬜⬜⬜⬜⬜⬜⬜⬜⬜🟧⬜🟦⬜⬜⬜⬜⬜🟩🟩⬜🟥🟥⬜⬜
⬜🟨🟨⬜🟪🟪🟪⬜🟫🟫🟫🟫⬜🟧🟧🟧⬜🟦🟦🟦🟦⬜🟩🟩⬜⬜⬜🟥🟥⬜
⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜

Blocks-lib 是一个简单基于四联块的落下游戏的游戏逻辑仅版本。

游戏大致遵循“官方”的四联块动态,但不实现“墙壁踢出”功能。它是完全单线程的,没有异步操作。

安装

cargo添加 blocks_lib

创建和操作游戏

要创建游戏,请调用游戏状态构造函数,添加事件处理程序,然后调用 start()。

    let gs = GameState::new(
        width,
        height,
        hide_next_piece,
        difficulty
    );

    let ev = |ge: &GameEvent, gs: &GameState| match ge {
        ... Do something with the GameEvent to update the presentation ...
    };
    gs.add_event_handler(&ev);
    gs.start();

GameState 结构具有许多方法,用于推动游戏前进和控制四联块

  • GameState::move_left() 将当前四联块向左移动
  • GameState::move_right() 将当前四联块向右移动
  • GameState::move_down() 将当前四联块向下移动
  • GameState::rotate_right() 将当前四联块向右旋转
  • GameState::drop() 释放当前四联块
  • GameState::advance() 通过释放当前四联块并执行其他维护活动来推进游戏。实现通常会定时调用 advanced()。使用 GameState::get_piece_interval() 获取建议的毫秒间隔,尽管实现可以有自己的间隔。

游戏事件

事件处理程序会在重要游戏事件发生时被调用

  • GameEvent::GameStarted 当游戏开始时
  • GameEvent::ScoreChanged 当得分改变时
  • GameEvent::LevelChanged 当级别改变时
  • GameEvent::PieceMoved 当四联块移动时
  • GameEvent::PieceChanged 当当前四联块(和下一个四联块)改变时
  • GameEvent::GameOver 当游戏结束时
  • GameEvent::GameReset 当游戏重置时

视觉实现将响应对这些事件,并查询传递给事件处理程序的游戏状态对象以更新表示层。

游戏状态方法

  • GameState::get_board() 返回当前板上的四联块。板.cells嵌套向量中的每个条目都持有 PieceColor 枚举变体:Wall、Empty、Red、Green、Blue、Yellow、Cyan、Magenta、Orange、Tracer。Wall 和 Tracer 的颜色由实现决定,但建议使用其余的实际颜色名称。Empty 是板上的空白空间。

    以下是一个示例绘图循环

    for y in 0..board.height {
        for x in 0..board.width {
            draw_square(x, y, board.cells[x as usize][y as usize]);
        }
    }
  • GameState::get_next_piece() 返回将放置到板上的下一个四联块
  • GameState::get_score() 返回一个元组 (score, lines, level)
  • GameState::get_status() 返回当前游戏状态。
  • GameState::start() 开始游戏,触发 GameStarted 事件。
  • GameState::add_event_handler(Fn(&GameEvent, &GameState)) 接收一个闭包或函数,并在每次触发 GameEvent 时调用它。处理函数不应尝试修改 GameState(实际上也不能),这纯粹是为了更新用户界面的展示,而不是实现额外的游戏逻辑。

依赖项

~310KB