可以用 Proteus仿真的KeilC俄罗斯方块程序_第1页
可以用 Proteus仿真的KeilC俄罗斯方块程序_第2页
可以用 Proteus仿真的KeilC俄罗斯方块程序_第3页
可以用 Proteus仿真的KeilC俄罗斯方块程序_第4页
可以用 Proteus仿真的KeilC俄罗斯方块程序_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/-/ 源程序大公开 / (c) Copyright 20012005 xuwenjun / All Rights Reserved / V1.00 /-/标题: 俄罗斯方块程序 ? /文件名: xwj_fk.c /版本: V1.00 /修改人: 徐文军 E-mail: /日期: 05-05-13 /描述: 俄罗斯方块程序 ? /声明: / 以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. / 如用于商业用途请与作者联系. E-mail: / 有问题请mailto 欢迎与我交流! /-/老版本: 无 老版本文件名: /创建人: 徐文军 E-mail: /日期: 05-05-13 /描述: / 1、功能完整,直接使用 / 2、模块独立性强,移植方便,外部仅init和move函数,修改显示和输入即可 / 3、对减少内存占用、尽量减少屏幕操作进行适当优化 / 4、新方块生成高度随机,绝对无规律 / 5、仿真环境为Keil7.5+Proteus6.5,可以联机也可脱机运行 / code SIZE = 1845 - / constANT SIZE = 326 - / data SIZE = 16 19 / idata SIZE = 50 - / bit SIZE = 1 1 /-/#include #include xwj_lcd16.h / 字符液晶控制函数声明 /#include xwj_lcd6963.h / T6963C 公用函数#include xwj_hlkey.h / P1口行列式键盘 /#include xwj_serial.h /串口函数集#include change.h /数制转换#include xwj_fk.h /俄罗斯方块程序#define ulong unsigned long#define uint unsigned int#define uchar unsigned charextern void delay(unsigned int x);/-俄罗斯方块内部函数-/void fk_dot(uchar x,uchar y); /显示1个方块点void fk_cldot(uchar x,uchar y); /清除1个方块点void fk_show(void); /显示分数void fk_reffk(void); /刷新方块void fk_refnew(void); /刷新预览方块void fk_refline(yy); /刷新1行背景bit fk_chk(void); /冲突检查void fk_new(void); /产生新方块void fk_add(void); /方块合并/*/-俄罗斯方块公用函数-/void fk_init(void); /方块初始化void fk_move(unsigned char mode); /移动方块*/-/#define FULLMAP 0x0fff /*掩码*/#define LINEGUAN 20 /*20行过一关*/#define NEWX 15 /*预览方块X位置*/#define NEWY 12 /*预览方块Y位置*/#define LINEMAX 21 /*屏幕最高21行*/uint idata fk_mapLINEMAX+4; /背景映象uchar fk_x,fk_y,fk_r; /方块左右、高度、方向uchar fk_type; /方块形状uchar fk_oldx,fk_oldy,fk_oldr; /方块上次左右、高度、方向uchar fk_newtype,fk_newr; /新方块形状、方向uint score; /总分uint line; /总行数 uchar speed; /速度uchar moven; /速度相关计数器uchar automapn; /随机方块的行数bit fk_run; /俄罗斯方坑蜗吩诵?uchar code fk_mod44= /方块模型号,4个方向,4行0,0,7,2,0,1,3,1,0,0,2,7,0,2,3,2, /_|_0,0,6,3,0,1,3,2,0,0,6,3,0,1,3,2, /_|0,0,3,6,0,2,3,1,0,0,3,6,0,2,3,1, /|_0,0,7,4,0,3,1,1,0,0,1,7,0,2,2,3, /|_0,0,7,1,0,1,1,3,0,0,4,7,0,3,2,2, /_|0,0,0,15,1,1,1,1,0,0,0,15,1,1,1,1, /_0,0,3,3,0,0,3,3,0,0,3,3,0,0,3,3, /田字;uchar code strmap49=不错! ,真棒! ,好极啦!,太棒了!,;/-/void fk_dot(uchar x,uchar y) /显示1个方块点printat(x*3+1, 241-(y-4)*12,);/-/void fk_cldot(uchar x,uchar y) /清除1个方块点/ printat(x*3+1, 241-(y-4)*12,);printat(x*3+1, 241-(y-4)*12,);/-/void fk_show(void) /显示分数printat(50, 12,chnint(score,1);printat(60, 12,00);printat(40, 12,得分:);printat(54,36,chnint(line,1);printat(40, 36,行数:);printat(54,60,chnchar(speed,1);printat(40,60,速度:);printat(54,84,chnchar(automapn,1);printat(40,84,关数:); /-/void fk_reffk(void) /刷新方块uchar i,j;uchar temp;/-/清除原来的方块for (i=0;i4;i+)temp=(fk_modfk_typefk_oldri);for (j=fk_oldx;j=1;/-/显示新的方块for (i=0;i4;i+)temp=(fk_modfk_typefk_ri);for (j=fk_x;j=1;fk_oldx=fk_x;fk_oldy=fk_y;fk_oldr=fk_r; /保存新方块位置/-/void fk_refnew(void) /刷新预览方块uchar i,j;uchar temp;/-/预览方块for (i=0;i4;i+)temp=(fk_modfk_newtypefk_newri);for (j=NEWX;j=1;/-/void fk_refline(yy) /刷新1行背景uchar i;uint temp;if (yy=4)temp=fk_mapyy;for (i=0;i= 1;/-/bit fk_chk(void) /冲突检查uchar i;bit neq=0;for (i=0;i4;i+)if ( (fk_modfk_typefk_ri)fk_x)+(fk_mapfk_y+i) != (fk_modfk_typefk_ri)fk_x)|(fk_mapfk_y+i) )neq=1;return(neq);/-/void fk_new(void) /产生新方块srand(rand()+fk_x+fk_y+fk_r);fk_oldx=fk_x=5;fk_oldy=fk_y=LINEMAX;fk_type = fk_newtype;fk_oldr=fk_newr;fk_newtype = rand()%7;fk_newr=rand()%4;fk_refnew(); /刷新预览方块if (fk_run)fk_reffk(); /刷新显示/-/void fk_add(void) /方块合并uchar i,j;uchar full=0x00;uchar fulltemp;uchar fullline=0x00;for (i=0;i4;i+) /方块合并fk_mapfk_y+i |= (fk_modfk_typefk_ri)fk_x;full = 4) & (fk_mapfk_y+i = 0xffff) /满行full |= 0x01;if (full != 0) /有满行for (j=0;j3;j+) /消行闪烁3次delay(300);fulltemp=full;for (i=0;i4;i+) /4行if (fulltemp&0x08) != 0)fk_mapfk_y+i = FULLMAP;fk_refline(fk_y+i);fulltemp = 1;fulltemp=full;for (i=fk_y;iLINEMAX+4+fullline;i+) /上面行下移if (i = LINEMAX+4)&(fk_mapi-fullline!=FULLMAP)fk_mapi-fullline=FULLMAP; /背景映象fk_refline(i-fullline);if (fulltemp&0x08) != 0)fullline+;fulltemp = 1;if (line+fullline)/LINEGUAN) != (line/LINEGUAN)/每20行速度+1speed +;line += fullline; /更新分数、行数score += (1 LINEMAX-10) /在最高位置碰撞且不能消行则游戏结束printat(46,180,加油啊!); /加油啊if (fk_y LINEMAX-6) /在最高位置碰撞且不能消行则游戏结束printat(46,180,糟糕了!); /糟糕了if (fk_y=LINEMAX) /在最高位置碰撞且不能消行则游戏结束fk_run=0; /方块初始化elsefk_new(); /产生新方块/-/void fk_init(void) /方块初始化uchar i;fk_run = 0;moven=0;Lcd6963Cls();Lcd6963Rec(0,0,152,255);Lcd6963ChHz(0); /切换到16X16点阵printat(2, 16,欢迎光临文君阁);printat(2, 48,请按键选择:);printat(2, 80,-);printat(2, 96,7左旋 8右旋 9右旋);printat(2, 112,4左移 5右旋 6右移);printat(2, 128,4速度 5开始 6关数);printat(2, 144,1左移 2下移 3右移);printat(2, 160,-);Lcd6963ChHz(1); /切换到12X12点阵printat(46,180,欢迎使用);fk_show(); /显示分数while (fk_run)fk_move(); /等待设置速度关数开始delay(10);for (i=0;i4;i+)fk_mapi=0xffff; /背景映象 delay(3000);for (i=4;iLINEMAX+4;i+)if (ispeed)+2;case 2: /下移if (fk_run) /游戏中下移if(fk_y0)fk_y-;if(fk_chk()fk_y+; /有冲突取消操作,执行碰撞组合fk_add(); /方块合并 /产生新方块else /方块到底也执行碰撞组合fk_add(); /方块合并else /初始化时fk_new(); /产生新方块break;case 0: /下移到底while(fk_y0)&(fk_chk() /一直下移直到冲突fk_y-;moven=1;fk_y+; /恢复到未冲突位置break;case 3: /右移case 6: /右移if (fk_run) /游戏中右移if(fk_x0)fk_x-;if(fk_chk()fk_x+;/有冲突取消操作else /初始化时speed+;speed &= 0x07;fk_show(); /显示分数break;case 9: /右转case 8: /右转case 5: /右转if (fk_run) /游戏中右转fk_r+;if(fk_chk()fk_r-; /有冲突取消操作fk_r &= 0x03;else /初始化时fk_run = 1;break;case 7: /左转if (fk_run) /游戏中右转fk_r-;if(fk_chk()fk_r+; /有冲突取消操作fk_r &= 0x03;else /初始化时fk_run = 1;break;if(fk_run)& (fk_x!=fk_oldx)|(fk_y!=fk_oldy)|(fk_r!=fk_oldr) )fk_reffk(); /刷新显示rand();/*/ - / 32字节void delay(uint x)uint i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论