你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)  

[复制链接]
思考的大兵 发布时间:2014-4-21 20:23
wifi0s01236577842IMG_20140421_201344.jpg
0 F0 P' ~, }: H/ j$ N看到网上有人用单片机做俄罗斯方块、贪吃蛇游戏后,自己也想做个。。。说干就干,先是分析游戏内容,然后设计程序结构,最后调试硬件,写代码,花了一两天时间搞定了,在此分享下成果,做的过程中,没有参考任何游戏资料,所以应该是100%原创吧。。。
8 K/ M4 r& k" g) i, J8 a( z
% |6 B, X  L" p* \% t6 P4 K# N游戏分析:
; i9 U+ g; p8 g" `% i+ ]: u8 y! D# S& e4 Q# Y7 ~) `
贪吃蛇游戏很简单,不用多说,就是按键控制蛇的移动方向,使之吃到食物增加自身长度,当蛇碰到边界或自身后游戏结束2 w5 j6 e8 [9 A' D: z" ]6 t3 e5 I
) P; }3 ^* D! N
所以开发这个游戏有一下几个事情要做
% U9 q$ ^8 N0 b( j. B
2 Z, i' p) m* H9 h1、游戏界面:; ^) [" v- X1 [2 L6 |3 J) d& O% A

2 m: O* S. v2 Q/ E& F; @* Q采用LCD12864液晶屏,不是市场上常见的大屏,而是小屏,显示内容和大屏一样,外接字库芯片。
; r! H, b; i2 c* L# w' n( B) x  w
) S% K# P  m+ t3 f5 e' x5 w) R因为单个像素点太小,所以采用4*4像素作为一个最小显示单元,这样一来整屏就划分成了32*64的游戏区域,8 I- C0 {& c& Q( k: O
& ~  \7 G+ u4 ]& C( @( ?
在此方面控制程序主有两个,一个画点函数,一个擦点函数,用于在屏幕任意坐标添加或删除一个黑点,作为游戏显示操作
" ?2 P! v" W; u8 a5 l8 _4 R4 g. q5 \' R2 x4 E% m8 Y4 D
2、蛇身的建立
$ Y: [, a. O! w( i1 `" ~5 h7 @) T' T: S
这一步将整个蛇显示到屏幕上,因为蛇身是一个点连接一个点,所以之前有想到用建立链表的方式去表示蛇,但后来发现有处理起来有点繁琐,就舍弃了。
9 e( p+ Q, ?5 n
) q' z; W# ?; O  g' N3 @* Q4 [3 a转而第二种方式,采用数组方式,因为屏幕最大内容是32*64=2K个点,所以建立了一个2048 x 16bit的数组,虽然有点大,但是对于stm32拥有64K RAM来说就有点小巫见大巫了。。。/ Y  X, Q) p6 S- s! o  j  T9 {$ K, \

' Z' `$ ]3 b2 q5 m' _建立数组后,每个数据表示蛇在屏幕上的坐标,高八位表示行坐标,低八位表示列坐标,数组起始为头部坐标,根据蛇的长度决定尾部坐标。这样一来就解决了蛇身的问题
" [1 H  m8 e) x, w* z+ y- F/ R% E4 b, I0 H5 t; O& v* C. s" r
此外还建立了一个64*32bit的屏幕缓存,用以表示屏幕上任意坐标(x,y)处是否存在蛇身。
4 ^& `6 n& A! m# J* G" B/ K0 F1 j( X. \& M7 C; S
3、蛇的移动
6 g% v+ @8 h) X9 k  U) u
8 v. V7 F6 t0 S当蛇要移动时,先提取头部坐标,如(x,y),根据当前的移动方向,计算下一个坐标,如果方向为左(以屏幕左上角为(0,0)水平向右为x轴,向下为y轴)则下一坐标为(x-1,y)向右(x+1,y)向下(x,y+1)向上(x,y-1)' e: q/ r. ~0 N8 @; W' f

" A0 O" p: s$ Z7 L( {: C1 v然后再一次将蛇身坐标(数组内容)依次往后挪一个,长度为蛇身坐标。如果下一坐标为食物,则在尾坐标后再添加一个位置,复制尾坐标,长度+1,否者删除尾坐标。再将新坐标复制到数组0的地方作为新的蛇头,此过程中,及时根据坐标的改变(添加新坐标或删除坐标),在屏幕缓存相应位置画点和擦点,标记蛇身。
% ?* ]9 |: [8 @( T7 H% |/ u6 p; l2 d. U2 R( ]* ^! ]  R2 j% K
4、游戏的规则,按照3计算新坐标后,判断该店缓存是否为1(1表示存在蛇身或其他物体,0表示空白单元),如果为1,则表明蛇遇到物体了,如果该物体是食物,则进行游戏添加食物动作,如果不为食物则表明蛇撞自己了,即游戏失败,此外还要判断该坐标是否超出边界。9 J! t) c* ?2 \* m$ f" G, g
/ \, {' \8 F+ _/ S- K6 q
5、动作控制,4个按键,采用中断方式,代表4个方向。按下一个键,改变当前的移动方向,在这里要注意,方向改变之前要判断当前方向必须不为反向,如转变至左方向时,当前方向不能是右,防止蛇回头,撞到自身,这是游戏中不允许的。
. V* h* G+ ]4 h, H, c: i
6 E4 Y# |: Q) J  [, S0 h8 L0 l6、食物的出现,随机出现,有两种办法,一是利用单片机的系统随机误差产生坐标,如ADC模块,随机读取ADC数据模块,分别对64和32取余。当然前提是误差最大有64的摆幅,这是一种不够精确地随机数。
- G3 U( R( d: W" u9 I% S1 F
' E/ N1 }/ ?+ R& w- S8 c! I二是采用C语言rand()随机函数,也是分别对64和32取余,比前者要科学,但前提是每次游戏运行前要给一个随机种子,进行随机函数种子初始化srand(seed),否者每次游戏运行出现的随机序列(食物的坐标)都是一样的,这一步就必须借助外部环境了,游戏中我采用的是这一方式获得食物,这里通过记录游戏开始后第一次按下键盘的时间作为随机数种子,开了一个72M不分频的定时器,因为技术频率快,从游戏开始到第一次按键的时间几乎是随机的。当然也可以采用ADC模块的随机误差数据。, E1 n* h6 {1 R1 ]* x% g; H$ T

: M* @/ }! n# i9 {) U8 l然后就在游戏开始随机产生一个食物,当游戏开始后,在计算下一坐标后,如果该点为食物,则吃掉它,并产生一个食物,通过对屏幕缓存的判断,直到新的食物坐标是一个空白单元。
& |( k2 c; T6 g; a2 {
4 j6 p% a% Y7 |& @7、游戏进程控制:
6 o8 n' V: T9 J# t
$ Q9 Y/ S: A4 X) X8 p0 ?开了一个定时器,周期决定蛇的移动速度。进入定时器后,根据当前的移动方向,进入不同的状态机,计算下一坐标,判断,(吃食物或者移动),移动蛇身将坐标往数组后面挪,如果游戏失败,将游戏标志位置位,主函数则实时判断游戏是否失败,如果失败,则关闭定时器,清屏,显示游戏分数(蛇身长度),并进入死循环或等待系统软复位。2 P& D! @- q1 L
6 o) {( d* ^+ p& T( U
wifi0s0-10253607IMG_20140421_201454.jpg 4 I' U' d, r( Y% A5 S4 \
游戏代码.rar (425.14 KB, 下载次数: 1288)
wifi0s0-2081564277IMG_20140421_201406.jpg
wifi0s01369854669IMG_20140421_201416.jpg
收藏 9 评论75 发布时间:2014-4-21 20:23

举报

75个回答
pisayisi 回答时间:2014-4-22 02:18:14

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

snake game my fav
思考的大兵 回答时间:2014-12-30 22:47:47
有道无界 发表于 2014-12-17 15:27
0 D" W  v) ^+ |% ?为什么既有CS脚,也有RS脚,二者不是同一个脚吗?CS和RS脚不就是用来区分串行模式和并行模式的吗?求解.... ...

* a8 J2 d3 R8 g! A# hCS是片选,RS是数据或命令,12864是SPI协议
有道 回答时间:2014-12-17 15:27:02
为什么既有CS脚,也有RS脚,二者不是同一个脚吗?CS和RS脚不就是用来区分串行模式和并行模式的吗?求解.....' D* G6 a4 @/ V. i
LCD12864_CS->PB1,LCD12864_RST->PB0,LCD12864_RS->PB13
思考的大兵 回答时间:2014-4-21 20:25:04

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作(提供源码)

自己先顶下,希望能帮到大家。。。
大米周822 回答时间:2014-4-21 20:38:30

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

顶一下,学一下。。。。
疯子咬手指 回答时间:2014-4-21 20:39:52

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

我再顶
思考的大兵 回答时间:2014-4-22 10:11:30

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

回复第 5 楼 于2014-04-22 02:18:14发表:1 `5 ]* v  e5 |) Z$ n9 l, g
snake game my fav 
ansai008 回答时间:2014-4-22 19:06:05

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

收下  看看
ansai008 回答时间:2014-4-22 19:25:14

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

因为单个像素点太小,所以采用4*4像素作为一个最小显示单元,这样一来整屏就划分成了32*64的游戏区域。   这里楼主 笔误了吧 128*64 应该是2*2 像素 才是   32*64的显示区域吧。
快乐汉 回答时间:2014-4-24 20:16:21

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

谢谢分享,学习中!
sunriseup 回答时间:2014-4-25 17:10:47

RE:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

好東西
思考的大兵 回答时间:2014-4-27 21:46:22

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

回复第 8 楼 于2014-04-22 19:25:14发表:
# c; u4 j, ]/ i$ d2 p因为单个像素点太小,所以采用4*4像素作为一个最小显示单元,这样一来整屏就划分成了32*64的游戏区域。   这里楼主 笔误了吧 128*64 应该是2*2 像素 才是   32*64的显示区域吧 $ S5 e  j; z5 A% @/ N
) J& c4 W; L, B1 L* u
的确是的,笔误了。。。
amaximg 回答时间:2014-4-29 08:37:30

RE:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

顶一下,学习中...
湛芦居士 回答时间:2014-5-11 09:20:45

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

来学习一下
Farmer119 回答时间:2014-5-13 14:39:57

回复:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

高手啊,下下来学习学习
ericchf 回答时间:2014-5-13 15:52:57

RE:【MCU实战经验】+基于stm32和LCD12864的贪吃蛇游戏制作,游戏分析(提供源码)

谢谢分享~~~~
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版