看到网上有人用单片机做俄罗斯方块、贪吃蛇游戏后,自己也想做个。。。说干就干,先是分析游戏内容,然后设计程序结构,最后调试硬件,写代码,花了一两天时间搞定了,在此分享下成果,做的过程中,没有参考任何游戏资料,所以应该是100%原创吧。。。 " M1 y3 J7 Q8 p! L. Z2 S/ B0 @. I7 _4 a; t* } 游戏分析: 贪吃蛇游戏很简单,不用多说,就是按键控制蛇的移动方向,使之吃到食物增加自身长度,当蛇碰到边界或自身后游戏结束# u% W" m- G% e P0 J6 K 3 {6 C% x; l5 G. K, O' u$ m 所以开发这个游戏有一下几个事情要做/ K" L6 p7 }& S$ ` Q9 |/ z8 h7 @ 1 x3 f1 s6 _" h1 ~ 1、游戏界面:4 }8 U8 o7 I* ` 1 V: `' S) C, C* q- p8 T( M3 X4 f 采用LCD12864液晶屏,不是市场上常见的大屏,而是小屏,显示内容和大屏一样,外接字库芯片。# m: u( e f. O8 n) b# P& Q5 ] 因为单个像素点太小,所以采用4*4像素作为一个最小显示单元,这样一来整屏就划分成了32*64的游戏区域, 在此方面控制程序主有两个,一个画点函数,一个擦点函数,用于在屏幕任意坐标添加或删除一个黑点,作为游戏显示操作9 i) p" n0 ]- }& H$ u/ ~9 q3 j" @. B 2、蛇身的建立 2 h# W$ e9 \" u7 ?) {4 |, P 这一步将整个蛇显示到屏幕上,因为蛇身是一个点连接一个点,所以之前有想到用建立链表的方式去表示蛇,但后来发现有处理起来有点繁琐,就舍弃了。 0 l( r& ]3 @$ i* V; `4 i 转而第二种方式,采用数组方式,因为屏幕最大内容是32*64=2K个点,所以建立了一个2048 x 16bit的数组,虽然有点大,但是对于stm32拥有64K RAM来说就有点小巫见大巫了。。。 + V6 L; f9 e: s1 o: A- t6 ~5 A7 w% `0 q' _& L$ t& T/ X 建立数组后,每个数据表示蛇在屏幕上的坐标,高八位表示行坐标,低八位表示列坐标,数组起始为头部坐标,根据蛇的长度决定尾部坐标。这样一来就解决了蛇身的问题9 B! r# J$ E) q) m. V 7 n) v( b( S' s, l- ? 此外还建立了一个64*32bit的屏幕缓存,用以表示屏幕上任意坐标(x,y)处是否存在蛇身。5 Q% S6 S0 j6 @1 ~3 M7 ^) c( o 3、蛇的移动 " @6 g! n& T+ Q D. V4 ~ 当蛇要移动时,先提取头部坐标,如(x,y),根据当前的移动方向,计算下一个坐标,如果方向为左(以屏幕左上角为(0,0)水平向右为x轴,向下为y轴)则下一坐标为(x-1,y)向右(x+1,y)向下(x,y+1)向上(x,y-1) : T, i }% ?8 t/ j3 Z) C 然后再一次将蛇身坐标(数组内容)依次往后挪一个,长度为蛇身坐标。如果下一坐标为食物,则在尾坐标后再添加一个位置,复制尾坐标,长度+1,否者删除尾坐标。再将新坐标复制到数组0的地方作为新的蛇头,此过程中,及时根据坐标的改变(添加新坐标或删除坐标),在屏幕缓存相应位置画点和擦点,标记蛇身。8 _8 }2 b9 W- y+ {8 U: n& [: ~ ) \. D% z, O( s% e/ w& u 4、游戏的规则,按照3计算新坐标后,判断该店缓存是否为1(1表示存在蛇身或其他物体,0表示空白单元),如果为1,则表明蛇遇到物体了,如果该物体是食物,则进行游戏添加食物动作,如果不为食物则表明蛇撞自己了,即游戏失败,此外还要判断该坐标是否超出边界。( o4 T4 T: A! N F/ s* J. C . @8 A1 b. c. R6 w; n 5、动作控制,4个按键,采用中断方式,代表4个方向。按下一个键,改变当前的移动方向,在这里要注意,方向改变之前要判断当前方向必须不为反向,如转变至左方向时,当前方向不能是右,防止蛇回头,撞到自身,这是游戏中不允许的。9 v/ Z0 o/ Z. A# O: C5 N# c. x9 i 6、食物的出现,随机出现,有两种办法,一是利用单片机的系统随机误差产生坐标,如ADC模块,随机读取ADC数据模块,分别对64和32取余。当然前提是误差最大有64的摆幅,这是一种不够精确地随机数。 二是采用C语言rand()随机函数,也是分别对64和32取余,比前者要科学,但前提是每次游戏运行前要给一个随机种子,进行随机函数种子初始化srand(seed),否者每次游戏运行出现的随机序列(食物的坐标)都是一样的,这一步就必须借助外部环境了,游戏中我采用的是这一方式获得食物,这里通过记录游戏开始后第一次按下键盘的时间作为随机数种子,开了一个72M不分频的定时器,因为技术频率快,从游戏开始到第一次按键的时间几乎是随机的。当然也可以采用ADC模块的随机误差数据。0 K/ Z( j6 F' V" t% D3 W& {% g! g + p Y2 M1 \ i' K5 {" X 然后就在游戏开始随机产生一个食物,当游戏开始后,在计算下一坐标后,如果该点为食物,则吃掉它,并产生一个食物,通过对屏幕缓存的判断,直到新的食物坐标是一个空白单元。) K p+ H+ X8 v- m7 [9 J 7、游戏进程控制:/ r x: C" g& @5 X1 E6 R ; [/ [' T" F& r8 ^' f: a 开了一个定时器,周期决定蛇的移动速度。进入定时器后,根据当前的移动方向,进入不同的状态机,计算下一坐标,判断,(吃食物或者移动),移动蛇身将坐标往数组后面挪,如果游戏失败,将游戏标志位置位,主函数则实时判断游戏是否失败,如果失败,则关闭定时器,清屏,显示游戏分数(蛇身长度),并进入死循环或等待系统软复位。
游æä»£ç .rar
(425.14 KB, 下载次数: 1291)
|
微信公众号
手机版
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
CS是片选,RS是数据或命令,12864是SPI协议
LCD12864_CS->PB1,LCD12864_RST->PB0,LCD12864_RS->PB13
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作(提供源码)
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
snake game my fav
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
RE:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
因为单个像素点太小,所以采用4*4像素作为一个最小显示单元,这样一来整屏就划分成了32*64的游戏区域。 这里楼主 笔误了吧 128*64 应该是2*2 像素 才是 32*64的显示区域吧 # w* P4 c8 h7 W
的确是的,笔误了。。。
RE:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)
RE:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)