單片機課程設(shè)計報告-俄羅斯方塊_第1頁
已閱讀1頁,還剩48頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  《單片機原理及應(yīng)用》課程設(shè)計報告</p><p>  基于MCS-51單片機的俄羅斯方塊游戲設(shè)計</p><p><b>  目錄</b></p><p>  一、課程設(shè)計的目的4</p><p><b>  二、題目要求4</b></p><p>

2、<b>  三、原理概述4</b></p><p><b>  四、調(diào)試過程4</b></p><p><b>  五、驗收結(jié)果4</b></p><p><b>  六、個人體會10</b></p><p><b>  七、參考文獻1

3、0</b></p><p><b>  八、致謝10</b></p><p>  附錄一:外電路原理圖11</p><p>  附錄二:程序清單12</p><p><b>  一、課程設(shè)計的目的</b></p><p>  加深對單片機的理解,熟悉單片機的

4、原理,掌握單片機的編程方法與技巧</p><p>  靈活運用單片機的基礎(chǔ)知識,增強利用理論知識解決實際問題的能力</p><p><b>  二、題目要求</b></p><p>  1.驗收時,先在仿真機的LED上顯示自己學(xué)號的后6位,再進行相應(yīng)內(nèi)容驗收。</p><p>  2.能在單片機實驗箱通用板上的液晶顯示屏

5、(LCD)上玩俄羅斯方塊游戲,使用4*4鍵盤輸入,能夠完美實現(xiàn)俄羅斯方塊的基本游戲內(nèi)容,界面優(yōu)美,最后可以顯示分?jǐn)?shù)和級別,如果游戲失敗顯示“GAME OVER”,最后顯示本人姓名“YANG XIN”和學(xué)號“200911880”。</p><p><b>  原理概述</b></p><p><b>  1. 程序整體思路</b></p>

6、;<p>  單片機上的程序設(shè)計一般是一個大循環(huán)結(jié)構(gòu),對于俄羅斯方塊的程序設(shè)計,首先產(chǎn)生一個偽隨機數(shù),其范圍是0-6,分別對應(yīng)俄羅斯方塊中隨機產(chǎn)生的七種方塊,然后程序根據(jù)此數(shù)值所對應(yīng)的圖形模塊裝入RAM的固定區(qū)域內(nèi),緊接著將此圖像寫入LCD所對應(yīng)的顯示緩沖區(qū)中,顯示程序?qū)⒕彌_區(qū)內(nèi)的內(nèi)容顯示在顯示屏上,如果沒有控制鍵按下,圖形將自動向下移動。如果有鍵按下,程序?qū)⒏鶕?jù)按下的鍵來改變圖形存儲區(qū)的值,同時程序?qū)⑴袛鄨D形是否已到達邊

7、界,當(dāng)圖形最上層到達顯示區(qū)頂部,則游戲結(jié)束,此時將清除顯示緩沖的內(nèi)容,游戲重新開始。</p><p><b>  2.圖形顯示</b></p><p>  QH12864T液晶顯示器一共有128*64個像素點,本程序中每個像素點用一個坐標(biāo)表示,左上角為(0,0),右下角為(128,64)。對于顯示類的基本操作是任意點亮一個點,熄滅一個點,任意點亮n個點,滅掉n個點,如

8、此一來游戲的第一個關(guān)鍵點就完成了。</p><p>  我們將RAM中選取一段為顯示緩沖區(qū),這里面的每一位對應(yīng)LCD上的的一個點,LCD將實時顯示緩沖區(qū)的內(nèi)容,也就是當(dāng)此緩沖區(qū)內(nèi)容一改變,LCD上看到的也會做出相應(yīng)的改變。同時游戲中的那些方塊被存放在一個類似于一維的數(shù)組之中,每一個方塊對應(yīng)四個小方塊,根據(jù)偽隨機數(shù)將這四個小方塊對應(yīng)的值裝入RAM固定的區(qū)域內(nèi)。如果要顯示方塊只需將這些方塊所對應(yīng)的點寫入緩沖區(qū)就可以了

9、。</p><p><b>  3.消層算法</b></p><p>  設(shè)置循環(huán)變量數(shù)R2=128,即總共要掃描128次,每一次循環(huán)過程中檢測此行是否已滿,也就是檢測這一行所對應(yīng)的存儲單元是否全為1,如果全為1則將此行消去,即將此行對應(yīng)的RAM清零。同時將此行上面RAM的內(nèi)容按每列依次下移,下移完之后重新令R2=0,又從第一行開始檢測。此行不全為零時只需令R2=R2

10、+1,直到R2=128消層過程結(jié)束。</p><p><b>  4.旋轉(zhuǎn)算法</b></p><p>  首先要確定一個旋轉(zhuǎn)中心,假如旋轉(zhuǎn)中心的編號是n,將n除以64,商是m存入R1余數(shù)是l存入R2,及時用商和余數(shù)建立坐標(biāo)系。此時若以此為旋轉(zhuǎn)中心的圖形需要旋轉(zhuǎn),則將每一個小方塊對應(yīng)編號除以64,商減去R1,余數(shù)減去R2,而每一個方塊一次將旋轉(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í)行四次,此過程旋轉(zhuǎn)結(jié)束。</p><p><b>  調(diào)試過程</b></p><p>  1、學(xué)號顯示部分單獨調(diào)試</p><p>  這個在之前的很多實驗

12、中都有涉及,程序較為簡單,語句也不復(fù)雜,本實驗中才用的是并行動態(tài)顯示,調(diào)試一次成功。</p><p><b>  游戲程序調(diào)試相關(guān)</b></p><p><b>  驗收結(jié)果</b></p><p>  下圖為當(dāng)時的整個實驗裝置:</p><p>  實驗中,游戲隨機產(chǎn)生方塊</p>

13、<p>  按下控制鍵,方塊旋轉(zhuǎn):</p><p>  按下控制鍵,方塊加速下落</p><p>  方塊下落到底部,最底層被填滿:</p><p>  最底層填滿后,自動消去這一層:</p><p>  隨機產(chǎn)生下一個方塊,每次產(chǎn)生方塊完全隨機:</p><p>  最后一幅圖為游戲結(jié)束后,顯示所得分?jǐn)?shù),

14、每消去一行得到一分,顯示“GAME OVER”和游戲者姓名學(xué)號。</p><p>  本次實驗?zāi)J游戲者為本人YANG XIN(楊欣),學(xué)號(U)200911880</p><p><b>  六、個人體會</b></p><p>  在這次實驗過程中,特別是調(diào)試的時候,如果能夠順利排除BUG實現(xiàn)程序預(yù)定功能是最讓人開心的,這個過程也會讓我很

15、享受。但是如果由于一些搞不清楚的原因遲遲達不到目標(biāo),也是最讓人煩躁的。而其中的問題,只能漫無目的地去嘗試,無法在邏輯中得到答案,我個人遇到了這種狀況,確實很無奈。不知道是否是因為我的分析不到位,而實際上有一個合乎邏輯的答案在那里呢?</p><p>  這次課程設(shè)計,第一周主要是在修改程序的驅(qū)動部分,從第二周開始上機調(diào)試,用了差不多半個月的時間,最終也沒有成功調(diào)試出結(jié)果,實在很受打擊,讓我很沮喪。從單片機課程到單

16、片機實驗到如今的單片機課程設(shè)計,我感觸最深的一點就是:必須有耐心、足夠細心。單片機程序前前后后有不少聯(lián)系,可能前面用的某個變量跟后面重復(fù)、字與字節(jié)搞亂等等細小的問題,如果不能耐心、細心地去尋找,很難發(fā)現(xiàn)。</p><p>  最后,我還體會到了,硬件學(xué)習(xí)是編寫程序前最重要的部分,只有對所使用的硬件設(shè)備完全了解才能編寫出適合使用的程序,否則會做很多無用功,浪費很多時間和精力。以后一定要謹(jǐn)記這個道理!</p&g

17、t;<p><b>  七、主要參考文獻</b></p><p>  【1】《單片機原理及應(yīng)用》 姜志海主編</p><p>  【2】《MCS-51系列單片機原理及應(yīng)用實驗指導(dǎo)書》 </p><p><b>  八、致謝</b></p><p>  感謝黃勁老師的耐心指導(dǎo)!<

18、;/p><p>  感謝管理實驗室的老師多日來為我們開放實驗室!</p><p><b>  附錄一:電路原理圖</b></p><p><b>  按鍵與單片機連接:</b></p><p>  按照4*4鍵盤上的布置,游戲控制鍵分別為:Move_Left 8 ,Move_Right A,A

19、dd_Speed 9,Change_Shape D,Game_Star C,Game_Pause E</p><p>  液晶顯示器與單片機的連接:</p><p><b>  附錄二:程序清單:</b></p><p> ?。ㄒ虺绦蚍倍?,此處只列出.C文件程序,如果老師要看完成程序,請看電子檔報告)</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]; //游戲平臺數(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; //等級速度,正常情況,方塊下降的速度</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;//下一個形狀</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>  //= 功 能: 初始化游戲平臺</p><p>  //= 參 數(shù)

84、: 無</p><p>  //= 返 回 值: 無</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 );//初始化游戲平臺邊界畫游戲區(qū)域</p><p>  Wr_line(1,33,14,64,1 ); //畫上橫線</p><p>  Wr_line(0,33,15,100,1);</p

87、><p>  Wr_line(0,34,15,100,1); //畫左豎線</p><p>  Wr_line(1,33,115,64,1); </p><p>  Wr_line(1,33,116,64,1); //畫下橫線</p><p>  Wr_line(0,95,15,100,1);</p><p>  W

88、r_line(0,96,15,100,1); //畫右豎線</p><p>  //--------------------------------------------------------</p><p>  for(i=1;i<13;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; //游戲平臺最下面一行的每一個方塊位置為1,作為下邊界</p><p><b>  }</b></p><p>  for(j=0;j<20;

91、j++)//游戲平臺左右方塊位置置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); //輸入“級”漢字</p><p>  Show_score(0); //顯示初始分?jǐn)?shù)</p&

93、gt;<p>  Show_num(13,11,Game_Level); //顯示初始等級水平</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); //輸入“開”漢字</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>  //= 功 能: 顯示一個小方塊</p><p>  //= 參

98、數(shù): 小方塊的橫x,堅坐標(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;//將方塊在平臺的位置轉(zhuǎn)化成LCD的點坐標(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); //畫一條橫線</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); //畫第二條橫線</p><p><b>  }</b></p><p>  for(i=0;i<5;i++)</p><p><b>  {</b></p>

103、<p>  Point(x1,y1-i,1); //畫第1條堅線</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); //畫第2條堅線</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); //畫斜線</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); //畫一條橫線</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); //畫第二條橫線</p><p><b>  }</b></p><p>  for(i=0;i<

108、5;i++)</p><p><b>  {</b></p><p>  Point(x1,y1-i,0); //畫第1條堅線</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); //畫第2條堅線</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); //畫斜線</p><p><b>  }</b></p><p><b>  }</b></p><p><b&

111、gt;  }</b></p><p>  //////////////////////////////////////////////////////////////////////////</p><p>  ////////////////左沖突檢測//////////////////////////////////////////////</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>  ////////////////右沖突檢測///////////////////////////////////////////</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>  ////////////////////////////////////////下沖突檢測//////////////////////////</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>  //////////////////////////////////改變形狀時產(chǎn)生的沖

120、突檢測////////////////////</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; //檢測一個形狀的沖突情況</p><

122、p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  //////////////////////////////////產(chǎn)生一個隨機數(shù),返回一個隨機數(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>  //////////////計分函數(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);//顯示個位</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);//顯示個位,十位</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);//顯示個位 ,十位,百位</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);//顯示個位 ,十位,百位,千位</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. 本站所有資源如無特殊說明,都需要本地電腦安裝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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論