《基于51单片机的推箱子游戏》由会员分享,可在线阅读,更多相关《基于51单片机的推箱子游戏(17页珍藏版)》请在金锄头文库上搜索。
1、推箱子 (以前做的,现在加以整理传上来给初学者做个参考,也整点分用用。)演示:上电显示游戏的名字及我的qq开始游戏1. 红外:不同的遥控器用的芯片不同,发射出来的数据长度都不同。12864:不同的12864的指令可能是不同的,需要根据具体的模块来编写代码。具体怎么用,去看数据手册吧。我用的是汉升的 12864-15c。2. 游戏实现:A、我把屏幕分成了8*8的区域,箱子,目的地,人墙,都是8*8的。所以这个屏幕是16*8的了B、我的这块12864,在基本指令集是写入文字,再在扩展指令集时绘制图形,文字会反白显示,我的菜单模块就是根据这个特点来实现的。注释中也叫文本模式,图形模式。C、数据表示:
2、a、在地图中用0、1、2、3、4分别表示 空地、墙、人、目的地、箱子,他们的点阵数据保存在全局变量unsigned char code yuansu_code58中。b、在程序ROM中,各关的地图保存在全局变量unsigned char code ditu_ju_code3128(我只做了3关)中。如:第一关的地图数据: 第一关游戏画面:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,4,4,4,0,1,0,0,0,0,0,
3、0,0,1,1,1,3,3,1,0,0,1,0,0,0,0,0,0,0,1,0,4,3,3,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0c、一个重要的全局变量unsigned char idata ditu816,游戏开始时,ROM中的地图数据会被加载到这个数组中,之后,所有的游戏操作都会围绕着这个数组展开。根据用户的操作去修改这个数组,然后根据这个数组刷新屏幕。如,第一关开始时,将人左移一格,idata ditu816=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4、0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,4,4,4,0,1,0,0,0,0,0,0,0,1,1,1,3,3,1,0,0,1,0,0,0,0,0,0,0,1,0,4,3,3,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,2,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0电路:推箱子地图编辑器: (关闭本Word文件再打开,下面的flash可以重新开始。没写好,惭愧)(0空地 1墙 2人 3目的地 4箱子)源代码:#i
5、nclude/*定义引脚连接*/ #define lcd_shuju P0 /12864的引脚#define lcd_en P3_4#define lcd_rs P3_5#define lcd_rw P3_6#define lcd_psb P3_7#define fm P2_3/蜂鸣器引脚/*定义按键常数*/ #definekey_shang 48#definekey_xia 176#definekey_zuo 232#definekey_you 104#definekey_quxiao 40#definekey_queding 24#definekey_caidan 136/*红外用的变量*
6、/char IR_timer=0;/脉冲周期unsigned char IR_DATAH=0; /存储8位数据码unsigned char IR_DATAL=0; /存储8位数据反码bit IR_OK=0;/接收完bit starflag=0;/等于1时,表示帧已经开始/*游戏时用的变量*/unsigned char biaoti0=;unsigned char biaoti1=推箱子;unsigned char biaoti2=;unsigned char shengming=QQ:857448526;unsigned int shengyi =0; /当不为0时,就用T1定时器播放声音un
7、signed char ren_x,ren_y;/人的座标unsigned char jushu=0;/用来保存玩的是第几局游戏bit wancheng =0;/是否全部完成char chexiao22=0,0,0,0;/记录移动箱子时,人的x,y 及运动方向dx,dy 最大撤销1步unsigned char idata ditu816;/当作内存来使用,用来保存游戏的地图,整个游戏都围绕着这个数组展开unsigned char caidan_biaoqian0=打开:; /菜单上的文字unsigned char caidan_biaoqian1=;unsigned char caidan_b
8、iaoqian2=;unsigned char caidan_biaoqian3=;/*游戏元素的点阵数据*/unsigned char code yuansu_code58=0,0,0,0,0,0,0,0,/空地 0 255,255,255,255,255,255,255,255,/墙的点阵数据 1 0x00,0x18,0x5A,0x7E,0x18,0x24,0x42,0x00,/人的点阵数据 20x00,0x42,0x24,0x18,0x18,0x24,0x42,0x00,/目的地的点阵数据 30x00,0x7E,0x56,0x6A,0x56,0x6A,0x7E,0x00/箱子的点阵数据
9、4;unsigned char code ditu_ju_code3128=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,4,4,4,0,1,0,0,0,0,0,0,0,1,1,1,3,3,1,0,0,1,0,0,0,0,0,0,0,1,0,4,3,3,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,/第 1 局
10、的地图数据0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,2,1,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,4,0,4,0,4,1,0,0,0,0,0,0,0,0,1,0,0,1,1,4,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,4,0,1,1,1,0,0,0,0,0,0,0,1,0,0,3,3,3,3,3,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,/第 2 局的地图数据0,0,0,0,1,1,1,1,1,1,0,0,0,0,
11、0,0,0,0,0,0,1,3,3,3,0,1,0,0,0,0,0,0,0,0,0,0,1,3,3,3,3,1,1,1,1,0,0,0,0,0,1,1,1,0,4,1,1,1,0,0,1,0,0,0,0,0,1,0,4,4,0,0,4,0,4,0,1,0,0,0,0,0,1,0,0,0,0,4,0,4,0,0,1,0,0,0,0,0,1,0,0,0,1,1,1,0,0,2,1,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0/第 3 局的地图数据;/* 延时函数*/void yanshi(int us) us*=3; for(us;us0;us-);/*与红外有关的函
12、数*/void T0_FUNC() interrupt 1/定时器T0 中断服务函数,有两个作用IR_timer+;/1、播放声音。shengyi 是一个全局变量,if(shengyi1)/ 当它等于0时,蜂鸣器连接的引脚输出低电平,fm=0;/ 当它不等于0时,输出高电平,使蜂鸣器发声shengyi-;/所以呢, shengyi值越大,蜂鸣器响的时间越长if(shengyi=1)/2、测量红外脉冲的长度,用IR_timer保存。IR_timer=7时,认为该脉冲是1。 fm=1; shengyi=0;void INT0_FUNC() interrupt 0 /外部中断INT0中断服务函数,用来 解析红外 /这个只能用来解析帧长度为32个下降沿的红外帧,/并且不处理长按一个键的情况,/在这里,开发板的硬件上面将红外接收头的OUT脚已经经过反向后再接单片机/所以刚好这里数的是下降沿static char i=0;/i用来保存这是第几个脉冲 if(starflag)/starflag=0,认为这个脉冲是前导码,下一个脉冲开始依次是/地址码,地址反码,数据码,数据反码,这里只处理了数据码和数据反码 if(IR_timer=33&IR_timer63)/如果IR_timer太大,则认为这个脉冲跟上一个脉冲不是同/一个数据帧的,而是一个新的数据帧的开始