您的当前位置:首页正文

用rust实现一个贪吃蛇的小游戏

2024-11-28 来源:个人技术集锦

创建项目

cargo new snake -bin

项目结构规划

我们创建三个rs文件分别是:draw.rs,game.rs,snake.rs

  • draw.rs: 用来画出贪吃蛇和对应的食物,里面包括to_coord方法用来把逻辑整数坐标转成屏幕的实际坐标,draw_block 用来画出食物或者贪吃蛇的形状,draw_rectangle用来画一个长方形或者矩形。
  • game.rs:game.rs文件中我们定义一个Game的结构体,里面包括snake,长款,以及食物坐标,等待时间,判断游戏是否结束和食物是否存在。然后实现Game结构体,添加new方法用来初始化结构体,key_pressed方法用来接受上下左右按键来移动贪吃蛇。draw方法用来画出游戏的画布,并且调用了draw.rsdraw_rectangle方法。check_if_snake_alive 判断贪吃蛇是否还存活,update方法用来更新贪吃蛇的状态,比如吃了方块后身体变长等。check_eating 用来检查是否成功吃了随机出现的食物。update_snake方法用来更新贪吃蛇的移动方向,比如说上下左右,并且判断是否吃了食物。add_food 方法是用来食物被贪吃蛇吃了以后随机在游戏画布上添加食物。restart用来重启游戏。
  • snake.rs: 在snake.rs中我们首先定义一个Direction枚举用来记录上下左右按键的方向。然后impl这个枚举,里面 opposite方法用来接受当前方向相反方向的函数。还定义了一个结构体Block 用来存放坐标信息。Snake 结构体定义了三个字段分别是direction类型是Direction,body 则是一个存放Block的LinkedList,tail字段用来存放贪吃蛇尾部信息。impl snake分别有new方法用来创建Snake结构体实例,draw方法用来画出对应的块,head_position存放贪吃蛇头部信息,move_forward方法用来移动贪吃蛇,head_direction 表示贪吃蛇头部方向,next_head方法用于计算蛇头在给定方向后的下一个位置。restore_tail 方法用于恢复尾部块。overlap_tail 方法用于检查给定的坐标 (x, y) 是否与 self.body 中的某个块的坐标重合.

项目时序图

qjcq

draw.rs代码

use piston_window::types::Color;
use piston_window::{rectangle, Context, G2d};

const BLOCK_SIZE: f64 = 25.0;

/// game_coord:这是游戏逻辑中的坐标,通常以网格的形式表示,类似于棋盘上的格子坐标。它通常是一个整数,表示在逻辑网格中的位置。
/// BLOCK_SIZE:这是每个游戏方块在屏幕上的大小。它是一个浮点数,通常以像素为单位,表示单个方块在屏幕上的宽度和高度。
pub fn to_coord(game_coord: i32) -> f64 {
    (game_coord as f64) * BLOCK_SIZE
}

pub fn to_coord_u32(game_coord: i32) -> u32 {
    to_coord(game_coord) as u32
}

pub fn draw_block(color: Color, x: i32, y: i32, con: &Context, g: &mut G2d) {
    // 这里把游戏的逻辑坐标转换成屏幕坐标
    let gui_x = to_coord(x);
    let gui_y = to_coord(y);
    rectangle(
        color,
        [gui_x, gui_y, BLOCK_SIZE, BLOCK_SIZE],
        con.transform,
        g,
    );
}

pub fn draw_rectangle(
    color: Color,
    x: i32,
    y: i32,
    width: i32,
    height: i32,
    con: &Context,
    g: &mut G2d,
) {
    let x = to_coord(x);
    let y = to_coord(y);
    rectangle(
        color,
        [
            x,
            y,
            BLOCK_SIZE * (width as f64),
            BLOCK_SIZE * (height as f64),
        ],
        con.transform,
        g,
    );
}

代码功能解释

这段Rust代码主要用于将游戏逻辑中的坐标转换为屏幕坐标,并绘制游戏中的方块。

控制流图

x, y
开始
转换游戏逻辑坐标为屏幕坐标
计算屏幕坐标 gui_x, gui_y
调用 rectangle 函数绘制方块
结束

详细解释

  1. 常量 BLOCK_SIZE:

    • 定义了每个游戏方块在屏幕上的大小,单位为像素。
  2. 函数 to_coord:

    • 将游戏逻辑中的整数坐标 game_coord 转换为屏幕上的浮点数坐标。
    • 通过将 game_coord 转换为 f64 类型并乘以 BLOCK_SIZE 来实现。
  3. 函数 to_coord_u32:

    • 将游戏逻辑中的整数坐标 game_coord 转换为屏幕上的无符号整数坐标。
    • 先调用 to_coord 函数将 game_coord 转换为浮点数坐标,再将其转换为 u32 类型。
  4. 函数 draw_block:

    • 在屏幕上绘制一个方块。
    • 首先将游戏逻辑中的坐标 xy 转换为屏幕坐标 gui_xgui_y
    • 然后使用 rectangle 函数在指定的位置绘制一个颜色为 color 的方块。

控制流图

x, y
开始
转换游戏逻辑坐标为屏幕坐标
计算屏幕坐标 gui_x, gui_y
调用 rectangle 函数绘制方块
结束

这是贪吃蛇游戏的上半部分,想要看下半部分点个关注呗,谢谢支持哈

显示全文