單片機(jī)課程設(shè)計(jì)報(bào)告-俄羅斯方塊_第1頁(yè)
已閱讀1頁(yè),還剩48頁(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)介

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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論