

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 《單片機(jī)原理及應(yīng)用》課程設(shè)計(jì)報(bào)告</p><p> 基于MCS-51單片機(jī)的俄羅斯方塊游戲設(shè)計(jì)</p><p><b> 目錄</b></p><p> 一、課程設(shè)計(jì)的目的4</p><p><b> 二、題目要求4</b></p><p>
2、<b> 三、原理概述4</b></p><p><b> 四、調(diào)試過(guò)程4</b></p><p><b> 五、驗(yàn)收結(jié)果4</b></p><p><b> 六、個(gè)人體會(huì)10</b></p><p><b> 七、參考文獻(xiàn)1
3、0</b></p><p><b> 八、致謝10</b></p><p> 附錄一:外電路原理圖11</p><p> 附錄二:程序清單12</p><p><b> 一、課程設(shè)計(jì)的目的</b></p><p> 加深對(duì)單片機(jī)的理解,熟悉單片機(jī)的
4、原理,掌握單片機(jī)的編程方法與技巧</p><p> 靈活運(yùn)用單片機(jī)的基礎(chǔ)知識(shí),增強(qiáng)利用理論知識(shí)解決實(shí)際問(wèn)題的能力</p><p><b> 二、題目要求</b></p><p> 1.驗(yàn)收時(shí),先在仿真機(jī)的LED上顯示自己學(xué)號(hào)的后6位,再進(jìn)行相應(yīng)內(nèi)容驗(yàn)收。</p><p> 2.能在單片機(jī)實(shí)驗(yàn)箱通用板上的液晶顯示屏
5、(LCD)上玩俄羅斯方塊游戲,使用4*4鍵盤(pán)輸入,能夠完美實(shí)現(xiàn)俄羅斯方塊的基本游戲內(nèi)容,界面優(yōu)美,最后可以顯示分?jǐn)?shù)和級(jí)別,如果游戲失敗顯示“GAME OVER”,最后顯示本人姓名“YANG XIN”和學(xué)號(hào)“200911880”。</p><p><b> 原理概述</b></p><p><b> 1. 程序整體思路</b></p>
6、;<p> 單片機(jī)上的程序設(shè)計(jì)一般是一個(gè)大循環(huán)結(jié)構(gòu),對(duì)于俄羅斯方塊的程序設(shè)計(jì),首先產(chǎn)生一個(gè)偽隨機(jī)數(shù),其范圍是0-6,分別對(duì)應(yīng)俄羅斯方塊中隨機(jī)產(chǎn)生的七種方塊,然后程序根據(jù)此數(shù)值所對(duì)應(yīng)的圖形模塊裝入RAM的固定區(qū)域內(nèi),緊接著將此圖像寫(xiě)入LCD所對(duì)應(yīng)的顯示緩沖區(qū)中,顯示程序?qū)⒕彌_區(qū)內(nèi)的內(nèi)容顯示在顯示屏上,如果沒(méi)有控制鍵按下,圖形將自動(dòng)向下移動(dòng)。如果有鍵按下,程序?qū)⒏鶕?jù)按下的鍵來(lái)改變圖形存儲(chǔ)區(qū)的值,同時(shí)程序?qū)⑴袛鄨D形是否已到達(dá)邊
7、界,當(dāng)圖形最上層到達(dá)顯示區(qū)頂部,則游戲結(jié)束,此時(shí)將清除顯示緩沖的內(nèi)容,游戲重新開(kāi)始。</p><p><b> 2.圖形顯示</b></p><p> QH12864T液晶顯示器一共有128*64個(gè)像素點(diǎn),本程序中每個(gè)像素點(diǎn)用一個(gè)坐標(biāo)表示,左上角為(0,0),右下角為(128,64)。對(duì)于顯示類的基本操作是任意點(diǎn)亮一個(gè)點(diǎn),熄滅一個(gè)點(diǎn),任意點(diǎn)亮n個(gè)點(diǎn),滅掉n個(gè)點(diǎn),如
8、此一來(lái)游戲的第一個(gè)關(guān)鍵點(diǎn)就完成了。</p><p> 我們將RAM中選取一段為顯示緩沖區(qū),這里面的每一位對(duì)應(yīng)LCD上的的一個(gè)點(diǎn),LCD將實(shí)時(shí)顯示緩沖區(qū)的內(nèi)容,也就是當(dāng)此緩沖區(qū)內(nèi)容一改變,LCD上看到的也會(huì)做出相應(yīng)的改變。同時(shí)游戲中的那些方塊被存放在一個(gè)類似于一維的數(shù)組之中,每一個(gè)方塊對(duì)應(yīng)四個(gè)小方塊,根據(jù)偽隨機(jī)數(shù)將這四個(gè)小方塊對(duì)應(yīng)的值裝入RAM固定的區(qū)域內(nèi)。如果要顯示方塊只需將這些方塊所對(duì)應(yīng)的點(diǎn)寫(xiě)入緩沖區(qū)就可以了
9、。</p><p><b> 3.消層算法</b></p><p> 設(shè)置循環(huán)變量數(shù)R2=128,即總共要掃描128次,每一次循環(huán)過(guò)程中檢測(cè)此行是否已滿,也就是檢測(cè)這一行所對(duì)應(yīng)的存儲(chǔ)單元是否全為1,如果全為1則將此行消去,即將此行對(duì)應(yīng)的RAM清零。同時(shí)將此行上面RAM的內(nèi)容按每列依次下移,下移完之后重新令R2=0,又從第一行開(kāi)始檢測(cè)。此行不全為零時(shí)只需令R2=R2
10、+1,直到R2=128消層過(guò)程結(jié)束。</p><p><b> 4.旋轉(zhuǎn)算法</b></p><p> 首先要確定一個(gè)旋轉(zhuǎn)中心,假如旋轉(zhuǎn)中心的編號(hào)是n,將n除以64,商是m存入R1余數(shù)是l存入R2,及時(shí)用商和余數(shù)建立坐標(biāo)系。此時(shí)若以此為旋轉(zhuǎn)中心的圖形需要旋轉(zhuǎn),則將每一個(gè)小方塊對(duì)應(yīng)編號(hào)除以64,商減去R1,余數(shù)減去R2,而每一個(gè)方塊一次將旋轉(zhuǎn)90度,所以有公式x1,
11、y1,x2,y2 , x2= - y1,y2= x1,其中x1,y1為旋轉(zhuǎn)之前的坐標(biāo),x2,y2為旋轉(zhuǎn)之后的坐標(biāo)。旋轉(zhuǎn)完之后將x2加上R1將y2加上R2,然后將x2乘以64再加上y2。執(zhí)行四次,此過(guò)程旋轉(zhuǎn)結(jié)束。</p><p><b> 調(diào)試過(guò)程</b></p><p> 1、學(xué)號(hào)顯示部分單獨(dú)調(diào)試</p><p> 這個(gè)在之前的很多實(shí)驗(yàn)
12、中都有涉及,程序較為簡(jiǎn)單,語(yǔ)句也不復(fù)雜,本實(shí)驗(yàn)中才用的是并行動(dòng)態(tài)顯示,調(diào)試一次成功。</p><p><b> 游戲程序調(diào)試相關(guān)</b></p><p><b> 驗(yàn)收結(jié)果</b></p><p> 下圖為當(dāng)時(shí)的整個(gè)實(shí)驗(yàn)裝置:</p><p> 實(shí)驗(yàn)中,游戲隨機(jī)產(chǎn)生方塊</p>
13、<p> 按下控制鍵,方塊旋轉(zhuǎn):</p><p> 按下控制鍵,方塊加速下落</p><p> 方塊下落到底部,最底層被填滿:</p><p> 最底層填滿后,自動(dòng)消去這一層:</p><p> 隨機(jī)產(chǎn)生下一個(gè)方塊,每次產(chǎn)生方塊完全隨機(jī):</p><p> 最后一幅圖為游戲結(jié)束后,顯示所得分?jǐn)?shù),
14、每消去一行得到一分,顯示“GAME OVER”和游戲者姓名學(xué)號(hào)。</p><p> 本次實(shí)驗(yàn)?zāi)J(rèn)游戲者為本人YANG XIN(楊欣),學(xué)號(hào)(U)200911880</p><p><b> 六、個(gè)人體會(huì)</b></p><p> 在這次實(shí)驗(yàn)過(guò)程中,特別是調(diào)試的時(shí)候,如果能夠順利排除BUG實(shí)現(xiàn)程序預(yù)定功能是最讓人開(kāi)心的,這個(gè)過(guò)程也會(huì)讓我很
15、享受。但是如果由于一些搞不清楚的原因遲遲達(dá)不到目標(biāo),也是最讓人煩躁的。而其中的問(wèn)題,只能漫無(wú)目的地去嘗試,無(wú)法在邏輯中得到答案,我個(gè)人遇到了這種狀況,確實(shí)很無(wú)奈。不知道是否是因?yàn)槲业姆治霾坏轿唬鴮?shí)際上有一個(gè)合乎邏輯的答案在那里呢?</p><p> 這次課程設(shè)計(jì),第一周主要是在修改程序的驅(qū)動(dòng)部分,從第二周開(kāi)始上機(jī)調(diào)試,用了差不多半個(gè)月的時(shí)間,最終也沒(méi)有成功調(diào)試出結(jié)果,實(shí)在很受打擊,讓我很沮喪。從單片機(jī)課程到單
16、片機(jī)實(shí)驗(yàn)到如今的單片機(jī)課程設(shè)計(jì),我感觸最深的一點(diǎn)就是:必須有耐心、足夠細(xì)心。單片機(jī)程序前前后后有不少聯(lián)系,可能前面用的某個(gè)變量跟后面重復(fù)、字與字節(jié)搞亂等等細(xì)小的問(wèn)題,如果不能耐心、細(xì)心地去尋找,很難發(fā)現(xiàn)。</p><p> 最后,我還體會(huì)到了,硬件學(xué)習(xí)是編寫(xiě)程序前最重要的部分,只有對(duì)所使用的硬件設(shè)備完全了解才能編寫(xiě)出適合使用的程序,否則會(huì)做很多無(wú)用功,浪費(fèi)很多時(shí)間和精力。以后一定要謹(jǐn)記這個(gè)道理!</p&g
17、t;<p><b> 七、主要參考文獻(xiàn)</b></p><p> 【1】《單片機(jī)原理及應(yīng)用》 姜志海主編</p><p> 【2】《MCS-51系列單片機(jī)原理及應(yīng)用實(shí)驗(yàn)指導(dǎo)書(shū)》 </p><p><b> 八、致謝</b></p><p> 感謝黃勁老師的耐心指導(dǎo)!<
18、;/p><p> 感謝管理實(shí)驗(yàn)室的老師多日來(lái)為我們開(kāi)放實(shí)驗(yàn)室!</p><p><b> 附錄一:電路原理圖</b></p><p><b> 按鍵與單片機(jī)連接:</b></p><p> 按照4*4鍵盤(pán)上的布置,游戲控制鍵分別為:Move_Left 8 ,Move_Right A,A
19、dd_Speed 9,Change_Shape D,Game_Star C,Game_Pause E</p><p> 液晶顯示器與單片機(jī)的連接:</p><p><b> 附錄二:程序清單:</b></p><p> ?。ㄒ虺绦蚍倍?,此處只列出.C文件程序,如果老師要看完成程序,請(qǐng)看電子檔報(bào)告)</p>&l
20、t;p><b> STARPUP.C</b></p><p><b> $NOMOD51</b></p><p> ;------------------------------------------------------------------------------</p><p> ; This
21、file is part of the C51 Compiler package</p><p> ; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.</p><p> ; Version 8.01</p><p><b> ;</b></
22、p><p> ; *** <<< Use Configuration Wizard in Context Menu >>> ***</p><p> ;------------------------------------------------------------------------------</p><p>
23、; STARTUP.A51: This code is executed after processor reset.</p><p><b> ;</b></p><p> ; To translate this file use A51 with the following invocation:</p><p><b>
24、; ;</b></p><p> ; A51 STARTUP.A51</p><p><b> ;</b></p><p> ; To link the modified STARTUP.OBJ file to your application use the following</p><p&
25、gt; ; Lx51 invocation:</p><p><b> ;</b></p><p> ; Lx51 your object file list, STARTUP.OBJ controls</p><p><b> ;</b></p><p> ;--------
26、----------------------------------------------------------------------</p><p><b> ;</b></p><p> ; User-defined <h> Power-On Initialization of Memory</p><p><
27、b> ;</b></p><p> ; With the following EQU statements the initialization of memory</p><p> ; at processor reset can be defined:</p><p><b> ;</b></p>
28、<p> ; <o> IDATALEN: IDATA memory size <0x0-0x100></p><p> ; <i> Note: The absolute start-address of IDATA memory is always 0</p><p> ; <i> The ID
29、ATA space overlaps physically the DATA and BIT areas.</p><p> IDATALEN EQU 80H</p><p><b> ;</b></p><p> ; <o> XDATASTART: XDATA memory start address
30、<0x0-0xFFFF> </p><p> ; <i> The absolute start address of XDATA memory</p><p> XDATASTART EQU 0 </p><p><b> ;</b></p><p> ;
31、 <o> XDATALEN: XDATA memory size <0x0-0xFFFF> </p><p> ; <i> The length of XDATA memory in bytes.</p><p> XDATALEN EQU 0 </p><p><b> ;
32、</b></p><p> ; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> </p><p> ; <i> The absolute start address of PDATA memory</p><p> PDATASTART
33、 EQU 0H</p><p><b> ;</b></p><p> ; <o> PDATALEN: PDATA memory size <0x0-0xFF> </p><p> ; <i> The length of PDATA memory in bytes.</p>
34、;<p> PDATALEN EQU 0H</p><p><b> ;</b></p><p><b> ;</h></b></p><p> ;------------------------------------------------------------
35、------------------</p><p><b> ;</b></p><p> ;<h> Reentrant Stack Initialization</p><p><b> ;</b></p><p> ; The following EQU statemen
36、ts define the stack pointer for reentrant</p><p> ; functions and initialized it:</p><p><b> ;</b></p><p> ; <h> Stack Space for reentrant functions in the SMA
37、LL model.</p><p> ; <q> IBPSTACK: Enable SMALL model reentrant stack</p><p> ; <i> Stack space for reentrant functions in the SMALL model.</p><p> IBPSTACK
38、 EQU 0 ; set to 1 if small reentrant is used.</p><p> ; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF></p><p> ; <i> Set the top of the stack to
39、 the highest location.</p><p> IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 </p><p><b> ; </h></b></p><p><b> ;</b></p><p> ;
40、 <h> Stack Space for reentrant functions in the LARGE model. </p><p> ; <q> XBPSTACK: Enable LARGE model reentrant stack</p><p> ; <i> Stack space for reentrant fun
41、ctions in the LARGE model.</p><p> XBPSTACK EQU 0 ; set to 1 if large reentrant is used.</p><p> ; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>&
42、lt;/p><p> ; <i> Set the top of the stack to the highest location.</p><p> XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1 </p><p><b> ; </h></b>&
43、lt;/p><p><b> ;</b></p><p> ; <h> Stack Space for reentrant functions in the COMPACT model. </p><p> ; <q> PBPSTACK: Enable COMPACT model reentrant stack
44、</p><p> ; <i> Stack space for reentrant functions in the COMPACT model.</p><p> PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.</p><p><b>
45、; ;</b></p><p> ; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF></p><p> ; <i> Set the top of the stack to the highest location.</p><
46、;p> PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 </p><p><b> ; </h></b></p><p><b> ;</h></b></p><p> ;---------------------------
47、---------------------------------------------------</p><p><b> ;</b></p><p> ; Memory Page for Using the Compact Model with 64 KByte xdata RAM</p><p> ; <e>Co
48、mpact Model Page Definition</p><p><b> ;</b></p><p> ; <i>Define the XDATA page used for PDATA variables. </p><p> ; <i>PPAGE must conform with the PPAG
49、E set in the linker invocation.</p><p><b> ;</b></p><p> ; Enable pdata memory page initalization</p><p> PPAGEENABLE EQU 0 ; set to 1 if pdata object a
50、re used.</p><p><b> ;</b></p><p> ; <o> PPAGE number <0x0-0xFF> </p><p> ; <i> uppermost 256-byte address of the page used for PDATA variables.</
51、p><p> PPAGE EQU 0</p><p><b> ;</b></p><p> ; <o> SFR address which supplies uppermost address byte <0x0-0xFF> </p><p> ; <i&g
52、t; most 8051 variants use P2 as uppermost address byte</p><p> PPAGE_SFR DATA 0A0H</p><p><b> ;</b></p><p><b> ; </e></b></p><p&
53、gt; ;------------------------------------------------------------------------------</p><p> ; Standard SFR Symbols </p><p> ACC DATA 0E0H</p><p> B DATA 0F0H<
54、/p><p> SP DATA 81H</p><p> DPL DATA 82H</p><p> DPH DATA 83H</p><p> NAME ?C_STARTUP</p><p> ?C_C51STARTUP SEGMENT CODE<
55、/p><p> ?STACK SEGMENT IDATA</p><p> RSEG ?STACK</p><p><b> DS 1</b></p><p> EXTRN CODE (?C_START)</p><p> PUBLIC ?C_STAR
56、TUP</p><p> CSEG AT 0</p><p> ?C_STARTUP: LJMP STARTUP1</p><p> RSEG ?C_C51STARTUP</p><p><b> STARTUP1:</b></p><p> IF I
57、DATALEN <> 0</p><p> MOV R0,#IDATALEN - 1</p><p><b> CLR A</b></p><p> IDATALOOP: MOV @R0,A</p><p> DJNZ R0,IDATALOOP</p>
58、;<p><b> ENDIF</b></p><p> IF XDATALEN <> 0</p><p> MOV DPTR,#XDATASTART</p><p> MOV R7,#LOW (XDATALEN)</p><p> IF (LOW (XDATALEN)
59、) <> 0</p><p> MOV R6,#(HIGH (XDATALEN)) +1</p><p><b> ELSE</b></p><p> MOV R6,#HIGH (XDATALEN)</p><p><b> ENDIF</b></p>
60、<p><b> CLR A</b></p><p> XDATALOOP: MOVX @DPTR,A</p><p> INC DPTR</p><p> DJNZ R7,XDATALOOP</p><p> DJNZ R6,XDATALOOP<
61、/p><p><b> ENDIF</b></p><p> IF PPAGEENABLE <> 0</p><p> MOV PPAGE_SFR,#PPAGE</p><p><b> ENDIF</b></p><p> IF PDATALEN
62、<> 0</p><p> MOV R0,#LOW (PDATASTART)</p><p> MOV R7,#LOW (PDATALEN)</p><p><b> CLR A</b></p><p> PDATALOOP: MOVX @R0,A</p&
63、gt;<p> INC R0</p><p> DJNZ R7,PDATALOOP</p><p><b> ENDIF</b></p><p> IF IBPSTACK <> 0</p><p> EXTRN DATA (?C_IBP)</p><p
64、> MOV ?C_IBP,#LOW IBPSTACKTOP</p><p><b> ENDIF</b></p><p> IF XBPSTACK <> 0</p><p> EXTRN DATA (?C_XBP)</p><p> MOV ?C_XBP,#HIGH XBPST
65、ACKTOP</p><p> MOV ?C_XBP+1,#LOW XBPSTACKTOP</p><p><b> ENDIF</b></p><p> IF PBPSTACK <> 0</p><p> EXTRN DATA (?C_PBP)</p><p> M
66、OV ?C_PBP,#LOW PBPSTACKTOP</p><p><b> ENDIF</b></p><p> MOV SP,#?STACK-1</p><p> ; This code is required if you use L51_BANK.A51 with Banking Mode 4</p>
67、<p> ;<h> Code Banking</p><p> ; <q> Select Bank 0 for L51_BANK.A51 Mode 4</p><p><b> #if 0 </b></p><p> ; <i> Initialize bank mechani
68、sm to code bank 0 when using L51_BANK.A51 with Banking Mode 4.</p><p> EXTRN CODE (?B_SWITCH0)</p><p> CALL ?B_SWITCH0 ; init bank mechanism to code bank 0</p><p><b>
69、; #endif</b></p><p><b> ;</h></b></p><p> LJMP ?C_START</p><p><b> END</b></p><p> Fangkuai.c</p><p> #include
70、 "t6963c.h"</p><p> #include "typedef.h"</p><p> #include "key.h"</p><p> #define X_START 5</p><p> #define Y_START 0</p><p
71、> #define MIN_SLOW_SPEED 300</p><p> #define BX_START 30</p><p> #define BY_START 15</p><p> #define Nothing 100</p><p><b> //全局?jǐn)?shù)據(jù)</b></p>
72、;<p> code uchar Game_Char[]={0x27,0x41,0x4d,0x45};</p><p> code uchar Over_Char[]={0x2f,0x56,0x45,0x52};</p><p> static uchar xx,yy; //方塊的位置</p><p> static uint
73、 Game_Score=0;</p><p> static uchar xdata Platform[14][21]; //游戲平臺(tái)數(shù)據(jù)</p><p> static uchar This_shape;//當(dāng)前形狀</p><p> static uchar Next_shape=0;</p><p> static
74、 uint Game_Speed=MIN_SLOW_SPEED; //等級(jí)速度,正常情況,方塊下降的速度</p><p> static uchar Game_Stop=1;</p><p> static uchar Game_Level=0;</p><p> //////////////////////////////////////////////
75、///////////////////////////////////</p><p> /////////////////////////////////////////////////////////////////////////////////</p><p> /////////方塊形狀的定義//////////////////////////////////////////
76、////////////////</p><p> /////////////////////////////////////////////////////////////////////////////////</p><p> struct POINT{</p><p><b> uchar x;</b></p>&l
77、t;p><b> uchar y;</b></p><p><b> };</b></p><p> struct SHAPE{</p><p> struct POINT point[4];</p><p> uchar next;//下一個(gè)形狀</p><p
78、><b> } </b></p><p> xdata shape[19]={ </p><p> { 1,0,0,1,1,1,2,1,1 },</p><p> { 1,0,1,1,2,1,1,2,2 },</p><p> { 0,0,1,0,2,0,1,1,3 },</p>&l
79、t;p> { 1,0,0,1,1,1,1,2,0 },</p><p> { 1,0,2,0,1,1,1,2,5 },</p><p> { 0,0,1,0,2,0,2,1,6 },</p><p> { 2,0,2,1,2,2,1,2,7 },</p><p> { 0,0,0,1,1,1,2,1,4 },<
80、/p><p> { 1,0,2,0,2,1,2,2,9 },</p><p> { 2,0,0,1,1,1,2,1,10 },</p><p> { 1,0,1,1,1,2,2,2,11 },</p><p> { 0,0,1,0,2,0,0,1,8 },</p><p> { 0,0,0,1,1,1,1,2
81、,13 },</p><p> { 1,0,2,0,0,1,1,1,12 },</p><p> { 2,0,1,1,2,1,1,2,15 },</p><p> { 0,0,1,0,1,1,2,1,14 },</p><p> { 1,0,1,1,1,2,1,3,17 },</p><p> { 0,1,1
82、,1,2,1,3,1,16 },</p><p> { 1,0,2,0,1,1,2,1,18 }, </p><p><b> }; </b></p><p> ////////////////////////////////////////////////////////////////////////////</p>
83、<p> //**************************************************************************</p><p> //= 函數(shù)原型:void Init_GamePlatform()</p><p> //= 功 能: 初始化游戲平臺(tái)</p><p> //= 參 數(shù)
84、: 無(wú)</p><p> //= 返 回 值: 無(wú)</p><p> //= 函數(shù)性質(zhì):公有函數(shù)</p><p> //= 注 意:</p><p> //*************************************************************************** </p&g
85、t;<p> void Show_score(uchar);</p><p> void Init_GamePlatform()</p><p><b> {</b></p><p><b> uchar i;</b></p><p><b> uchar j;&l
86、t;/b></p><p> // uchar N_Hanzi;</p><p> Wr_line(1,33,13,64,1 );//初始化游戲平臺(tái)邊界畫(huà)游戲區(qū)域</p><p> Wr_line(1,33,14,64,1 ); //畫(huà)上橫線</p><p> Wr_line(0,33,15,100,1);</p
87、><p> Wr_line(0,34,15,100,1); //畫(huà)左豎線</p><p> Wr_line(1,33,115,64,1); </p><p> Wr_line(1,33,116,64,1); //畫(huà)下橫線</p><p> Wr_line(0,95,15,100,1);</p><p> W
88、r_line(0,96,15,100,1); //畫(huà)右豎線</p><p> //--------------------------------------------------------</p><p> for(i=1;i<13;i++)//游戲平臺(tái)數(shù)據(jù)清零</p><p><b> {</b></p>
89、<p> for(j=0;j<20;j++)</p><p><b> {</b></p><p> Platform[i][j]=0;</p><p><b> }</b></p><p><b> }</b></p><p&g
90、t; for(i=1;i<13;i++)</p><p><b> {</b></p><p> Platform[i][20]=1; //游戲平臺(tái)最下面一行的每一個(gè)方塊位置為1,作為下邊界</p><p><b> }</b></p><p> for(j=0;j<20;
91、j++)//游戲平臺(tái)左右方塊位置置1,作為左右邊界</p><p><b> {</b></p><p> Platform[0][j]=1;</p><p> Platform[13][j]=1;</p><p><b> }</b></p><p> //-
92、-------------------------------------------------------- </p><p> hanzhi(13,3,6,1); //輸入“分”漢字</p><p> hanzhi(13,8,8,1); //輸入“級(jí)”漢字</p><p> Show_score(0); //顯示初始分?jǐn)?shù)</p&
93、gt;<p> Show_num(13,11,Game_Level); //顯示初始等級(jí)水平</p><p> Game_Speed=MIN_SLOW_SPEED/(Game_Level+1); //根據(jù)水平確定速度</p><p> //----------------------------------------------------------------
94、--</p><p> Game_Score=0;</p><p> xx=X_START ;</p><p> yy=Y_START ;</p><p><b> }</b></p><p> ////////////////////////Init_Game/////////////
95、////////</p><p> void Init_Game()</p><p><b> {</b></p><p> Game_Stop=1;</p><p> Init_GamePlatform();</p><p> hanzhi(7,3,9,1); //輸入“按”漢字&l
96、t;/p><p> Show_num(7,6,7); //顯示7</p><p> hanzhi(7,8,10,1); //輸入“開(kāi)”漢字</p><p> hanzhi(7,10,11,1); //輸入“始”漢字</p><p><b> }</b></p><p> //*****
97、*********************************************************************</p><p> //= 函數(shù)原型:void XiaoFengKuai(uchar x,uchar y,uchar mode)</p><p> //= 功 能: 顯示一個(gè)小方塊</p><p> //= 參
98、數(shù): 小方塊的橫x,堅(jiān)坐標(biāo)y,mode=1:顯示小方塊,mode=0:刪除小方塊</p><p> //= 返 回 值:</p><p> //= 函數(shù)性質(zhì):私有函數(shù)</p><p> //= 注 意:</p><p> //*************************************************
99、************************** </p><p> void XiaoFengKuai(uchar x,uchar y,bit mode)</p><p><b> {</b></p><p> uchar x1=5*x+BX_START;//將方塊在平臺(tái)的位置轉(zhuǎn)化成LCD的點(diǎn)坐標(biāo)(地址轉(zhuǎn)換)</p>
100、<p> uchar y1=5*y+BY_START; </p><p><b> uchar i;</b></p><p> if(mode==1)</p><p><b> {</b></p><p> for(i=0;i<5;i++)</p>&l
101、t;p><b> {</b></p><p> Point(x1+i,y1,1); //畫(huà)一條橫線</p><p><b> }</b></p><p><b> y1+=4;</b></p><p> for(i=0;i<5;i++)</p>
102、<p><b> {</b></p><p> Point(x1+i,y1,1); //畫(huà)第二條橫線</p><p><b> }</b></p><p> for(i=0;i<5;i++)</p><p><b> {</b></p>
103、<p> Point(x1,y1-i,1); //畫(huà)第1條堅(jiān)線</p><p><b> }</b></p><p><b> x1+=4;</b></p><p> for(i=0;i<5;i++)</p><p><b> {</b></
104、p><p> Point(x1,y1-i,1); //畫(huà)第2條堅(jiān)線</p><p><b> }</b></p><p><b> y1-=4;</b></p><p> for(i=0;i<5;i++)</p><p><b> {</b>
105、</p><p> Point(x1-i,y1+i,1); //畫(huà)斜線</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b&
106、gt;</p><p> for(i=0;i<5;i++)</p><p><b> {</b></p><p> Point(x1+i,y1,0); //畫(huà)一條橫線</p><p><b> }</b></p><p><b> y1+=4;<
107、;/b></p><p> for(i=0;i<5;i++)</p><p><b> {</b></p><p> Point(x1+i,y1,0); //畫(huà)第二條橫線</p><p><b> }</b></p><p> for(i=0;i<
108、5;i++)</p><p><b> {</b></p><p> Point(x1,y1-i,0); //畫(huà)第1條堅(jiān)線</p><p><b> }</b></p><p><b> x1+=4;</b></p><p> for(i=0;
109、i<5;i++)</p><p><b> {</b></p><p> Point(x1,y1-i,0); //畫(huà)第2條堅(jiān)線</p><p><b> }</b></p><p><b> y1-=4;</b></p><p> for
110、(i=0;i<5;i++)</p><p><b> {</b></p><p> Point(x1-i,y1+i,0); //畫(huà)斜線</p><p><b> }</b></p><p><b> }</b></p><p><b&
111、gt; }</b></p><p> //////////////////////////////////////////////////////////////////////////</p><p> ////////////////左沖突檢測(cè)//////////////////////////////////////////////</p><p
112、> bit Left_Anti()</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p>
113、 if(Platform[xx+shape[This_shape].point[i].x-1][yy+shape[This_shape].point[i].y]==1) </p><p><b> return 1;</b></p><p><b> }</b></p><p><b> return 0
114、;</b></p><p><b> } </b></p><p> ////////////////右沖突檢測(cè)///////////////////////////////////////////</p><p> bit Right_Anti()</p><p><b> {<
115、;/b></p><p><b> uchar i;</b></p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> if(Platform[xx+shape[This_shape].point[i].x+1][yy+shape
116、[This_shape].point[i].y]==1)</p><p><b> return 1;</b></p><p><b> } </b></p><p><b> return 0;</b></p><p><b> }</b&g
117、t;</p><p> ////////////////////////////////////////下沖突檢測(cè)//////////////////////////</p><p> bit Bottom_Anti()</p><p><b> {</b></p><p><b> uchar i;&
118、lt;/b></p><p> for(i=0;i<4;i++)</p><p><b> {</b></p><p> if(Platform[xx+shape[This_shape].point[i].x][yy+shape[This_shape].point[i].y+1]==1)</p><p>
119、;<b> return 1;</b></p><p><b> }</b></p><p> return 0; </p><p><b> }</b></p><p> //////////////////////////////////改變形狀時(shí)產(chǎn)生的沖
120、突檢測(cè)////////////////////</p><p> bit Change_Shape_Anti()</p><p><b> {</b></p><p><b> uchar i;</b></p><p> for(i=0;i<4;i++)</p><
121、p><b> {</b></p><p> if(Platform[xx+shape[shape[This_shape].next].point[i].x][yy+shape[shape[This_shape].next].point[i].y]==1)</p><p> return 1; //檢測(cè)一個(gè)形狀的沖突情況</p><
122、p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> //////////////////////////////////產(chǎn)生一個(gè)隨機(jī)數(shù),返回一個(gè)隨機(jī)數(shù)///////////////</p>
123、<p> uchar Random()</p><p><b> {</b></p><p> static uchar m;</p><p><b> m+=49;</b></p><p> return (m%19);</p><p><b>
124、; }</b></p><p> //////////////計(jì)分函數(shù),參數(shù)為 消行行數(shù)n///////////////////////////////////////</p><p> void Show_score(uchar n)</p><p><b> {</b></p><p> Gam
125、e_Score=Game_Score+10*n;</p><p> if(Game_Score<10)</p><p><b> {</b></p><p> Show_num(13,6,Game_Score%10);//顯示個(gè)位</p><p><b> }</b></p&
126、gt;<p> else if(Game_Score<100)</p><p><b> { </b></p><p> Show_num(14,6,Game_Score%10);</p><p> Show_num(13,6,Game_Score/10%100);//顯示個(gè)位,十位</p><
127、;p><b> }</b></p><p> else if(Game_Score<1000)</p><p><b> {</b></p><p> Show_num(14,6,Game_Score%10);</p><p> Show_num(13,6,Game_Score
128、/10%10);</p><p> Show_num(12,6,Game_Score/100%10);//顯示個(gè)位 ,十位,百位</p><p><b> }</b></p><p><b> else</b></p><p><b> { </b></p&g
129、t;<p> Show_num(15,6,Game_Score%10);</p><p> Show_num(14,6,Game_Score/10%10);</p><p> Show_num(13,6,Game_Score/100%10);//顯示個(gè)位 ,十位,百位,千位</p><p> Show_num(12,6,Game_Score/
130、1000);</p><p><b> }</b></p><p> if(Game_Score%1000==0)</p><p><b> {</b></p><p> if(Game_Score>0)</p><p><b> {</b&g
131、t;</p><p> Game_Level++;</p><p> if(Game_Level==10)</p><p><b> {</b></p><p> Game_Stop=1;</p><p> hanzhi(7,5,12,1); //輸出“太棒了"</p
132、><p> hanzhi(7,7,13,1); </p><p> hanzhi(7,9,14,1);</p><p><b> }</b></p><p> Show_num(13,11,Game_Level); //顯示水平</p><p><b> }</b>
133、</p><p><b> }</b></p><p><b> }</b></p><p> //**************************************************************************</p><p> //= 函數(shù)原型:voi
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 51單片機(jī)課程設(shè)計(jì)---俄羅斯方塊
- 俄羅斯方塊單片機(jī)課程設(shè)計(jì)作品說(shuō)明書(shū)
- 基于單片機(jī)的俄羅斯方塊游戲機(jī)課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 《c++俄羅斯方塊》課程設(shè)計(jì)--俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)---俄羅斯方塊
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 課程設(shè)計(jì)--俄羅斯方塊設(shè)計(jì)報(bào)告
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊課程設(shè)計(jì)
- 俄羅斯方塊編程課程設(shè)計(jì)報(bào)告
- 俄羅斯方塊游戲課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)報(bào)告-俄羅斯方塊
- c課程設(shè)計(jì)--俄羅斯方塊
- 簡(jiǎn)單俄羅斯方塊課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論