内容介绍
内容介绍
一·项目和设计思路介绍
随着电子技术的发展,基于单片机的电子游戏成为了一种受欢迎的娱乐方式。贪吃蛇游戏是一款经典的小游戏,简单易学但富有挑战性,适合各个年龄段的玩家。该游戏将利用单片机的I/O接口控制显示模块和输入设备,实现基本的贪吃蛇游戏功能。本项目旨在设计并实现一款基于51单片机的贪吃蛇游戏机,使玩家能够通过简单的操作体验到贪吃蛇游戏的乐趣。
二·方案框图和原理图介绍
方案框图:
原理图:
- 电源:为整个系统提供电力。
- 51单片机:核心控制单元,负责执行程序逻辑。它接受来自数据处理模块和控制按键的输入,并通过内部时钟生成计时信号。
- 数据处理:负责处理输入数据并将结果传送至单片机。
- 字符库:存储可用于显示的字符,通过单片机与LCD12864液晶显示屏连接。
- LCD12864液晶显示屏:用于显示字符库中的字符,显示系统处理后的信息。
- 控制按键(上下左右):用户交互接口,允许用户控制系统功能。
- 复位,清屏:提供系统的复位和清除显示屏的功能。
- 内部时钟生成倒计时:模块用于时间相关功能,如计时或定时操作。
- 方块判定:可能涉及某种逻辑判断或状态检测,与数据处理和单片机交互。
三·设计中用到来自指定厂商元器件及设计方向
厂商元器件简介
- AT89C51:由Atmel公司(现为Microchip Technology的一部分)生产的8位微控制器
四·PCB设计介绍及实物展示
布局:
- 连接器和插座布局:
- 布局中的连接器排列整齐,但需要注意是否有足够的空间进行插拔和连接。
- 过孔和线路布局:
- 过孔密度中等,适当使用过孔能优化信号路径,但需要确认过孔不会干扰其他信号。
- 元器件布局:
- 元器件排布紧凑,但要留意散热问题和电源分配路径的优化。
- 电源层和地层:
- 需要确保宽的电源和地回路以减少阻抗。
实物图
五·软件代码介绍
以下代码主要声明
- 初始化
- 食物生成
- 显示食物
- 蛇的移动
- 碰撞检测
- 食物碰撞
- 绘制蛇
- 速度控制
- 设置随机数生成器
- 初始化食物状态 和蛇的生命状态
- 设置蛇的初始方向、位置和节点数。
- 打印初始分数和速度。
void GamePlay(void) {
unsigned char n;
InitRandom(TL0);
food.yes = 1; // 1表示需要出现新食物,0表示食物已存在
snake.life = 0; // 0表示蛇还活着
snake.direction = DOWN;
snake.x[0] = 6; snake.y[0] = 6; // 蛇头坐标
snake.x[1] = 3; snake.y[1] = 6; // 蛇身坐标
snake.node = 3; // 初始蛇的长度
PrintScore();
PrintSpeed();
while (1) {
if (food.yes) { // 检查是否需要新食物
while (1) {
food.x = Random() * 85 + 3;
food.y = Random() * 55 + 3; // 获取随机食物位置
while (food.x % 3 != 0) food.x++;
while (food.y % 3 != 0) food.y++;
for (n = 0; n < snake.node; n++) { // 检查与蛇身体是否重合
if ((food.x == snake.x[n]) && (food.y == snake.y[n])) break;
}
if (n == snake.node) {
food.yes = 0; // 找到有效食物位置
break;
}
}
}
if (!food.yes) {
Lcd_Rectangle(food.x, food.y, food.x + 2, food.y + 2, 1); // 画出食物
}
// 更新蛇的位置
for (n = snake.node - 1; n > 0; n--) {
snake.x[n] = snake.x[n - 1];
snake.y[n] = snake.y[n - 1];
}
switch (snake.direction) {
case DOWN: snake.x[0] += 3; break;
case UP: snake.x[0] -= 3; break;
case RIGHT: snake.y[0] -= 3; break;
case LEFT: snake.y[0] += 3; break;
default: break;
}
for (n = 3; n < snake.node; n++) { // 检查是否撞到自身
if (snake.x[n] == snake.x[0] && snake.y[n] == snake.y[0]) {
GameOver();
snake.life = 1;
break;
}
}
// 检查是否撞墙
if (snake.x[0] < 3 || snake.x[0] >= 90 || snake.y[0] < 3 || snake.y[0] >= 60) {
GameOver();
snake.life = 1;
}
if (snake.life == 1) break; // 若游戏结束则跳出循环
// 检查蛇是否吃到食物
if (snake.x[0] == food.x && snake.y[0] == food.y) {
Lcd_Rectangle(food.x, food.y, food.x + 2, food.y + 2, 0); // 擦除食物
snake.x[snake.node] = 200; // 新节点初始位置在屏幕外
snake.y[snake.node] = 200;
snake.node++; // 蛇长度增加
food.yes = 1; // 需要新食物
if (++Score >= PASSSCORE) {
PrintScore();
GameOver();
break; // 通过分数则结束游戏
}
PrintScore();
}
for (n = 0; n < snake.node; n++) {
Lcd_Rectangle(snake.x[n], snake.y[n], snake.x[n] + 2, snake.y[n] + 2, 1); // 画出蛇
}
delay(Speed * 1000);
Lcd_Rectangle(snake.x[snake.node - 1], snake.y[snake.node - 1], snake.x[snake.node - 1] + 2, snake.y[snake.node - 1] + 2, 0); // 擦除蛇的最后一个段
switch (KeyBuffer) {
case FUNC:
KeyBuffer = 0;
if (++Speed >= 10) Speed = 1;
PrintSpeed();
break;
case DOWN:
KeyBuffer = 0;
if (snake.direction != UP) snake.direction = DOWN;
break;
case UP:
KeyBuffer = 0;
if (snake.direction != DOWN) snake.direction = UP;
break;
case RIGHT:
KeyBuffer = 0;
if (snake.direction != LEFT) snake.direction = RIGHT;
break;
case LEFT:
KeyBuffer = 0;
if (snake.direction != RIGHT) snake.direction = LEFT;
break;
default: break;
}
}
}
六·总结
十分感谢电子森林提供的机会和平台,我通过设计基于51单片机的贪吃蛇游戏机,不仅加深了对单片机应用的理解,也提升了电子设计与编程能力。未来可以在此基础上增加更多功能,如关卡设置、音效增强等。
软硬件
KiCad文件
使用说明
全屏
附件下载
程序.zip
程序
程序.zip
程序
youxiji.kicad_sch
原理图
youxiji.kicad_pcb
PCB
贪吃蛇游戏机PCB图.pdf
PCBPDF图
团队介绍
个人
评论
0 / 100
查看更多