论文部分内容阅读
1 游戏说明
本游戏设置为8X8的地图。
键盘分为上、下、左、右、标雷、无雷键。要操作的位置上会有光标显示。
踩到雷后会显示全图及雷的位置,当所有的无雷区都被找到之后胜利。
2 程序设计
由于12864M的显示为4行,每行显示16个符号或8个汉字,这样用字库并不能实现,所以程序中要把64个格都编辑成图形方式存到数组再调用。
(1)标志位的设计
一般会想到的方法,要设置两个数组,一个是全开的图,一个是要显示的图,然后通过按键改变要显示的数组,不过实验过就会发现,由于单片机内部寄存器的空间不够,编辑一个8X8的图需要数组包含512个字节,而定义到外部寄存器的数组“unsigned char code tab[ ]”却不能修改。本作品可贵之处没有用扩展RAM,而是采用标志位的方式控制8X8的方格显示,在没有被操作过的方格位置上标志位设为0,已被点开的方格位置上设置为1,标志雷的方格上标志为2,每次要操作时只要检测标志位即可。
(2)光标显示及移动的设计
由于游戏上的要求,必须在要操作的位置设置光标。不过这样就要求对按键控制的左右上下移动要有不同的子程序进行处理。下面进行具体的介绍:
因为12864M对图形的显示,行(0~63)是以位为单位,列是以字为单位,上半屏为0~7,下半屏为8~15。
如下图以向左右移为例:
1和3的移动方式就不能调用同一个子程序。
1只涉及了一个字上图形的改变,它的列地址为(0x80),要写进(2,1)、(2,2)的两字节内容为:
0xff(光标为黑色方块)
tab[x+1+8*(y+i)](x方格列位置,y方格列地址)
而3设计了两个列地址(0x80)、(0x81)。
要写进(3,1)、(3,2)、(3,3)、(3,4)的四字节内容为:
tab[x -1+8*(y+i)]、 0xff、 tab[x+1+8*(y+i)]、tab[x+2+8*(y+i)]。
同样,向右移2和4的处理方式与1和3相同。
向上与向下都要改变上下各两个字节内容,这时就要判断要移动的方格是在这个字的哪个字节,以7为例,需要写进(6,1)、(6,2)、(7,1)、(7,2)的内容分别为:
tab[x-1+8*(y+i)]、0xff、tab[x-1+8*(y+8+i)]、tab[x+8*(y+8+i)]。
同样8中,要写进(6,3)、(6,4)、(7,3)、(7,4)的内容为:
tab[x+8*(y-8+i)]、tab[x+1+8*(y-8+i)]、0xff、tab[x+1+8*(y+i)]。
4和5的情况看起来比较特殊,因为他们跨越了上下半屏,需要把它们输入到液晶的位置命令进行一下转换。这里在程序设计时也有些技巧,下面就进行一下介绍。
(3)坐标转换设计
在写入数据之前我们要对显示的位置和输入到液晶的位置命令进行一下转换。
(y,x)为在液晶上显示的方格位置,L为输入到液晶列位置命令的值,h为输入到液晶行位置命令的值,他们的转换字程序为:
3 总结
游戏唯一缺憾是不能随机产生扫雷地图。不过可以通过调用不同的地图数组来进行改善。
本游戏设置为8X8的地图。
键盘分为上、下、左、右、标雷、无雷键。要操作的位置上会有光标显示。
踩到雷后会显示全图及雷的位置,当所有的无雷区都被找到之后胜利。
2 程序设计
由于12864M的显示为4行,每行显示16个符号或8个汉字,这样用字库并不能实现,所以程序中要把64个格都编辑成图形方式存到数组再调用。
(1)标志位的设计
一般会想到的方法,要设置两个数组,一个是全开的图,一个是要显示的图,然后通过按键改变要显示的数组,不过实验过就会发现,由于单片机内部寄存器的空间不够,编辑一个8X8的图需要数组包含512个字节,而定义到外部寄存器的数组“unsigned char code tab[ ]”却不能修改。本作品可贵之处没有用扩展RAM,而是采用标志位的方式控制8X8的方格显示,在没有被操作过的方格位置上标志位设为0,已被点开的方格位置上设置为1,标志雷的方格上标志为2,每次要操作时只要检测标志位即可。
(2)光标显示及移动的设计
由于游戏上的要求,必须在要操作的位置设置光标。不过这样就要求对按键控制的左右上下移动要有不同的子程序进行处理。下面进行具体的介绍:
因为12864M对图形的显示,行(0~63)是以位为单位,列是以字为单位,上半屏为0~7,下半屏为8~15。
如下图以向左右移为例:
1和3的移动方式就不能调用同一个子程序。
1只涉及了一个字上图形的改变,它的列地址为(0x80),要写进(2,1)、(2,2)的两字节内容为:
0xff(光标为黑色方块)
tab[x+1+8*(y+i)](x方格列位置,y方格列地址)
而3设计了两个列地址(0x80)、(0x81)。
要写进(3,1)、(3,2)、(3,3)、(3,4)的四字节内容为:
tab[x -1+8*(y+i)]、 0xff、 tab[x+1+8*(y+i)]、tab[x+2+8*(y+i)]。
同样,向右移2和4的处理方式与1和3相同。
向上与向下都要改变上下各两个字节内容,这时就要判断要移动的方格是在这个字的哪个字节,以7为例,需要写进(6,1)、(6,2)、(7,1)、(7,2)的内容分别为:
tab[x-1+8*(y+i)]、0xff、tab[x-1+8*(y+8+i)]、tab[x+8*(y+8+i)]。
同样8中,要写进(6,3)、(6,4)、(7,3)、(7,4)的内容为:
tab[x+8*(y-8+i)]、tab[x+1+8*(y-8+i)]、0xff、tab[x+1+8*(y+i)]。
4和5的情况看起来比较特殊,因为他们跨越了上下半屏,需要把它们输入到液晶的位置命令进行一下转换。这里在程序设计时也有些技巧,下面就进行一下介绍。
(3)坐标转换设计
在写入数据之前我们要对显示的位置和输入到液晶的位置命令进行一下转换。
(y,x)为在液晶上显示的方格位置,L为输入到液晶列位置命令的值,h为输入到液晶行位置命令的值,他们的转换字程序为:
3 总结
游戏唯一缺憾是不能随机产生扫雷地图。不过可以通过调用不同的地图数组来进行改善。