版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于51单片机的俄罗斯方块游戏设计DesignofTetrisGameBasedon51SingleChipMicrocomputer目录13252摘要 页致谢在此,我要感谢我的毕业指导老师,在您的指导下才顺利完成了我的设计。更重要的是老师帮我解决了许多技术上的难题让我能把设计做的更加完善。如果没有我的指导老师,我将花费比本来用时多的多的时间,感谢老师的耐心教导和无私的奉献,同时也对我的同学表示感谢,感谢同学的耐心检查和钻牛角尖与鸡蛋里挑骨头的精神,让我感受到了浓浓的学术气氛。本设计也存在一定的问题,但在老师、同学的帮助和鼓励下都已经解决了,最后再次感谢老师的悉心指导和同学的帮助!我除了非常感谢我的良师益友以外,我还非常的感谢我的父母,没有他们的默默付出,我不可能此时此地在此刻做着设计打着字,有茫茫多的少年因为家庭的经济原因没有办法完成自己的学业,又有茫茫多的人因为与家庭的矛盾产生了厌学甚至逃学的情绪。没有家长的经济支持,我不能在这里。父母是伟大的,父爱如山,沉默而又伟大,他养育你,给你食物给你安息之地,自己却寡言,默默承受着来自社会,来自领导,来自这个世界的所有的恶意与压力,母爱如水,母爱是世界上最伟大的爱,她无私,不求回报,如果没有母爱,这个世界将失去生机。母爱如一碗甜甜的山泉,这个世界没有了母爱也就没有了人类的繁衍,母爱是世界上全心全意最不求回报的爱。世界因爱而温暖,因感恩而伟大。感谢所有人,感谢所有帮助过我的人。参考文献[1]徐科军.传感器与检测技术[M],北京:电子工业出版社,2016(2):15-17[2]赵亮侯,国锐.单片机语言编程与实例[M],北京:人民邮电出版社,2003(3):45-56[3]李光飞.单片机课程设计实例指导[M],北京:北京航空航天大学出版社,2004(3):34-39[4]何立民.单片机高级教程一应用与设计[M],北京:北京航空航天大学出版社,2009(5):145-167[5]楼然苗,李光飞.51系列单片机设计实例[M],北京:北京航空航天大学出版社,2003(2):62-69[6]胡汗才.单片机原理与接口技术[M],清华大学出版社,2004(6):146-158[7]王萍.电子技术实验教程[M],北京:机械工业出版社,2009(3):36-44[8]朱定华,戴淑萍.单片机微机原理与应用[M],北京:清华大学出版社,2003(2):25-29[9]毕满清,高文华等.模拟电子技术基础[M],北京:电子工业出版社,2008(6):156-178[10]郝晓剑,杨述平等.仪器电路设计与应用[M],北京:电子工业出版社,2007(3):64-77[11]刘勇.数字电路[M],北京:电子工业出版社,2004(5):137-152[12]陈正振.电子电路设计与制作[M],广西:广西交通职业技术学院信息工程系,2007(2):17-25[13]杨子文.单片机原理及应用[M],西安:西安电子科技大学出版社,2006(5):89-99[14]陈汝全.电子技术常用器件应用手册[M],北京:机械工业出版社,2004(3):31-33[15]韩焱,张艳花等.电子技术基础[M],北京:电子工业出版社,2009(5):121-132[16]童长飞.CSO5lF系列单片机开发与C语言编程[M],北京:北京航空航天大学出版社,2005(5):77-79[17]XiaoChen,ChaoranLin.TetrisGamesystemDesignBasedonAT89S52SingleChipMicrocomputer[D],DepartmentofElectronicInformationEngineeringNanjingUniversityofInformationScienceandTechnology,2012,pp1-6[18]WillWade,TetrisGameSystemSolvesYear2008ProblemProductAnnouncement[J],ElectronicNews,2007,pp1-6附录1原理图附录2元器件清单表1元器件清单名称标号数量30PF瓷片电容C1,C3210UF电解电容C21微动开关KEY1,KEY2,KEY3
KEY4,KEY5,KEY66LCD12864液晶Q1110K色环电阻R1110K电位器R21双掷开关SW11DC-002电源插座P112Pi插针U21STC89C52单片机U3112MHZ晶振Y11附录3源程序清单#include<reg51.h> //头文件#include<12864.h> //宏定义#defineA48271L#defineM2147483647L#defineQ(M/A)//44488#defineR(M%A)//3399/************************引脚定义**************************/sbitK1=P1^6;//翻转键sbitK2=P1^5;//下键sbitK3=P1^4;//左键sbitK4=P1^7;//右键sbitK5=P1^3;//开始/暂停/************************变量定义**************************/staticunsignedlongSeed=1;unsignedintidatanum[19+2]={0xfff,//第1行,最下面0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,//第2行到第20行共19行0xfff//第21行,最上面};//游戏界面定义共21行,其中num[0]为下墙壁行,num[20]为上墙壁行,每行12格,//最左一格为左墙壁列,最右一格为右墙壁列/* 01 23 45 6789 10110■■■■■■■■■■■■ 1■□□□□□□□□□□■ 2■□□□□□□□□□□■ 3■□□□□□□□□□□■ 4■□□□□□□□□□□■ 5■□□□□□□□□□□■ 6■□□□□□□□□□□■ 7■□□□□□□□□□□■ 8■□□□□□□□□□□■ 9■□□□□□□□□□□■ 10■□□□□□□□□□□■ 11■□□□□□□□□□□■ 12■□□□□□□□□□□■ 13 ■□□□□□□□□□□■14 ■□□□□□□□□□□■ 15 ■□□□□□□□□□□■ 16 ■□□□□□□□□□□■ 17 ■□□□□□□□□□□■ 18 ■□□□□□□□□□□■ 19 ■□□□□□□□□□□■ 20 ■■■■■■■■■■■■积木定义共7种,每种4个形态第一个数高四位□□□□第一个数低四位□□□□第二个数高四位□□□□第二个数低四位□□□□*///以第一个图形为例,数据:{0x88,0xc0}/*■□□□1000=8■□□□1000=8■■□□1100=c□□□□0000=0*/unsignedcharcodeBlock[28][2]={/**口口口口口口*口口口口*口口口口口口*/{0x88,0xc0},{0xe8,0x00},{0x62,0x20},{0x02,0xe0},/**口口口口口口*口口口口*口口口口口口*/{0x22,0x60},{0x08,0xe0},{0xc8,0x80},{0xe2,0x00},/**口*口口口口*口口口*/{0x8c,0x40},{0x6c,0x00},{0x8c,0x40},{0x6c,0x00},/**口口口*口口口口*口*/{0x4c,0x80},{0xc6,0x00},{0x4c,0x80},{0xc6,0x00},/**口口*口口口口口口口口*口口口口口口*/{0x04,0xe0},{0x8c,0x80},{0xe4,0x00},{0x26,0x20},/*口*口*口口口口口*口*/{0x44,0x44},{0x0f,0x00},{0x44,0x44},{0x0f,0x00},/**口口*口口*/{0x06,0x60},{0x06,0x60},{0x06,0x60},{0x06,0x60}};#definePASSSCORE99 //过关分数//积木结构体0:当前积木,1:过渡积木,2:下个积木structJimu{ unsignedintdat; //积木数据 charx; //积木左下角坐标(X,Y) unsignedchary; unsignedchartype; //积木类型 unsignedcharchange;//积木旋转次数}Sign[3]; unsignedcharSysFlag=0;#defineNEWSIGNFLAG0#defineDEADFLAG1#definePAUSEFLAG2unsignedcharScore=0;unsignedcharLevel=1;unsignedcharDelayCnt=5;/*********************************************************/#defineN25/************************************毫秒延时函数*************************************/voiddelayms(unsignedintms){ unsignedchari=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } }}/************************************伪随机数发生器*************************************/doubleRandom(void){ longTmpSeed; TmpSeed=A*(Seed%Q)-R*(Seed/Q); if(TmpSeed>=0) Seed=TmpSeed; else Seed=TmpSeed+M; return(double)Seed/M;}/**************************************为伪随机数发生器播种***************************************/voidInitRandom(unsignedlongInitVal){ Seed=InitVal;}//延时子程序voidDelay(unsignedintt){ unsignedinti,j; for(i=0;i<t;i++) for(j=0;j<10;j++);}/*********************************初始化MPU**********************************/voidInitCpu(void){ TMOD=0x0; TH0=0; TL0=0; TR0=1; ET0=1; EX1=1; EA=1;TCON|=0x04;}/****************************welcome 游戏选择界面/**********************/voidwelcome(){ unsignedintn; unsignedchartemp[2]; Lcd_WriteStr(0,0,"☆《俄罗斯方块》"); Lcd_WriteStr(1,2,"选择关卡:"); Lcd_WriteStr(2,3,"进入游戏"); while(K5) { if(K3==0) { delayms(3); if(Level!=1) Level--; else Level=10; while(!K3); } if(K4==0) { delayms(3); if(Level!=10) Level++; else Level=1; while(!K4); } if(n%1000==0) { temp[0]=Level/10+0x30; temp[1]=Level%10+0x30; Lcd_WriteStr(6,2,temp); } n++; if(n==8000) n=0; if(n==5000) Lcd_WriteStr(2,3,""); if(n==0) Lcd_WriteStr(2,3,"进入游戏"); }}/**************************************************俄罗斯方块部分****************************************************************//******************************画墙壁,初始化界面*******************************/voidDrawBoard(void){ unsignedcharn; for(n=0;n<12;n++) { Lcd_Rectangle(3*n,0,3*n+2,2,1); Lcd_Rectangle(3*n,60,3*n+2,62,1); } for(n=1;n<20;n++) { Lcd_Rectangle(0,3*n,2,3*n+2,1); Lcd_Rectangle(33,3*n,35,3*n+2,1); } Lcd_WriteStr(3,1,"俄罗斯方块"); Lcd_WriteStr(3,2,"得分:"); Lcd_WriteStr(3,3,"关卡:");}/***********************************游戏结束处理************************************/voidGameOver(void){ //unsignedcharStr[3]; unsignedcharn; unsignedintj=0; //Lcd_Clear(0);//清屏 //DrawBoard();//画界面 Lcd_WriteStr(5,0,"继续"); for(n=3;n<60;n++) Lcd_HoriLine(3,n,30,0); while(K5) //等待继续游戏 { if(j==15000) { for(n=16;n<33;n++) Lcd_HoriLine(3,n,30,0); } if(j==0) { if(Level==11) //通关 { LCD12864_image1616(0,2,asc[2]); LCD12864_image1616(1,2,asc[3]); for(n=5;n<11;n++) Lcd_Rectangle(0,3*n,2,3*n+2,1); } else { if((SysFlag&(1<<DEADFLAG))!=0) //失败 { LCD12864_image1616(0,2,asc[4]); LCD12864_image1616(1,2,asc[5]); for(n=5;n<11;n++) Lcd_Rectangle(0,3*n,2,3*n+2,1); Level=1; } else //过关 { LCD12864_image1616(0,2,asc[0]); LCD12864_image1616(1,2,asc[1]); for(n=5;n<11;n++) Lcd_Rectangle(0,3*n,2,3*n+2,1); } } } j++; if(j==30000) j=0; } for(n=3;n<60;n++) Lcd_HoriLine(3,n,30,0);//*/}unsignedintcodeMaskTab[16]={0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000};/**********************************根据积木图标左下坐标X,Y来画出积木图标,DrawMode=0清除,=1显示***********************************/voidDrawSign(structJimuTemp,unsignedcharDrawMode){ unsignedcharm,n; for(m=0;m<4;m++) for(n=0;n<4;n++) { if((Temp.dat&MaskTab[4*m+n])!=0) Lcd_Rectangle(Temp.x+n*3,Temp.y-2-3*m,Temp.x+n*3+2,Temp.y-3*m,DrawMode); }}/********************************将积木图标值融入num数据中也即把积木图标固定,无法再下降*********************************/voidFixSign(void){ unsignedcharm,n; for(m=0;m<4;m++)//行循环 for(n=0;n<4;n++)//列循环 { if((Sign[0].dat&MaskTab[4*m+n])!=0) { num[20-(Sign[0].y-2)/3+m]|=MaskTab[11-Sign[0].x/3-n]; } }}/********************************判断积木图标中方块是否与障碍方块重合*********************************/unsignedcharCheckIf(void){ unsignedcharm,n; for(m=0;m<4;m++)//行循环 for(n=0;n<4;n++)//列循环 { if((Sign[1].dat&MaskTab[4*m+n])!=0) { if((num[20-(Sign[1].y-2)/3+m]&MaskTab[11-Sign[1].x/3-n])!=0) return0; } } return1;}/********************************判断积木图标是否可以继续下降一格********************************/unsignedcharCheckIfDown(void){ Sign[1]=Sign[0];// Sign[1].y+=3;//假设下降一格 returnCheckIf(); }/********************************判断积木图标是否可以向左移动*********************************/unsignedcharCheckIfLeft(void){ Sign[1]=Sign[0]; Sign[1].x-=3; returnCheckIf();}/********************************判断积木图标是否可以向右移动*********************************/unsignedcharCheckIfRight(void){ Sign[1]=Sign[0]; Sign[1].x+=3; returnCheckIf();}/********************************判断是否可以旋转*********************************/unsignedcharCheckIfRoll(void){ unsignedchari; unsignedintTemp; Sign[1]=Sign[0]; if(++Sign[1].change>3) Sign[1].change=0; i=Sign[1].type*4+Sign[1].change; Temp=(unsignedint)Block[i][0]<<8; Temp=Temp|Block[i][1]; Sign[1].dat=Temp; returnCheckIf();}/********************************寻找满格的行并做消除处理最多寻找4个满行并做消除*********************************/voidDelFull(void){ unsignedchari=0; unsignedcharm,n; unsignedcharTemp; unsignedcharFlag=0; Temp=(Sign[0].y-2)/3; if(Temp>=20)//防止越过了下边界 Temp=1; else Temp=20-Temp; for(n=Temp+3;n>=Temp;n--)//积木图标的最顶行开始寻找满行比较有利于运算 { if(num[n]==0xfff) { Flag=1; for(m=n+1;m<=19;m++) { num[m-1]=num[m]; } num[m]=0x801; i++; Score+=i; //分数累加 } } if(Flag)//为加速而设置并判断的标志,有已固定的积木有满格消行变化则重画积木界面 { for(m=Temp;m<=19;m++)//为加速,不必要重第一行重画起,只需要从积木图标最下行开始往上的重画 for(n=1;n<=10;n++) { if((num[m]&MaskTab[n])==0) { //if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)!=0)//为加速而做的读象素操作 //{ Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,0); //} } else { //if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)==0)//为加速而做的读象素操作 //{ Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,1); //} } } }}/*******************************随机产生一个积木图标放到预产生区域并显示出来********************************/voidCreatSign(void){ unsignedcharn; unsignedintTemp; DrawSign(Sign[2],0);//先清除 n=Random()*28; Temp=(unsignedint)Block[n][0]<<8; Temp=Temp|Block[n][1]; Sign[2].dat=Temp; Sign[2].x=45; Sign[2].y=4*3+2; Sign[2].type=n/4; Sign[2].change=n%4; DrawSign(Sign[2],1);//后画出}voidPrintScore(void){ unsignedcharStr[3]; Str[0]=(Score/10)|0x30; Str[1]=(Score%10)|0x30; Str[2]=0; Lcd_WriteStr(6,2,Str);}voidPrintLevel(void){ unsignedcharStr[3]; Str[0]=(Level/10)|0x30; Str[1]=(Level%10)|0x30; Str[2]=0; Lcd_WriteStr(6,3,Str);}/********************************游戏的具体过程,也是俄罗斯方块算法的关键部分*********************************/voidGamePlay(void){ unsignedcharm,n; unsignedintTemp; SysFlag=0; //初始化所有变量参数 Score=0; if(Level>10) Level=1; DelayCnt=5; for(n=0;n<21;n++) { if(n==0||n==20) num[n]=0xfff; else num[n]=0x801; } SysFlag|=1<<NEWSIGNFLAG;//刚开始初始化为需要产生新的积木图标 InitRandom(TL0); Lcd_WriteStr(5,0,"开始"); PrintScore(); PrintLevel(); CreatSign(); while(1) { if((SysFlag&(1<<NEWSIGNFLAG))==1)//判是否需要产生新的积木图标 { SysFlag&=~(1<<NEWSIGNFLAG); Sign[0]=Sign[2]; CreatSign(); Sign[0].x=12; Sign[0].y=14; for(m=0;m<4;m++)//行循环 { for(n=0;n<4;n++)//列循环 { if((Sign[0].dat&MaskTab[15-m*4-n])==0) break; } if(n==4) Sign[0].y-=3; }//将积木图标出现置顶 for(m=0;m<4;m++)//行循环 for(n=0;n<4;n++)//列循环 { if((Sign[0].dat&MaskTab[4*m+n])!=0) { if((num[20-(Sign[0].y-2)/3+m]&MaskTab[11-Sign[0].x/3-n])!=0) SysFlag|=1<<DEADFLAG; } } if((SysFlag&(1<<DEADFLAG))!=0) break;//如果产生新的积木图标中的方块与已固定好的方块重合,则死亡。游戏结束 DrawSign(Sign[0],1); } if((CheckIfLeft())&&(K3==0))//左,移动 { DrawSign(Sign[0],0); Sign[0].x-=3; DrawSign(Sign[0],1);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年临时工派遣合同样本
- 信托公司委托贷款合同
- 缆索吊机租赁合同样本
- 标准家教服务合同范本
- 2024标准附期限借款合同样本
- 2024模板采购合同范本
- 2024工程装修简易合同样本
- 物业租赁合同模板
- 技术服务合同中的保密义务与条款
- 建材产品购销协议样本
- 民法典讲座-继承篇
- 外包施工单位入厂安全培训(通用)
- 糖尿病健康知识宣教课件
- 客户接触点管理课件
- Python语言学习通超星课后章节答案期末考试题库2023年
- 医学-心脏骤停急救培训-心脏骤停急救教学课件
- 高中英语-Book 1 Unit 4 Click for a friend教学课件设计
- 年产30万吨碳酸钙粉建设项目可行性研究报告
- 主题班会如何对待厌学情绪(初二) 省赛获奖 省赛获奖
- 初中数学北师大版七年级上册课件5-4 应用一元一次方程-打折销售
- 0-6岁儿童健康管理服务规范(第三版)
评论
0/150
提交评论