先说下我这个东西最主要的几块。
1.单片机用的是stc的,51内核,你首先要会这个···
2.用状态机实现按键。这个里面有别人写的技术帖子··
3.液晶是12864,2种控制器都做过,一个控制器是ST7920带字库的,一个控制器是KS0108不带字库的。2个的英文资料我都放在里面了。首先得弄懂液晶要怎么样和单片机连接。
要在液晶上面做游戏,推荐先看英文资料,一定要看英文,研究液晶读写时序和初始化方法,然后找别人的程序,实现液晶的基本操作,画点,写汉字什么的,读液晶···然后自己写程序实现液晶的所有基本操作。这样才能对液晶有充分的认识,才能开始在上面做游戏。有了这个基础,以后学别的液晶也会快的多。
4.菜单,游戏少不了要用到菜单,比如选择难度,选择地图什么的。我里面放了一个别人的论文,看了之后应该就会自己写了。(注意论文里面讲的是用函数指针实现菜单,但是KEIL这个环境下用51函数指针会很困难,推荐像我那样直接传菜单号)
5.贪吃蛇游戏,推荐先不要看别人的程序,自己在电脑上面下个贪吃蛇游戏,玩的时候就观察贪吃蛇游戏的特征···比如蛇在怎么动,蛇要怎么描述,是每个点都描述还是只要蛇头蛇尾···蛇转弯的时候怎么写?对于上面的问题,可以参考别人的程序,然后就开始动手画图什么的表示出来这些过程,一个功能一个功能逐一实现。(推荐看带字库的那个程序,那个程序代码是最终优化版本。思路很清晰···)
6.液晶的动画,动画实际上就是图片一张一张的显示,我在里面放了一个把彩色照片黑白二值化的工具,可以找到自己喜欢的GIF动画,用提取工具把照片一张一张提取出来,然后黑白二值化,然后取模工具取模,然后实现···虽然过程蛮枯燥,但是效果还不过,也可以学到不少东西。
单片机源程序如下:
#include <12864.h>
#include
#define num 15
//用来描述蛇在液晶上面一个点的结构体
struct she
{
unsigned char x,y,value;
unsigned char direction;
};
struct loop_queue //利用循环数组实现循环队列,拐点不会超过15个。所以大小选15足以。
{
unsigned int front;
unsigned int rear;
unsigned int count;
struct she dat[num];
};
//不熟悉数组实现循环队列的可以在纸上画一下操作过程
struct she tou,wei,food; //蛇的头尾节点 和食物点
struct loop_queue queue;//循环队列 蛇转弯则形成拐点 将拐点入队列 尾巴到达拐点则拐点出队列
unsigned char flag_exit_game; //返回标志 为1时 从贪吃蛇游戏返回菜单
unsigned char flag_game_over; //结束标志 为1时 显示游戏结束画面 同时使返回标志为1
unsigned char tcs_stop;//暂停标志
unsigned char tcs_nd; //难度标志
unsigned char tcs_dt; //地图标志
unsigned char tcs_key_flag; //贪吃蛇在一次移动中 只允许捕获一次按键 也就是只能产生一个拐点
unsigned char tcs_key_state; //用于按键状态机的实现
unsigned int tcs_df;//得分
unsigned int tcs_highest_df;//最高得分···没有使用这个 因为不知道要怎么在运行时写单片机的ROM
void tcs_game();
void tcs_bianjie(unsigned int ); //贪吃蛇边界
void tcs_game_initial(); //游戏初始化
void timer0_initial(); //定时器0初始化
void timer1_initial();
void food_produce(); //产生食物
unsigned char test_point_exist(unsigned char x, unsigned char y, unsigned char value);
void queue_initial(struct loop_queue *q);
void queue_in(struct loop_queue *q,struct she h) ;
struct she queue_out(struct loop_queue *q) ;
void wei_you();
void wei_xia();
void wei_zuo();
void wei_shang();
void tcs_game()
{
struct she check; //用与暂存蛇即将移动的点 从而进行判断
unsigned char he;
unsigned char hui,i;
flag_exit_game=0;
flag_game_over=0;
tcs_key_state=0;
tcs_df=0;
tcs_stop=1;
draw_lcd_picture(&tcs_picture[0]); //贪吃蛇游戏画面
delay_ms(2000);
clear_lcd();//清屏12864
tcs_bianjie(tcs_dt); //贪吃蛇游戏边界
tcs_game_initial();//贪吃蛇初始化 主要是设定蛇头蛇尾 并显示蛇
timer0_initial(); //定时器0工作在方式2 8位自动装初值 只计数不中断 用来产生随机数
timer1_initial(); //定时器1工作在方式1 16位 10ms中断一次扫描键盘
do
{
food_produce();//产生一个随机数 即随即产生x y value3个值确定一个点为食物
he=test_point_exist(food.x,food.y,food.value);//检测产生的点的地方是否已经有点存在
}
while(he==food.value);//如果随机数产生在蛇的身体以及边界上 则重新再产生一个
draw_lcd_point(food.x,food.y,food.value);//显示食物 先读取这个点所在8位的情况 以免破坏现场
queue_initial(&queue);//初始化循环队列 使队列空 front rear 即头尾指针为0
check.x=0;
check.y=0;
check.value=0;
check.direction=0;
for(i=0;i queue.dat[i]=check; while(1) { if(flag_exit_game==1)//如果游戏过程中按下返回键 则立即结束游戏 返回菜单 break; if(flag_game_over==1) break; ET1=1; //允许扫描按键 贪吃蛇游戏难度决定蛇2次移动之间的间隔时间 也就是检测按键的时间 tcs_key_flag=0; //允许捕获按键 在检测按键时间内 只允许生产一个拐点 即捕获到一个有效的 //按键以后 就置一这个变量 不允许再增加拐点 while(tcs_stop==0); switch(tcs_nd) { case 0: {delay_ms(10); break;} case 1: {delay_ms(50); break;} case 2: {delay_ms(100); break;} } ET1=0; switch(tou.direction)//这个switch用来根据蛇头的x y value值以及当前蛇头移动的方向 //取出蛇头要到达的下一个点 存入check中 来判断是否撞墙 吃到食物 什么的··· { case 0: { check.x=tou.x; if(tou.y==63) check.y=0; else
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』