版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2/131/13簡(jiǎn)易貪食蛇游戲機(jī)學(xué)院:信息與通信工程專業(yè):班級(jí):姓名:學(xué)號(hào):班內(nèi)序號(hào):
簡(jiǎn)易貪食蛇游戲機(jī)一.設(shè)計(jì)課題的任務(wù)要求基本任務(wù):用一個(gè)8×8點(diǎn)陣做為基本顯示屏,4個(gè)連續(xù)移動(dòng)的的發(fā)光點(diǎn)表示一條蛇,用任意出現(xiàn)的一個(gè)亮點(diǎn)表示老鼠,用4個(gè)排成一條線的發(fā)光點(diǎn)表示“墻”,用四個(gè)按鍵控制蛇的運(yùn)動(dòng)方向,完成貪食蛇游戲,蛇撞“墻”、邊或者游戲時(shí)間到,則游戲結(jié)束。1.老鼠出現(xiàn)的地方是隨機(jī)的,在某個(gè)地點(diǎn)出現(xiàn)的時(shí)間是5秒鐘,如果5秒鐘之內(nèi)沒(méi)有被吃掉,它就會(huì)在其它地方出現(xiàn);2.用數(shù)碼管顯示得分情況和游戲的剩余時(shí)間,每吃掉一只老鼠就加一分;提高要求:1.游戲時(shí)間和速度可以手動(dòng)設(shè)置。2.增加游戲難度或自擬其它功能。二.系統(tǒng)設(shè)計(jì)1.設(shè)計(jì)思路當(dāng)復(fù)位鍵置為1時(shí),8*8點(diǎn)陣也初始化為全不亮,每來(lái)一個(gè)時(shí)鐘脈沖就對(duì)8*8點(diǎn)陣進(jìn)行一次掃描,并依次點(diǎn)亮四個(gè)蛇身點(diǎn)、一個(gè)老鼠點(diǎn)、四個(gè)墻點(diǎn),由于掃描頻率遠(yuǎn)遠(yuǎn)超出人眼所能分辨的范圍,故人眼看來(lái)蛇身是連續(xù)的。在數(shù)碼管上顯示得分與倒計(jì)時(shí)情況。用四個(gè)按鍵分別控制蛇的運(yùn)動(dòng)方向“上下左右”,每次按鍵時(shí)通過(guò)和蛇原來(lái)的運(yùn)動(dòng)方向進(jìn)行比較來(lái)控制蛇接下來(lái)的運(yùn)動(dòng)方向。當(dāng)蛇撞墻、出界、游戲時(shí)間到時(shí)游戲結(jié)束,點(diǎn)陣全亮。每當(dāng)蛇吃到一個(gè)老鼠時(shí)則自動(dòng)加一分并重設(shè)老鼠位置。老鼠存活5秒鐘時(shí)重設(shè)老鼠位置。用M序列發(fā)生器實(shí)現(xiàn)老鼠位置的隨機(jī)變化。2.總體框架圖:點(diǎn)陣顯示顯示存儲(chǔ)器點(diǎn)陣顯示顯示存儲(chǔ)器方向控制模塊方向控制模塊控制器控制器分頻器分頻器計(jì)時(shí)器計(jì)分器計(jì)時(shí)器計(jì)分器復(fù)位開(kāi)關(guān)方向輸入按鍵3.邏輯劃分框圖數(shù)碼管顯示分?jǐn)?shù)和倒計(jì)時(shí)數(shù)碼管顯示分?jǐn)?shù)和倒計(jì)時(shí)點(diǎn)陣顯示蛇、鼠、墻over,snaker,snakec,shownumratr,ratc控制器控制器控制蛇的運(yùn)動(dòng)、鼠的位置clk3clk2clk1overdir分頻器和輸入方向寄存器分頻器和輸入方向寄存器clearkey外界輸入器復(fù)位鍵和方向輸入鍵外界輸入器復(fù)位鍵和方向輸入鍵4.流程圖6.分塊電路設(shè)計(jì)點(diǎn)陣顯示模塊此模塊采用頻率為1Mhz的時(shí)鐘clk3。每來(lái)一個(gè)時(shí)鐘就對(duì)整個(gè)8*8點(diǎn)陣全部掃描一次,當(dāng)某個(gè)點(diǎn)的行為低電平,列為高電平時(shí)被點(diǎn)亮。由于蛇身有4個(gè)移動(dòng)的點(diǎn),墻有4個(gè)固定的點(diǎn)以及一個(gè)老鼠的亮點(diǎn),那么一共有9個(gè)點(diǎn)需要在8*8點(diǎn)陣上顯示。所以我將時(shí)鐘用point分成9個(gè)周期,每個(gè)周期掃描一個(gè)點(diǎn)。clk3頻率很高,雖然是逐點(diǎn)掃描,但由于視覺(jué)暫留我們看到的是9個(gè)點(diǎn)同時(shí)亮。當(dāng)復(fù)位信號(hào)clear置為1時(shí),點(diǎn)陣全不亮。當(dāng)結(jié)束信號(hào)over置為1時(shí),點(diǎn)陣全亮。數(shù)碼管顯示模塊當(dāng)一個(gè)數(shù)碼管要穩(wěn)定顯示需要頻率不小于50hz,總共4個(gè)數(shù)碼管,需要采用500hz的時(shí)鐘clk2.用cat信號(hào)對(duì)數(shù)碼管進(jìn)行片選,用seven信號(hào)儲(chǔ)存7個(gè)管腳的電平。共有4個(gè)數(shù)字需要顯示,用數(shù)組shownum儲(chǔ)存分?jǐn)?shù)與游戲時(shí)間。用state變量將時(shí)鐘clk2分成4個(gè)周期,每個(gè)周期顯示state對(duì)應(yīng)的shounum(state)。復(fù)位信號(hào)clear置為1時(shí),數(shù)碼管全不亮。控制器倒記時(shí)和老鼠5秒換位置要分頻出1赫茲的一個(gè)clk1。并且1赫茲的頻率十分適合蛇的移動(dòng),所以我將clk1信號(hào)作為了蛇移動(dòng)的觸發(fā)信號(hào)。復(fù)位信號(hào)clear=1將蛇的位置、方向、老鼠位置、墻的位置、游戲時(shí)間、分?jǐn)?shù)等初始化。蛇身的移動(dòng)。用4個(gè)點(diǎn)表示蛇,從蛇尾開(kāi)始,依次等于前一個(gè)蛇身點(diǎn)坐標(biāo)。蛇頭的移動(dòng)按照狀態(tài)轉(zhuǎn)移圖編寫(xiě)程序。實(shí)際編寫(xiě)時(shí)我將對(duì)出界情況的判斷加了進(jìn)去。給定dir時(shí),若出界,游戲結(jié)束。若否,當(dāng)蛇頭方向direction不和輸入值dir正好相反時(shí),蛇頭步進(jìn),將dir的值賦給蛇頭當(dāng)前方向direction;當(dāng)蛇頭方向direction和輸入值dir正好相反時(shí),若蛇頭出界,游戲結(jié)束,若不出界,蛇頭按照原來(lái)的direction方向步進(jìn)。重設(shè)老鼠位置設(shè)置一個(gè)重設(shè)老鼠標(biāo)志setrat。當(dāng)老鼠存活時(shí)間滿5s或蛇吃到老鼠時(shí),將setrat標(biāo)志置為1,否則為0.當(dāng)setrat=1時(shí),用M序列發(fā)生器隨機(jī)重設(shè)老鼠位置。當(dāng)重設(shè)后的老鼠和墻的位置重合時(shí),修改老鼠位置。分頻器和外界輸入方向寄存器EPM1270T144C5數(shù)電實(shí)驗(yàn)開(kāi)發(fā)板的時(shí)鐘clk頻率為50Mhz??刂破餍枰粋€(gè)頻率為1hz的時(shí)鐘clk1,數(shù)碼管顯示需要一個(gè)頻率為500hz的時(shí)鐘clk2,點(diǎn)陣顯示需要一個(gè)頻率為1Mhz的時(shí)鐘clk3.由于游戲結(jié)束時(shí)只有數(shù)碼管需要保持顯示結(jié)束時(shí)的時(shí)間和分?jǐn)?shù),所以當(dāng)over置為1時(shí),clk1和clk3的分頻器停止,只有clk2的分頻器繼續(xù)工作。外界輸入的方向用key表示,key值為“1000”、“0100”、“0010”、“0001”時(shí)分別表示上、下、左、右。將輸入的方向值賦給dir。dir設(shè)置為兩位二進(jìn)制變量:“00”表示“上”,“01”表示“下”,“10”表示“左”,“11”表示“右”。三.仿真波形及波形分析為方便仿真,將時(shí)鐘clk改為1Mhz,將clk3改為100khz,將點(diǎn)陣顯示、數(shù)碼管顯示的時(shí)鐘頻率都改為clk,將控制模塊顯示的時(shí)鐘改為clk3。1.點(diǎn)陣顯示仿真:如圖所示,當(dāng)clear=1時(shí),點(diǎn)陣的行都為高電平,列都為低電平,點(diǎn)陣全不亮。從clear置為0后clk的第一個(gè)上升沿開(kāi)始,點(diǎn)陣掃描顯示蛇、鼠、墻。先顯示前四個(gè)蛇點(diǎn)(蛇點(diǎn)初始位置:行為0,1,2,3;列為1),然后顯示鼠,接著顯示四個(gè)墻點(diǎn)(行為3,4,5,6;列為4)。然后重新掃描蛇、鼠、墻。如上圖,over=1時(shí),點(diǎn)陣行都變成低電平,列都變成高電平,點(diǎn)陣全亮。2.數(shù)碼管顯示仿真如圖,clear=1時(shí)數(shù)碼管全不亮。clear置為0后,數(shù)碼管輪流開(kāi)始顯示shounum數(shù)組中的元素。當(dāng)cat=011111和101111時(shí),分別顯示得分的十位和個(gè)位。由于得分為0,所以這兩個(gè)數(shù)碼管的管腳電平為1111110,即都顯示為0.此時(shí)時(shí)間為59,當(dāng)cat=111101時(shí)顯示游戲時(shí)間的十位,所以該數(shù)碼管的seven值為1011011,即顯示為5.當(dāng)cat=111110時(shí),顯示游戲時(shí)間的個(gè)位9,該數(shù)碼管的seven值為1111011,即顯示為9。從圖中可以看出,當(dāng)游戲時(shí)間為58時(shí),顯示游戲時(shí)間的個(gè)位的cat=111110的數(shù)碼管對(duì)應(yīng)的seven值變?yōu)?111110,即顯示為8.3.控制模塊仿真從圖中可以看到,clear置為1時(shí),蛇的位置被初始化。時(shí)間初始化為59。clear=0后,每個(gè)clk3的上升沿,蛇頭移動(dòng)一步,蛇身分別跟著前一個(gè)點(diǎn)移動(dòng)。當(dāng)游戲進(jìn)行了5秒時(shí),蛇頭到達(dá)點(diǎn)陣最上邊,這時(shí)由于對(duì)方向輸入鍵key的設(shè)置,蛇開(kāi)始向右走。當(dāng)?shù)褂?jì)時(shí)為49s時(shí),蛇頭到達(dá)點(diǎn)陣最右邊。此時(shí)蛇繼續(xù)向右走,出界,over置為1,游戲結(jié)束。從圖中可以看出,老鼠每5秒重置一次位置。四.源程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitytanshisheis port( clk,clear:instd_logic;--時(shí)鐘、復(fù)位/開(kāi)始開(kāi)關(guān) key:instd_logic_vector(3downto0);--方向控制鍵 seven:outstd_logic_vector(6downto0);--七位數(shù)碼管的7根二極管 cat:outstd_logic_vector(5downto0);--控制數(shù)碼管顯示 row,col:outstd_logic_vector(7downto0));--點(diǎn)陣行、列坐標(biāo)endtanshishe;architecturegameoftanshisheis signalsetrat,over:std_logic;--重設(shè)老鼠、游戲結(jié)束信號(hào) signalratr,ratc,rat:integerrange0to7;--老鼠行、列坐標(biāo) signalt:std_logic_vector(2downto0); signalrattime:integerrange0to4;--老鼠出現(xiàn)時(shí)間 typedotsisarray(integerrange<>)ofintegerrange0to7; signalsnaker,snakec:dots(3downto0);--蛇行、列坐標(biāo) constantwallr:dots(3downto0):=(6,5,4,3);--墻的行坐標(biāo)(常數(shù)) constantwallc:dots(3downto0):=(4,4,4,4);--強(qiáng)的列坐標(biāo)(常數(shù)) signalclk1,clk2,clk3:std_logic;--clk1:1秒clk2:500hz時(shí)鐘signaltmp1:integerrange0to49999999;--分頻1signaltmp2:integerrange0to99999;--分頻2signaltmp3:integerrange0to49;--分頻3 signaldir:std_logic_vector(1downto0);--保存下一時(shí)刻方向 signaldirection:integerrange0to3;--當(dāng)前蛇方向:0->上,1->下,2->左,3->右 signalpoint:integerrange0to8;--當(dāng)前點(diǎn)陣上顯示的點(diǎn) typefigureisarray(integerrange<>)ofintegerrange0to9; signalshownum:figure(3downto0);--shownum(3)和shownum(2)分別為得分的高位和地位,shownum(1)和shownum(0)分別為剩余時(shí)間的高位和地位begin p1:process(clk,over,clear)--分頻同時(shí)保存下一時(shí)刻蛇的移動(dòng)方向 begin ifclear='1'then dir<="00";tmp1<=0;tmp2<=0; elsifclk'eventandclk='1'then if(tmp2=99999)thentmp2<=0;clk2<='1';elsetmp2<=tmp2+1;clk2<='0';endif;ifover/='1'then if(tmp1=49999999)thentmp1<=0;clk1<='1';elsetmp1<=tmp1+1;clk1<='0';endif;if(tmp3=49)thentmp3<=0;clk3<='1';elsetmp3<=tmp3+1;clk3<='0';endif; casekeyis when"1000"=>dir<="00"; when"0100"=>dir<="01"; when"0010"=>dir<="10"; when"0001"=>dir<="11"; whenothers=>null; endcase; endif; endif; endprocess; p2:process(clear,clk3,over)--點(diǎn)陣顯示模塊 begin ifclear='1'then row<="11111111"; col<="00000000"; point<=0; else if(over='1')then--游戲結(jié)束col<="11111111";row<="00000000";else ifclk3'eventandclk3='1'then col<="00000000"; row<="11111111"; ifpoint=8then point<=0; elsepoint<=point+1; endif; casepointis when0|1|2|3=>row(snaker(point))<='0'; col(snakec(point))<='1'; when4=>row(ratr)<='0';col(ratc)<='1'; when5|6|7|8=>row(wallr(point-5))<='0';col(wallc(point-5))<='1'; whenothers=>col<="00000000";row<="11111111"; endcase; endif; endif; endif; endprocess; p3:process(clear,clk1,shownum(0),dir)--控制模塊 variableratr1,ratc1:integerrange0to7; begin ifclear='1'then--復(fù)位 snaker<=(3,2,1,0); snakec<=(1,1,1,1); direction<=0; over<='0'; shownum(3)<=0; shownum(2)<=0; shownum(1)<=5; shownum(0)<=9; setrat<='1'; else ifclk1'eventandclk1='1'then ifrattime=4thenrattime<=0;--老鼠出現(xiàn)時(shí)間 elserattime<=rattime+1; endif; ifshownum(0)=0then--剩余時(shí)間 shownum(0)<=9; shownum(1)<=shownum(1)-1; else shownum(0)<=shownum(0)-1; endif; foriin0to2loop--thesnakemoves--蛇的步進(jìn) snaker(i)<=snaker(i+1); snakec(i)<=snakec(i+1); endloop; casediris when"00"=>ifsnaker(3)=7then--向上出界游戲結(jié)束 over<='1'; elsifdirection/=1then--蛇頭向上步進(jìn)(蛇頭方向不和輸入值相反時(shí)) snaker(3)<=snaker(3)+1; snakec(3)<=snakec(3); direction<=0; else ifsnaker(3)=0then--蛇頭方向和輸入值相反,若蛇頭向下出界,游戲結(jié)束 over<='1'; else snaker(3)<=snaker(3)-1;--蛇頭向下未出界,向下步進(jìn) snakec(3)<=snakec(3); endif; endif; when"01"=>ifsnaker(3)=0then--若蛇頭向下出界,游戲結(jié)束 over<='1'; elsifdirection/=0then--蛇頭方向不和輸入值相反,向下步進(jìn) snaker(3)<=snaker(3)-1; snakec(3)<=snakec(3); direction<=1; elsifsnaker(3)=7then--蛇頭方向和輸入值相反,若蛇頭向上出界游戲結(jié)束 over<='1'; else snaker(3)<=snaker(3)+1;--蛇頭向上未出界,向上步進(jìn) snakec(3)<=snakec(3); endif; when"10"=>ifsnakec(3)=0then--左 over<='1'; elsifdirection/=3then snakec(3)<=snakec(3)-1; snaker(3)<=snaker(3); direction<=2; elsifsnakec(3)=7then over<='1'; else snakec(3)<=snakec(3)+1; snaker(3)<=snaker(3); endif; when"11"=>ifsnakec(3)=7then--右 over<='1'; elsifdirection/=2then snakec(3)<=snakec(3)+1; snaker(3)<=snaker(3); direction<=3; elsifsnakec(3)=0then over<='1'; else snakec(3)<=snakec(3)-1; snaker(3)<=snaker(3); endif; endcase; ifsetrat='1'then--重設(shè)老鼠位置 ratr1:=rat; ratc1:=rat+2; foriin0to3loop ifratr1=wallr(i)andratc1=wallc(i)then ratr1:=ratr1+1; ratc1:=ratc1+1; exit; endif; endloop; ratr<=ratr1; ratc<=ratc1; rattime<=0; setrat<='0'; endif;if(shownum(1)=0andshownum(0)=0)then--游戲時(shí)間到 over<='1';else ifrattime=4thensetrat<='1';--重設(shè)老鼠位置 endif; ifsnaker(3)=ratrandsnakec(3)=ratcthen--吃到老鼠 setrat<='1'; ifshownum(2)=9then--加一分 shownum(2)<=0; shownum(3)<=shownum(3)+1; else shownum(2)<=shownum(2)+1; endif; else foriin0to3loop ifsnaker(3)=wallr(i)andsnakec(3)=wallc(i)then--蛇撞墻 over<='1'; exit; endif; endloop;endif;endif; endif; endif; endprocess; p4:process(clear,clk2)--在數(shù)碼管上顯示得分和剩余時(shí)間 variablestate:integerrange0to3:=0; begin ifclear='1'thencat<="111111"; elsifclk2'eventandclk2='1'then state:=state+1; casestateis when3=>cat<="011111"; when2=>cat<="101111"; when1=>cat<="111101"; when0=>cat<="111110"; endcase; caseshownum(state)is when0=>seven<="1111110"; when1=>seven<="0110000"; when2=>seven<="1101101"; when3=>seven<="1111001"; when4=>seven<="0110011"; when5=>seven<="1011011"; when6=>seven<="1011111"; when7=>seven<="1110000"; when8=>seven<="1111111"; when9=>seven<="1111011"; whenothers=>seven<="0000000"; endcase; endif; endprocess; p5:process(clk1,t)--M序列發(fā)生器beginift="000"thent<="001";elsifclk1'eventandclk1='1'thent(0)<=t(0)xort(2);t(1)<=t(0);t(2)<=t(1);endif;casetiswhen"000"=>rat<=0;when"001"=>rat<=1;when"010"=>rat<=2;when"011"=>rat<=3;when"100"=>rat<=4;when"101"=>rat<=5;when"110"=>rat<=6;when
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職設(shè)施農(nóng)業(yè)工程技術(shù)(設(shè)施設(shè)計(jì)與建造)試題及答案
- 2025年高職(財(cái)務(wù)會(huì)計(jì))固定資產(chǎn)核算階段測(cè)試試題及答案
- 2026年職業(yè)興趣綜合測(cè)試(興趣適配性評(píng)估)試題及答案
- 2025年中職社會(huì)保障事務(wù)(社保辦理流程)試題及答案
- 2025 小學(xué)二年級(jí)科學(xué)下冊(cè)學(xué)習(xí)養(yǎng)護(hù)多肉植物技巧課件
- 廣告學(xué)專業(yè)就業(yè)趨勢(shì)
- 政法暨安全生產(chǎn)講解
- 2025河南洛陽(yáng)市汝陽(yáng)縣審計(jì)局輔助性崗位招聘勞務(wù)派遣人員4人備考題庫(kù)及參考答案詳解
- 江西省宜春市高安市第九中學(xué)2025-2026學(xué)年上學(xué)期11月期中考七年級(jí)數(shù)學(xué)試題(含答案)
- 河南省濮陽(yáng)市范縣2024屆高三下學(xué)期模擬測(cè)試(五)歷史試題(含答案)
- 城市軌道交通聯(lián)絡(luò)通道凍結(jié)法技術(shù)規(guī)范
- 2025-2030阿爾法地中海貧血治療行業(yè)市場(chǎng)現(xiàn)狀供需分析及重點(diǎn)企業(yè)投資評(píng)估規(guī)劃分析研究報(bào)告
- 智能建筑設(shè)計(jì)與綠色建筑技術(shù)應(yīng)用方案
- 工作計(jì)劃考核管理辦法
- 語(yǔ)義地圖構(gòu)建方法-深度研究
- 五年級(jí)下冊(cè)語(yǔ)文寒假預(yù)習(xí)古詩(shī)、古文、日積月累背誦單
- DB33 642-2019 熱電聯(lián)產(chǎn)能效、能耗限額及計(jì)算方法
- GB/T 4074.7-2024繞組線試驗(yàn)方法第7部分:測(cè)定漆包繞組線溫度指數(shù)的試驗(yàn)方法
- 海參供貨合同范例
- DB41T 1448-2017 濕式堆存尾礦庫(kù)安全技術(shù)規(guī)程
- GB/T 22081-2024網(wǎng)絡(luò)安全技術(shù)信息安全控制
評(píng)論
0/150
提交評(píng)論