#include "related.h"
//=================================================================================================================================================================
extern uchar SSS,t,STY,SWY,GUO,GCUNX,Q;
extern uint HUANCUN[16],STX,SWX,GCUNY;
extern uchar idata ZZS[16];
extern uint idata ZZD[16];
//=================================================================================================================================================================
//功能描述:开始键按下后,初始化各种参数
//=================================================================================================================================================================
void K_S()
{
uchar i;
if(KS==0){ //如果开始键按下
QC_HC();
SSS=2; //蛇方向向右
t=50; //蛇初始速度
SWY=7; //蛇尾初始纵坐标
STY=7; //蛇头初始纵坐标
STX=0x0040; //蛇头初始横坐标
SWX=0x0100; //蛇尾初始横坐标
HUANCUN[7]=0x01c0; //初始化蛇全身
ZZS[0]=SSS; //存储蛇的方向
for(i=0;i<16;i++){
ZZD[i]=0xffff;
}
GUO=0; //无糖果
TR0=1; //定时器开启
}
}
//=================================================================================================================================================================
//功能描述:游戏结束后显示预设图案
//=================================================================================================================================================================
void J_S() //结束子程序
{
QC_HC();
HUANCUN[2]=0x0ff0; //显示笑脸
HUANCUN[3]=0x1008;
HUANCUN[4]=0x2424;
HUANCUN[5]=0x2a54;
HUANCUN[6]=0x2004;
HUANCUN[7]=0x2004;
HUANCUN[8]=0x2004;
HUANCUN[9]=0x2004;
HUANCUN[10]=0x2244;
HUANCUN[11]=0x2184;
HUANCUN[12]=0x1008;
HUANCUN[13]=0x0ff0;
}
//=================================================================================================================================================================
//功能描述:16x16点阵显示清除
//=================================================================================================================================================================
void QC_HC() //清除缓存子程序
{
uchar i;
for(i=0;i<16;i++){ //缓存清零
HUANCUN[i]=0;
}
}
//=================================================================================================================================================================
//功能说明:”糖果“随机函数
//程序说明:Q取0~255之间的数,对应16x16点阵上的256个点
// Q/16取16x16点阵的哪一行,0x0001<<(Q%16)取16x16点阵的哪一列
// Q随机出一个数后,有可能点阵上的点是亮着的,要重新随机,直到随机到没亮着的点
// 然后改变对应缓存显示数组HUANCUN[]里的数据
// 16x16点阵是以左上角为原点的一个坐标(不过y轴不是负的),记录下对应点的横坐标和纵坐标
// 改变“糖果”的状态变量GUO=1,就是说当前有“糖果”在
//=================================================================================================================================================================
void SUI_JI()
{
while(HUANCUN[Q/16]&(0x0001<<(Q%16))) //判断随机数对应的点阵上的点是否是灭的状态
{
Q=rand()%256; //如果是亮的,那么再随机一次,直到随机到灭的点
}
HUANCUN[Q/16]|=(0x0001<<(Q%16)); //让这个点亮起来
GCUNX=Q/16; //记录该点的横坐标和纵坐标
GCUNY=(0x0001<<(Q%16));
GUO=1; //记录糖果状态
}
//=================================================================================================================================================================
//功能说明:当蛇尾处在转折点处时,这个转折点数据没用了,判断蛇还有没有转折点,如果有,覆盖掉这个转折点
// 根据改变后的转折点,确定蛇尾的坐标
//=================================================================================================================================================================
void ZZ_X()
{
uchar i;
if(ZZS[1]!=0){ //如果有第二个转折点
for(i=0;i<15;i++){ //把第一个转折点覆盖
ZZD[i]=ZZD[i+1];
ZZS[i]=ZZS[i+1];
}
}
switch(ZZS[0]) //判断改变后蛇的方向,而后改变蛇尾坐标
{
case 1:
SWY--;
break;
case 2:
SWX>>=1;
break;
case 3:
SWY++;
break;
case 4:
SWX<<=1;
break;
}
}
//=================================================================================================================================================================
//思维说明:蛇移动是不是要判断前面有没有障碍物?这个障碍物有可能是蛇的身体,也有可能是糖果。还有,蛇会不会碰壁呢?
//程序说明:根据蛇的方向(SSS)来分成4种情况,
// 蛇头就是一个点,这个点被记录下横(STY)和纵坐标(STX),再加上记录下的方向(SSS),可以确定蛇头的下一个位置
// 当SSS=1时,蛇向上移动,把蛇头横坐标(STX)和缓存显示数组HUANCUN[STY-1]相与,确定该位置是否被点亮,为什么是STY-1呢?点阵第一行对应HUANCUN[0]
// 当该位置没被点亮时,表示蛇可以移动上去了,把蛇头的坐标改变
// 否则,把该位置的坐标和糖果的坐标比较,如果是糖果位置,蛇头一样可变。其他情况游戏结束,关定时器TR0
// 其他3种情况分析同上
// 蛇尾也不能忘了,一条蛇只标蛇头可不行
// 如果蛇吃了糖果,那么蛇头长了一点,蛇尾不用变,蛇头坐标变后跳出函数就行了
// 否则,就要让蛇尾灭掉HUANCUN[SWY]&=(~SWX);
// 再则,一条蛇可会转弯的哦,那么必须要有转折点,不止一个,要判断,如果需要的话,要做改变
//=================================================================================================================================================================
void SE_BH() //蛇变子程序
{
switch(SSS)
{
case 1:
if(STY>0){ //大于0是要判断的,因为下面HUANCUN[STY-1]
if((HUANCUN[STY-1]&STX)==0) //判断下一个蛇坐标是否是灭的
STY--; //蛇头坐标改变
else{
if(((STY-1)==GCUNX)&&(STX==GCUNY)){ //否则,判断该点是否是糖果点
STY--; //蛇头坐标改变
GUO=0; //糖果变量清零
}else
TR0=0; //定时器关闭
return; //跳出
}
}else{
TR0=0;
return;
}
break;
case 2:
if((HUANCUN[STY]&(STX>>1))==0)
STX>>=1;
else{
if((STY==GCUNX)&&((STX>>1)==GCUNY)){
STX>>=1; //蛇头横坐标右移一位
GUO=0;
}else
TR0=0;
return;
}
break;
case 3:
if((HUANCUN[STY+1]&STX)==0)
STY++; //蛇头纵坐标减一位
else{
if(((STY+1)==GCUNX)&&(STX==GCUNY)){
STY++;
GUO=0;
}else
TR0=0;
return;
}
break;
case 4:
if((HUANCUN[STY]&(STX<<1))==0)
STX<<=1;
else{
if((STY==GCUNX)&&((STX<<1)==GCUNY)){
STX<<=1;
GUO=0;
}else
TR0=0;
return;
}
break;
}
if((STX!=0)&&(STY>=0)&&(STY<16)){ //如果蛇头没超出边界
HUANCUN[STY]|=STX; //让蛇头亮起
HUANCUN[SWY]&=(~SWX); //让蛇尾灭掉
switch(ZZS[0])
{
case 1:
if(SWY!=ZZD[0])
SWY--;
else ZZ_X();
break;
case 2:
if(SWX!=ZZD[0])
SWX>>=1;
else ZZ_X();
break;
case 3:
if(SWY!=ZZD[0])
SWY++;
else ZZ_X();
break;
case 4:
if(SWX!=ZZD[0])
SWX<<=1;
else ZZ_X();
break;
基于51单片机16x16点阵贪吃蛇 单片机源程序.rar
版权申诉
5星 · 超过95%的资源 2 浏览量
2021-09-07
20:27:04
上传
评论 6
收藏 59KB RAR 举报
风和技术资料库
- 粉丝: 36
- 资源: 925
最新资源
- 电机控制霍尔传感器和反电动势的关系分析
- 计算机生产实习:OA后台管理(web前端+Java后端)压缩文件包
- greenplum6.10安装时缺失的fpm包
- 缺陷检测-轻量化PCB表面缺陷检测算法实现-工业视觉+六大缺陷检出-优质项目实战.zip
- JAVA 中的Spring框架介绍包括起源、体系结构、核心部分、特点等
- 2024年小米汽车产业链分析及新品上市全景洞察报告
- 基于Qt和C++实现的偏3D风格的异型窗体界面操作+源码(期末大作业&课设&项目开发)
- 基于yolov8的花卉分类系统,包含训练好的权重和推理代码,GUI界面,支持图片、视频、摄像头输入,支持检测结果导出
- 基于图形化编程的单片机教学案例研究
- 基于matlab语音识别的信号灯图像模拟控制技术代码19
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
前往页