当前位置: 首页 > news >正文

【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单片机控制器&#xff0c;使用8*8LED点阵、按键模块等。 主要功能&#xff1a; 系统运行后&#xff0c;可操作4个按键控制小蛇方向。 二、软件设计 /* 作者&#xff1a;嗨小易…...

Android 原生定位开发(解决个别手机定位失败问题)

文章目录 前言一、实现步骤二、使用步骤1.服务启动工具类2.实现LocationService 总结 前言 在android开发中地图和定位是很多软件不可或缺的内容&#xff0c;这些特色功能也给人们带来了很多方便。定位一般分为三种发方案&#xff1a;即GPS定位、Google网络定位以及基站定位。…...

uni-app 中如何实现数据组件间传递?

在 uni-app 中&#xff0c;实现数据组件间传递可以使用 Props 或 Vuex。 Props 是一种组件通信的方式&#xff0c;通过向子组件传递数据来实现组件间的数据传递。下面是一个示例&#xff1a; 父组件&#xff1a; <template><child :message"hello">&l…...

SpringBoot整合自签名SSL证书,转变HTTPS安全访问(单向认证服务端)

前言 HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面&#xff0c;事物皆具两面性&#xff0c;它也是有不足之处的。例如&#xff1a; 通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能会被窃听。不验证通信方的身份&#xff0c;因此有可能会遭遇…...

k8s:endpoint

在 Kubernetes 中&#xff0c;Endpoint 是一种 API 对象&#xff0c;它用于表示集群内某个 Service 的具体网络地址。换句话说&#xff0c;它连接到一组由 Service 选择的 Pod&#xff0c;从而使它们能够提供服务。每个 Endpoint 对象都与相应的 Service 对象具有相同的名称&am…...

最新版星火官方搬运工具6.0,高级搬运,100%过原创,短视频上热门搬运软件黑科技【搬运脚本+使用技术教程】

软件介绍&#xff1a; 高级搬运&#xff0c;条条过原创 短视频暴力热门搬运黑科技 自研摄像头内录突破性技术6.0 无需任何繁琐准备工作安装即用 无需复杂售后培训看教程即可学会 直装直用自研技术更好卖 无需root 无需框架 更方便 无需xposed 无需vcam更安全 适配99%以…...

轧钢厂安全生产方案:AI视频识别安全风险智能监管平台的设计

一、背景与需求 轧钢厂一般都使用打包机对线材进行打包作业&#xff0c;由于生产需要&#xff0c;人员需频繁进入打包机内作业&#xff0c;如&#xff1a;加护垫、整包、打包机检修、调试等作业。在轧钢厂生产过程中&#xff0c;每个班次生产线材超过300件&#xff0c;人员在一…...

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&#xff08;俗称LIB和DB&#xff09;&#xff0c;是后端设计中重要的库逻辑描述文件&#xff0c;这里边包含了除过physical&#xff08;当然也有一点点涉及&#xff09;以外所有的信息&#xff0c;对整个后端设计实现有非常大的作用。借此机会&#xff0c;一起LIB做一个…...

Linux 安装 RocketMq

RocketMq是阿里出品&#xff08;基于MetaQ&#xff09;的开源中间件&#xff0c;已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现&#xff0c;十万级数据吞吐量&#xff0c;ms级处理速度&#xff0c;分布式架构&#xff0c;功能强大&#xff0c;扩展性强。 官网…...

大数据Doris(十六):Doris表的数据划分

文章目录 Doris表的数据划分 一、Partition 二、 Bucket 三、PROPERTIES 四、 ENGINE Doris表的数据划分 Doris支持单分区和复合分...

管理文件:文件批量重命名,轻松删除文件名中的空格

在文件管理中&#xff0c;我们经常会遇到文件名中带有空格的情况。这些空格可能会使文件在某些情况下难以被正确识别或使用&#xff0c;因此我们需要掌握一些技巧来轻松删除文件名中的空格。现在使用云炫文件管理器批量重命名进行批量处理。以下是如何操作的步骤详解&#xff1…...

Docker容器技术实战3

8、docker原生网络 Docker原生网络基于Linux桥接技术和虚拟网络接口&#xff0c;使用了Linux内核的网络功能。每个Docker容器都有自己的网络命名空间&#xff0c;这使得容器之间可以使用独立的IP地址&#xff0c;并隔离了容器的网络栈。 当创建一个Docker原生网络时&#xff…...

数字处理-第10届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第3讲。 数字处理&#xff…...

Go并发编程

一、goroutine 和 通道 在Go语言中&#xff0c;每一个并发执行的活动成为goroutine。通道则是每一个goroutine之间传递消息的工具。 1、Goroutine 在一个Go程序中&#xff0c;只有一个主Goroutine来调用main函数。生成新的goroutine也十分简单&#xff0c;例如有一个函数&…...

Nignx及负载均衡动静分离

核心要点&#xff1a;部署后台项目 1.配置jdk环境 1.先将jdk的Linux版本的压缩包上传虚拟机中服务器 2.解压上传的jdk压缩包 tar -zxvf jdk.gz 3.先进入jdk的解压目录&#xff0c;再通过pwd查看当前解压包的路径 4.将 解压包路径 配置到 /etc/profile 5…...

HDFS架构介绍

数新网络_让每个人享受数据的价值浙江数新网络有限公司是一家开源开放、专注于云数据智能操作系统和数据价值流通的服务商。公司自主研发的DataCyber云数据智能操作系统&#xff0c;主要包括数据平台CyberData、人工智能平台CyberAI、数据智能引擎CyberEngine、数据安全平台Cyb…...

微信小程序提示确认框 wx.showModal

核心实现代码如下 wx.showModal({ title: 确认, content: 确定要删除吗&#xff1f;, success (res) { if (res.confirm) { console.log(用户点击确定) } else if (res.cancel) { console.log(用户点击取消) } } })title 是确认框的标题&#xff0c;content 是确认…...

如何设置OBS虚拟摄像头给钉钉视频会议使用

环境&#xff1a; OBS Studio 29.1.3 Win10 专业版 钉钉7.1.0 问题描述&#xff1a; 如何设置OBS虚拟摄像头给钉钉视频会议使用 解决方案&#xff1a; 1.打开OBS 底下来源这添加视频采集设备 选择OBS虚拟摄像头 2.源那再建一个图像&#xff0c;随便选一张图片 3.点击虚…...

SpringCloud 微服务全栈体系(十一)

第十章 RabbitMQ 三、SpringAMQP SpringAMQP 是基于 RabbitMQ 封装的一套模板&#xff0c;并且还利用 SpringBoot 对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp 的官方地址&#xff1a;https://spring.io/projects/spring-amqp SpringAMQP 提供了三个功能&…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...