基于单片机数码管俄罗斯方块设计
1481下载地址 https://docs.qq.com/doc/DWEpnR2pOWU91b3p4?pub=1&dver=2.1.0
1.由于俄罗斯方块图形的宽度和高度最多只有四位,所以要以4X4为基本单元。
2.硬件采用16行扫描、8位送显示信号
3.各个图形的宽度不一致,所以要人为给图形设定居中位置。
若图形宽度为偶数可直接将其居中,若为奇数则靠左居中。
4.由于图形需要旋转,所以由基本的图形会衍生出另外3种图形。
5.因此每个图形应该给定4个8位的二进制码,并放入一个二维数组里。
6.经典俄罗斯方块游戏里有19种不同形状的方块,包括旋转得到的。
7.数组的第一个下标为该图形的编号
uchar code allshape[19][4]={0x00,0x00,0x18,0x18,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x3c, 0x00,0x08,0x18,0x10,0x00,0x00,0x30,0x18,0x00,0x10,0x18,0x08, 0x00,0x00,0x18,0x30,0x00,0x08,0x08,0x18,0x00,0x00,0x38,0x08, 0x00,0x18,0x10,0x10,0x00,0x00,0x20,0x38,0x00,0x10,0x10,0x18, 0x00,0x00,0x08,0x38,0x00,0x18,0x08,0x08,0x00,0x00,0x38,0x20, 0x00,0x00,0x10,0x38,0x00,0x08,0x18,0x08,0x00,0x00,0x38,0x10, 0x00,0x10,0x18,0x10}; /****************************************************************************************/ uchar code number[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管数形显示编码 uchar code weima[4]={0x01,0x02,0x04,0x08}; //位选信号编码,方便写循环使用 char shapewidth[19]={2,1,4,2,3,2,3,2,3,2,3,2,3,2,3,3,2,3,2}; //各个图形的宽度属性,用于判断左移和右移的步格数上限 char shaperotate[19]={0,2,1,4,3,6,5,8,9,10,7,12,13,14,11,16,17,18,15}; //旋转图形时,用于改变图形的编号以实现图形的切换 uchar staticdata[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff}; //用于存储方块降落后固定显示的图形信息 uchar rate[5]={0,1,3,6,10}; //规定一次性消掉的行数的分数奖励机制 /****************************************全局变量声明************************************/ char y; //方块位置属性:底部下落的高度,y=0时:刚刚出现,y=15时:下落到屏幕最底部 char shapenum; //方块形状属性:从0到18 int left; //方块位置属性:方块偏离居中位置的格数,不同的方块left值的上限不同 int mark; //玩家分数变量 int speed; //方块下落速度变量 int initialspeed; //方块下落的初始速度 int systemspeed; //系统下落速度,此值会随着玩家分数的增加而减小,相应的下落速度会增大 int fastspeed; //当用户按下down键时,方块下落速度为此值 int k; //一个全局循环变量,“帧数”变量 int startcontrol=1; //开始画面状态指示变量,为1时说明程序进入开机欢迎界面 int suspendcontrol=0; //游戏暂停与游戏继续画面状态指示变量,为1说明处在暂停界面,为0说明处在继续画面 int randnum; //随机数变量,用于产生随机方块 /****************************************************************************************/ /****************************************函数声明****************************************/ void delayms(int); //粗略延时函数 uchar move(uchar,int); //对二进制码实行移位,可为负值 void shapedisplay(); //对点阵扫描一场,对数码管扫描一场,用于显示图形和数字 void keyscan(); //对所有键盘扫描一次,并执行相应运算和操作