本帖最后由 张静茹 于 2014-8-21 12:51 编辑 三四天的时间 思路改了好几次,刚开始 写了一个10*10方块的函数,打算每个形状的 方框都写一个函数,然后检测屏幕哪一行满了就计分 ,后来发现不太好检测,原子自带的那个 检测屏幕颜色的函数也不大好用,而且左移右移之后怎样能不淹没已经固定的方块,最后改成了现在的程序 定义一个32个元素 的int数组,屏幕分辨率320*240,每个元素代表一行。每位对应一个10*10方块,在写一个专门刷屏的函数,只要计算好这个数组表就能实现 左移右移 计分的功能,
void left_shift(void); //左移函数
void right_shift(void); //右移函数
char down_shift(void); //下移
方块形状存到box_date[19][4]
box_xy[0]=0;box_xy[1]=10; //复位xy标记
Calculation_Fraction(); //计分
KEY.n=rand()%0x13; //形成随即形状
box_date_temp[0]=box_date[KEY.n][0]; //放进临时缓存数组
box_date_temp[1]=box_date[KEY.n][1];
box_date_temp[2]=box_date[KEY.n][2];
box_date_temp[3]=box_date[KEY.n][3];
然后由down_shift函数 对准将 方块缓存box_date_temp[0]对准屏幕缓存box[],拷贝进准确的位置,由fresh_screen();更新到屏幕
然后再次用down_shift下降方块,并且判断 是否已经落到屏幕底部,或者 通过方块缓存box_date_temp与屏幕缓存box[]与运算,结果大于0说明落到落到别的方块上面了,
unsigned int box[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
const unsigned int box_date[19][4]={
0x2000, 0x2000, 0x2000, 0x2000, //垂直四块 0
0x0000, 0x0000, 0x0000, 0x7800, //水平四块 1
0x0000, 0x0000, 0x6000, 0x3000, //正Z水平 2
0x0000, 0x2000, 0x6000, 0x4000, //正Z垂直 3
0x0000, 0x0000, 0x3000, 0x6000, //反Z水平 4
0x0000, 0x4000, 0x6000, 0x2000, //反Z垂直 5
0x0000, 0x6000, 0x2000, 0x2000, //正7 +0 6
0x0000, 0x0000, 0x1000, 0x7000, //正7 +90 7
0x0000, 0x4000, 0x4000, 0x6000, //正7 +180 8
0x0000, 0x0000, 0x7000, 0x4000, //正7 +270 9
0x0000, 0x6000, 0x4000, 0x4000, //反7 +0 10 a
0x0000, 0x0000, 0x7000, 0x1000, //反7 +90 11 b
0x0000, 0x2000, 0x2000, 0x6000, //反7 +180 12 c
0x0000, 0x0000, 0x4000, 0x7000, //反7 +270 13 d
0x0000, 0x0000, 0x2000, 0x7000, //上土 14 e
0x0000, 0x0000, 0x7000, 0x2000, //下土 15 f
0x0000, 0x4000, 0x6000, 0x4000, //右土 16 10
0x0000, 0x2000, 0x6000, 0x2000, //左土 17 11
0x0000, 0x0000, 0x6000, 0x6000 //田 18 12
};
void box_delete(void); //删除当前方块
void box_change(void); //更改方块形状
//void box_xy(void); //取方框 在box数组中的位置
//char box_judge(void); //判断方块 落到底,碰到 别的方块
void refresh_screen(void);//刷屏函数
unsigned int Calculation_Fraction(void);//计算分数
void Row_Down(signed char); //整排下降
@科创论坛, 编译环境是keil5.1