俄罗斯方块C语言程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includereg52.h#includestdlib.h#includemath.h#defineucharunsignedcharsbitslock=P2^7;//译码器输出使能端sbitupkey=P2^3;//“旋转图形/向上”按键sbitleftkey=P2^1;//“左移/向左”按键sbitrightkey=P2^2;//“右移/向右”按键sbitdownkey=P2^0;//“快速下移/向下”按键sbitduan=P2^5;//数码管段选信号所用锁存器的锁存允许端sbitwei=P2^6;//数码管位选信号所用锁存器的锁存允许端sbitstartsuspendkey=P2^4;//“开始/暂停/继续”多功能切换按键/***********************************图形编码机制介绍***********************************1.由于俄罗斯方块图形的宽度和高度最多只有四位,所以要以4X4为基本单元。2.硬件采用16行扫描、8位送显示信号3.各个图形的宽度不一致,所以要人为给图形设定居中位置。若图形宽度为偶数可直接将其居中,若为奇数则靠左居中。4.由于图形需要旋转,所以由基本的图形会衍生出另外3种图形。5.因此每个图形应该给定4个8位的二进制码,并放入一个二维数组里。6.经典俄罗斯方块游戏里有19种不同形状的方块,包括旋转得到的。7.数组的第一个下标为该图形的编号*****************************************************************************************/ucharcodeallshape[19][4]={0x00,0x00,0x18,0x18,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x3c,0x00,0x08,0x18,0x10,0x00,0x00,0x30,0x18,0x00,0x10,0x18,0x08,0x00,0x00,0x18,0x30,0x00,0x08,0x08,0x18,0x00,0x00,0x38,0x08,0x00,0x18,0x10,0x10,0x00,0x00,0x20,0x38,0x00,0x10,0x10,0x18,0x00,0x00,0x08,0x38,0x00,0x18,0x08,0x08,0x00,0x00,0x38,0x20,0x00,0x00,0x10,0x38,0x00,0x08,0x18,0x08,0x00,0x00,0x38,0x10,0x00,0x10,0x18,0x10};/****************************************************************************************///数码管数形显示编码ucharcodenumber[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//位选信号编码,方便写循环使用ucharcodeweima[4]={0x01,0x02,0x04,0x08};//各个图形的宽度属性,用于判断左移和右移的步格数上限charshapewidth[19]={2,1,4,2,3,2,3,2,3,2,3,2,3,2,3,3,2,3,2};//旋转图形时,用于改变图形的编号以实现图形的切换charshaperotate[19]={0,2,1,4,3,6,5,8,9,10,7,12,13,14,11,16,17,18,15};//用于存储方块降落后固定显示的图形信息ucharstaticdata[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff};//规定一次性消掉的行数的分数奖励机制ucharrate[5]={0,1,3,6,10};/****************************************************************************************//*************************************全局变量声明***************************************/chary;//方块位置属性:底部下落的高度,y=0时:刚刚出现,y=15时:下落到屏幕最底部charshapenum;//方块形状属性:从0到18intleft;//方块位置属性:方块偏离居中位置的格数,不同的方块left值的上限不同intmark;//玩家分数变量intspeed;//方块下落速度变量intinitialspeed;//方块下落的初始速度intsystemspeed;//系统下落速度,此值会随着玩家分数的增加而减小,相应的下落速度会增大intfastspeed;//当用户按下down键时,方块下落速度为此值intk;//一个全局循环变量,“帧数”变量intstartcontrol=1;//开始画面状态指示变量,为1时说明程序进入开机欢迎界面intsuspendcontrol=0;//游戏暂停与游戏继续画面状态指示变量,为1说明处在暂停界面。intrandnum;//随机数变量,用于产生随机方块/****************************************************************************************//****************************************函数声明****************************************/voiddelayms(int);//粗略延时函数ucharmove(uchar,int);//对二进制码实行移位,可为负值voidshapedisplay();//对点阵扫描一场,对数码管扫描一场,用于显示图形和数字voidkeyscan();//对所有键盘扫描一次,并执行相应运算和操作ucharcheck(char,int);//用于检查方块将要下落的位置或是将要旋转的位置是否有障碍ucharshapedisappear();//用于消行,返回一次性消掉的行数numberdisplay(intamark);//用于四位数字显示voidstartimage();//游戏等待开始画面函数voidoverimage();//游戏结束后的画面voiddataset();//对数据初始化,为游戏重新开始做准备/****************************************************************************************//*****************************************主函数*****************************************/voidmain(){charj;startimage();//进入开机,函数内有键盘扫描,只有按下“开始”键会退出函数,否则不退出dataset();//对数据进行初始化while(1){//进入大循环k=speed;//确定显示的帧数while(k--){keyscan();//扫描键盘,放入高速循环语句中提高键盘的响应速度,并检测此时用户是否有相应请求shapedisplay();//显示图形和数字}y++;//图形下落一格if(check(shapenum,left)){//在没有显示之前判断将要下落的位置是否有障碍物,如果有障碍就进入到if语句中if(y==1){//如果y=1;说明方块刚出现就遇到障碍物了,这时游戏需结束overimage();//进入游戏结束画面,此函数内没有键盘扫描,运行一段时间会自动退出startimage();//又进入开机画面dataset();//对数据进行初始化,将前一用户数据清零}else{//遇到障碍物,但还不至于图形不能出现for(j=0;j4;j++){//将下落形状的值赋给固定图形,形成停留显示的效果staticdata[y+j]+=move(allshape[shapenum][j],left);}mark+=rate[shapedisappear()];//消掉已拼满的函数,并记录所得分数y=0;//为下一个方块赋属性值:从第一行出现left=0;//为下一个方块赋属性值:居中显示randnum=rand()%19;shapenum=randnum;//为下一个方块赋属性值:给定形状systemspeed=initialspeed-10*(mark/40);//计算相应分数下的系统速度值,分数越高,速度越快speed=systemspeed;//将此值赋给速度控制量}}}}/****************************************************************************************//***************************************自定义函数***************************************/voiddelayms(intxms)//粗略的延时函数{inti,j;for(i=xms;i0;i--)for(j=110;j0;j--);}/****************************************************************************************/ucharmove(ucharaa,intanum)//移位函数{if(anum=0)aa=anum;elseaa=(-anum);returnaa;}/****************************************************************************************/voidshapedisplay()//显示函数{ucharj;for(j=y3?3-y:0;j4;j++){//显示动态方块slock=1;P1=j+y-3;P3=move(allshape[shapenum][j],left);slock=0;delayms(1);P3=0x00;}for(j=0;j16;j++){//显示静态方块slock=1;P1=j;P3=staticdata[j+3];slock=0;delayms(1);P3=0x00;}numberdisplay(mark);//分数显示}/****************************************************************************************/numberdisplay(intamark)//大数拆分并显示,带去无效零功能{chari;ucharnum[4];num[0]=amark/1000%10;num[1]=amark/100%10;num[2]=amark/10%10;num[3]=amark%10;if(amark10){//显示一位数for(i=3;i4;i++){P0=0xff;duan=1;P0=number[num[i]];duan=0;P0=0x00;wei=1;P0=weima[i];wei=0;delayms(1);wei=1;P0=0x00;wei=0;}}elseif(amark100){//显示两位数for(i=2;i4;i++){P0=0xff;duan=1;P0=number[num[i]];duan=0;P0=0x00;wei=1;P0=weima[i];wei=0;delayms(1);wei

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功