前言

课程设计报告以及keil文件和protues仿真在文末。


一、设计内容及要求

设计一个贪吃蛇游戏,使其具有以下游戏规则:

①当没有改变方向时,贪吃蛇沿原来路径一直前进

②贪吃蛇无法回头,只能异于当前方向改变行动

③蛇头碰到蛇身时死亡,游戏结束

④贪吃蛇吃到豆子则蛇身增加

⑤蛇头碰到墙壁时死亡,游戏结束

⑥当蛇长达到17及以上时出现山洞出口,进入则游戏胜利

二、系统的硬件设计

  • 主控芯片为AT89C51
  • LCD-12864为显示器输出
  • 多个按键作为控制器

2.1  Protues仿真图

2.2  主控芯片连接

其中P0口连接LCD-12864的DB0~DB7,P2.0~P2.1连接LCD两个片选端,P2.2~P2.4连接LCD的指令线,读写线,以及电源线,P1.0~P1.4连接控制的四个按键。

2.3  LCD-12864连接

分别连接至AT89C51的引脚

2.4  控制按键连接

此法连接,当按下按键后,相应端口置零

三、系统的软件设计

3.1  贪吃蛇算法介绍

贪吃蛇游戏算法的实现,即如何通过液晶屏显示蛇的移动。

1、其实蛇看似移动的过程中,实质只有两个点再变,即蛇头前进方向增加一个点,蛇尾减少一个点。

2、知道如何显示蛇的移动后,再一个关键问题就是蛇的转折问题,如何控制蛇尾消失的点沿着蛇的路径。通俗的说就是蛇怎么实现曲折移动,这里就用到了循环队列,每次蛇头前进方向发生变化后,队列增加一个结点,结点中包含蛇头方向变化的位置,以及蛇头转变的方向。

3、蛇尾每次移动的过程中都会与队列头指针所储存的位置做一次判断,当蛇尾到达这一位置后,从结点中取出保存的蛇头的移动方向赋给蛇尾,结点出队列即删除这一结点。

4、由于队列是先进先出,所以每前进一步会先push进蛇头的节点,再pop出蛇尾的节点,即实现了蛇的曲折运动。

3.2  典型算法实现

3.2.1  采用循环队列存储蛇头的转向信息

存储蛇头转向的信息使用了step记录,即每走一步使step+1,初始化蛇头step>蛇尾step,当按下按键时代表蛇头发生转向,用循环队列记录此时蛇头step坐标入队,同时使队尾指针+1,当不停前进蛇尾到达此step时,代表之前蛇头在此发生转向,则可不用具体xy坐标记录信息,从而节省存储空间。

// 按键扫描
void Key_Scan(void){if (KEY0 == 0)pause();else if (KEY1 == 0) {if (direction != 2) { //蛇不能直接掉头direction = 1;tailtrun_step[rear] = head_step;tailtrun_direction[rear] = 1;rear = (rear + 1) % 20;}}else if (KEY2 == 0) {if (direction != 1) {direction = 2;tailtrun_step[rear] = head_step;tailtrun_direction[rear] = 2;rear = (rear + 1) % 20;}}else if (KEY3 == 0) {if (direction != 4) {direction = 3;tailtrun_step[rear] = head_step;tailtrun_direction[rear] = 3;rear = (rear + 1) % 20;}}else if (KEY4 == 0) {if (direction != 3) {direction = 4;tailtrun_step[rear] = head_step;tailtrun_direction[rear] = 4;rear = (rear + 1) % 20;}}
}

3.2.2  根据行列具体点亮或熄灭LCD-12864某一个点

由于LCD-12864的点阵点亮是八位DB0~DB7一次性操作一个page,代表一次只能八位一起操作,无法根据某一点的line,column点亮一个点,这里采用了位与或的思想,即根据某一点的line算出此坐标点对应的page中所在的位,后读取这点所在整列的数据与此位进行位或,即可在不改变原始数据的情况下点亮此点,熄灭相似,先对位信息进行取反,后与所在整列的数据与此位进行位与,即可熄灭某一具体点。

// 点亮一个点,行列
void show_p(uint8 screen, uint8 line, uint8 column) {SelectScreen(screen);dat = read_LCD_data(line / 8, column);Set_page(line/8);  Set_column(column);write_LCD_data(dat | bitTo16(line % 8));
}
// 熄灭一个点,行列
void out_p(uint8 screen, uint8 line, uint8 column) {SelectScreen(screen);dat = read_LCD_data(line / 8, column);Set_page(line/8);   Set_column(column);write_LCD_data(dat & ~(bitTo16(line % 8)));
}

3.2.3  碰撞检测

同样采取位与的思想,函数传入具体点的line,column坐标,读取此列的信息,后进行位与操作,若结果不为零,则代表此点已被点亮,表示发生碰撞(蛇身,墙壁)。

// 碰撞检测
void hit_block(uint8 line, uint8 column) {dat = read_LCD_data(line * 2 / 8, column * 2);Set_page(line * 2 /8); Set_column(column * 2);if ((dat & bitTo16(line * 2 % 8)) != 0)over();
}

3.2.4  2×2点扩大

由于一次只亮一个点,导致贪吃蛇和豆子会很小,对视觉和操作是一个很大的考验,于是可以使用比例扩大到一个点为2×2,使得游戏界面变得更加亲和。对于原先的1点扩大到2个点,我使用了每个点对应一个坐标,使得4个点是一体的,为后续的函数书写提供极大便利。

// 2×2合并为一个点
void show_bp(uint8 screen,uint8 line,uint8 column){SelectScreen(screen);start_line = line * 2;start_column = column * 2;for(j=0;j<2;j++){dat = read_LCD_data(start_line / 8, start_column + j);write_LCD_data(dat | bitTo16(start_line % 8));dat = read_LCD_data(start_line / 8, start_column + j);write_LCD_data(dat | bitTo16(start_line % 8 + 1));}Set_page(start_line / 8);    //前面设置完会自动+1,需重新设置回来Set_column(start_column + 1);
}
void out_bp(uint8 screen,uint8 line,uint8 column){SelectScreen(screen);start_line = line * 2;start_column = column * 2;for(j=0;j<2;j++){dat = read_LCD_data(start_line / 8, start_column + j);write_LCD_data(dat & ~( bitTo16(start_line % 8)));dat = read_LCD_data(start_line / 8, start_column + j);write_LCD_data(dat & ~( bitTo16(start_line % 8 + 1)));}Set_page(start_line / 8); //前面设置完会自动+1,需重新设置回来Set_column(start_column + 1);
}

3.2.5  字模算法

由于LCD-12864采用的是点阵点亮,若想显示具体汉字信息,则需使用16×16的字模运算。可使用“PCtoLCD2002”软件进行字模提取。

在具体调用时,应设计相应算法,适应具体字模,例如16×16,由于一次只能书写8位,16则需分两次书写,先写上面的8×16,再写下方的8×16。

// 16×16字模
void show_ch(uint8 screen,uint8 page,uint8 column,uint8 *p)
{uint8 i;SelectScreen(screen);Set_page(page);Set_column(column);for(i=0;i<16;i++) //采用16*16的字模{write_LCD_data(p[i]);}Set_page(page+1);Set_column(column);for(i=0;i<16;i++) //采用16*16的字模,"小四号字"{write_LCD_data(p[i+16]);}
}
//游戏开始结束字模
uint8 code ch[]=
{
0x10,0x60,0x02,0x8C,0x00,0x08,0xF9,0x4E,0xC8,0x20,0x58,0x4F,0x48,0xC8,0x08,0x00,
0x04,0x04,0x7E,0x81,0x40,0x30,0x0F,0x40,0x7F,0x00,0x44,0x84,0x7F,0x04,0x04,0x00,/*"游",0*/0x00,0x08,0x48,0x88,0x08,0xC8,0x38,0x40,0x40,0x40,0xFF,0x20,0x22,0xAC,0x20,0x00,
0x00,0x20,0x10,0x0C,0x03,0x04,0x18,0x80,0x40,0x20,0x17,0x18,0x26,0x41,0xF0,0x00,/*"戏",1*/0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,/*"开",2*/0x10,0x10,0xF0,0x1F,0x10,0xF0,0x00,0x40,0xE0,0x58,0x47,0x40,0x50,0x60,0xC0,0x00,
0x40,0x22,0x15,0x08,0x16,0x21,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,/*"始",3*/0x20,0x30,0xAC,0x63,0x20,0x18,0x08,0x48,0x48,0x48,0x7F,0x48,0x48,0x48,0x08,0x00,
0x22,0x67,0x22,0x12,0x12,0x12,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,/*"结",4*/0x04,0x04,0xE4,0x24,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0x24,0xE4,0x04,0x04,0x00,
0x40,0x40,0x27,0x22,0x12,0x0A,0x06,0xFF,0x06,0x0A,0x12,0x22,0x27,0x40,0x40,0x00,/*"束",5*/0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"!",6*/
};
// 游戏开始界面
void start(){show_im(1, 2, 0 * 16, image1);show_ch(1, 4, 2 * 16, ch + 32 * 0);show_ch(1, 4, 3 * 16, ch + 32 * 1);show_ch(2, 4, 0 * 16, ch + 32 * 2);show_ch(2, 4, 1 * 16, ch + 32 * 3);show_ch(2, 4, 2 * 16, ch + 32 * 6);show_ch(2, 4, 3 * 16, ch + 32 * 6);pause();ClearScreen(0);
}

附录

百度网盘,提取码:r70l

单片机课程设计,基于AT89C51和LCD-12864的贪吃蛇游戏相关推荐

  1. 基于FPGA的VGA显示对贪吃蛇游戏的设计

    基于FPGA的VGA显示对贪吃蛇游戏的设计 摘要 目前,电子数码产品已经进入了人生活的方方面面,而大多数电子产品都依靠显示屏来传递信息,由此可见用电路对显示屏进行控制的研究有很大的实用价值和市场需求. ...

  2. 单片机课程设计-基于单片机直流电机控制器设计

    本科单片机课程设计,附Proteus仿真效果图 要求: 思路很简单,使用定时器0控制单片机IO口输出不同占空比的触发脉冲即可控制转速 代码参考: #include <reg52.h>#de ...

  3. 单片机课程设计——基于51单片机温湿度检测系统的设计与实现

    本文主要介绍了怎么使用51单片机最小系统板和温湿度传感器制作一个温湿度检测系统. 本次设计主要涉及了温湿度的测量.显示以及实现简单控制.硬件方面有五个模块,即STC89C52单片机主控模块.传感器模块 ...

  4. 51单片机课程设计 || 基于AS608模块的指纹锁

    知乎:Fragtex CSDN: 川明_Fragtex 代码 代码速览: 源码 [闲鱼]https://m.tb.cn/h.U1SDh0Z?tk=npyX2Dqp114 CZ0001 「我在闲鱼发布了 ...

  5. 计算机课程编程设计贪吃蛇游戏设计,c语言课程设计报告--贪吃蛇游戏系统

    c语言课程设计报告--贪吃蛇游戏系统 院 系 计算机科学技术学院 班 级 组 长 学 号 指导教师 2017 年 3 月 2 日 C 语言语言基础课程设计基础课程设计 贪贪贪贪吃吃吃吃蛇蛇蛇蛇游游游游 ...

  6. 检测噪声大小的c语言程序,单片机课程设计(论文)_基于AT89C51的噪音检测自适应系统设计.doc...

    单片机课程设计(论文)_基于AT89C51的噪音检测自适应系统设计 摘 要 本文以AT89S52 单片机为控制核心,通过播音判断电路寻找广播间歇时段,实时采集噪声环境内的噪音信 号,根据A/ D 转换 ...

  7. c语言编写闹钟主程序流程图,课程设计基于单片机的定时闹钟.docx

    课程设计基于单片机的定时闹钟.docx 课程设计 设计题目:基于单片机的定时闹钟 院 系:电气工程 专 业:电子信息工程 年 级: 姓 名: 指导教师: 课程设计任务书 专业电子信息工程姓名学号 开题 ...

  8. 单片机课程设计数字心率计_课程设计-基于单片机的数字人体心率计设计.doc

    课程设计-基于单片机的数字人体心率计设计 中北大学 基于单片机的心率计设计 课 程 设 计 说 明 书 2017年 6月30日 课 程 设 计 任 务 书 1.设计目的:通过本课程设计的学习,学生将复 ...

  9. 温度报警程序c语言设计,51单片机课程设计:基于DS18B20的温度报警器

    51单片机课程设计:基于DS18B20的温度报警器 本程序用于读取DS18B20温度,同时具备报警功能,工程分为3个文件,main.c.temp.c.temp.h,经本人修改部分代码,适用于吉林农业大 ...

最新文章

  1. C++ static
  2. 1.3 使用jmeter进行http接口测试
  3. 第十二篇:形式语言理论与有限状态自动机
  4. 【灵动直播提醒】全国大学生智能车竞赛培训(一)——灵动MM32SPIN27介绍
  5. volatile: 多线程程序员最好的朋友
  6. linux平台的office文档转pdf的实例(程序员的菜)
  7. Java Application 直接通过jndi连接数据库
  8. Axure实现多用户注册验证
  9. 25q64存储多个数据_一篇文章看懂,存储虚拟化在不同用例中的实践与优势
  10. 用Kubernetes搭建便携式开发环境之MongoDB
  11. Git显示漂亮日志的小技巧
  12. 【机器学习】基础之线性代数(超详细总结)
  13. 【FPGA】05_按键消抖
  14. web大前端-------初识html
  15. IE里面的画笔---VML(Vector Markup Language)入门之一
  16. Ubuntu10.10 CAJView安装 读取nh\kdh\caj文件 成功
  17. PopClip for Mac 增强型复制粘贴工具
  18. ThinkPad E550 安装 WIN7 的启动 U 盘制作
  19. vue element 输入框出现英文提示怎样解决
  20. java根据生日判断生日和星座

热门文章

  1. 合肥一中2021高考成绩查询,2021年合肥重点高中名单及排名,合肥高中高考成绩排名榜...
  2. 【记录】删库如何进行恢复?
  3. kruskal java_Kruskal算法(三)之 Java详解
  4. qt中制作添加 .ts 翻译文件
  5. 项目中如何避免团队成员相互甩锅?
  6. 软件测试人员不完全甩锅攻略
  7. 称霸全球游戏,腾讯帝国的困局之处
  8. 计算机专业转生物信息(bioinformatics)方向必看视频
  9. 文件搜索与文本内容查看
  10. 苹果隐藏app_iOS14隐藏功能,很实用!附部分BUG解决方案