在编写完上面几个函数以后,就可以进行对彩屏的初始化编程。但是初始化编程时候将会设计几百个寄存器,在如今开发时候不可能对着彩屏几百个寄存器进行设置,一般厂家在出厂时候会给出对彩屏初始化函数 ,并且厂家会强烈要求用户最好使用它们提供编写的函数。所以这次彩屏的初始化编程是殖移厂家所规定的函数, 这些函数将在附录中给出。
4.3算法说明及程序流程图
有了模块之后讲解怎么制作俄罗斯方块。主程序算法说明:
首先在Mega16的SRAM中建立一个16行×22列的数组表,这个数表用做缓冲,即是在内存中通过建立数组模拟俄罗斯方块,在数组中的0 ,1表示该位置是否“点亮”该点,在运算完结果后,更新这个数组表,然后查表,把被点亮的点的位置和彩屏中的位置映射起来,将完成1点换成彩屏上的10点的转化写入彩屏显示。下面为这次设计的主程序流程图:图4-7 系统流程图
.4系统模块函数程序设计论文网
http://www.751com.cn/本次设计所涉及的模块较多,下面主要说明几个重要的模块的实现方法。
1 检测满行和消行:处理函数为checkmap,该函数主要是对下落方块发碰撞而做出检测下面位置是否有满行的函数,在设计中主要为下面的某一位置是否有满行,这时我们先假设这一行是满的,然后逐行中的每一个数据进行检查,最后确认有满行,对分数进行累加或者升级,下面是它的程序。
void checkmap(U8 now_y)
{
U8 x,i,y,dx,dy;
U8 flag_ok=0;
for(y=now_y; y>=0; y--)
{
flag_ok=1;//假设有满行
for(x=2; x<14; x++)
if(!game_maps[y][x])
{
flag_ok=0;//消块显示标志位
break;
}
if(flag_ok)
{
for(dy=y; dy>0; dy--)
{ for(dx=2; dx<14; dx++)
{
game_maps[dy][dx]=game_maps[dy-1][dx];
}//把前面方块往下移动一个单位
}
for(dx=2; dx<14; dx++)
{
game_maps[0][dx]=0;
}
score+=10;
if(score>=200)
{
level++;
}论文网
http://www.751com.cn/ }
}
}
2 方块的旋转:处理函数为change,方块的选择为每一次有按键按下方块都顺时针旋转九十度,主程序中将会每隔一定时间扫描各个按键,扫描的时间根据等级和下落时间决定,此这里只要对方块4*4数组进行旋转即可。
void change(U8 BLK[4][4])
{
U8 block1[4][4];//临时方块
U8 x, y;
for(y=0; y<4; y++)
{
for(x=0; x<4; x++)
{
block1[y][x] = BLK[y][x];//复制一份
}原文请加辣;文^论,文'网QQ752018766
}
for(y=0; y<4; y++)
for(x=0; x<4; x++)
now_block[y][x] = block1[3-x][y];//旋转90度
if(!check(now_x,now_y,now_block))
{
for(y=0; y<4; y++)
{
for(x=0; x<4; x++)
{
now_block[y][x] = block1[y][x];//变回原来方块
}
}论文网http://www.751com.cn/
}
}
3 碰撞问题:处理函数为check,内存中的方块在下落过程中会对前面的位置进行判断,是否可以在下面一个位置显示将要显示的方块。碰撞的判断主要是用与运算实现,对前面的4*4数组和将要显示在该位置的4*4数组进行逐一与运算,如果结果是0则前面可以显示将要显示的方块,否则失败显示,要消行检测。
U8 check(U8 N_X, U8 N_Y, U8 BLK[4][4])
上一页 [1] [2] [3] [4] [5] [6] [7]
Mega16单片机+AVR彩屏游戏机设计 第7页下载如图片无法显示或论文不完整,请联系qq752018766