基于Arduino的贪吃蛇游戏机
3D 打印迷你贪吃蛇游戏机:
在数字娱乐高度发达的今天,我们常常怀念那些经典的复古游戏。其中,贪吃蛇游戏无疑是许多人童年的记忆。今天,我将带你走进一个有趣的 DIY 项目——3D 打印迷你贪吃蛇游戏机。这个项目不仅能够让你重温经典,还能让你亲手制作一个属于自己的便携式游戏机。让我们一起探索如何将 3D 打印技术和 Arduino 结合起来,打造一个迷你而功能完备的贪吃蛇游戏机。
项目简介
这个迷你贪吃蛇游戏机是由 CrazyScience 在 Instructables 上分享的。它是一个基于 Arduino 的便携式游戏机,内置经典的贪吃蛇游戏,通过一个摇杆控制器操作,还能发出复古的游戏音效。整个游戏机的外壳是通过 3D 打印制作的,小巧便携,可以通过 USB 供电,随时随地享受游戏的乐趣。
所需材料
在开始制作之前,我们需要准备以下材料和工具:
电子元件
- Arduino Nano:这是一个功能强大的微型控制器,适合用于各种小型项目。
- 摇杆模块:用于控制贪吃蛇的移动方向。
- 蜂鸣器:用于在游戏中发出音效,增加游戏的趣味性。
- OLED 显示模块:用于显示游戏画面,OLED 屏幕具有高对比度和低功耗的特点,非常适合这个项目。
- 跳线:用于连接各个电子元件。
- 小型面包板:方便搭建电路,无需焊接。
3D 打印材料
- PLA 耗材(黑色和白色):用于打印游戏机的外壳。
- 3D 打印机:用于打印外壳部件。
软件工具
- Arduino IDE:用于编写和上传代码到 Arduino Nano。
- Ultimaker Cura 切片软件:用于将 3D 模型文件转换为打印机可以识别的 G-code 文件。
其他工具
- 热熔胶枪:用于固定电子元件和组装外壳。
- 螺丝刀(可选):用于安装摇杆模块。
设计与 3D 打印
设计思路
这个项目的核心在于设计一个既小巧又实用的游戏机外壳。设计时,我考虑到了所有电子元件的尺寸,确保它们能够完美地嵌入外壳中。外壳分为上下两部分,底部用于放置 Arduino Nano 和其他电子元件,顶部则设计了专门的槽位来安装 OLED 显示屏和摇杆模块。
3D 打印过程
- 模型设计:使用 Tinkercad 软件设计了游戏机的外壳模型。Tinkercad 是一个非常易用的在线 3D 建模工具,适合初学者快速上手。你可以根据自己的需求调整模型的尺寸和形状,甚至可以添加一些个性化的装饰元素。
- 切片设置:将设计好的模型文件导出为 STL 格式,然后导入到 Ultimaker Cura 切片软件中。在切片软件中,你可以设置打印参数,如层高、填充密度等。建议使用默认的打印参数,以确保打印质量。
- 打印过程:将 PLA 耗材装入 3D 打印机,开始打印。整个打印过程大约需要 30-40 分钟,具体时间取决于你的打印机性能和设置的打印参数。打印完成后,检查模型是否有瑕疵,如有需要可以进行简单的清理。
如果你没有 3D 打印机,也可以使用硬纸板按照设计尺寸制作外壳,并用胶水固定,虽然效果可能没有 3D 打印的那么精致,但同样可以完成项目。
电路搭建与代码上传
电路连接
在搭建电路之前,我们需要先将代码上传到 Arduino Nano 开发板。以下是详细的连接步骤:
-
连接 OLED 显示屏与开发板:
- OLED 的 SCL 引脚连接到 Arduino Nano 的 A4 引脚。
- OLED 的 SDA 引脚连接到 Arduino Nano 的 A5 引脚。
- OLED 的 VCC 引脚连接到 Arduino Nano 的 5V 引脚。
- OLED 的 GND 引脚连接到 Arduino Nano 的 GND 引脚。
-
连接摇杆模块与开发板:
- 摇杆模块的 VRx 引脚连接到 Arduino Nano 的 A0 引脚。
- 摇杆模块的 VRy 引脚连接到 Arduino Nano 的 A1 引脚。
- 摇杆模块的 VCC 引脚连接到 Arduino Nano 的 5V 引脚。
- 摇杆模块的 GND 引脚连接到 Arduino Nano 的 GND 引脚。
-
连接蜂鸣器与开发板:
- 蜂鸣器的正极引脚连接到 Arduino Nano 的 D2 引脚。
- 蜂鸣器的负极引脚连接到 Arduino Nano 的 GND 引脚。
-
连接电源:
- 将 USB 数据线的一端连接到 Arduino Nano 的 USB 接口,另一端连接到电脑或其他 USB 电源设备。
代码上传
- 安装 Arduino IDE:从 Arduino 官方网站下载并安装 Arduino IDE。
- 安装 OLED 库:在 Arduino IDE 中,打开“草图”->“包含库”->“管理库”,搜索并安装以下库:
- Adafruit GFX Library
- Adafruit SSD1306 Library
- 上传代码:将提供的代码复制到 Arduino IDE 中,选择正确的开发板类型(Arduino Nano)和 COM 端口,然后点击“上传”按钮。
以下是代码示例(部分代码):
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>#define SCREEN_WIDTH 128 // OLED显示屏幕的宽度,以像素为单位
#define SCREEN_HEIGHT 64 // OLED显示屏幕的高度,以像素为单位// 定义OLED显示屏的复位引脚,如果不适用可以设置为 -1
#define OLED_RESET -1Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);// 游戏变量
int snakeX[20], snakeY[20];
int appleX, appleY;
int direction = 0; // 0: 向右,1: 向下,2: 向左,3: 向上
int length = 3;void setup() {// 初始化OLED显示屏if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {Serial.println(F("SSD1306 allocation failed"));for (;;);}display.clearDisplay();display.setTextSize(1); // 设置文本大小display.setTextColor(SSD1306_WHITE); // 设置文本颜色display.setCursor(0, 10); // 设置文本起始位置display.println(F("Snake Game")); // 显示文本display.display(); // 将以上图形操作显示出来delay(2000); // 等待2秒// 初始化贪吃蛇和苹果的位置snakeX[0] = 64; snakeY[0] = 32;snakeX[1] = 56; snakeY[1] = 32;snakeX[2] = 48; snakeY[2] = 32;spawnApple();
}void loop() {// 游戏逻辑moveSnake();checkCollision();displaySnake();delay(200); // 控制游戏速度
}void moveSnake() {// 移动贪吃蛇for (int i = length - 1; i > 0; i--) {snakeX[i] = snakeX[i - 1];snakeY[i] = snakeY[i - 1];}switch (direction) {case 0: snakeX[0] += 8; break; // 向右移动case 1: snakeY[0] += 8; break; // 向下移动case 2: snakeX[0] -= 8; break; // 向左移动case 3: snakeY[0] -= 8; break; // 向上移动}// 检查是否吃到苹果if (snakeX[0] == appleX && snakeY[0] == appleY) {length++;spawnApple();}
}void checkCollision() {// 检查碰撞for (int i = 1; i < length; i++) {if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {// 碰撞到自己,游戏结束display.clearDisplay();display.setTextSize(2);display.setTextColor(SSD1306_WHITE);display.setCursor(10, 20);display.println(F("Game Over!"));display.display();while (1); // 停止程序}}
}void displaySnake() {// 显示贪吃蛇display.clearDisplay();for (int i = 0; i < length; i++) {display.fillRect(snakeX[i], snakeY[i], 8, 8, SSD1306_WHITE);}display.fillRect(appleX, appleY, 8, 8, SSD1306_RED);display.display();
}void spawnApple() {// 随机生成苹果appleX = random(0, SCREEN_WIDTH / 8) * 8;appleY = random(0, SCREEN_HEIGHT / 8) * 8;
}
最终组装
固定 Arduino Nano
- 粘贴 Arduino Nano:将 Arduino Nano 使用热熔胶固定在 3D 打印的底座上。确保 USB 接口朝向底座的开口,以便连接电源。
- 安装 OLED 显示屏:将 OLED 显示屏插入顶部外壳的槽位中,并使用热熔胶固定。
- 安装摇杆模块:将摇杆模块插入顶部外壳的槽位中,并使用热熔胶固定。
组装外壳
- 粘合上下外壳:使用热熔胶将顶部外壳和底座粘合在一起。注意不要使用过多的胶水,以免影响外壳的外观。
- 检查连接:确保所有电子元件的连接牢固,摇杆模块和 OLED 显示屏能够正常工作。
测试与使用
测试步骤
- 连接电源:将 USB 数据线的一端连接到 Arduino Nano 的 USB 接口,另一端连接到充电宝或其他 USB 电源设备。
- 启动游戏:按下摇杆模块的按钮,OLED 显示屏上应该显示贪吃蛇游戏的界面。使用摇杆模块控制贪吃蛇的移动方向,让贪吃蛇吃掉屏幕上的苹果。
- 游戏规则:当贪吃蛇吃到苹果时,蜂鸣器会发出“哔”的一声,同时贪吃蛇的长度会增加。如果贪吃蛇的头部撞到自己的身体,游戏结束,OLED 显示屏上会显示“Game Over”。
使用建议
- 便携性:由于游戏机可以通过 USB 供电,你可以将其连接到任何带有 USB 接口的设备上,如充电宝、电脑等,随时随地享受游戏。
- 个性化:你可以通过修改代码来改变游戏的难度、速度或显示效果。例如,你可以增加更多的水果类型、调整贪吃蛇的移动速度或添加新的音效。
- 扩展功能:你可以尝试添加更多的功能,如计分系统、多个游戏模式或与其他玩家对战的功能。
项目扩展
这个项目不仅是一个有趣的 DIY 项目,还可以根据你的需求进行扩展和定制。以下是一些扩展建议:
- 添加计分系统:通过修改代码,为游戏添加一个计分系统,记录玩家的得分,并在 OLED 显示屏上显示。
- 增加游戏难度:随着游戏的进行,逐渐增加贪吃蛇的移动速度,或者在屏幕上添加障碍物,增加游戏的挑战性。
- 添加更多游戏模式:除了经典的贪吃蛇模式,你还可以添加其他游戏模式,如“时间挑战模式”或“无尽模式”。
- 美化外壳:你可以使用喷漆或贴纸来美化 3D 打印的外壳,使其更加符合你的个人风格。
- 添加 LED 灯效:在游戏机的外壳上安装一些 LED 灯,通过 Arduino 编程控制 LED 的闪烁,为游戏增加更多的视觉效果。
总结
这个 3D 打印迷你贪吃蛇游戏机项目是一个非常有趣且实用的 DIY 项目,它不仅能够让你重温经典的游戏,还能让你亲手制作一个属于自己的便携式游戏机。通过这个项目,你可以学习到 3D 打印、电子电路搭建和 Arduino 编程的基础知识。更重要的是,你可以根据自己的需求对项目进行扩展和定制,让它成为你独一无二的桌面小玩具。
希望这篇文章能够激发你的创造力,让你动手制作属于自己的迷你贪吃蛇游戏机。如果你在制作过程中遇到任何问题,欢迎在评论区留言,我会尽力为你解答。如果你已经完成了这个项目,也欢迎在评论区分享你的作品,让我们一起交流和学习!
希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。
作者:Svan.
注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!
相关文章:

基于Arduino的贪吃蛇游戏机
3D 打印迷你贪吃蛇游戏机: 在数字娱乐高度发达的今天,我们常常怀念那些经典的复古游戏。其中,贪吃蛇游戏无疑是许多人童年的记忆。今天,我将带你走进一个有趣的 DIY 项目——3D 打印迷你贪吃蛇游戏机。这个项目不仅能够让你重温经…...
talk-linux 不同用户之间终端通信
好的!下面是一个完整的指南和脚本,用于在两台 Linux 主机上配置并使用 talk 聊天功能(假设它们在同一个局域网内)。 ⸻ 🧾 一、需求说明 我们需要在两台主机上: 1. 安装 talk 和 talkd 2. 启用 talkd 服…...

【PmHub后端篇】Redis分布式锁:保障PmHub流程状态更新的关键
在分布式系统中,确保数据一致性和操作的正确执行是至关重要的。PmHub项目中,通过集成Redis分布式锁来保障流程状态更新,这是一个非常关键的技术点,以下将详细介绍其原理、实现。 1 本地锁的问题 1.1 常见的本地锁 在Java中&…...
MySQL基础入门:MySQL简介与环境搭建
引言 在数字化转型浪潮中,MySQL作为数据存储的"基石引擎",支撑着从电商交易到金融风控的各类核心业务。其高并发处理能力、灵活的架构设计及跨平台兼容性,使其成为开发者技术栈中的"常青树"。本章节将通过历史溯源、技术…...
力扣-543.二叉树的直径
题目描述 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 class Solution { public:int maxLength(TreeNode *…...

Starrocks的主键表涉及到的MOR Delete+Insert更新策略
背景 写这个文章的作用主要是做一些总结和梳理,特别是正对大数据场景下的实时写入更新策略 COW 和 MOR 以及 DeleteInsert 的技术策略的演进, 这也适用于其他大数据的计算存储系统。该文章主要参考了Primary Key table. 分析总结 Starrocks 的主键表主…...

《操作系统真象还原》第十四章(2)——文件描述符、文件操作基础函数
文章目录 前言文件描述符简介文件描述符原理文件描述符实现修改thread.h修改thread.c 文件操作相关的基础函数inode操作相关函数文件相关函数编写file.h编写file.c 目录相关函数完善fs/dir.h编写fs/dir.c 路径解析相关函数实现文件检索功能修改fs.h继续完善fs.c makefile 结语 …...

EMQX v5.0通过连接器和规则同步数据
1 概述 EMQX数据集成功能,帮助用户将所有的业务数据无需额外编写代码即可快速完成处理与分发。 数据集成能力由连接器和规则两部分组成,用户可以使用数据桥接或 MQTT 主题来接入数据,使用规则处理数据后,再通过数据桥接将数据发…...

2. 盒模型/布局模块 - 响应式产品展示页_案例:电商产品网格布局
2. 盒模型/布局模块 - 响应式产品展示页 案例:电商产品网格布局 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">:root {--primary-color…...

LVGL的三层屏幕结构
文章目录 🌟 LVGL 的三层屏幕架构1. **Top Layer(顶层)**2. **System Layer(系统层)**3. **Active Screen(当前屏幕层)** 🧠 总结对比🔍 整体作用✅ 普通屏幕层对象&…...

【PDF】使用Adobe Acrobat dc添加水印和加密
【PDF】使用Adobe Acrobat dc添加水印和加密 文章目录 [TOC](文章目录) 前言一、添加保护加密口令二、添加水印三、实验四、参考文章总结 实验工具: 1.Adobe Acrobat dc 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加保护加…...
AI 搜索引擎 MindSearch
背景 RAG是一种利用文档减少大模型的幻觉,AI搜索也是 AI 搜索引擎 MindSearch 是一个开源的 AI 搜索引擎框架,具有与 Perplexity.ai Pro 相同的性能。您可以轻松部署它来构建您自己的搜索引擎,可以使用闭源 LLM(如 GPT、Claude…...

Windows下安装mysql8.0
一、下载安装离线安装包 (下载过了,可以跳过) 下载网站:MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/ 二、安装mysql 三、安装完成验证...
【android bluetooth 框架分析 02】【Module详解 7】【VendorSpecificEventManager 模块介绍】
1. 背景 我们在 gd_shim_module 介绍章节中,看到 我们将 VendorSpecificEventManager 模块加入到了 modules 中。 // system/main/shim/stack.cc modules.add<hci::VendorSpecificEventManager>();在 ModuleRegistry::Start 函数中我们对 加入的所有 module…...

水滴Android面经及参考答案
static 关键字有什么作用,它修饰的方法可以使用非静态的成员变量吗? static关键字在 Java 中有多种作用。首先,它可以用来修饰变量,被static修饰的变量称为静态变量。静态变量属于类,而不属于类的某个具体实例…...

工程师必读! 3 个最常被忽略的 TDR 测试关键细节与原理
TDR真的是一个用来看阻抗跟Delay的好工具,通过一个Port的测试就可以看到通道各个位置的阻抗变化。 可是使用上其实没这么单纯,有很多细节需要非常地小心,才可以真正地看到您想看的信息! 就让我们整理3个极为重要的TDR使用小细节&…...

C++中的各式类型转换
隐式转换: 基本类型的隐式转换: 当函数参数类型非精确匹配,但是可以转换的时候发生 如: void func1(double x){cout << x << endl; }void func2(char c){cout << c << endl; }int main(){func1(2);//…...
2025年阿里云ACP人工智能高级工程师认证模拟试题(附答案解析)
这篇文章的内容是阿里云ACP人工智能高级工程师认证考试的模拟试题。 所有模拟试题由AI自动生成,主要为了练习和巩固知识,并非所谓的 “题库”,考试中如果出现同样试题那真是纯属巧合。 1、在PAl-Studio实验运行完毕后,可以右键单…...
如何使用scp命令拉取其他虚拟机中的文件
使用 SCP 命令拉取远程虚拟机文件 scp(Secure Copy)是基于 SSH 协议的安全文件传输工具,可以在本地与远程主机之间复制文件。以下是使用scp从其他虚拟机拉取文件的详细指南: 一、基本语法 bash # 从远程主机复制到本地 scp [选…...

Nacos源码—9.Nacos升级gRPC分析七
大纲 10.gRPC客户端初始化分析 11.gRPC客户端的心跳机制(健康检查) 12.gRPC服务端如何处理客户端的建立连接请求 13.gRPC服务端如何映射各种请求与对应的Handler处理类 14.gRPC简单介绍 10.gRPC客户端初始化分析 (1)gRPC客户端代理初始化的源码 (2)gRPC客户端启动的源码…...
从入门到精通:Drools全攻略
目录 一、Drools 初相识二、快速上手 Drools2.1 环境搭建2.2 第一个 Drools 程序 三、深入理解 Drools 核心概念3.1 规则(Rule)3.2 工作内存(Working Memory)3.3 知识库(Knowledge Base, KieBase)3.4 会话&…...
最大子段和(递推)
题目描述 给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数,表示序列的长度 n。 第二行有 n 个整数,第 i 个整数表示序列的第 i 个数字 ai。 输出格式 输出一行一个整数表示答案。 输…...

【计算机视觉】基于深度学习的实时情绪检测系统:emotion-detection项目深度解析
基于深度学习的实时情绪检测系统:emotion-detection项目深度解析 1. 项目概述2. 技术原理与模型架构2.1 核心算法1) 数据预处理流程2) 改进型MobileNetV2 2.2 系统架构 3. 实战部署指南3.1 环境配置3.2 数据集准备3.3 模型训练3.4 实时推理 4. 常见问题与解决方案4.…...
Windows CMD通过adb检查触摸屏Linux驱动是否被编译
检查 CONFIG_TOUCHSCREEN_GT9XX 是否启用,检查内核是否编译了Goodix GT9XX系列触摸屏的驱动支持 Windows CMD.exe输入: adb shell “zcat /proc/config.gz | grep CONFIG_TOUCHSCREEN_GT9XX” 如果返回CONFIG_TOUCHSCREEN_GT9XXy,表示驱动已编…...

【图像处理基石】什么是油画感?
在图像处理中,“油画感”通常指图像呈现出类似油画的块状纹理、笔触痕迹或色彩过渡不自然的现象,表现为细节模糊、边缘不锐利、颜色断层或人工纹理明显。这种问题常见于照片处理、视频帧截图或压缩后的图像,本质是画质受损的一种表现。以下是…...

AD PCB布线的常用命令
PCB布线顺序:先信号,再电源,再GNG 1.多根走线的应用 将IC上的引脚分类 更改一类引脚以及引线的颜色,画出走线(将脚引出) 选中这些走线,点击‘交互式总线布线’,便可以多根拉线 shi…...
Python操作Elasticsearch实战指南:从安装到性能调优的全链路解析
一、引言:为什么选择Python+Elasticsearch? Elasticsearch作为分布式搜索引擎,在日志分析、全文检索等场景中表现卓越。Python凭借其简洁语法和丰富生态,成为操作ES的首选语言。本文将带您从环境搭建到性能调优,系统掌握Python操作ES的核心技能。 二、环境准备:三步完成…...

【3-2】HDLC
前言 前面我们提到了 PSTN(Public Switched Telephone Network) ,今天介绍一种很少见的数据链路层的协议,HDLC! 文章目录 前言1. 定义2. 帧边界3. 零比特填充4. 控制字段4.1. 信息帧(I帧)4.2. …...

MySQL 学习(八)如何打开binlog日志
目录 一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)3.2 永久开启(需修改配置文件)3.3 验证是否开启成功3.4 查看 binlog 内容 四、高级配置建议五、注意事项六、开启后的日常维护 知识回顾&a…...
《数据库原理》部分习题解析
《数据库原理》部分习题解析 1. 课本pg196.第1题。 (1)函数依赖 若对关系模式 R(U) 的任何可能的关系 r,对于任意两个元组 t₁ 和 t₂,若 t₁[X] t₂[X],则必须有 t₁[Y] t₂[Y],则称属性集 Y 函数依赖…...