基于51單片機(jī)的俄羅斯方塊游戲設(shè)計(jì)_第1頁(yè)
基于51單片機(jī)的俄羅斯方塊游戲設(shè)計(jì)_第2頁(yè)
基于51單片機(jī)的俄羅斯方塊游戲設(shè)計(jì)_第3頁(yè)
基于51單片機(jī)的俄羅斯方塊游戲設(shè)計(jì)_第4頁(yè)
基于51單片機(jī)的俄羅斯方塊游戲設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩46頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

基于51單片機(jī)的俄羅斯方塊游戲設(shè)計(jì)DesignofTetrisGameBasedon51SingleChipMicrocomputer目錄13252摘要 頁(yè)致謝在此,我要感謝我的畢業(yè)指導(dǎo)老師,在您的指導(dǎo)下才順利完成了我的設(shè)計(jì)。更重要的是老師幫我解決了許多技術(shù)上的難題讓我能把設(shè)計(jì)做的更加完善。如果沒(méi)有我的指導(dǎo)老師,我將花費(fèi)比本來(lái)用時(shí)多的多的時(shí)間,感謝老師的耐心教導(dǎo)和無(wú)私的奉獻(xiàn),同時(shí)也對(duì)我的同學(xué)表示感謝,感謝同學(xué)的耐心檢查和鉆牛角尖與雞蛋里挑骨頭的精神,讓我感受到了濃濃的學(xué)術(shù)氣氛。本設(shè)計(jì)也存在一定的問(wèn)題,但在老師、同學(xué)的幫助和鼓勵(lì)下都已經(jīng)解決了,最后再次感謝老師的悉心指導(dǎo)和同學(xué)的幫助!我除了非常感謝我的良師益友以外,我還非常的感謝我的父母,沒(méi)有他們的默默付出,我不可能此時(shí)此地在此刻做著設(shè)計(jì)打著字,有茫茫多的少年因?yàn)榧彝サ慕?jīng)濟(jì)原因沒(méi)有辦法完成自己的學(xué)業(yè),又有茫茫多的人因?yàn)榕c家庭的矛盾產(chǎn)生了厭學(xué)甚至逃學(xué)的情緒。沒(méi)有家長(zhǎng)的經(jīng)濟(jì)支持,我不能在這里。父母是偉大的,父愛如山,沉默而又偉大,他養(yǎng)育你,給你食物給你安息之地,自己卻寡言,默默承受著來(lái)自社會(huì),來(lái)自領(lǐng)導(dǎo),來(lái)自這個(gè)世界的所有的惡意與壓力,母愛如水,母愛是世界上最偉大的愛,她無(wú)私,不求回報(bào),如果沒(méi)有母愛,這個(gè)世界將失去生機(jī)。母愛如一碗甜甜的山泉,這個(gè)世界沒(méi)有了母愛也就沒(méi)有了人類的繁衍,母愛是世界上全心全意最不求回報(bào)的愛。世界因愛而溫暖,因感恩而偉大。感謝所有人,感謝所有幫助過(guò)我的人。參考文獻(xiàn)[1]徐科軍.傳感器與檢測(cè)技術(shù)[M],北京:電子工業(yè)出版社,2016(2):15-17[2]趙亮侯,國(guó)銳.單片機(jī)語(yǔ)言編程與實(shí)例[M],北京:人民郵電出版社,2003(3):45-56[3]李光飛.單片機(jī)課程設(shè)計(jì)實(shí)例指導(dǎo)[M],北京:北京航空航天大學(xué)出版社,2004(3):34-39[4]何立民.單片機(jī)高級(jí)教程一應(yīng)用與設(shè)計(jì)[M],北京:北京航空航天大學(xué)出版社,2009(5):145-167[5]樓然苗,李光飛.51系列單片機(jī)設(shè)計(jì)實(shí)例[M],北京:北京航空航天大學(xué)出版社,2003(2):62-69[6]胡汗才.單片機(jī)原理與接口技術(shù)[M],清華大學(xué)出版社,2004(6):146-158[7]王萍.電子技術(shù)實(shí)驗(yàn)教程[M],北京:機(jī)械工業(yè)出版社,2009(3):36-44[8]朱定華,戴淑萍.單片機(jī)微機(jī)原理與應(yīng)用[M],北京:清華大學(xué)出版社,2003(2):25-29[9]畢滿清,高文華等.模擬電子技術(shù)基礎(chǔ)[M],北京:電子工業(yè)出版社,2008(6):156-178[10]郝曉劍,楊述平等.儀器電路設(shè)計(jì)與應(yīng)用[M],北京:電子工業(yè)出版社,2007(3):64-77[11]劉勇.數(shù)字電路[M],北京:電子工業(yè)出版社,2004(5):137-152[12]陳正振.電子電路設(shè)計(jì)與制作[M],廣西:廣西交通職業(yè)技術(shù)學(xué)院信息工程系,2007(2):17-25[13]楊子文.單片機(jī)原理及應(yīng)用[M],西安:西安電子科技大學(xué)出版社,2006(5):89-99[14]陳汝全.電子技術(shù)常用器件應(yīng)用手冊(cè)[M],北京:機(jī)械工業(yè)出版社,2004(3):31-33[15]韓焱,張艷花等.電子技術(shù)基礎(chǔ)[M],北京:電子工業(yè)出版社,2009(5):121-132[16]童長(zhǎng)飛.CSO5lF系列單片機(jī)開發(fā)與C語(yǔ)言編程[M],北京:北京航空航天大學(xué)出版社,2005(5):77-79[17]XiaoChen,ChaoranLin.TetrisGamesystemDesignBasedonAT89S52SingleChipMicrocomputer[D],DepartmentofElectronicInformationEngineeringNanjingUniversityofInformationScienceandTechnology,2012,pp1-6[18]WillWade,TetrisGameSystemSolvesYear2008ProblemProductAnnouncement[J],ElectronicNews,2007,pp1-6附錄1原理圖附錄2元器件清單表1元器件清單名稱標(biāo)號(hào)數(shù)量30PF瓷片電容C1,C3210UF電解電容C21微動(dòng)開關(guān)KEY1,KEY2,KEY3

KEY4,KEY5,KEY66LCD12864液晶Q1110K色環(huán)電阻R1110K電位器R21雙擲開關(guān)SW11DC-002電源插座P112Pi插針U21STC89C52單片機(jī)U3112MHZ晶振Y11附錄3源程序清單#include<reg51.h> //頭文件#include<12864.h> //宏定義#defineA48271L#defineM2147483647L#defineQ(M/A)//44488#defineR(M%A)//3399/************************引腳定義**************************/sbitK1=P1^6;//翻轉(zhuǎn)鍵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個(gè)形態(tài)第一個(gè)數(shù)高四位□□□□第一個(gè)數(shù)低四位□□□□第二個(gè)數(shù)高四位□□□□第二個(gè)數(shù)低四位□□□□*///以第一個(gè)圖形為例,數(shù)據(jù):{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 //過(guò)關(guān)分?jǐn)?shù)//積木結(jié)構(gòu)體0:當(dāng)前積木,1:過(guò)渡積木,2:下個(gè)積木structJimu{ unsignedintdat; //積木數(shù)據(jù) charx; //積木左下角坐標(biāo)(X,Y) unsignedchary; unsignedchartype; //積木類型 unsignedcharchange;//積木旋轉(zhuǎn)次數(shù)}Sign[3]; unsignedcharSysFlag=0;#defineNEWSIGNFLAG0#defineDEADFLAG1#definePAUSEFLAG2unsignedcharScore=0;unsignedcharLevel=1;unsignedcharDelayCnt=5;/*********************************************************/#defineN25/************************************毫秒延時(shí)函數(shù)*************************************/voiddelayms(unsignedintms){ unsignedchari=100,j; for(;ms;ms--) { while(--i) { j=10; while(--j); } }}/************************************偽隨機(jī)數(shù)發(fā)生器*************************************/doubleRandom(void){ longTmpSeed; TmpSeed=A*(Seed%Q)-R*(Seed/Q); if(TmpSeed>=0) Seed=TmpSeed; else Seed=TmpSeed+M; return(double)Seed/M;}/**************************************為偽隨機(jī)數(shù)發(fā)生器播種***************************************/voidInitRandom(unsignedlongInitVal){ Seed=InitVal;}//延時(shí)子程序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,"選擇關(guān)卡:"); Lcd_WriteStr(2,3,"進(jìn)入游戲"); 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,"進(jìn)入游戲"); }}/**************************************************俄羅斯方塊部分****************************************************************//******************************畫墻壁,初始化界面*******************************/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,"關(guān)卡:");}/***********************************游戲結(jié)束處理************************************/voidGameOver(void){ //unsignedcharStr[3]; unsignedcharn; unsignedintj=0; //Lcd_Clear(0);//清屏 //DrawBoard();//畫界面 Lcd_WriteStr(5,0,"繼續(xù)"); for(n=3;n<60;n++) Lcd_HoriLine(3,n,30,0); while(K5) //等待繼續(xù)游戲 { if(j==15000) { for(n=16;n<33;n++) Lcd_HoriLine(3,n,30,0); } if(j==0) { if(Level==11) //通關(guān) { 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 //過(guò)關(guān) { 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};/**********************************根據(jù)積木圖標(biāo)左下坐標(biāo)X,Y來(lái)畫出積木圖標(biāo),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); }}/********************************將積木圖標(biāo)值融入num數(shù)據(jù)中也即把積木圖標(biāo)固定,無(wú)法再下降*********************************/voidFixSign(void){ unsignedcharm,n; for(m=0;m<4;m++)//行循環(huán) for(n=0;n<4;n++)//列循環(huá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]; } }}/********************************判斷積木圖標(biāo)中方塊是否與障礙方塊重合*********************************/unsignedcharCheckIf(void){ unsignedcharm,n; for(m=0;m<4;m++)//行循環(huán) for(n=0;n<4;n++)//列循環(huá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;}/********************************判斷積木圖標(biāo)是否可以繼續(xù)下降一格********************************/unsignedcharCheckIfDown(void){ Sign[1]=Sign[0];// Sign[1].y+=3;//假設(shè)下降一格 returnCheckIf(); }/********************************判斷積木圖標(biāo)是否可以向左移動(dòng)*********************************/unsignedcharCheckIfLeft(void){ Sign[1]=Sign[0]; Sign[1].x-=3; returnCheckIf();}/********************************判斷積木圖標(biāo)是否可以向右移動(dòng)*********************************/unsignedcharCheckIfRight(void){ Sign[1]=Sign[0]; Sign[1].x+=3; returnCheckIf();}/********************************判斷是否可以旋轉(zhuǎn)*********************************/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個(gè)滿行并做消除*********************************/voidDelFull(void){ unsignedchari=0; unsignedcharm,n; unsignedcharTemp; unsignedcharFlag=0; Temp=(Sign[0].y-2)/3; if(Temp>=20)//防止越過(guò)了下邊界 Temp=1; else Temp=20-Temp; for(n=Temp+3;n>=Temp;n--)//積木圖標(biāo)的最頂行開始尋找滿行比較有利于運(yù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; //分?jǐn)?shù)累加 } } if(Flag)//為加速而設(shè)置并判斷的標(biāo)志,有已固定的積木有滿格消行變化則重畫積木界面 { for(m=Temp;m<=19;m++)//為加速,不必要重第一行重畫起,只需要從積木圖標(biāo)最下行開始往上的重畫 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); //} } } }}/*******************************隨機(jī)產(chǎn)生一個(gè)積木圖標(biāo)放到預(yù)產(chǎn)生區(qū)域并顯示出來(lái)********************************/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);}/********************************游戲的具體過(guò)程,也是俄羅斯方塊算法的關(guān)鍵部分*********************************/voidGamePlay(void){ unsignedcharm,n; unsignedintTemp; SysFlag=0; //初始化所有變量參數(shù) 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;//剛開始初始化為需要產(chǎn)生新的積木圖標(biāo) InitRandom(TL0); Lcd_WriteStr(5,0,"開始"); PrintScore(); PrintLevel(); CreatSign(); while(1) { if((SysFlag&(1<<NEWSIGNFLAG))==1)//判是否需要產(chǎn)生新的積木圖標(biāo) { SysFlag&=~(1<<NEWSIGNFLAG); Sign[0]=Sign[2]; CreatSign(); Sign[0].x=12; Sign[0].y=14; for(m=0;m<4;m++)//行循環(huán) { for(n=0;n<4;n++)//列循環(huán) { if((Sign[0].dat&MaskTab[15-m*4-n])==0) break; } if(n==4) Sign[0].y-=3; }//將積木圖標(biāo)出現(xiàn)置頂 for(m=0;m<4;m++)//行循環(huán) for(n=0;n<4;n++)//列循環(huá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;//如果產(chǎn)生新的積木圖標(biāo)中的方塊與已固定好的方塊重合,則死亡。游戲結(jié)束 DrawSign(Sign[0],1); } if((CheckIfLeft())&&(K3==0))//左,移動(dòng) { DrawSign(Sign[0],0); Sign[0].x-=3; DrawSign(Sign[0],1);

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論