




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、*说明*此程序包含一个俄罗斯方块.c 文件和一个12864.h 文件*俄罗斯方块.c文件*#include "reg51.h"#include "12864.h"#define uchar unsigned char#define uint unsigned intstatic unsigned long Seed = 1;#define A 48271L#define M 2147483647L#define Q (M / A)#define R (M % A)sbit K1=P34;sbit K2=P35;sbit K3=P36;sbit K4=P3
2、7;unsigned int idata num19+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行,其中num0为下墙壁行,num20为上墙壁行,每行12格,最左一格为左墙壁列,最右一格为右墙壁列unsigned char code Block282=/* 口 口口口 口口* 口 口 口 口* 口口 口 口口口
3、*/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,0x2
4、6,0x20,/*口* 口* 口 口口口口* 口*/0x44,0x44,0x0f,0x00,0x44,0x44,0x0f,0x00, /* 口口* 口口*/ 0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60;#define PASSSCORE 20struct Jimuunsigned int dat; char x;unsigned char y;unsigned char type;unsigned char change;Sign3;/积木结构体unsigned char SysFlag=0;#define NEWSIGNFLAG 0#define DEAD
5、FLAG 1#define PAUSEFLAG 2unsigned char Score=0;unsigned char Level=1;unsigned char DelayCnt=5;/*/#define N 25/*伪随机数发生器*/double Random(void)long TmpSeed;TmpSeed=A*(Seed%Q)-R*(Seed/Q);if(TmpSeed>=0)Seed=TmpSeed;elseSeed=TmpSeed+M;return (double)Seed/M;/*为伪随机数发生器播种*/void InitRandom(unsigned long Ini
6、tVal)Seed=InitVal;/延时子程序void Delay(unsigned int t) unsigned int i,j;for(i=0;i<t;i+)for(j=0;j<10;j+); /*初始化MPU*/void InitCpu(void) TMOD=0x0;TH0=0;TL0=0;TR0=1;ET0=1;EX1=1;EA=1; TCON|=0x04;/*welcome 游戏选择界面/*/void welcome()Lcd_WriteStr(0,0,"欢迎来玩");Lcd_WriteStr(0,1,"俄罗斯方块 ");Lcd
7、_WriteStr(0,2,"设置按K1");Lcd_WriteStr(0,2,"开玩按K2");/*俄罗斯方块部分 /*画墙壁,初始化界面*/void DrawBoard(void)unsigned char n;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=0;n<20;n+)Lcd_Rectangle(0,3*n,2,3*n+2,1);Lcd_Rectangle(33,3*n,35,3*n+2,1);Lcd_Wr
8、iteStr(4,0,"经典游戏");Lcd_WriteStr(3,2,"Score:");Lcd_WriteStr(3,3,"Level:");/*游戏结束处理*/void GameOver(void)if(SysFlag&(1<<DEADFLAG)!=0)Lcd_WriteStr(3,1,"You Fail");elseLcd_WriteStr(3,1,"You Pass");unsigned int code MaskTab16=0x0001,0x0002,0x0004
9、,0x0008,0x0010,0x0020,0x0040,0x0080,0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000;/*根据积木图标左下坐标X,Y来画出积木图标*/void DrawSign(struct Jimu Temp,unsigned char DrawMode)unsigned char m,n;for(m=0;m<4;m+)for(n=0;n<4;n+)if(Temp.dat&MaskTab4*m+n)!=0)Lcd_Rectangle(Temp.x+n*3,Temp.y-2-3*m,Temp.
10、x+n*3+2,Temp.y-3*m,DrawMode);/*将积木图标值融入num数据中也即把积木图标固定,无法再下降*/FixSign(void)unsigned char m,n;for(m=0;m<4;m+)/行循环for(n=0;n<4;n+)/列循环if(Sign0.dat&MaskTab4*m+n)!=0)num20-(Sign0.y-2)/3+m|=MaskTab11-Sign0.x/3-n;/*判断积木图标中方块是否与障碍方块重合*/unsigned char CheckIf(void)unsigned char m,n;for(m=0;m<4;m+
11、)/行循环for(n=0;n<4;n+)/列循环if(Sign1.dat&MaskTab4*m+n)!=0)if(num20-(Sign1.y-2)/3+m&MaskTab11-Sign1.x/3-n)!=0)return 0;return 1;/*判断积木图标是否可以继续下降一格*/unsigned char CheckIfDown(void)Sign1=Sign0;/Sign1.y+=3;/假设下降一格return CheckIf();/*判断积木图标是否可以向左移动*/unsigned char CheckIfLeft(void)Sign1=Sign0;Sign1.
12、x-=3;return CheckIf();/*判断积木图标是否可以向右移动*/unsigned char CheckIfRight(void)Sign1=Sign0;Sign1.x+=3;return CheckIf();/*判断是否可以旋转*/unsigned char CheckIfRoll(void)unsigned char i;unsigned int Temp;Sign1=Sign0;if(+Sign1.change>3)Sign1.change=0; i=Sign1.type*4+Sign1.change;Temp=(unsigned int)Blocki0<<
13、;8;Temp=Temp|Blocki1;Sign1.dat=Temp;return CheckIf();/*寻找满格的行并做消除处理最多寻找4个满行并做消除*/void DelFull(void)unsigned char m,n;unsigned char Temp;unsigned char Flag=0;Temp=(Sign0.y-2)/3;if(Temp>=20)/防止越过了下边界Temp=1;elseTemp=20-Temp;for(n=Temp+3;n>=Temp;n-)/积木图标的最顶行开始寻找满行比较有利于运算if(numn=0xfff)Flag=1;for(m=
14、n+1;m<=19;m+)numm-1=numm;numm=0x801;Score+;/每找到一个满行,则分数加1if(Flag)/为加速而设置并判断的标志,有已固定的积木有满格消行变化则重画积木界面for(m=Temp;m<=19;m+)/为加速,不必要重第一行重画起,只需要从积木图标最下行开始往上的重画for(n=1;n<=10;n+)if(numm&MaskTabn)=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
15、-1)*3+2,57-(m-1)*3+2,0); elseif(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);/*随机产生一个积木图标放到预产生区域并显示出来*/void CreatSign(void)unsigned char n;unsigned int Temp;DrawSign(Sign2,0);/先清除n=Random()*28;Temp=(unsigned int)Blockn0<<8;
16、Temp=Temp|Blockn1;Sign2.dat=Temp;Sign2.x=45;Sign2.y=4*3+2;Sign2.type=n/4;Sign2.change=n%4;DrawSign(Sign2,1);/后画出void PrintScore(void)unsigned char Str3;Str0=(Score/10)|0x30;Str1=(Score%10)|0x30;Str2=0;Lcd_WriteStr(6,2,Str);void PrintLevel(void)unsigned char Str3;Str0=(Level/10)|0x30;Str1=(Level%10)|
17、0x30;Str2=0;Lcd_WriteStr(6,3,Str);/*游戏的具体过程,也是俄罗斯方块算法的关键部分*/void GamePlay(void)unsigned char m,n; unsigned int Temp;SysFlag|=1<<NEWSIGNFLAG;/刚开始初始化为需要产生新的积木图标InitRandom(TL0);Lcd_WriteStr(3,1,"Playing");PrintScore();PrintLevel();CreatSign();while(1)if(SysFlag&(1<<NEWSIGNFLAG
18、)=1)/判是否需要产生新的积木图标SysFlag&=(1<<NEWSIGNFLAG);Sign0=Sign2;CreatSign();Sign0.x=12;Sign0.y=14;for(m=0;m<4;m+)/行循环for(n=0;n<4;n+)/列循环if(Sign0.dat&MaskTab15-m*4-n)=0)break;if(n=4)Sign0.y-=3;/将积木图标出现置顶for(m=0;m<4;m+)/行循环for(n=0;n<4;n+)/列循环if(Sign0.dat&MaskTab4*m+n)!=0)if(num20
19、-(Sign0.y-2)/3+m&MaskTab11-Sign0.x/3-n)!=0)SysFlag|=1<<DEADFLAG;if(SysFlag&(1<<DEADFLAG)!=0)break;/如果产生新的积木图标中的方块与已固定好的方块重合,则死亡。游戏结束DrawSign(Sign0,1);if(CheckIfLeft()&&(K3=0) /左DrawSign(Sign0,0);Sign0.x-=3;DrawSign(Sign0,1); if(CheckIfRight()&&(K4=0) /右DrawSign(Si
20、gn0,0);Sign0.x+=3;DrawSign(Sign0,1);if(CheckIfDown()&&(K2=0)/下DrawSign(Sign0,0);Sign0.y+=3;DrawSign(Sign0,1); if(CheckIfRoll()&&(K1=0) /翻转DrawSign(Sign0,0);if(+Sign0.change>3)Sign0.change=0; m=Sign0.type*4+Sign0.change;Temp=(unsigned int)Blockm0<<8;Temp=Temp|Blockm1;Sign0.da
21、t=Temp;DrawSign(Sign0,1);if(SysFlag&(1<<PAUSEFLAG)!=0)continue;Delay(500);if(+DelayCnt>=2*(11-Level)DelayCnt=0;if(CheckIfDown()/判断是否能继续下降一格DrawSign(Sign0,0);Sign0.y+=3;DrawSign(Sign0,1);elseFixSign();DelFull();PrintScore();if(Score>=PASSSCORE)SysFlag&=(1<<DEADFLAG);break;/跳
22、出玩游戏过程SysFlag|=1<<NEWSIGNFLAG;/新的积木图标产生标志置1void Main() InitCpu();/初始化CPULcd_Reset(); /初始化LCD屏Lcd_Clear(0);/清屏 Lcd_Reset(); /初始化LCD屏Lcd_Clear(0);/清屏DrawBoard();/画界面GamePlay();/玩游戏GameOver();/游戏结束Lcd_Reset(); /初始化LCD屏Lcd_Clear(0);/清屏*12864.h文件*#include<intrins.h>sbit RS=P20; /并行的指令/数据选择信号,
23、 H数据, L命令sbit RW=P21; /并行读写选择信号, H读, L写sbit E=P22; /并行使能端, H有效, L无效sbit PSB=P23; /并/串接口选择, H并,L串sbit RET=P24; /复位, L有效#define LcdData P0unsigned char Lcd_CheckBusy(void) unsigned char Busy;LcdData=0xff; RS=0; RW=1; E=1; _nop_(); Busy=LcdData&0x80; E=0; return Busy;/*向LCD写入字节数据*/void Lcd_WriteDat
24、a(unsigned char Data) while(Lcd_CheckBusy();RS=1;RW=0;E=0;_nop_(); _nop_(); LcdData=Data;E=1;_nop_();_nop_();E=0;/*从LCD中读出数据*/unsigned char Lcd_ReadData(void)unsigned char Temp;while(Lcd_CheckBusy(); LcdData=0xff; RS=1;RW=1;E=1;_nop_(); Temp=LcdData; E=0; return Temp;/*想LCD中写入指令代码*/void Lcd_WriteCmd
25、(unsigned char CmdCode) while(Lcd_CheckBusy(); RS=0; RW=0; E=0; _nop_(); _nop_(); LcdData=CmdCode; _nop_(); _nop_(); E=1; _nop_(); _nop_(); E=0;/*向LCD指定起始位置写入一个字符串*/void Lcd_WriteStr(unsigned char x,unsigned char y,unsigned char *Str)if(y>3)|(x>7)return;/如果指定位置不在显示区域内,则不做任何写入直接返回EA=0;switch(y)
26、case 0:Lcd_WriteCmd(0x80+x);break;case 1:Lcd_WriteCmd(0x90+x);break;case 2:Lcd_WriteCmd(0x88+x);break;case 3:Lcd_WriteCmd(0x98+x);break;while(*Str>0) Lcd_WriteData(*Str); Str+; EA=1;/*为加速逻辑运算而设置的掩码表,这是以牺牲空间而换取时间的办法*/code unsigned int LcdMaskTab=0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0
27、080, 0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000;/*向LCD指定坐标写入一个象素,象素颜色有两种,0代表白(无显示),1代表黑(有显示)*/void Lcd_PutPixel(unsigned char x,unsigned char y,unsigned char Color)unsigned char z,w;unsigned int Temp;if(x>=128|y>=64)return;Color=Color%2;w=15-x%16;/确定对这个字的第多少位进行操作x=x/16;/确定为一行上的第几字
28、if(y<32) /如果为上页z=0x80;else /否则如果为下页z=0x88;y=y%32;EA=0;Lcd_WriteCmd(0x36);Lcd_WriteCmd(y+0x80); /行地址Lcd_WriteCmd(x+z); /列地址 Temp=Lcd_ReadData();/先空读一次Temp=(unsigned int)Lcd_ReadData()<<8;/再读出高8位Temp|=(unsigned int)Lcd_ReadData();/再读出低8位EA=1;if(Color=1) /如果写入颜色为1Temp|=LcdMaskTabw;/在此处查表实现加速el
29、se /如果写入颜色为0Temp&=LcdMaskTabw;/在此处查表实现加速EA=0;Lcd_WriteCmd(y+0x80); /行地址Lcd_WriteCmd(x+z); /列地址 Lcd_WriteData(Temp>>8);/先写入高8位,再写入低8位 Lcd_WriteData(Temp&0x00ff);Lcd_WriteCmd(0x30);EA=1;/*从LCD指定坐标读取象素颜色值*/unsigned char Lcd_ReadPixel(unsigned char x,unsigned char y)unsigned char z,w;unsig
30、ned int Temp;if(x>=128|y>=64)return 0;w=15-x%16;/确定对这个字的第多少位进行操作x=x/16;/确定为一行上的第几字if(y<32) /如果为上页z=0x80;else /否则如果为下页z=0x88;y=y%32;EA=0;Lcd_WriteCmd(0x36);Lcd_WriteCmd(y+0x80); /行地址Lcd_WriteCmd(x+z); /列地址 Temp=Lcd_ReadData();/先空读一次Temp=(unsigned int)Lcd_ReadData()<<8;/再读出高8位Temp|=(uns
31、igned int)Lcd_ReadData();/再读出低8位EA=1;if(Temp&&LcdMaskTabw)=0)return 0;elsereturn 1;/*向LCD指定位置画一条长度为Length的指定颜色的水平线*/void Lcd_HoriLine(unsigned char x,unsigned char y,unsigned char Length,unsigned char Color)unsigned char i;if(Length=0)return;for(i=0;i<Length;i+)Lcd_PutPixel(x+i,y,Color);/*向LCD指定位置画一条长度为Length的指定颜色的垂直线*/void Lcd_VertLine(unsigned char x,unsigned char y,unsigned char Length,unsigned char C
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 天津大学《数据库系统设计实践》2023-2024学年第二学期期末试卷
- 菏泽学院《医学影像设备安装与维修学》2023-2024学年第二学期期末试卷
- 肇庆医学高等专科学校《可编程控制器技术》2023-2024学年第二学期期末试卷
- 信阳航空职业学院《建筑设计基础二》2023-2024学年第二学期期末试卷
- 哈尔滨传媒职业学院《毕业论文写作》2023-2024学年第二学期期末试卷
- 湖州学院《微信小程序开发与实践》2023-2024学年第二学期期末试卷
- 重庆移通学院《Pthon数据分析与挖掘基础》2023-2024学年第二学期期末试卷
- 广州航海学院《体育(上)》2023-2024学年第二学期期末试卷
- 四川应用技术职业学院《工程制图与CAD》2023-2024学年第二学期期末试卷
- 温州科技职业学院《智能汽车传感技术》2023-2024学年第二学期期末试卷
- QSB快速反应看板
- 初中信息技术备课组工作计划8篇
- 售后维修服务单模板
- (中职)电子技术基础与技能(电子信息类)教案
- 汪小兰有机化学课件(第四版)3
- 减少电力监控系统告警信息上传方法的研究(QC成果)
- 交易商协会非金融企业债务融资工具发行注册工作介绍
- 《人与环境》课程教学大纲
- 班组长管理能力提升培训(PPT96张)课件
- 深圳市城市用地分类表
- 内蒙古自治区小额贷款公司试点管理实施细则
评论
0/150
提交评论