- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
贪吃蛇C语言.doc
贪吃蛇C语言.txt这是一个禁忌相继崩溃的时代,没人拦得着你,只有你自己拦着自己,你的禁忌越多成就就越少。自卑有多种档次,最高档次的自卑表现为吹嘘自己干什么都是天才。//贪吃蛇游戏程序,屏左半部用于游戏活动,右半部为分数显示
//游戏屏为16*16游戏点阵,可容纳蛇身块数256。每个游戏点阵又由4*4个LCD基本点阵组成
//蛇行标志在定时器上置位,这里为游戏的主体部分。
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define LCMD XBYTE[0xAfff] // 液晶数据口
#define LCMC XBYTE[0xAbff] // 液晶命令口
#define TIME_RUN 10 //定时器分品系数
#include study.h
#include reg51.h
#include absacc.h
#include intrins.h
//游戏部分
//x,y最大极限
#define MAX_GAME_X 15
#define MAX_GAME_Y 15
#define lcd_no_read 1 //编译选项,把这项屏蔽掉就采用LCD读出方式,否则采用显存形式
uchar snake_flag, //蛇头标志 7 6 5 4 3 2 1 0
// 上 下 左 右 x gameover food run
snake_len, //蛇身长度
snake_food; //食物位置,高4位Y,低4位x
uchar xdata snake_body[256]; //蛇身每个部分的数据
// 7 6 5 4 3 2 1 0
// 高4位Y方向 低4位X方向
#ifdef lcd_no_read
uchar xdata lcd_buf[8][64];//lcd缓冲,用于记录LCD内部的点阵,可以理解为显存
//当LCD无读出功能时,就要采用显示缓冲。本LCD为可读,一般不用这个功能
//缓冲只记录蛇身活动的部分,即LCD左半屏
#endif
/******************************************************
* 游戏LCD部分,根据游戏的特点把LCD分成16*16块
* 用作游戏点阵,
*******************************************************/
//
//函数名:clr_game_dot
//功能:清一个游戏点
//输入参数:游戏点的X,Y坐标
//注意事项:这里的X,Y坐标和LCD底层的X,Y坐标不同,他最大只能是MAX_GAME_X,MAX_GAME_Y
//使用方式:内部调用
void clr_game_dot(uchar x,uchar y)
{
uchar lcd_x,i,tmp;
while(xMAX_GAME_X)x-=(MAX_GAME_X+1); //这个是写程序习惯的保护措施,预防输入范围过大
while(yMAX_GAME_Y)y-=(MAX_GAME_Y+1);
lcd_x=x2;
LCMC=lcd_x0x0f; //设置x位置
LCMC=(lcd_x4)|0x10;
LCMC=0xb0+y/2; //设置Y位置
LCMC=0xe0;
if(y%2)//行的下半部
{
for(i=0;i4;i++)
{
#ifdef lcd_no_read //以下是显存法的清点程序,其他例如亮点的部分和这个原理一样
tmp=lcd_buf[y1][(x2)+i]; //先从缓冲读出要修改的LCD片的数据
tmp=0x0f; //清对应的游戏点
LCMD=tmp;
_nop_();
lcd_buf[y1][(x2)+i]=tmp; //把新数据写回缓冲
#else
tmp=LCMD;tmp=LCMD; //读LCD的方法,要求连读2次
LCMD=tmp0x0f;
#endif
}
}
else //行的上半部,下同
{
for(i=0;i4;i++)
{
#ifdef lcd_no_read
tmp=lcd_buf[y1][(x2)+i];
tmp=0xf0;
LCMD=tmp;
_nop_();
lcd_bu
文档评论(0)