




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
基于51單片機的俄羅斯方塊游戲設(shè)計DesignofTetrisGameBasedon51SingleChipMicrocomputer目錄13252摘要 頁致謝在此,我要感謝我的畢業(yè)指導(dǎo)老師,在您的指導(dǎo)下才順利完成了我的設(shè)計。更重要的是老師幫我解決了許多技術(shù)上的難題讓我能把設(shè)計做的更加完善。如果沒有我的指導(dǎo)老師,我將花費比本來用時多的多的時間,感謝老師的耐心教導(dǎo)和無私的奉獻(xiàn),同時也對我的同學(xué)表示感謝,感謝同學(xué)的耐心檢查和鉆牛角尖與雞蛋里挑骨頭的精神,讓我感受到了濃濃的學(xué)術(shù)氣氛。本設(shè)計也存在一定的問題,但在老師、同學(xué)的幫助和鼓勵下都已經(jīng)解決了,最后再次感謝老師的悉心指導(dǎo)和同學(xué)的幫助!我除了非常感謝我的良師益友以外,我還非常的感謝我的父母,沒有他們的默默付出,我不可能此時此地在此刻做著設(shè)計打著字,有茫茫多的少年因為家庭的經(jīng)濟(jì)原因沒有辦法完成自己的學(xué)業(yè),又有茫茫多的人因為與家庭的矛盾產(chǎn)生了厭學(xué)甚至逃學(xué)的情緒。沒有家長的經(jīng)濟(jì)支持,我不能在這里。父母是偉大的,父愛如山,沉默而又偉大,他養(yǎng)育你,給你食物給你安息之地,自己卻寡言,默默承受著來自社會,來自領(lǐng)導(dǎo),來自這個世界的所有的惡意與壓力,母愛如水,母愛是世界上最偉大的愛,她無私,不求回報,如果沒有母愛,這個世界將失去生機。母愛如一碗甜甜的山泉,這個世界沒有了母愛也就沒有了人類的繁衍,母愛是世界上全心全意最不求回報的愛。世界因愛而溫暖,因感恩而偉大。感謝所有人,感謝所有幫助過我的人。參考文獻(xiàn)[1]徐科軍.傳感器與檢測技術(shù)[M],北京:電子工業(yè)出版社,2016(2):15-17[2]趙亮侯,國銳.單片機語言編程與實例[M],北京:人民郵電出版社,2003(3):45-56[3]李光飛.單片機課程設(shè)計實例指導(dǎo)[M],北京:北京航空航天大學(xué)出版社,2004(3):34-39[4]何立民.單片機高級教程一應(yīng)用與設(shè)計[M],北京:北京航空航天大學(xué)出版社,2009(5):145-167[5]樓然苗,李光飛.51系列單片機設(shè)計實例[M],北京:北京航空航天大學(xué)出版社,2003(2):62-69[6]胡汗才.單片機原理與接口技術(shù)[M],清華大學(xué)出版社,2004(6):146-158[7]王萍.電子技術(shù)實驗教程[M],北京:機械工業(yè)出版社,2009(3):36-44[8]朱定華,戴淑萍.單片機微機原理與應(yīng)用[M],北京:清華大學(xué)出版社,2003(2):25-29[9]畢滿清,高文華等.模擬電子技術(shù)基礎(chǔ)[M],北京:電子工業(yè)出版社,2008(6):156-178[10]郝曉劍,楊述平等.儀器電路設(shè)計與應(yīng)用[M],北京:電子工業(yè)出版社,2007(3):64-77[11]劉勇.數(shù)字電路[M],北京:電子工業(yè)出版社,2004(5):137-152[12]陳正振.電子電路設(shè)計與制作[M],廣西:廣西交通職業(yè)技術(shù)學(xué)院信息工程系,2007(2):17-25[13]楊子文.單片機原理及應(yīng)用[M],西安:西安電子科技大學(xué)出版社,2006(5):89-99[14]陳汝全.電子技術(shù)常用器件應(yīng)用手冊[M],北京:機械工業(yè)出版社,2004(3):31-33[15]韓焱,張艷花等.電子技術(shù)基礎(chǔ)[M],北京:電子工業(yè)出版社,2009(5):121-132[16]童長飛.CSO5lF系列單片機開發(fā)與C語言編程[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)號數(shù)量30PF瓷片電容C1,C3210UF電解電容C21微動開關(guān)KEY1,KEY2,KEY3
KEY4,KEY5,KEY66LCD12864液晶Q1110K色環(huán)電阻R1110K電位器R21雙擲開關(guān)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;//翻轉(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個形態(tài)第一個數(shù)高四位□□□□第一個數(shù)低四位□□□□第二個數(shù)高四位□□□□第二個數(shù)低四位□□□□*///以第一個圖形為例,數(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ān)分?jǐn)?shù)//積木結(jié)構(gòu)體0:當(dāng)前積木,1:過渡積木,2:下個積木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ù)*************************************/voiddelayms(unsignedintms){ unsignedchari=100,j; for(;ms;ms--) { while(--i) { j=10; while(--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;}/**************************************為偽隨機數(shù)發(fā)生器播種***************************************/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,"選擇關(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ā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來畫出積木圖標(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)固定,無法再下降*********************************/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)是否可以向左移動*********************************/unsignedcharCheckIfLeft(void){ Sign[1]=Sign[0]; Sign[1].x-=3; returnCheckIf();}/********************************判斷積木圖標(biāo)是否可以向右移動*********************************/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個滿行并做消除*********************************/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--)//積木圖標(biāo)的最頂行開始尋找滿行比較有利于運算 { 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); //} } } }}/*******************************隨機產(chǎn)生一個積木圖標(biāo)放到預(yù)產(chǎn)生區(qū)域并顯示出來********************************/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ā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))//左,移動 { DrawSign(Sign[0],0); Sign[0].x-=3; DrawSign(Sign[0],1);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 玫瑰花購銷合同
- 工業(yè)設(shè)備維修保養(yǎng)服務(wù)合同
- 出售房屋委托代理合同書
- 固體廢物處理處置服務(wù)合同
- 水電接入合同協(xié)議書
- 承包建造船舶合同
- 電子政務(wù)系統(tǒng)合同
- 內(nèi)蒙古北方職業(yè)技術(shù)學(xué)院《美容外科學(xué)醫(yī)學(xué)美容》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧稅務(wù)高等??茖W(xué)?!峨姎鈧鲃幼詣涌刂葡到y(tǒng)綜合課程設(shè)計》2023-2024學(xué)年第二學(xué)期期末試卷
- 大連裝備制造職業(yè)技術(shù)學(xué)院《智慧教學(xué)與微課制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 心肺復(fù)蘇課件
- 2024-2030年“一帶一路”背景下中國鐵塊礦產(chǎn)業(yè)未來發(fā)展趨勢及投資策略分析報告
- 鋼包熱修工安全技術(shù)操作規(guī)程(3篇)
- 風(fēng)力發(fā)電廠土建工程施工組織設(shè)計
- 2024年云南省公務(wù)員錄用考試《行測》真題卷及答案解析
- 成人缺氧缺血性腦病護(hù)理
- 期末提優(yōu)測試卷(試題)-2024-2025學(xué)年四年級上冊數(shù)學(xué)青島版
- 常用數(shù)學(xué)公式大全
- 風(fēng)機基礎(chǔ)監(jiān)理實施細(xì)則
- GB/T 24503-2024礦用圓環(huán)鏈驅(qū)動鏈輪
- 人教版(2024)英語七年級上冊單詞表
評論
0/150
提交評論