用rust实现一个贪吃蛇游戏(上)
arduino代码解读复制代码我们创建三个rs文件分别是:,,rust代码解读复制代码这段Rust代码主要用于将游戏逻辑中的坐标转换为屏幕坐标,并绘制游戏中的方块。常量定义:函数 :函数 :函数 :在屏幕上绘制一个方块。参数:逻辑:css代码解读复制代码常量 :函数 :函数 :函数 :css代码解读复制代码
写了这么久的rust知识,但是还没实战过,没有项目怎么行了,记得小时候拿着一个黑白游戏机专注的玩贪吃蛇的时候感觉好快乐,整个人都沉浸在其中,长大了很少玩游戏了,但是年少的记忆还在激荡敲打着我的内心,想着自己也是学编程的能不能写一个贪吃蛇来玩玩呢。今天就带大家用rust实现一个简单的贪吃蛇游戏,编程除了工作我觉得还可以拿来取悦自己啊,用自己学到的知识做出自己喜欢的东西,这本身就是一种高级的享受和娱乐。
创建项目
arduino
代码解读
复制代码
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.rs
的draw_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 中的某个块的坐标重合.
项目时序图
draw.rs代码
rust
代码解读
复制代码
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代码主要用于将游戏逻辑中的坐标转换为屏幕坐标,并绘制游戏中的方块。
-
常量定义:
BLOCK_SIZE
: 定义了每个游戏方块在屏幕上的大小,单位为像素。
-
函数
to_coord
:- 将游戏逻辑中的整数坐标转换为屏幕上的浮点数坐标。
- 参数
game_coord
: 游戏逻辑中的坐标。 - 返回值: 屏幕上的浮点数坐标。
-
函数
to_coord_u32
:- 将游戏逻辑中的整数坐标转换为屏幕上的无符号整数坐标。
- 参数
game_coord
: 游戏逻辑中的坐标。 - 返回值: 屏幕上的无符号整数坐标。
-
函数
draw_block
:-
在屏幕上绘制一个方块。
-
参数:
color
: 方块的颜色。x
,y
: 游戏逻辑中的坐标。con
: 绘制上下文。g
: 绘制目标。
-
逻辑:
- 将游戏逻辑中的坐标转换为屏幕坐标。
- 使用
rectangle
函数绘制方块。
-
控制流图
css
代码解读
复制代码
flowchart TD A[开始] --> B{转换游戏逻辑坐标为屏幕坐标} B -->|x, y| C[计算屏幕坐标 gui_x, gui_y] C --> D[调用 rectangle 函数绘制方块] D --> E[结束]
详细解释
-
常量
BLOCK_SIZE
:- 定义了每个游戏方块在屏幕上的大小,单位为像素。
-
函数
to_coord
:- 将游戏逻辑中的整数坐标
game_coord
转换为屏幕上的浮点数坐标。 - 通过将
game_coord
转换为f64
类型并乘以BLOCK_SIZE
来实现。
- 将游戏逻辑中的整数坐标
-
函数
to_coord_u32
:- 将游戏逻辑中的整数坐标
game_coord
转换为屏幕上的无符号整数坐标。 - 先调用
to_coord
函数将game_coord
转换为浮点数坐标,再将其转换为u32
类型。
- 将游戏逻辑中的整数坐标
-
函数
draw_block
:- 在屏幕上绘制一个方块。
- 首先将游戏逻辑中的坐标
x
和y
转换为屏幕坐标gui_x
和gui_y
。 - 然后使用
rectangle
函数在指定的位置绘制一个颜色为color
的方块。
控制流图
css
代码解读
复制代码
flowchart TD A[开始] --> B{转换游戏逻辑坐标为屏幕坐标} B -->|x, y| C[计算屏幕坐标 gui_x, gui_y] C --> D[调用 rectangle 函数绘制方块] D --> E[结束]
更多推荐
所有评论(0)