1、可以用 Proteus仿真的KeilC俄罗斯方块程序可以用 Proteus仿真的KeilC俄罗斯方块程序时间:2006-12-29 来源: 作者:徐文军 点击:1792 字体大小:【大 中 小】 /-/ 源程序大公开 / (c) Copyright 20012005 xuwenjun / All Rights Reserved / V1.00 /-/标题: 俄罗斯方块程序 ? /文件名: xwj_fk.c /版本: V1.00 /修改人: 徐文军 E-mail:xuwenjun /日期: 05-05-13 /描述: 俄罗斯方块程序 ? /声明: / 以下代码仅免费提供给学习用途,但引用或修改后
2、必须在文件中声明出处. / 如用于商业用途请与作者联系. E-mail:xuwenjun / 有问题请mailto xuwenjun 欢迎与我交流! /-/老版本: 无 老版本文件名: /创建人: 徐文军 E-mail:xuwenjun /日期: 05-05-13 /描述: / 1、功能完整,直接使用 / 2、模块独立性强,移植方便,外部仅init和move函数,修改显示和输入即可 / 3、对减少内存占用、尽量减少屏幕操作进行适当优化 / 4、新方块生成高度随机,绝对无规律 / 5、仿真环境为Keil7.5+Proteus6.5,可以联机也可脱机运行 / code SIZE = 1845 -
3、/ 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 lon
4、g#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(voi
5、d); /冲突检查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_m
6、apLINEMAX+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行
7、 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= 不错! ,真棒! ,好极啦!,太棒
8、了!,;/-/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,chnin
9、t(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=(
10、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;
11、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_
12、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) /满行
13、 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_map
14、i-fullline=FULLMAP; /背景映象 fk_refline(i-fullline); if (fulltemp&0x08) != 0) fullline+; fulltemp = 1; if (line+fullline)/LINEGUAN) != (line/LINEGUAN)/每20行速度+1 speed +; line += fullline; /更新分数、行数 score += (1 LINEMAX-10) /在最高位置碰撞且不能消行则游戏结束 printat(46,180,加油啊!); /加油啊 if (fk_y LINEMAX-6) /在最高位置碰撞且不能消行则游戏结
15、束 printat(46,180,糟糕了!); /糟糕了 if (fk_y=LINEMAX) /在最高位置碰撞且不能消行则游戏结束 fk_run=0; /方块初始化 else fk_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,-); prin
16、tat(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 (i(automapn+4) fk_mapi=rand()-1|FULLMAP; /背景映象 else fk_mapi=FULLMAP; /背景映象 fk_refline(i); /刷新1行背景 fk_show(); /显示分数/ fk_new(); /产生新方块 /-/void fk_move(void) /移动方块 unsigned char temp; if(KeyTest() /检查有无按键 putinbuf(KeyGetcode(); /按键码输入接收缓冲区
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1