【Proteus仿真】【51单片机】贪吃蛇游戏
文章目录
- 一、功能简介
- 二、软件设计
- 三、实验现象
- 联系作者
一、功能简介
本项目使用Proteus8仿真51单片机控制器,使用8*8LED点阵、按键模块等。
主要功能:
系统运行后,可操作4个按键控制小蛇方向。
二、软件设计
/*
作者:嗨小易(QQ:3443792007)*/#include "PBDATA.H"/****************************************蛇体 和 食物 相关的数据 和 函数
*****************************************/
uchar bodyRow[16], bodyCol[16]; // 蛇身的数组uchar code dirRow[4] = {-1, 0, 1, 0}; // 上右下左方向X增量
uchar code dirCol[4] = {0, 1, 0, -1}; // 上右下左方向Y增量
extern uchar dir;
uchar maxRow = 8, maxCol = 8; // 行的范围 [0, maxRow), 列范围同理
uchar speed = 5; // 蛇的速度,单位是50ms
uchar snakeBodyLength = 0; // 蛇身体的长度
uchar isDead = 0; // 表示蛇是否死亡uchar foodRow = 0, foodCol = 0, needCreate = 1; // 食物坐标和食物是否被吃标志void InitSnake()
{bodyRow[0] = 7;bodyCol[0] = 2;bodyRow[1] = 7;bodyCol[1] = 1;snakeBodyLength = 2;dir = 1;// 生成蛇打印的内容Matrix_GenerateTab(bodyRow, bodyCol, snakeBodyLength);// 设置时间种子srand(0);
}void GenerateFood()
{uchar i = 0;while(needCreate) {// 随机生成 Row 和 ColfoodRow = rand() % maxRow;foodCol = rand() % maxCol;// 判断食物是否和当前蛇身体冲突 for(i = 0; i < snakeBodyLength; i++) {if(bodyRow[i] == foodRow && bodyCol[i] == foodCol) {break;}}if(i == snakeBodyLength) {needCreate = 0;bodyRow[snakeBodyLength] = foodRow;bodyCol[snakeBodyLength] = foodCol;} }
}/****************************************定时器相关的代码
*****************************************/uchar count; // time = count * 50msvoid InitTimer()
{TMOD = 0x01;// 初始值 : 50msTH0 = (65536 - 50000) / 256; // 初始值取高八位TL0 = (65536 - 50000) % 256; // 初始值取低八位// 中断开启ET0 = 1; // 开启定时器0的中断EA = 1; // 开启总的中断// 配置TCON// TR0 : 1, 启动定时器0TR0 = 1;
}void TimerIsr() interrupt 1
{uchar nextHeadRow = 0, nextHeadCol = 0, i = 0;// 重新装填// 初始值 : 50msTH0 = (65536 - 50000) / 256; // 初始值取高八位TL0 = (65536 - 50000) % 256; // 初始值取低八位if(count == speed && !isDead) { // count * 50ms 触发一次count = 0;// 生成食物GenerateFood();// 预测蛇头nextHeadRow = bodyRow[0] + dirRow[dir];nextHeadCol = bodyCol[0] + dirCol[dir];if(nextHeadRow >= maxRow || nextHeadRow < 0 || nextHeadCol >= maxCol || nextHeadCol < 0) {isDead = 1;return;}// 身体撞击for(i = 0; i < snakeBodyLength; i++) {if(nextHeadRow == bodyRow[i] && nextHeadCol == bodyCol[i]) {isDead = 1;return;}}// 吃到食物与否if(nextHeadRow == foodRow && nextHeadCol == foodCol) {snakeBodyLength += 1;needCreate = 1;// 再生成新的食物GenerateFood();}// 蛇身体移动for(i = snakeBodyLength - 1; i > 0; i--) {bodyRow[i] = bodyRow[i - 1];bodyCol[i] = bodyCol[i - 1];}// 新的蛇头bodyRow[0] = nextHeadRow;bodyCol[0] = nextHeadCol;// 生成需要显示的图形Matrix_GenerateTab(bodyRow, bodyCol, snakeBodyLength + 1);}count++; // 每50ms进行一次按键扫描DirKeyScan();
}void main()
{uchar i = 0, a = 0;count = speed;InitSnake();InitTimer();while(1){if(isDead) {Matrix_ShowAll();} else {// 打印蛇的身体Matrix_ShowPointByCode(); }}
}
三、实验现象
B站演示视频:https://space.bilibili.com/444388619

联系作者
视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。
相关文章:
【Proteus仿真】【51单片机】贪吃蛇游戏
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用8*8LED点阵、按键模块等。 主要功能: 系统运行后,可操作4个按键控制小蛇方向。 二、软件设计 /* 作者:嗨小易…...
Android 原生定位开发(解决个别手机定位失败问题)
文章目录 前言一、实现步骤二、使用步骤1.服务启动工具类2.实现LocationService 总结 前言 在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便。定位一般分为三种发方案:即GPS定位、Google网络定位以及基站定位。…...
uni-app 中如何实现数据组件间传递?
在 uni-app 中,实现数据组件间传递可以使用 Props 或 Vuex。 Props 是一种组件通信的方式,通过向子组件传递数据来实现组件间的数据传递。下面是一个示例: 父组件: <template><child :message"hello">&l…...
SpringBoot整合自签名SSL证书,转变HTTPS安全访问(单向认证服务端)
前言 HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面,事物皆具两面性,它也是有不足之处的。例如: 通信使用明文(不加密),内容可能会被窃听。不验证通信方的身份,因此有可能会遭遇…...
k8s:endpoint
在 Kubernetes 中,Endpoint 是一种 API 对象,它用于表示集群内某个 Service 的具体网络地址。换句话说,它连接到一组由 Service 选择的 Pod,从而使它们能够提供服务。每个 Endpoint 对象都与相应的 Service 对象具有相同的名称&am…...
最新版星火官方搬运工具6.0,高级搬运,100%过原创,短视频上热门搬运软件黑科技【搬运脚本+使用技术教程】
软件介绍: 高级搬运,条条过原创 短视频暴力热门搬运黑科技 自研摄像头内录突破性技术6.0 无需任何繁琐准备工作安装即用 无需复杂售后培训看教程即可学会 直装直用自研技术更好卖 无需root 无需框架 更方便 无需xposed 无需vcam更安全 适配99%以…...
轧钢厂安全生产方案:AI视频识别安全风险智能监管平台的设计
一、背景与需求 轧钢厂一般都使用打包机对线材进行打包作业,由于生产需要,人员需频繁进入打包机内作业,如:加护垫、整包、打包机检修、调试等作业。在轧钢厂生产过程中,每个班次生产线材超过300件,人员在一…...
Linux Dotnet 程序堆栈监控
# 查看进程 dotnet-stack ps #显示如下2014067 dotnet /usr/share/dotnet/dotnet k1 --LogLevel4 2014087 dotnet /usr/share/dotnet/dotnet --LogLevel4 2014089 dotnet /usr/share/dotnet/dotnet --LogLevel4 # 根据PID查看这个进程每个线程的堆栈 dotnet-stack repor…...
后端设计PG liberty的作用和增量式生成
Liberty(俗称LIB和DB),是后端设计中重要的库逻辑描述文件,这里边包含了除过physical(当然也有一点点涉及)以外所有的信息,对整个后端设计实现有非常大的作用。借此机会,一起LIB做一个…...
Linux 安装 RocketMq
RocketMq是阿里出品(基于MetaQ)的开源中间件,已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现,十万级数据吞吐量,ms级处理速度,分布式架构,功能强大,扩展性强。 官网…...
大数据Doris(十六):Doris表的数据划分
文章目录 Doris表的数据划分 一、Partition 二、 Bucket 三、PROPERTIES 四、 ENGINE Doris表的数据划分 Doris支持单分区和复合分...
管理文件:文件批量重命名,轻松删除文件名中的空格
在文件管理中,我们经常会遇到文件名中带有空格的情况。这些空格可能会使文件在某些情况下难以被正确识别或使用,因此我们需要掌握一些技巧来轻松删除文件名中的空格。现在使用云炫文件管理器批量重命名进行批量处理。以下是如何操作的步骤详解࿱…...
Docker容器技术实战3
8、docker原生网络 Docker原生网络基于Linux桥接技术和虚拟网络接口,使用了Linux内核的网络功能。每个Docker容器都有自己的网络命名空间,这使得容器之间可以使用独立的IP地址,并隔离了容器的网络栈。 当创建一个Docker原生网络时ÿ…...
数字处理-第10届蓝桥杯省赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第3讲。 数字处理ÿ…...
Go并发编程
一、goroutine 和 通道 在Go语言中,每一个并发执行的活动成为goroutine。通道则是每一个goroutine之间传递消息的工具。 1、Goroutine 在一个Go程序中,只有一个主Goroutine来调用main函数。生成新的goroutine也十分简单,例如有一个函数&…...
Nignx及负载均衡动静分离
核心要点:部署后台项目 1.配置jdk环境 1.先将jdk的Linux版本的压缩包上传虚拟机中服务器 2.解压上传的jdk压缩包 tar -zxvf jdk.gz 3.先进入jdk的解压目录,再通过pwd查看当前解压包的路径 4.将 解压包路径 配置到 /etc/profile 5…...
HDFS架构介绍
数新网络_让每个人享受数据的价值浙江数新网络有限公司是一家开源开放、专注于云数据智能操作系统和数据价值流通的服务商。公司自主研发的DataCyber云数据智能操作系统,主要包括数据平台CyberData、人工智能平台CyberAI、数据智能引擎CyberEngine、数据安全平台Cyb…...
微信小程序提示确认框 wx.showModal
核心实现代码如下 wx.showModal({ title: 确认, content: 确定要删除吗?, success (res) { if (res.confirm) { console.log(用户点击确定) } else if (res.cancel) { console.log(用户点击取消) } } })title 是确认框的标题,content 是确认…...
如何设置OBS虚拟摄像头给钉钉视频会议使用
环境: OBS Studio 29.1.3 Win10 专业版 钉钉7.1.0 问题描述: 如何设置OBS虚拟摄像头给钉钉视频会议使用 解决方案: 1.打开OBS 底下来源这添加视频采集设备 选择OBS虚拟摄像头 2.源那再建一个图像,随便选一张图片 3.点击虚…...
SpringCloud 微服务全栈体系(十一)
第十章 RabbitMQ 三、SpringAMQP SpringAMQP 是基于 RabbitMQ 封装的一套模板,并且还利用 SpringBoot 对其实现了自动装配,使用起来非常方便。 SpringAmqp 的官方地址:https://spring.io/projects/spring-amqp SpringAMQP 提供了三个功能&…...
从WordPress同步到数据库:一个真实案例拆解n8n节点间的“数据对话”
从WordPress到数据库:用n8n构建数据管道的实战解剖 当你点击WordPress后台的"发布"按钮时,一篇新文章如何穿越数字世界,精准落入目标数据库的表格中?这背后是一场由n8n节点编排的精密数据芭蕾。本文将带你走进一个真实的…...
SenseVoice-Small ONNX标点评测:CT-Transformer在不同文本长度下的F1值
SenseVoice-Small ONNX标点评测:CT-Transformer在不同文本长度下的F1值 1. 引言 语音识别技术已经深入到我们工作和生活的方方面面,从手机语音助手到会议纪要自动生成,都离不开它的身影。然而,对于很多开发者和小型团队来说&…...
通义千问1.5-1.8B-Chat-GPTQ-Int4 WebUI编程助手效果:对比Claude Code在简单任务上的表现
通义千问1.5-1.8B-Chat-GPTQ-Int4 WebUI编程助手效果:对比Claude Code在简单任务上的表现 最近在折腾本地部署的AI编程助手,发现了一个挺有意思的开源小模型——通义千问1.5-1.8B-Chat的GPTQ-Int4量化版本。别看它体积小,只有1.8B参数&#…...
DeOldify API速率限制:令牌桶算法实现每用户每小时1000次调用
DeOldify API速率限制:令牌桶算法实现每用户每小时1000次调用 1. 为什么需要API速率限制 在构建基于DeOldify的图像上色服务时,我们面临一个重要的技术挑战:如何公平合理地分配计算资源。深度学习模型推理需要消耗大量的GPU计算资源&#x…...
告别硬编码!Activiti7流程变量与监听器实战:动态分配审批人与业务数据流转
Activiti7流程变量与监听器实战:动态审批人分配与业务数据流转 在业务流程管理(BPM)领域,硬编码审批人始终是系统灵活性的主要障碍。当组织架构调整或审批规则变化时,传统方案往往需要重新部署流程定义。本文将深入探…...
Opyrator UI设计技巧:5个Streamlit自动生成界面教程
Opyrator UI设计技巧:5个Streamlit自动生成界面教程 【免费下载链接】opyrator 🪄 Turns your machine learning code into microservices with web API, interactive GUI, and more. 项目地址: https://gitcode.com/gh_mirrors/op/opyrator Opyr…...
如何高效捕获网页媒体资源:猫抓浏览器插件智能解决方案
如何高效捕获网页媒体资源:猫抓浏览器插件智能解决方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在数字内容爆炸的时代,网页中的视频、音频和图片资源往往难以直接保存&…...
为什么你的Markdown文档总是乱糟糟?vscode-markdownlint帮你告别格式噩梦
为什么你的Markdown文档总是乱糟糟?vscode-markdownlint帮你告别格式噩梦 【免费下载链接】vscode-markdownlint Markdown linting and style checking for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-markdownlint 你是否曾因…...
MozJPEG色彩空间扩展终极指南:支持RGBX、BGRX等32位格式的完整教程
MozJPEG色彩空间扩展终极指南:支持RGBX、BGRX等32位格式的完整教程 【免费下载链接】mozjpeg Improved JPEG encoder. 项目地址: https://gitcode.com/gh_mirrors/mo/mozjpeg MozJPEG作为libjpeg-turbo的增强版本,不仅提供了卓越的JPEG压缩性能&a…...
STM32实战指南_基于STM32F103的智能交通灯系统设计与实现(硬件+软件+调试)
1. 项目背景与需求分析 十字路口的交通拥堵是城市治理的经典难题。传统定时切换的交通灯就像个固执的老头子,不管车多车少都按固定节奏工作,经常出现一边排长龙、另一边空荡荡的尴尬场景。这次我们要用STM32F103这颗"最强大脑"给交通灯装上&qu…...
