Rust小白自练手项目——贪吃蛇
创作时间:
作者:
@小白创作中心
Rust小白自练手项目——贪吃蛇
引用
CSDN
1.
https://blog.csdn.net/djw_CSDN/article/details/140478178
Rust自练手小项目 - 贪吃蛇
1. 贪吃蛇游戏长什么样子
图片来源于网络
可以看出,基本的贪吃蛇游戏有几个部分:1. 背板;2. 蛇;3. 食物。知道了这些我们就可以进行贪吃蛇的设计了。
2. 贪吃蛇游戏的设计
2.1 方块
显然可以看出,无论是食物、蛇还是背景板,其基本构成都是方块。食物和背景板是一个方块,蛇是很多个方块。因此,先写一个方块:
const BLOCK_SIZE: f64 = 25.0;
#[derive(Debug, Clone)]
pub struct Block {
pub x: i32,
pub y: i32,
}
x
、y
是方块位置坐标,方块大小使用常量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_rangtangle(
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,
)
}
好了,我们已经完成方块的绘制了,很多事件就显然了,比如说食物就是随机在面板的一个位置绘制一个方块,这个问题暂且不表。下面来看看难一点的snake
需要怎么处理。
2.2 蛇的处理
想明白一点,蛇的本质是什么?蛇其实就是一些方块组成的集合罢了。那选用什么数据结构来存储呢,常见数据结构有array
、stack
、queue
、set
、map
。容易想到蛇移动一个位置,就是蛇头前面一个方块进入蛇,蛇尾一个方块离开蛇,这样很容易想到一种数据结构:queue
。因此可以描述队列的结构都行,我们使用LinkList
描述蛇的身体,当然也可以使用VecDeque
。
pub struct Snake {
direction: Direction,
body: LinkedList<Block>,
tail: Option<Block>,
}
这里面还包含着蛇的一个重要特性:移动方向。这是一个枚举,显然只有上、下、左、右咯,
#[derive(Clone, Copy, PartialEq)]
pub enum Direction {
Up,
Down,
Left,
Right,
}
我们知道,如果蛇头向上,那它下一步可以向左、右、上移动,但是不可以向反方向移动,我们在Direction
上实现一个关联函数表示其反方向,
impl Direction {
pub fn opposite(&self) -> Direction {
match *self {
Direction::Up => Direction::Down,
Direction::Down => Direction::Up,
Direction::Left => Direction::Right,
Direction::Right => Direction::Left,
}
}
}
接下来,我们来实现蛇的一些逻辑,
impl Snake {
pub fn new(x: i32, y: i32) -> Snake {
let mut body: LinkedList<Block> = LinkedList::new();
body.push_back(
热门推荐
土酒曲制作其实很简单,6种植物就是常用到的原料,你认识几种?
万亿低空经济催生“飞手”考证热:报价近万,有机构欲10倍扩招教员,职业缺口达百万
风水中的白虎穿堂是什么意思,传统风水学中白虎象征
如何判断是否属于高利贷?法律标准与实践指南
高利贷利息一般多高?法律如何规制?
组织结构优化与团队协作
炖肉加肉蔻的三大好处及经典香料搭配指南
Windows11手柄适配器支持哪些游戏?如何完美适配?
鸭嘴兽——对进化论者来说,问题依旧比答案多
石家庄房价现状分析:供需关系、政策调控与区域发展
减肚子的8个动作
普洱茶价格差异全解析:从原料到市场策略的深度剖析
三角函数降幂公式是什么 如何使用降幂公式
延吉十大美食:从冷面到石锅拌饭,尽显朝鲜族饮食文化魅力
AI将给人类带来的深远变化
全球央行观察|美联储意外“放鸽”背后:“神奇的点阵图”为何仍预测今年降息两次?
美国2月CPI数据低于预期,但通胀压力仍未完全消除
空气净化机的功效与选择(打造清新宜居的室内环境,以空气净化机为先导)
空气净化器效果看不见?可视化的全面测试!
什么是普拉提?做普拉提教练的发展前景如何?
动辄超两个小时,电影单片的片长为何越来越长
示波器的原理和使用方法
2024年全国人均可支配收入突破4万
人工智能方向如何读博
非全日制研究生有正式学籍吗?
深海技术:探索未知的科技前沿
国产游戏表现亮眼:“黑神话”创造历史,广州产品入围游戏界“奥斯卡”
水蒸气烫伤急救法:快速缓解疼痛与红肿的小妙招
制作产品演示宣传三维动画时需要注意的几点问题
T型人与F型人安慰方式大不同:如何秒识他人性格类型