




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
俄罗斯方块,简单易学,编这个程序也比贪吃蛇相对简单,多花心思,4天的开发周期也足够了,这个程序是近期写的,所以程序代码也比之前的贪吃蛇简练些总模块:Main函数贴图:游戏编程总少不了GUI,这里运用了LCD12864,顺便把LCD12864的H文件的源程序也贴出来吧相应的LCD12864的C文件如下:/-/*应用函数*/初始化LCD12864void init_12864(void)DelayMs(20);write_com(0x30);/8位数据格式,基本指令显示 DelayMs(20);write_com(0x30);/8位数据格式,基本指令显示DelayMs(20);write_com(0x0C);/开显示,关闭光标DelayMs(20);write_com(0x01);/清屏指令DelayMs(20);write_com(0x06);/设置显示点:指针自加1RS=0;RW=0;/*写入字符和数字函数*/void write_string(unsigned char row,unsigned char col,unsigned char *str)/写入字符串函数,row代表行,col代表列,*str代表要写入的字符串的首地址unsigned char *pstr;pstr=str;if(row=1)write_com(0x80+col-1);/设定DDRAM地址到地址计数器AC(DDRAM地址:0x80+col-1)else if(row=2)write_com(0x90+col-1);else if(row=3)write_com(0x88+col-1);else if(row=4)write_com(0x98+col-1);while(*pstr!=0)write_dat(*pstr);pstr+;void write_num(unsigned char row,unsigned char col,unsigned int num)/写入数字函数,row代表行,col代表列,num代表要写入的字符串的首地址int BiteLength=0;int Wei16;int NumTmp;int i;NumTmp=num;if(num!=0)for(i=0;i0;i+)Weii=NumTmp%10;NumTmp/=10;BiteLength+;BiteLength-;if(row=1)write_com(0x80+col-1);/设定DDRAM地址到地址计数器AC(DDRAM地址:0x80+col-1)else if(row=2)write_com(0x90+col-1);else if(row=3)write_com(0x88+col-1);else if(row=4)write_com(0x98+col-1);for(i=BiteLength;i=0;i-)write_dat(Weii+0);else if(num=0)if(row=1)write_com(0x80+col-1);/设定DDRAM地址到地址计数器AC(DDRAM地址:0x80+col-1)else if(row=2)write_com(0x90+col-1);else if(row=3)write_com(0x88+col-1);else if(row=4)write_com(0x98+col-1);write_dat(0);/-画图函数-/写入图片void PhotoWrite(unsigned char code *picture)unsigned char i, j, k;write_com(0x36);/打开扩充指令,同时开启绘图显示for(i = 0; i 2; i+)/分上下两屏写for(j = 0; j 32; j+)write_com(0x80 + j);/写Y坐标if(i=0)/写X坐标write_com(0x80);elsewrite_com(0x88);for(k = 0; k 16; k+)/写一整行数据write_dat(*picture+);write_com(0x30);/8位数据格式,基本指令显示/显示任意区域块,X代表x轴起始点,Y代表y轴起始点;Color代表填充色类型,1代表点亮,0代表擦除void PhotoRegion(unsigned char X, unsigned char Y, unsigned char Color)unsigned char i, j;/i 用于写063行,j 用于写016列,每列一个字节(8位)unsigned char ColorTemp;if(Color=1)ColorTemp = 0xFF;else if(Color=0)ColorTemp = 0x00;write_com(0x36);/打开扩充指令,同时开启绘图显示for(i = (Y-1)*8; i 31)write_com(0x80+i-32);/先写入水平坐标值write_com(0x88);/写入垂直坐标值else write_com(0x80+i); /先写入水平坐标值write_com(0x80);/写入垂直坐标值for(j = 0; j X-1; j+)read_dat();for(; j 1)flag = 0x08;Y = Y-2;write_com(0x34);/开启扩充指令,同时关闭绘图显示for(i = 0; i 16; i+)/063共64个,64/4=16for(j = 0; j Width; j+)write_com(0x80 + (Y4) + i);/写入行坐标地址write_com(0x80 + flag + X + j);/写入纵坐标地址read_dat();/指令:读;每读/写一个字节(8位)指针自加1if(Color=0)/0 代表擦除(即清空)read_h = (0x00 & read_dat();read_l = (0x00 & read_dat();else if(Color=1)/1 代表点亮 read_h = (0xFF | read_dat();read_l = (0xFF | read_dat();else if(Color=2)/2 代表反白(即空白的点亮,点亮的擦除) read_h = (0xFF read_dat();read_l = (0xFF read_dat();write_com(0x80 + (Y4) + i);/写入行坐标地址write_com(0x80 + flag + X + j);/写入纵坐标地址write_dat(read_h);/向横坐标写入数据write_dat(read_l);/向纵坐标写入数据_nop_();_nop_();write_com(0x36);/开启绘图write_com(0x30);/基本指令显示,8位数据格式/*反白显示行,Y取值为14*/void PhotoWhite(unsigned char Y)PhotoArea(3, Y-1, 5, 2);/*图片右移*/void PictureMoveRitght(unsigned char *Picture1, unsigned char *Picture2)unsigned char i, j;/i 用于写063行,j 用于写016列,每列一个字节(8位)unsigned char m;/用于记录已移动的格子数,总共16格unsigned char n;/n 用于移动整副图像,n=0-16则从图的头走到图的尾,刚好两幅图对调unsigned char *Picture10, *Picture20;/用于记录图1、图2的地址 m = 0;for(n = 0; n 16; n+)/n 用于移动整副图像,n=0-16则从图的头走到图的尾,刚好两幅图对调write_com(0x34);/打开扩充指令,同时关闭绘图显示Picture10 = Picture1;/记录图片地址Picture20 = Picture2 + (16-m);for(i = 0; i 32; i+)/写上半屏write_com(0x80 + i);/先写入水平坐标值(把LCD12864倒过来看,原来的高就是水平轴)write_com(0x80);/再写入垂直坐标值for(j = 0; j m; j+)/写入图2 的数据write_dat(*Picture20+);Picture20 += (16-m);for(j = 0; j 16-m; j+)/写入图1 的数据write_dat(*Picture10+);Picture10 += m;DelayMs(1);for(i = 0; i 32; i+)/写下半屏write_com(0x80 + i);/先写入水平坐标值(把LCD12864倒过来看,原来的高就是水平轴)write_com(0x88);/再写入垂直坐标值for(j = 0; j m; j+)/写入图2 的数据write_dat(*Picture20+);Picture20 += (16-m);for(j = 0; j 16-m; j+)/写入图1 的数据write_dat(*Picture10+);Picture10 += m;DelayMs(1);write_com(0x36);/开启绘图DelayMs(250);/延迟图片刷新速度,即间接反映图片移动速度m+;/-/好了,我想现在最主要的还是集中在俄罗斯方块游戏编程中最主要的核心:构思这里我把sequare模块的H文件(头文件)贴出来吧,里面包含了俄罗斯方块游戏编程中主要的算法这个文件的sequare模块的C文件如下:/-/#includesquare.hunsigned char xdata photo168;/整体画面赋予格子行值(015)、列值(07)unsigned char xdata GameLable;/游戏标签,0进行当中,1游戏终止unsigned int xdata GamePoint;/游戏标签,记录游戏分数unsigned int xdata GamePointRanking3=0,0,0;/游戏标签,记录排名分数unsigned char xdata GameSpeed=3;/游戏标签,记录游戏速度,即难度unsigned char xdata MoveAble;/移动标签,1可移动,0禁止移动unsigned char xdata MoveRow;/移动标签,即当前方块垂直移动的格子数unsigned char xdata MoveCol;/移动标签,即当前方块水平移动的格子数unsigned char xdata NewLable;/生成标签,即当前方块是否更新,1代表需要更新,0代表不需要/方块体各方块初始行值、列值/-/unsigned char xdata A_142 = 1, 4, 0, 4, 1, 5, 1, 3;unsigned char xdata A_242 = 1, 4, 0, 4, 1, 3, 2, 4;unsigned char xdata A_342 = 1, 4, 1, 5, 1, 3, 2, 4;unsigned char xdata A_442 = 1, 4, 0, 4, 1, 5, 2, 4;/-/unsigned char xdata B_142 = 1, 4, 0, 4, 2, 4, 2, 3;unsigned char xdata B_242 = 1, 4, 1, 5, 1, 3, 2, 5;unsigned char xdata B_342 = 1, 4, 0, 5, 0, 4, 2, 4;unsigned char xdata B_442 = 1, 4, 0, 3, 1, 5, 1, 3;/-/unsigned char xdata C_142 = 1, 4, 0, 4, 0, 3, 1, 5;unsigned char xdata C_242 = 1, 4, 0, 5, 1, 5, 2, 4;/-/unsigned char xdata D_142 = 1, 4, 0, 4, 2, 4, 3, 4;unsigned char xdata D_242 = 1, 4, 1, 6, 1, 5, 1, 3;/-/unsigned char xdata E_142 = 1, 4, 0, 5, 0, 4, 1, 5;/*-函数-*/游戏初始化void InitGame(void)unsigned char i, j;for(i = 0; i 16; i+)/整体画面赋予格子行值(015)、列值(07)for(j = 0; j lable=11)p = &A_100;else if(S-lable=12)p = &A_200;else if(S-lable=13)p = &A_300;else if(S-lable=14)p = &A_400;else if(S-lable=21)p = &B_100;else if(S-lable=22)p = &B_200;else if(S-lable=23)p = &B_300;else if(S-lable=24)p = &B_400;else if(S-lable=31)p = &C_100;else if(S-lable=32)p = &C_200;else if(S-lable=41)p = &D_100;else if(S-lable=42)p = &D_200;else if(S-lable=51)p = &E_100;/赋予元素行值、列值for(i = 0; i elementi0 = *(p+i*2) + Row;S-elementi1 = *(p+i*2+1) + Col - 4; /初始化方块体(需写入方块体标签lable)void InitSquare(square *S)unsigned char i;unsigned char lable;/赋予lable随机数lable = rand()%5+1;/赋予ShampNumber值if(lable ShapeNumber = 4;else if(lable 2 & lable ShapeNumber = 2;else if(lable=5)S-ShapeNumber = 1;/赋予lable值S-lable = lable*10 + rand()%S-ShapeNumber + 1;/匹配方块体类型并赋予方块体各元素行值、列值RefreshSquare(S, 0, 4);/初始化方块体绘图for(i = 0; i elementi0, S-elementi1, 1);/判断初始方块体是否与已有方块体重合,重合则代表游戏失败,结束游戏for(i = 0; i elementi0-1 S-elementi1-1 =1)GameLable = 1;/Game Over!/方块体转换(需写入方向direction)void ConversionSquare(square *S, unsigned char direction)unsigned char i;square STemp;/临时转换方块体if(direction=POSITIVE)/正反向(顺时针)if(S-lable%10=S-ShapeNumber)/方块体为本类型的最后一种形状STemp.lable = S-lable - (S-ShapeNumber-1); elseSTemp.lable = S-lable + 1;else if(direction=OPPOSITE)/反方向(逆时针)if(S-lable%10=1)/方块体为本类型的第一种形状STemp.lable = S-lable+S-ShapeNumber-1; elseSTemp.lable = S-lable-1;RefreshSquare(&STemp, MoveRow, MoveCol);/赋予临时方块体各元素的行值、列值for(i = 0; i 4; i+)/判断临时转换的方块体是否与已有方块体重合或超出方框,若是则无法进行转换,直接终止函数进行if(photo STemp.elementi0-1 STemp.elementi1-1 =1 | STemp.elementi1 8 | STemp.elementi0 16)return;/直接终止函数进行for(i = 0; i elementi0, S-elementi1, 0);S-lable = STemp.lable;/赋予转换的方块体的标签RefreshSquare(S, MoveRow, MoveCol);for(i = 0; i elementi0, S-elementi1, 1);/方块体左移右移(需写入方向direction)void MoveSquare(square *S, unsigned char direction)unsigned char i, MoveColTemp;square STemp;/临时移动方块体if(direction=LEFT)/左方向MoveColTemp = MoveCol+1;else if(direction=RIGHT)/右方向MoveColTemp = MoveCol-1;RefreshSquare(&STemp, MoveRow, MoveColTemp);/赋予临时移动方块体各元素的行值、列值for(i = 0; i 4; i+)/判断临时移动的方块体是否与已有方块体重合或超出方框,若是则无法移动,直接终止函数进行if(photo STemp.elementi0-1 STemp.elementi1-1 =1 | STemp.elementi1 8 | STemp.elementi0 16)return;/直接终止函数进行for(i = 0; i elementi0, S-elementi1, 0);MoveCol = MoveColTemp;RefreshSquare(S, MoveRow, MoveCol);for(i = 0; i elementi0, S-elementi1, 1);/方块体下移void MoveDownSquare(square *S)unsigned char i, MoveRowTemp;square STemp;/临时移动方块体MoveRowTemp = MoveRow+1;RefreshSquare(&STemp, MoveRowTemp, MoveCol);/赋予临时移动方块体各元素的行值、列值for(i = 0; i 16)for(i = 0; i elementi0-1 S-elementi1-1 =1;NewLable = 1;/需要更新方块return;/直接终止函数进行MoveRow = MoveRowTemp;for(i = 0; i elementi0, S-elementi1, 0);RefreshSquare(S, MoveRow, MoveCol);for(i = 0; i elementi0, S-elementi1, 1);/检测方块体是否整行该消失void ClearSquare(void)unsigned char i, j, k;unsigned char flag
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设计薪酬绩效管理制度
- 评审项目分配管理制度
- 试行课堂手机管理制度
- 贝壳考试答案管理制度
- 财政分局对账管理制度
- 货品损失赔付管理制度
- 货物监管仓库管理制度
- 货车司机党员管理制度
- 2025年中国氡气检测试剂盒行业市场全景分析及前景机遇研判报告
- 塔吊安全服务协议书范本
- 食管动力性疾病病因介绍
- 《滨海旅游区介绍》课件
- 2024年度中国资管行业ESG投资发展研究报告
- 旅游分销合作合同范例
- 显示设备健康护眼技术研究-洞察分析
- 医院十四五发展规划
- 乙肝免疫标志物检测及其实验结果解读
- 医院急诊预检分诊分级标准(试行)-成人患者
- 老年友善医院护理培训
- 核电行业核电站安全运行与应急预案方案
- 培训学员管理制度范文(2篇)
评论
0/150
提交评论