搜索
bottom↓
回复: 84

[贡献小程序]ATmega64上贪食蛇游戏(128*64液晶 ks0108)

[复制链接]

出0入0汤圆

发表于 2006-12-30 22:23:34 | 显示全部楼层 |阅读模式
/*****************************/
最新程序:点击此处下载armok01139786.rar
bozai: 于20080103修改
/*****************************/

看到论坛上有人做俄罗斯方块的程序所以想编个简单点的游戏程序 --贪食蛇
今天弄了一天终于在我自己做到板子上实现了这个程序


单片机用m64
液晶为ks0108控制的128*64点阵图形液晶,采用总线驱动方式。
如在其他单片机上需要改一下底层的驱动


程序用了1K的SRAM作为显示缓冲(有点奢侈啊)
程序只完成最基本的功能,欢迎大家去完善扩充啊!


另外m64采用内部8MRC振荡,程序是用AVRSTUDIO4.12 sp4 + WINAVR20060421编的 优化-00
用其它级别的优化有点问题,但是查了半天也没查出来。有兴趣可以找找这个bug


这是原代码和原理图:

点击此处下载armok01139637.rar

一些图片:





阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2006-12-30 22:41:48 | 显示全部楼层
原理图很简单

出0入0汤圆

发表于 2006-12-30 23:36:59 | 显示全部楼层
波仔  是个 好人 ~!





鉴定完毕~!

出0入0汤圆

 楼主| 发表于 2006-12-30 23:42:08 | 显示全部楼层
彼此,彼此!

出0入8汤圆

发表于 2006-12-30 23:43:21 | 显示全部楼层
兄弟的动手能力很强,佩服!

出0入0汤圆

 楼主| 发表于 2006-12-31 00:25:34 | 显示全部楼层
发现程序一个问题:

当尾点周围有两个以上(包含两个)蛇身的点时会出现错误

蛇身移动时我是假设尾点四周没有两个以上蛇身点的,因为我是靠寻找周围的一个点来判断蛇尾到底是向哪个方向移动的,当超过1个时就会出现错误判断。



请问各位大侠有没有好的解决方法?



我现在是用 蛇头坐标+蛇尾坐标+移动方向+目标(要吃的点)+蛇身点数来 记录蛇的状态的。

我也想过用链表来记录蛇身的每一点,但这样显然不现实,128*64点数据量太大了,SRAM不够用。



大家帮帮忙看有没有好的解决方法。

谢谢!

出0入0汤圆

 楼主| 发表于 2006-12-31 03:39:25 | 显示全部楼层
经过两个小时的重新改版,现在的程序已经没问题了,不会出现楼上那种情况。



我的做法的用一个链表去记录蛇身转弯信息,每转一次弯就用一个节点记录它。

节点包含 移动方向和这个弯内的点数 这样就可以确定蛇尾的去向了。

这种方法虽然用链表,但是不会用太大的内存,这个游戏谁能转100个弯就非常了不起了。



请下载这个程序:

点击此处下载armok01139677.rar

出0入0汤圆

发表于 2006-12-31 08:17:44 | 显示全部楼层
不错!值得学习!

出0入0汤圆

发表于 2006-12-31 08:29:55 | 显示全部楼层
楼主牛人!

出0入0汤圆

发表于 2006-12-31 08:40:33 | 显示全部楼层
悍!真强!

出0入0汤圆

发表于 2006-12-31 08:47:20 | 显示全部楼层
牛人 支持中。。

出0入0汤圆

发表于 2006-12-31 08:59:08 | 显示全部楼层

-----此内容被dgxll于2006-12-31,09:00:00编辑过

出0入0汤圆

发表于 2006-12-31 09:17:36 | 显示全部楼层
厉害! 非常值得学习

出0入0汤圆

发表于 2006-12-31 09:20:33 | 显示全部楼层
岁末强贴留名

出0入0汤圆

发表于 2006-12-31 09:22:09 | 显示全部楼层
请问bozai,picture是采用哪个图形取模软件取模的,能不能共享!

出0入0汤圆

 楼主| 发表于 2006-12-31 09:32:18 | 显示全部楼层
多谢各位捧场!



14楼:

picture.h文件未用,是以前用的。

做法是,现用图片工具 如“画图”把图片截成128*64的黑白图片。

然后再用取模软件生成图片,软件网站上有的

也可以用这个

点击此处下载armok01139697.rar

出0入0汤圆

 楼主| 发表于 2006-12-31 19:11:00 | 显示全部楼层
修正一个隐含的小bug

点击此处下载armok01139786.rar


-----此内容被bozai于2006-12-31,19:50:57编辑过

出0入0汤圆

发表于 2006-12-31 23:09:08 | 显示全部楼层
不错,顶!

出0入0汤圆

发表于 2007-1-1 17:45:16 | 显示全部楼层
不错不错

有点意思~~

出0入0汤圆

发表于 2007-12-29 21:36:26 | 显示全部楼层
也在写液晶菜单,顶楼主

出0入0汤圆

发表于 2007-12-29 21:42:38 | 显示全部楼层
强,用得着,谢谢了

出0入0汤圆

发表于 2007-12-30 00:01:47 | 显示全部楼层
牛人 支持中^^^^^^^^^^^^^

出0入0汤圆

发表于 2007-12-30 06:12:41 | 显示全部楼层
干吗要用一片573?M64的管脚不是够用吗.

出0入0汤圆

 楼主| 发表于 2007-12-30 22:59:21 | 显示全部楼层
to 【22楼】 sunke9 小可歌
    用的板子还有其它功能

出0入0汤圆

发表于 2008-1-3 20:30:53 | 显示全部楼层
楼主    强个窝!

出0入0汤圆

发表于 2008-1-4 09:24:22 | 显示全部楼层
呵呵..焊得非常漂亮啊.特别是那个最小系统板..以前我也写过一个DOS下的贪吃食.那是我学完C语言第一个作品..

出0入0汤圆

发表于 2008-1-4 12:58:00 | 显示全部楼层
用这个字模软件如何取8x8的ASCII码的字模?在哪设置?还有12*12汉字的字模?

出0入0汤圆

 楼主| 发表于 2008-1-4 15:55:05 | 显示全部楼层
8x8的没听过,12*12,其实是12*16

出0入0汤圆

发表于 2008-1-4 16:21:23 | 显示全部楼层
多谢回复。
我想在W77E58上跑你的程序,片上的1K RAM是直接应用吗?char xdata a[];在KEIL下能通过编译,但不好用。
另,不用链表不行吗?这个结构太复杂。

出0入0汤圆

 楼主| 发表于 2008-1-4 20:07:31 | 显示全部楼层
1K RAM这个程序不够的,要修改了,因为我光用来缓存屏的数据就1K了,所以要修改屏的显示部分的东西,就需要用到读屏显示数据的东西了。

链表至少从我看来这样最简单了,记录每个点的情况是不现实的,只能一段一段的记录。用链表就可以方便的记录:
当前方向,这个段上的子数,等信息

现在函数的功能快忘了。

出0入0汤圆

发表于 2008-1-5 08:34:37 | 显示全部楼层
楼主可能太忙了,修正错误是12。31,昨天是01。04,几天时间就忘了。
再请教一个问题,在 C中讲链表动态分配内存,完毕后释放内存free,你的程序中也有,可这在单片机中有什么作用?单片机执行了什么操作?

出0入475汤圆

发表于 2008-1-5 09:55:32 | 显示全部楼层
to liqu:
keil你能编译通过struct Node *next;这个吗,要大写才可
还有就是有一些语法要修改,比如有些变量声明等不能在语句中间,
外部RAM只有1K就不够了,因为他使用动态后会占用几个字节的外部RAM,
如果你需要我可以将我改好的C51的发上来

出0入0汤圆

 楼主| 发表于 2008-1-5 10:21:07 | 显示全部楼层
to【30楼】 liqu
   那个12-31可以2006年的阿,现在都2008了

to【31楼】 1a2b3c
   看了一下,我的代码是这样写的哎,粗心了,奇怪的是没给我报错。或者只是个warning,但是我没注意。谢谢!
1K ram还是够的,只不过液晶的代码要重写

出0入475汤圆

发表于 2008-1-7 11:37:27 | 显示全部楼层
楼主还挺热心的,我也是当时一时兴趣就把程序拿来改在一个51的板上了,因为当时正好手里有个128X64的做好的板子,液晶也正好是0108的,只是我没有用总线来做,就用3根IO线来模拟,所以修改了液晶的低层后来用.
移植过程中发现了一些编译错误,大都修改好了,但是有2个错误我基本上不能解决,一个就是上面我提到的struct Node *next;还有一个就是代码中的一个申请一个临时节点的地方,怎么做都是报错(先说明一下我对C基本不通,以前都是用汇编的,读书也没学C,最近2年才慢慢用C,基本上都是使用的一些低档的C语句,像什么结构\类\链表\复杂的指针等等基本不懂),后来发现整个程序中都找不到Node这个词,想想是否这个有问题,于是改了就对了,后来又请教了搞软件的同事,说的确该大写.然后就是临时申请的那个节点,不是在函数的开始位置申明的,所以keil编译器也不认(不知是否有什么设置的方法让其接受,搞软件的同事说是C和C++的问题),我就按照我的一贯做法,将其在函数开始位置声明一个,然后代码中间来直接使用就OK了,这个对我反而会更容易理解一点.

然后就是液晶缓冲直接用了全部点阵大小的RAM,很多芯片都没有这么大,我先前想把你液晶的更新方式改为直接修改,不使用缓冲的方法,但还没有时间去弄,这个是完全可以的,因为程序的速度很够,现在我用的51,并且液晶是模拟时序的,都觉得太快了,还有就是动态内存的方法是否可以改为用一个数组来处理呢,因为占用的空间也不大,好象就几个字节吧,这样就用内部RAM来做了,不知是否可行,因为我说了对C的高级用法不懂,楼主有时间的话,再处理处理?

出0入0汤圆

 楼主| 发表于 2008-1-7 11:46:40 | 显示全部楼层
to 【33楼】 1a2b3c
    呵呵,辛苦了。
    你说的第二个问题,keil的确有这个问题,不能再语句之后再声明。

    不使用动态分配也可以的,我在mp3歌词的处理也这样做的,这样做可以节省很多ram,因为malloc要多占用几个字节空间。
不过不用动态分配的话,就要给个固定的大小,比如100个节点。然后自己在这片空间中组建连表,其实也很麻烦。还要自己去管理,因为期间会有节点被“删除”。这样软件就要做很多工作了。

出0入475汤圆

发表于 2008-1-7 11:56:18 | 显示全部楼层
这样啊,可我现在不懂,要有时间去慢慢学习高级的了,呵呵
那是否可以修改malloc等,让其在内部RAM中使用,这样就不占用外部的RAM了,因为现在那个板子的51芯片只有1024的片上XRAM,而内部RAM还空的有好几十字节.

出0入0汤圆

 楼主| 发表于 2008-1-7 12:16:46 | 显示全部楼层
其实这些你不需要去考虑了,keil自然会帮你处理的。修改应该不可以,这是标准库里的。
不用的确还是挺麻烦的。自己去管理也可以。

出0入0汤圆

发表于 2008-1-8 08:08:44 | 显示全部楼层
1a2b3c,改好了吗?学习一下。

出0入296汤圆

发表于 2008-1-8 19:10:54 | 显示全部楼层
給楼住一个图解的解决方案:

出0入296汤圆

发表于 2008-1-8 19:13:12 | 显示全部楼层

出0入296汤圆

发表于 2008-1-8 19:18:59 | 显示全部楼层
这种方法,在地图本身就记录了队列,节省了大量的内存开销。希望大家能够理解这种较为奇特的二维结构的“倒行”队列。
利用这种数据结构,不仅程序小巧,占用内存也极少。如果是一个4*4的小矩形,则只需要  32 * 8 = 256 个字节的数组空间。这种数据结构不需要动态内存分配,也应用不到指针。希望大家喜欢。

出0入0汤圆

 楼主| 发表于 2008-1-8 21:03:47 | 显示全部楼层
to 【38楼】 Gorgon Meducer 傻孩子:
    谢谢!在小屏幕的lcd上的确是个好方法。算了一下以4bits表示一个点,4个像素组成一个大点,那么128*64的液晶屏,需要1KB的ram,m64可以处理的了。
    我的那种方法,记录段的信息,比较复杂。如果每个点都转弯的话,每个点消耗的大概要8个字节(方向,点数,下一节点指针 + malloc耗的资源),同样1000字节只能记录125个弯的信息。

出0入296汤圆

发表于 2008-1-8 21:26:24 | 显示全部楼层
另外,个人觉得,如果只是想做一个12864的贪食蛇游戏,并不需要M64,一块M16就可以搞定。缓冲区其实不是必须的。

出0入0汤圆

 楼主| 发表于 2008-1-8 21:36:03 | 显示全部楼层
是的,很浪费。当时只是做了个比较复杂的板子,顺便看到这个话题,于是就在线有的板子上做了这个应用。

出0入0汤圆

发表于 2008-1-9 07:50:26 | 显示全部楼层
Gorgon Meducer 傻孩子,多谢了。液晶显示专题匆匆收声场,这么好的东西发到这了。你的书出版了吗?有书名吗?这些天就在研究液晶和程序架构,真希望看到你的作品。

出0入296汤圆

发表于 2008-1-13 22:18:43 | 显示全部楼层
书今年3月份就要出版了,书名是《深入浅出AVR单片机——从ATMega48/88/168开始》。谢谢关注。
本人没什么大理论,都是些平常作工程的经验和理解写在里面。

出0入0汤圆

发表于 2008-1-13 22:26:11 | 显示全部楼层
我到这个论坛没有多久,但已经得知楼上是高人。今闻要出书,关注中,到时一定买一本

出0入0汤圆

发表于 2008-1-17 08:15:33 | 显示全部楼层
用W77E58作了个贪吃蛇,128*64的,2*2为一个游戏点,用512作内存映射,因为2*2,有两个单元点是一样的,即64*8=512,用400Byte记录蛇身各坐标点,最多200个,(x,y).这样1K XDATA很方便。但我作了一个星期。远没有楼主厉害。
Gorgon Meducer 傻孩子,你的书我在当当网和卓越网搜了一下,没有。从哪买?多少钱?小县城,买本书真难。我的邮箱lqbaoer@163.com   想尽快买本学习一下。
对不起,看错了,是要出版。我说怎么没有。哪个出版社?

出0入296汤圆

发表于 2008-1-17 09:48:37 | 显示全部楼层
3月份才出版呢^_^,我自己都还暂时没有拿到出版社的校样,拿到以后扫描几张图片上来炫耀下。
中国电力出版社……偷偷说一句……出版社b u z a d i

出0入0汤圆

发表于 2008-1-17 17:34:51 | 显示全部楼层
一定要买本傻孩子的书,虽然出版社一般,但相信内容是精品。

出0入0汤圆

发表于 2008-1-17 23:27:16 | 显示全部楼层
有一个牛人出现

出0入0汤圆

 楼主| 发表于 2008-1-18 00:17:21 | 显示全部楼层
到时候也去看看

出0入70汤圆

发表于 2008-1-18 10:19:34 | 显示全部楼层
先等等,到时候去图书馆借本当支持吧
^_^

出0入0汤圆

发表于 2008-7-11 14:17:01 | 显示全部楼层
标记

出0入0汤圆

发表于 2008-8-28 19:33:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-8-29 16:15:06 | 显示全部楼层
努力自己做一个

出0入0汤圆

发表于 2008-9-1 12:15:21 | 显示全部楼层
佩服Gorgon Meducer 傻孩子

出0入0汤圆

发表于 2008-9-1 13:01:07 | 显示全部楼层
呵呵,以前有1602+89c51做个,好小哦,只能在1602的一小块屏幕上玩,而且还断断续续的。

出0入0汤圆

发表于 2008-9-5 08:28:39 | 显示全部楼层
up

出0入0汤圆

发表于 2009-7-27 14:32:54 | 显示全部楼层
顶上

出0入0汤圆

发表于 2009-7-29 10:01:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-19 16:02:46 | 显示全部楼层
强悍!牛人

出0入0汤圆

发表于 2009-8-22 15:42:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-22 23:00:50 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2009-8-22 23:40:55 | 显示全部楼层
论坛里牛人好多啊!佩服中

出0入0汤圆

发表于 2010-2-28 17:55:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-1 10:04:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-8 23:07:05 | 显示全部楼层
这么多年都被耽误了

出0入0汤圆

发表于 2010-4-18 16:28:07 | 显示全部楼层
太强了

出0入0汤圆

发表于 2010-5-13 08:53:16 | 显示全部楼层
学习~~~

出0入0汤圆

发表于 2010-7-15 18:03:45 | 显示全部楼层
强顶!!!!!!!!!!!!1111

出0入0汤圆

发表于 2010-7-16 09:45:31 | 显示全部楼层
mark ~

出0入0汤圆

发表于 2010-9-9 20:49:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-10 11:38:48 | 显示全部楼层
正好刚刚点亮了一块12864液晶,可以试试这个~

出0入0汤圆

发表于 2010-11-29 22:34:40 | 显示全部楼层
牛人

出0入0汤圆

发表于 2011-2-7 22:04:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-13 14:18:20 | 显示全部楼层
贪食蛇游戏,经典!

出0入0汤圆

发表于 2011-8-13 14:36:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-18 10:43:39 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-11-3 16:02:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-4 09:45:59 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-1-11 22:17:08 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-1-11 22:48:41 | 显示全部楼层
只要删掉尾点,加上头的点,然后碰撞测试就可以了,生成食物的时候看缓存里面没有占用就好的,标记一下食物的坐标就可以了,墙和蛇身都是一个代码,反正都是碰着就死。不必用二级缓存。

出0入0汤圆

发表于 2012-1-12 11:48:53 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 21:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表