FastBond3挑战部分-基于51单片机的贪吃蛇游戏机的完成
该项目使用了51单片机,实现了游戏机的设计,它的主要功能为:实现贪吃蛇游戏的功能。
标签
嵌入式系统
AT89C51
yuan
更新2024-10-21
23

一·项目和设计思路介绍

随着电子技术的发展,基于单片机的电子游戏成为了一种受欢迎的娱乐方式。贪吃蛇游戏是一款经典的小游戏,简单易学但富有挑战性,适合各个年龄段的玩家。该游戏将利用单片机的I/O接口控制显示模块和输入设备,实现基本的贪吃蛇游戏功能。本项目旨在设计并实现一款基于51单片机的贪吃蛇游戏机,使玩家能够通过简单的操作体验到贪吃蛇游戏的乐趣。

二·方案框图和原理图介绍

方案框图:

原理图:

  1. 电源:为整个系统提供电力。
  2. 51单片机:核心控制单元,负责执行程序逻辑。它接受来自数据处理模块和控制按键的输入,并通过内部时钟生成计时信号。
  3. 数据处理:负责处理输入数据并将结果传送至单片机。
  4. 字符库:存储可用于显示的字符,通过单片机与LCD12864液晶显示屏连接。
  5. LCD12864液晶显示屏:用于显示字符库中的字符,显示系统处理后的信息。
  6. 控制按键(上下左右):用户交互接口,允许用户控制系统功能。
  7. 复位,清屏:提供系统的复位和清除显示屏的功能。
  8. 内部时钟生成倒计时:模块用于时间相关功能,如计时或定时操作。
  9. 方块判定:可能涉及某种逻辑判断或状态检测,与数据处理和单片机交互。

三·设计中用到来自指定厂商元器件及设计方向

厂商元器件简介

  • AT89C51由Atmel公司(现为Microchip Technology的一部分)生产的8位微控制器

四·PCB设计介绍及实物展示

布局:

  1. 连接器和插座布局
      • 布局中的连接器排列整齐,但需要注意是否有足够的空间进行插拔和连接。
  2. 过孔和线路布局
      • 过孔密度中等,适当使用过孔能优化信号路径,但需要确认过孔不会干扰其他信号。
  3. 元器件布局
      • 元器件排布紧凑,但要留意散热问题和电源分配路径的优化。
  4. 电源层和地层
      • 需要确保宽的电源和地回路以减少阻抗。

实物图

五·软件代码介绍

以下代码主要声明

  1. 初始化
  2. 食物生成
  3. 显示食物
  4. 蛇的移动
  5. 碰撞检测
  6. 食物碰撞
  7. 绘制蛇
  8. 速度控制
  • 设置随机数生成器
  • 初始化食物状态 和蛇的生命状态 
  • 设置蛇的初始方向、位置和节点数。
  • 打印初始分数和速度。
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
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号