需求改进&原型设计

1. 需求&原型改进

1.1硬件部分
(1) 硬件部分分为主机和遥控器,分别由两个单片机进行控制。
(2) 单片机1:负责显示游戏的界面。使用数码管显示当前得分,使用不同颜色LED灯表示游戏过程中和游戏结束,使用液晶屏显示界面,这个液晶的界面包括显示游戏区域、下一个方块、得分、排行榜。另外还配有蜂鸣器,当方块可以消除一行或多行的时候,蜂鸣器鸣响一秒;当游戏结束的时候,蜂鸣器鸣响三秒。
(3) Ampire12864液晶:本程序所选择的LCD是AMPIRE128×64的汉字图形型液晶显示模块,可显示汉字及图形。
(4) 单片机2::负责控制遥控器操作。按键除去复位按键之外有六个:确定,左,右,加速,旋转,暂停。用户只需要操作遥控器则可进行游戏。用户根据按下“左,右”键来控制降落方块的位置和形状;通过按下“加速”键加速降落方块的移动;通过按下“旋转键”来控制降落方块的形状。
(5) 通信:主机与遥控器之间使用 I2C 通信,实现遥控器控制方块的移动及旋转。这个I2c通信使用at24c02芯片作为中介,主要通过I2C通信把信息发给e2prom暂时保存起来,然后e2prom也使用i2c通信方式把信息发送给另外一个单片机。I2C通信是硬件部分的亮点。
(6) AT24C02芯片:排行榜和通信都有用到AT24C02芯片,记录所有在该程序进行游戏的得分数据,即使是断电,得分数据依然保存在e2prom存储器中。
AT24C02芯片简介:AT24C02为I2C总线串行EEPROM储存器,它的存储容量为4k位(4096位),存储器的内部结构为512×8位,芯片具有写保护,可靠性高,擦写次数可达100万次,数据断电保存100年不变。
1.2. 软件部分
(1) 降落的方块真正的随机化,可以实现随机降落不同形状的方块。并且可以在屏幕上显示下一个。
(2) 降落的方块不可以越过障碍方块。当已落下的方块高度超过屏幕高度的时候游戏结束。
(3) 当已落下的方块之间填满一行或多行的时候,则可以得到相应的得分,当消去1行的时候得1分;消去2行得2分;当同时消去3行的时候,得到6分;同时消去4行的时候,得到8分。 
(4) 实现多种关卡,不同的起始情况,第二关加快了游戏速度和增加了障碍方块。在达到指定分数后显示胜利标题,并切换进入下一关卡。
(5) 降落的方块在越过一定位置的时候有几率切换方块的形状,以此来增加游戏难度和丰富游戏内容,增加可玩性。
(6) 实现了排行榜,得分数据通过i2c通信方式写进e2prom存储器中。

2. 系统设计

2.1. 总流程
(1) 程序初始化部分
a) 程序一开始就启动定时器,但是没有开中断,为了通过定时器获取随机数种子,而且只有在游戏进入按键循环的时候才需要靠中断来控制方块下降和刷新游戏区域。
b) LCD液晶也初始化,开屏幕显示、开光标、设置显示起始行、设置页地址、列地址。
c) I2c的数据线和时钟线拉高,随时准备通信。
d) 控制数码管显示分数零。
(2) 游戏主体
a) 按键循环,获取按键信息控制方块的移动旋转快速下降和游戏暂停。
b) 当程序检测游戏结束或者得分超过指定分数的时候,分别设置游戏结束标志位和过关标志位,while循环检测到这两个标志位就退出按键循环。
c) 如果是游戏结束标志位,则新一轮游戏速度不变、没有障碍方块,如果是过关标志位,则加快游戏速度、设置障碍方块。

2.2. I2C通信
两个单片机之间使用i2c通信。一般单片机之间不适用i2c通信,因为单片机本身不具备i2c总线接口,所以只能根据I2c协议模拟时序进行通信。初步设想单片机2负责把按键数据使用i2c通信方式发送到e2prom的固定地址,然后e2prom也使用i2c通信把信息传给单片机1,然后单片机1把一个无关数据放回该地址通知单片机2已经收到了数据。

2.3数据存储

1. 使用I2c通信和e2prom AT24C02芯片存储数据。
2. 单片机2的按键数据通过i2c通信写进e2prom的特定地址,单片机1每次需要按键数据的时候就通过这个地址取得数据。
3. 游戏初始化的时候,使用i2c通信方式读取e2prom中的分数排名信息,然后将排行榜显示在液晶上面。
4. 游戏结束的时候,使用i2c通信方式读取e2prom中保存的得分排名数据,判断得分是否能进排行榜,如果能则把数据i2c通信写进e2prom。

2.4 编码
使用编码的思想。将方块数据编码为unsigned int两个字节16位类型,16位代表4*4,刚好可以代表一个方块,并且每一位(也就是方块的每一个方格点)代表液晶的4*4的像素点。游戏区域编码为一个unsigned int数组,数组元素为16个,也就是16行,每一位也代表液晶的4*4像素点。16个整型数组就代表的整个游戏区域,能代表液晶游戏部分40*64的像素点。所有的游戏操作移动旋转、判断覆盖、消行、游戏结束等等全部进行编码成整形数据,直接对这个数组操作,而不是直接对液晶操作。

2.5解码
每隔一定时间将游戏区域数据进行解码,反应在液晶上面。由于液晶每次写数据都是在某一页的某一列写一个字节,也就是竖的八行,写数据是字节倒序的,方块方格点代表液晶的4*4像素点,所以每次读取编码的竖着的两位(方格点),若是11,则在液晶部分依次写1111 1111, 1111 1111, 1111 1111, 1111 1111。若是10,则在液晶部分依次写0000 0000,0000 0000,1111 1111, 1111 1111。若是01,则在液晶部分依次写1111 1111, 1111 1111,0000 0000,0000 0000。若是00,则在液晶部分依次写0000 0000,0000 0000,0000 0000,0000 0000。依此类推,直到游戏区域全部刷新。

2.6软件模拟I2C通信协议
51单片机本身不具备I2C总线,不支持I2C通信,要使用I2C通信就要对单片机根据I2C协议的时序进行模拟。一般单片机与单片机之间的通信方式是串口通信。那种通信能实现即时通信,不需要使用中介,不需要延时。
排行榜的得分信息也是用I2c通信方式保存在rom存储器中,所以即使是断电,信息仍然能保留不丢失。

2.7 编码用最少的数字保存全部信息
用最少的数字保存全部信息,只需要18个整型变量就可以表达整个游戏的所有内容和数据。在需要的时候进行解码。将方块和游戏区存储在整型数组中,每一位代表液晶的4*4像素点,移动、旋转、下降都是对这个数组进行操作,而不是直接对液晶进行操作。定时器每隔一定时间对这些数据的每一位进行解码,检测每一位,若该位为1则在液晶上写4*4的黑点,若该位为0则在液晶上写4*4的白点,把每一位数据都反应在液晶上。这样处理起来很容易,而且可以成为一个通用的方法,以后处理液晶我都可以使用这种思想,把区域编码,用数组存储,然后再在液晶外面、数组里面进行任何我需要的操作,需要显示的时候,再把信息解码显示到液晶上面。

2.8其他优化操作
使用定时器中断每隔一定时间刷新游戏区域,而不是对整个液晶进行重绘。
只有在定时器中断刷新游戏区的时候才需要操作液晶,其他任何游戏操作都不需要处理液晶的实现,只是对数组这个简单的地方进行操作。

3. Alpha任务分配计划

通信:软件模拟I2C通信协议:郑鉴

硬件搭建:郑鉴

中断、定时器控制、操作系统:郑鉴

音频模块:软件解码MP3文件需考虑解码速率与CPU主频、文件系统、DMA控制数据传输:郑鉴

算法:旋转算法、消行算法、游戏结束算法:余伟淇

界面:余伟淇

测试:余伟淇

文档:余伟淇

4. 测试计划

开发前:对所有函数进行先测试后编写进行单元测试,DE所有警告

开发后:由于是游戏,所以直接试玩

拉登是我罩的队_第三周_需求改进&原型设计的更多相关文章

  1. C++轮子队-第三周(需求改进&原型设计)

    需求改进&原型设计 一.需求完善 (一)系统功能(补充) 图形界面(图片如下图所示:) 根据需求与组内讨论结果,现归纳图形界面方面需要的设计与相应功能: 数据-图形界面中间类: 数字方块类 N ...

  2. 团队博客-第三周:需求改进&系统设计(科利尔拉弗队)

    针对课堂讨论环节老师和其他组的问题及建议,对修改选题及需求进行修改 需求规格说明书: 1.打开网页,弹出询问时候创建账号.是:分配数字组成账号,用户填写密码,确定登录进入首页:否,用已有账号登录(传参 ...

  3. 莪的拽、像省田各号①样没尽頭队——需求改进&原型设计

    需求改进&原型设计 1. 需求&原型改进 经过老师的指导以及组内成员的讨论后,我们认为之前的需求分析已经比较准确完备. 根据电子宠物的形象结构特点,以及模拟屏幕的空间限制,我们设计出了 ...

  4. 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算_第三周

    2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算 组队成员: 仇夏 学号: 20172310 博客地址: @王志伟 四则运算第一周博客 @仇夏四则运算第一周博客 ...

  5. Python笔记_第三篇_面向对象_9.Python中的"get"和"set"方法(@property和@.setter)

    1. 限制访问的问题: 如果学过C# 语言的我们可以知道C# 语言有get和set方法.我们之前想要获取父类中的私有变量,只能通过写一个set和get的函数进行访问或者通过类生成的新关键字来访问私有属 ...

  6. Python笔记_第三篇_面向对象_4.单下划线和双下划线

    说道这里我们需要稍微暂停一下.前面我们说到了类是作为一个对象存放容器.这个容器里面有属性和方法.最好的理解类的方式就是把类想想成一个容器. 然后构造了一个析构函数和构造函数,然后又对object和se ...

  7. Python笔记_第三篇_面向对象_2.第一个Python类

    1. 设计一个类: 设计一个类主要从三个方面进行考虑: 第一:类名:类名要见名知意.首字母大写. 第二:属性. 第三:方法. 备注:在Python中有些东西并不是绝对化的事情,有些根据Python社区 ...

  8. 网易云课堂_程序设计入门-C语言_第三周:循环_2数字特征值

    2 数字特征值(5分) 题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作 ...

  9. 网易云课堂_程序设计入门-C语言_第三周:循环_1奇偶个数

    1 奇偶个数(5分) 题目内容: 你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据.程序输出读到的数据中的奇数和偶数的个数. 输入格式: 一系列正整数,整数的范围是(0,1 ...

随机推荐

  1. 获取设备 ID 和名称

    获取设备 ID 和名称 .NET Framework 3.5   其他版本   更新:2007 年 11 月 要获取设备的名称,请使用 Dns.GetHostName 属性.通常情况下,默认名称为“P ...

  2. ubuntu下安装ros出现“无法下载-package.ros.org中某个包-校验和不符”的解决方法

    新安装的Ubuntu14.04,为了科研马上准备装ros indigo,却困难重重,一步一个坎. 比如说按照ros wiki里面一步一步来,当运行sudoapt-get update 然后出现下列情况 ...

  3. AIX rcp跨主机远程

    rcp用途:在本地主机和远程主机之间或者两个远程主机之间传输文件.详细用法可man rcp查看. 现在要把主机10.200.5.200的/tmp/work.sh(属主为root用户)拷贝到远程主机18 ...

  4. java代码练习======每隔5行打印数字

    总结:当我们感觉数字排列横排,竖排不好看的时候,学会空几行在排列,哎呦,效果不错喔 package com.aa; public class West2 { public static void ma ...

  5. 2017中国大学生程序设计竞赛 - 女生专场 Deleting Edges(思维+最短路)

    Deleting Edges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  6. Java-Runoob-高级教程:Java MySQL 连接

    ylbtech-Java-Runoob-高级教程:Java MySQL 连接 1.返回顶部 1. Java MySQL 连接 本章节我们为大家介绍 Java 如何使用 使用 JDBC 连接 MySQL ...

  7. redirect uri 参数错误 怎么办

    这种情况,多数是因为请求地址不合法所致. 去公众号中添加合法的地址. 这种地址需要满足一些条件. 设置地址 满足的条件 保证可以访问到安全文件 如果访问不到的话,将无法保存 这里是文件存放位置 经过这 ...

  8. 静态实现AOP(翻译自MSDN)

    在.net实现AOP 本文通过一个简单的例子实现静态AOP.改例子主要实现客户的增删改查,突然有一天你的老板需要在程序上跟踪每个方法操作的运行日志. 主要分为5个步骤. 第一步:创建接口IReposi ...

  9. mysql库操作

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  10. 赋予oracle执行存储过程权限和创建表权限

    grant create any table to username; grant create any procedure to username; grant execute any proced ...