




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*基于MSP430F5529俄罗斯方块游戏程序*/作者: 詹磊/功能: 基于MSP430F5529俄罗斯方块游戏程序/说明: 运行环境:TI官方MSP-EXP5529开发板(外接4个带上拉电阻独立按键)/ 非原创,思路是从51单片机上移植过来的/ 底层液晶驱动是TI官方提供的LCD API/ 游戏算法部分的底层程序多处已经修改,与原版会有较大的差别/版本: 测试版 V1.0(基本能流畅运行,但需要进一步的美化和优化)#include MSP430F5529.h#include LCD_102x64.h#include main.h#include Key.h#define MAXHANG 20 /游戏显示行数#define MAXLIE16 /游戏显示列数#define MapWide 48 /地图宽#define MapHigh 60 /地图高#define ON 0#define OFF 1#define BIT(n) (10;i-) for(m=4500;m0;m-) _NOP(); /-/函数名:八位LED灯控制函数/入口:Number:Number哪位为一则哪位LED点亮/出口:Void/功能:/-/void DigitalLedControl(uchar Number) if(Number&BIT7) P1OUT|=BIT0; else P1OUT&=BIT0; if(Number&BIT6) P8OUT|=BIT1; else P8OUT&=BIT1; if(Number&BIT5) P8OUT|=BIT2; else P8OUT&=BIT2; if(Number&BIT4) P1OUT|=BIT1; else P1OUT&=BIT1; if(Number&BIT3) P1OUT|=BIT2; else P1OUT&=BIT2; if(Number&BIT2) P1OUT|=BIT3; else P1OUT&=BIT3; if(Number&BIT1) P1OUT|=BIT4; else P1OUT&=BIT4; if(Number&BIT0) P1OUT|=BIT5; else P1OUT&=BIT5;/-/函数名:显存清空函数/入口:Void/出口:Void/功能:清空显存/-/void DisplayRamClear() uchar i; for(i=0;i20;i+) cubeMapi=0x0; /-/函数名:两位十进制数字显示函数/入口: Row:显示的行数/ Column:显示的列数/ Number:需要显示的数字=0/出口:Void/功能:/-/void Number2BitDisplay(uchar Row,uchar Column,uchar Number) uchar tempShi,tempGe; tempShi=Number/10; tempGe=Number%10; Dogs102x6_charDraw(Row, Column,tempShi+0,ON); Dogs102x6_charDraw(Row, Column+6,tempGe+0,ON);/-/函数名:游戏背景函数/入口:Void/出口:Void/功能:绘制游戏背景地图/-/void GameBackground() uchar i; for(i=0;iMapHigh+1;i+) Dogs102x6_pixelDraw(0, i, ON); Dogs102x6_pixelDraw(MapWide+1, i, ON); for(i=0;iMapWide+2;i+) Dogs102x6_pixelDraw(i, 0, ON); Dogs102x6_pixelDraw(i, MapHigh+1, ON); DisplayRamClear(); Dogs102x6_stringDraw(3, 10, START,ON); Dogs102x6_stringDraw(1, 51, NEXT:,ON); Dogs102x6_stringDraw(3, 51, SPEED:-,ON); Dogs102x6_stringDraw(5, 51, SCORE:-,ON); Number2BitDisplay(3,87,Speed); Number2BitDisplay(5,87,Score);/-/函数名:游戏Map清空/入口:Void/出口:Void/功能:清空游戏背景地图(不清空显存)/-/void GameMapClear() uchar i,j; for(i=0;iMapHigh;i+) for(j=0;j(Column%16); if(mode=ON) cubeMapRow|=tempData; else cubeMapRow&=tempData;/-/函数名:读取某个显示像素点位值函数/入口: Row:行数/ Column:列数/出口:uchar 1:所选点位1,0:所选的点位0/功能:/-/uchar ReadDisplayRamBit(uchar Row,uchar Column) uint tempData; tempData=(0x8000(Column%16); if(cubeMapRow&tempData) return 1; else return 0;/-/函数名:下一个方块显示函数/入口: x:x轴坐标/ y:y轴坐标/ *p:图形字模数据指针/出口:Void/功能:/-/void showNextCube(uchar const * p,uchar x,uchar y)#define NexPoinX 27 /下一个图形显示的X坐标#define NexPoinY 2 /下一个图形显示的Y坐标uchar i,j,temp;for(i=0;i4;i+) temp=0x08; for(j=0;j=1; /-/函数名:显示函数/入口:Void/出口:Void/功能:将显存的内容写入显示器显示/-/void showCubeMap(void)uchar hang,lie;for(hang=0;hangMAXHANG;hang+) if(cubeMaphang!=0) /跳过某行全为零的地方 for(lie=0;lie(lie%16) Display3x3Pixels(lie,hang,ON); /-/函数名:产生新方块函数/入口:Void/出口:Void/功能:/-/void createCube(void)static uchar next=0;this.cube=next;next=randomNumber%7; /产生随机数this.row=0; /初始行为0this.column=6; /初始列为6this.state=0; /初始状态为0this.box=cube+16*this.cube; /设定方块指针起始地址showNextCube(cube+16*next,NexPoinX,NexPoinY); /提示区显示下一个方块timeA=0;downflag=0;/-/函数名:写显存函数/入口:mode:ON 打点;OFF 消点/出口:Void/功能:将数据写入显存,同时写入显示器显示/-/void writeCubeToMap(uchar mode) uchar tempData,tempRow,tempColumn,i,j,k=0; for(i=0;i4;i+) tempData=this.boxi; if(tempData=0) continue; for(j=0;j4;j+) if(tempData&0x08) tempRow=this.row+k; tempColumn=this.column+j; ChangeRamBit(tempRow,tempColumn,mode); Display3x3Pixels(tempColumn,tempRow,mode); tempData=1; k+; /-/函数名:方块边沿检测函数/入口:Void/出口:uchar 0:可以继续移动 1:到底,停止移动/功能:/-/uchar checkClask(void) uchar tempData,tempRow,tempColumn,i,j,k=0; for(i=0;i4;i+) tempData=this.boxi; if(tempData=0) /跳过全为零的行 continue; for(j=0;j=MAXHANG) /到了最底部 |(tempColumn=MAXLIE) /到了最右边 |(tempColumn=255) /到了最左边 ) return 1; /返回1,停止移动 tempData0;i-) if(cubeMapi=0xffff) fullFlag+; for(j=i;j0;j-) if(j0) cubeMapj=cubeMapj-1; else cubeMapj=0; i+; tempScore=Score; tempSpeed=Speed; switch(fullFlag) case 1:Score+;break; case 2:Score+=2;break; case 3:Score+=4;break; case 4:Score+=6;break; default:break; if(Score99) Speed+; if(Speed9) Speed=1; Score=0; if(tempScore!=Score) Number2BitDisplay(5,87,Score); if(tempSpeed!=Speed) Number2BitDisplay(3,87,Speed); if(fullFlag) GameMapClear(); showCubeMap(); /-/函数名:方块左移函数/入口:Void/出口:Void/功能:/-/void moveLeft(void) writeCubeToMap(OFF); this.column-; if(checkClask() this.column+; writeCubeToMap(ON);/-/函数名:方块右移函数/入口:Void/出口:Void/功能:/-/void moveRigh(void) writeCubeToMap(OFF); this.column+; if(checkClask() this.column-; writeCubeToMap(ON);/-/函数名:方块下移函数/入口:Void/出口:uchar 到底返回1,否则返回0;/功能:/-/uchar moveDown(void) writeCubeToMap(OFF); this.row+; if(checkClask() /到底 this.row-; writeCubeToMap(ON); CheckMap(); /是否消行 return 1; else writeCubeToMap(ON); return 0; /-/函数名:方块翻转函数/入口:Void/出口:Void/功能:/-/void cubeRotation(void) uchar temp; temp=this.state; writeCubeToMap(OFF); this.state=+this.state%4; this.box=cube+16*this.cube+4*this.state; if(checkClask() this.state=temp; this.box=cube+16*this.cube+4*this.state; writeCubeToMap(ON);/-/函数名:俄罗斯方块结束界面函数/入口:Void/出口:Void/功能:/-/void TetrisGameOver() DisplayRamClear(); GameMapClear(); Score=0; Speed=1; Number2BitDisplay(5,87,Score); Number2BitDisplay(3,87,Speed); Dogs102x6_stringDraw(3, 13, GAME,ON); Dogs102x6_stringDraw(4, 13, OVER,ON);/-/函数名:俄罗斯方块游戏运行函数/入口:Void/出口:Void/功能:不阻塞CPU/-/void TetrisGame() uchar temp=0; static uchar Flag=0; if(Flag=0) createCube(); if(checkClask() TetrisGameOver(); delay_ms(1000); GameMapClear(); else writeCubeToMap(ON); Flag=1; if(downflag&Flag) downflag=0; if(moveDown() Flag=0; temp=GetKey(); switch(temp) case KeyUP:cubeRotation();DigitalLedControl(0); break; case KeyDOWN:whil
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论