{
unsigned char * box; unsigned char cube; unsigned char state; signed char row; signed char column;
}block
这是方块的数据结构的定义,它又记录方块的形状的数组box,方块形状的编号cube,方块的旋转方向state,以及方块形状数组第0行,第0列在整个游戏位图中的行数row和列数column组成。
2、unsigned char cubeMap[MAXROW][2]
这是游戏的位图,整个游戏界面就保存在这个味图中。游戏界面为20行10列。因此MAXROW被定义为20,同时表示一行的两个字节值用到了第一字节和第二字节的高2位。 3、unsigned char cube[]
这是保存游戏每一个方块形状位图的数组。每一个方块的形状位图由连续四个字节的低四位组成。每一个方块具有4个方向,同一个方块的四个方向的位图被连续保存。因此只要给出方块编号cube,再给出方块的旋转方向state,就可以通过4*cube+state找出该方块的形状位图。
4、unsigned char asii[]
这是保存游戏中显示的英文字母和数字的位图。每一个英文字母或数字由连续的5个字节组成位图、
5、unsigned char downok = 0; unsigned int score=0; unsigned char speed=1;
unsigned long downtime = 100;
unsigned char next;
这是5个全局变量。Downok表示着方块在下落过程中触底,无法继续下落。Score表示当前游戏的得分,speed表示当前游戏速度。Downtime表示方块隔100个时钟中断,即1秒钟就会强制一格。Next表示下一个方块的形状编号。
6、void Put_Double_Pixel(unsigned char x, unsigned char y) 因为在游戏中,每一个方块的每一个小格用两行两列的点阵来表示,因此这个函数的作用就是在游戏界面相对位置的第x行,第y列显示一个方格。
7、void Clear_Double_Pixel(unsigned char x, unsigned char y)
这个函数和上一个函数作用相似,只是它的作用是消除一个方格。 8、void showChar(unsigned char num, unsigned char x, unsigned char y)
将ascii数组中保存的字符位图显示在屏幕第x行,第y列开始的位置上。 9、void Game_Init()
该函数先打印游戏界面的边框,然后显示next,speed,score。 10、void Show_Speed_Score()
这个函数会将当前的得分和速度显示在屏幕上。
11、void createCube(unsigned char num)
当downok被置1时,调用这个函数来重新创建一个方块。 12、void showCubeMap(void)
当消掉行时,调用这个函数来在屏幕上刷新位图中的内容。
21
13、void writeCubeToMap(void)
每当向左,向右,向下移动方块或旋转方块后,最后都通过该函数将移动后的方块显示在屏幕上,及写入位图中。
14、void clearCubeFromMap(void)
每当向左,向右,向下移动方块或旋转方块前,最后都通过该函数将移动后的方块在屏幕上清除,及在位图中清除。
15、unsigned char checkBorder(void)
检测当前的方块是否碰到边框。如果碰到左边框,就不能向左移动,如果碰到右边框,就不能向右移动。如果触底,就触发downok。 16、unsigned char checkClask(void) 检测当前的方块是否碰到其他方块.
17、void checkMap(void)
检测位图中是否有被填满的行,如果有就消掉该行,并且加响应的分,并根据当前分数调整速度。
18、void moveRight(void) void moveLeft(void)
void moveDown(void) void cubeRotation(void) 这四个函数分别表示向左,向右,向下移动方块及旋转方块。在这些函数中,先移动方块,再检测是否碰到边框或者碰到其他方块。若没碰到,就退出函数。若碰到了,就返回原来的位置。对于moveDown。若在该函数中检测到了碰到边框或碰到其他方块,就会置位downok标识。
19、void game(void)
该函数的流程就如一开始给出的程序流程图。
22
4.10 按键检测
本课设中利用定时器中断检测按键。在定时器中断函数,添加了一个有限状态机,可以判别短按键和长按键。当发生短按键时,置位短按键标志spress_flag,并给出键值key。当发生长按键时,置位长按键标志位lpress_flag。并给出按键值key。这样做使得按键检测非常灵敏,并且可以利用长短按键的组合产生各种功能,节省按键数量。
5. 系统测试 游戏功能的测试
游戏功能可以正常初始化,方块可以正常下落,左移右移及旋转。可以正常的清楚被填满的行。当方块触顶时,会游戏结束而退出游戏。 下面给出游戏过程中的截图:
23
6. 心得体会
从确定课设题目开始,我们组就在老师的催促下开始做实验,当时心里有点不以为然,觉得没有必要那么早开始,后来真正实践的时候,问题不断的时候,才知道,要做一个像样的东西出来是多么不容易,庆幸当初没有拖到最后才开始做。
实验过程中,从搜集资料到选定器件,都是非常考验信息搜索能力的。最困难的是,在测试的时候,bug不断,都是要
7. 参考文献
【1】MSP430x1xx User Guide 【2】12864液晶屏中文资料 【3】FAT32文件系统详解
【4】SD卡在单片机上的应用
【5】基于MSP430单片机的菜单式MP3的实现
24