推箱子C課程設(shè)計報告_第1頁
推箱子C課程設(shè)計報告_第2頁
推箱子C課程設(shè)計報告_第3頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、程序設(shè)計課程設(shè)計報告書學(xué) 生 : 孟 祥 煜指 導(dǎo) 老 師 :曾 宇 容課 程 設(shè) 計 名 稱 : 推 箱 子 小 游 戲班 級 :軟 件 11401一、設(shè)計任務(wù)介紹推箱子游戲的實現(xiàn)方法,并逐步介紹C語言圖形編程的方法和技巧。在C語言編 寫軟件WIN-TC上,涉及軟中斷、二維數(shù)組、鍵盤操作及圖形化函數(shù)等方法,顯示器 中斷寄存器的設(shè)置、 二維數(shù)組的定義、 鍵盤上鍵值的獲取、 圖形方式下光標(biāo)的顯示和 定位,以及部分圖形函數(shù)的使用實現(xiàn)了一個完整的推箱子游戲界面,界面清晰可見。二、設(shè)計目的訓(xùn)練學(xué)生掌握C的數(shù)據(jù)結(jié)構(gòu)和綜合編程能力和游戲開發(fā)技巧等應(yīng)用能力。初步設(shè)想推箱子是一款經(jīng)典的益智小游戲, 目的是在訓(xùn)

2、練人的邏輯思考能力。 在一個狹小 的空間中, 要求把木箱從起始位置處推放到指定位置。 在空間中有地方限制, 稍 不小心就會出現(xiàn)箱子無法移動或者通道被堵住的情況,而且箱子只能推不能拉, 所以需要玩家巧妙的利用有限的空間和通道, 合理的移動次序和位置, 才能完成 任務(wù)。本游戲一共分 14 關(guān),由易到難,每一關(guān)都隨著關(guān)數(shù)的增加來增加難度, 從而達到吸引游戲玩家的目的三 功能1 、菜單功能,玩家通過看目錄按對應(yīng)的鍵可以進入對應(yīng)的功能菜單,其中 1 進入游 戲, 2選擇游戲關(guān)卡, 3游戲幫助指南 ,4 退出游戲。2 游戲功能: 玩家可以通過操縱鍵盤中的上下左右鍵進入游戲進行各種操作來完成 游戲。3 循環(huán)

3、功能:當(dāng)玩家正在游戲的時候如果某一步走錯了,導(dǎo)致游戲無法完成,可以隨 時重新開始游戲來完成關(guān)卡,游戲過程中可以隨時按 Ctrl+V 退出游戲。4 順序功能: 當(dāng)玩家完成了某一關(guān)之后,隨著進入下一關(guān)門可以按順序進入下一關(guān), 繼續(xù)開始更有挑戰(zhàn)的關(guān)卡,如果該關(guān)是最后一關(guān),則顯示通關(guān)完成。三、總體設(shè)計1、功能模塊設(shè)計函數(shù)功能描述本程序包括 5 個模塊,分別是初始化模塊、畫圖模塊、移動箱子模塊、 移動小人模塊和功能控制模塊。各個模塊功能的功能描述如下:(1)初始化模塊。 該模塊包括屏幕初始化和游戲第一關(guān)到第最后一關(guān)的初始化。 屏幕 初始化用于輸出歡迎信息和操作提示,游戲每一關(guān)的初始化是構(gòu)建每一關(guān)的關(guān) 卡

4、。(2)畫圖模塊。該模塊主要是被其他模塊調(diào)用,用于畫墻、在空地畫箱子、在目的地 畫箱子、畫小人和畫目的地。3)移動箱子模塊。該模塊用于移動箱子,包括目的地之間、空地之間和目的地與空地之間箱子的移動(4)移動小人模塊。該模塊是幾個功能函數(shù)的集合,包括屏幕輸出功能、指定位置狀態(tài)判斷功能和關(guān)卡重置功能。(5)功能控制模塊。該模塊是幾個功能函數(shù)的集合,包括屏幕輸出功能、指定位置狀 態(tài)判斷功能和關(guān)卡重置功能。任務(wù)執(zhí)行流程圖數(shù)據(jù)流程圖游戲從第一關(guān)開始,按上下左右方向鍵控制小人移動來推動箱子,可以在游戲中的任何時候按Esc鍵退出。如果游戲無成功希望,可以按 CTRI+ V回到當(dāng)前任務(wù)的 開始狀態(tài);如果成功完

5、成當(dāng)前關(guān),則進入下一關(guān),如果當(dāng)前關(guān)是最后一關(guān),則顯示通 關(guān)信息,提示游戲結(jié)束。小人移動流程圖 小人移動的方向有4個,move()函數(shù)(處理小人移動的函數(shù))對這 4個方向移動的處理都一致, 只是調(diào)用函數(shù)時的參數(shù)有所不同。 首先判斷小人移動的方向, 然后 根 據(jù)小人所處世的當(dāng)前狀態(tài)、下一步狀態(tài)或者下下一步狀態(tài)進行適當(dāng)?shù)奶幚怼?、數(shù)據(jù)結(jié)構(gòu)設(shè)計設(shè)置全局變量定義 int v1317 ,用于記錄箱子在屏幕中哪個坐標(biāo)上。其中“ 0”表示什么都 沒有。定義了 int num_guan 指現(xiàn)在的關(guān)數(shù), int num_xiang; 箱子的個數(shù), int move_num人行走的次數(shù);int push_num 人

6、推箱子的次數(shù);定義數(shù)組int M2表 示人所在的位置 ; M0 是人所在位置的橫坐標(biāo) M1 是人所在位置的縱坐標(biāo);定 義數(shù)組 int door2 表示門所在的坐標(biāo), door0 是“下一關(guān)門”的橫坐標(biāo), door1 是“下一關(guān)門”的縱坐標(biāo)。3 主函數(shù)下面讓我們來看看主函數(shù)的操作流程, 主函數(shù)首先進入游戲目錄, 提醒游戲 玩家輸入對應(yīng)的數(shù)字來進行的對應(yīng)的操作,如果玩家輸入 1 則進入游戲第一關(guān), 輸入 2 選擇關(guān)卡進入,輸入 3 顯示游戲幫助菜單,幫助玩家更好的理解這個游戲 的規(guī)則,輸入 4 退出游戲。進入游戲后,首先調(diào)用 chushi1() 函數(shù)初始化要使用 的頁面,之后程序進入 play()

7、 函數(shù), play() 函數(shù)中通過 if 語句通過判斷 i 的值 來初始化不同的關(guān)卡(設(shè)置好關(guān)卡的人,箱子,箱子的目的地,門) ,接著程序進 入 control 函數(shù)通過獲取玩家在鍵盤上的操作來分別對游戲人物進行操作,最后 通過wancheng函數(shù)來對操作進行判斷,如果判斷成功的話則進入下一關(guān)游戲。反 之則失敗。一直通過到最后一個則通關(guān)成功四 代碼設(shè)計(或編程)單個模塊或函數(shù)處理將整個系統(tǒng)程序分解為各個單獨的模塊,即 C 的函數(shù),各模塊可單獨編譯;整個程序的聯(lián)調(diào)在各個模塊基本的單獨編譯通過后,用主函數(shù)將他們集成在一起,實現(xiàn)調(diào)用,并進 行輸出數(shù)據(jù)的可靠性、輸入數(shù)據(jù)及系統(tǒng)的容錯性測試。五 程序說明

8、書功能模塊1. play()2. control()3. Daying()4. Wancheng()解析1. play()play() 函數(shù)在這個程序中的功能主要是按 1 進入游戲系統(tǒng)后自動按照順序進行游戲和 完成每一關(guān)游戲后進入下一關(guān)關(guān)卡,其中變量 i 控制關(guān)卡的關(guān)數(shù), j 控制進入下一關(guān), 首先利用 if 語句將 i 從一開始,初始化完成第一關(guān),通過 play() 函數(shù)中的內(nèi)嵌函數(shù) control() 函數(shù)來控制游戲中人和箱子的各種操作, 當(dāng)過關(guān)了 control() 函數(shù) return 0.結(jié)束。void play()int i,j=0;for(i=1;i<=20;i+)tem=0

9、;system("cls");/ 清屏設(shè)置關(guān)卡 1 的墻,箱子,人。 門if(i=1) chushihua_guan1(); /else if(i=2) chushihua_guan2();else if(i=3) chushihua_guan3();else if(i=4) chushihua_guan4();else if(i=5) chushihua_guan5();else if(i=6) chushihua_guan6();else if(i=7) chushihua_guan7();else if(i=8) chushihua_guan8();else if(i

10、=9) chushihua_guan9();else if(i=10) chushihua_gua n10();else if(i=11) chushihua_gua n11();else if(i=12) chushihua_gua n12();else if(i=13) chushihua_gua n13();else if(i=14) chushihua_gua n14();j=c on trol();if(j=1)system("cls");return ;2 con trol()Control()在這個程序中主要控制游戲中人物和箱子的運動,當(dāng)玩家在鍵盤進行各種 操

11、作時系統(tǒng)會給出不同的反應(yīng)。模塊中定義了 comman(變量,來接收玩家在鍵盤上的 各種操作,首先調(diào)用getch()函數(shù)為comman賦一個初值command“空字符”)22,進 入界面圖表初始化,根據(jù)num_guan的大小來具體初始化對應(yīng)的關(guān)卡(箱子,人,墻 的圖標(biāo)),接著模塊進入了 “控制階段”,再次通過getch()函數(shù)comman獲得一個字 符,當(dāng)command= H'(也就是T )時人進行向上前進的動作,對應(yīng)的 (“P ” K” ” M )進行人的J、-、-操作,以及人的上下左右推箱子的動作, 同時當(dāng)人的前進的方向是墻或者雙層箱子的時候人則不能運動,人推箱子如果箱子的前面是墻或

12、者箱子的話箱子和人都不能運動。運動過程中如果玩家輸入ctrl+c時游戲此關(guān)卡重新開始,同時在control函數(shù)中調(diào)用一個win變量來判斷是否完成了游戲, 調(diào) 用 內(nèi) 嵌 函 數(shù)wa nche ng()函 數(shù) , 當(dāng)(win=wancheng()=1 &&vdoor0door1=ren)時,表示這個關(guān)卡已經(jīng)完成了,return 0,即把play()函數(shù)中的j賦值等于0,游戲進入下一個關(guān)。游戲過程玩家每操作一步,系統(tǒng)通過控制daying()函數(shù)來控制畫面中目標(biāo)的運動,來達到游戲的目的。int con trol()int win;int temm;char comma nd;/存放接

13、收到命令while(1)comma nd=getch(); / 輸入一個字符/* if(comma nd=1)if(comma nd=22)if(nu m_gua n=1)system("cls");chushihua_gua n1(); else if(nu m_gua n=2) system("cls");chushihua_gua n2();else if(nu m_gua n=3) system("cls");chushihua_gua n3();else if(nu m_gua n=4) system("cls&q

14、uot;);chushihua_gua n4 ();else if(nu m_gua n=5) system("cls");chushihua_gua n5();else if(nu m_gua n=6) system("cls");chushihua_gua n6();else if(nu m_gua n=7) system("cls");chushihua_gua n7();else if(nu m_gua n=8) system("cls");chushihua_gua n8();else if(nu m_g

15、ua n=9) system("cls");chushihua_gua n9();else if(nu m_gua n=10) system("cls");chushihua_gua n10();else if(nu m_gua n=11) system("cls");chushihua_gua n11();else if(nu m_gua n=12) system("cls");chushihua_gua n12();else if(num_guan=1113) system("cls");c

16、hushihua_guan13();else if(nu m_gua n=14) system("cls");chushihua_gua n14();if(comma nd=-32)F11,F12:-123,-122temm=0;comma nd=getch();if(temm=0&&comma nd='H'(vM0-1M1=xia ng|vM0-1M1=oxia ng)&& vM0-2M1=jia)/箱子在人的上邊或者人的上邊的箱子已經(jīng)放好了且人的上面兩行就是箱子的家vM0-1M1=re n; /H 指的是向上推箱子到家vM

17、0M1=0;vM0-2M1=oxia ng;M0=M0-1;mo ve_num=move_nu m+1;push_ num=push_ nu m+1;temm=temm+1;if(temm=0&&comma nd='P'(vM0+1M1=xia ng|vM0+1M1=oxia ng)&& vM0+2M1=jia)vM0+1M1=re n;temm=temm+1; /P指向下推箱子到家vM0M1=0;vM0+2M1=oxia ng;M0=M0+1;mo ve_num=move_nu m+1;push _num=push _nu m+1; if(te

18、mm=0&&comma nd='K'(vM0M1-1=xia ng|vM0M1-1=oxia ng)&& vM0M1-2=jia)&&&&vM0M1-1=re n; /K指向左推箱子到家vM0M1-2=oxia ng;M1=M1-1;mo ve_num=move_nu m+1;push_ num=push_ nu m+1;if(temm=0&&comma nd='M'&&(vM0M1+1=xia ng|vM0M1+1=oxia ng)&& vM0M1+

19、2=jia)vM0M1+1=re n;temm=temm+1; /M指向右推箱子到家vM0M1=0;vM0M1+2=oxia ng;M1=M1+1;move_ num=move_ nu m+1;push_ num=push_ nu m+1;/H指人把箱子向上推,不是推到家&&&&if(temm=0&&comma nd='H'(vM0-1M1=xia ng|vM0-1M1=oxia ng)(vM0-2M1=0|vM0-2M1=jia)vM0-1M1=re n;temm=temm+1;vM0M1=0;vM0-2M1=xia ng;M0

20、=M0-1;mo ve_num=move_nu m+1;push _num=push _nu m+1;if(temm=0&&comma nd='H'(vM0-1M1=0|vM0-1M1=jia|vM0-1M1=me n)=M0-1;/人向上走if(temm=0&&comma nd='P'&&(vM0+1M1=0|vM0+1M1=jia|vM0+1M1=me n)vM0+1M1=re n;temm=temm+1; /人的下面為空或者下面為家或者下面為門的時候向下走vM0M1=0;M0=M0+1;move_num=mo

21、ve_num+1;if(temm=0&&comma nd='P'&&(vM0+1M1=xia ng|vM0+1M1=oxia ng)&&(vM0+2M1=0|vM0+2M1=jia)vM0+1M1=re n; /人的下面為箱子或者下面已經(jīng)有箱子找到家了 切下面的下面是空或者下面的下面是家,人把箱子向下推,人往下面走vM0M1=0;temm=temm+1;vM0+2M1=xia ng;M0=M0+1;mo ve_num=move_nu m+1;push _num=push _nu m+1;if(temm=0&&com

22、ma nd='K'(vM0M1-1=0|vM0M1-1=jia|vM0M1-1=me n)家或者左邊是門的時候人可以往左邊走&&&&&&&&vM0M1=0;M1=M1-1;move_num=move_num+1;if(temm=0&&comma nd='K'(vM0M1-1=xia ng|vM0M1-1=oxia ng) (vM0M1-2=0|vM0M1-2=jia)vM0M1-1=re n; temm=temm+1;人的左邊是箱子或者人的左邊是已經(jīng)找到家的箱子切人的左邊的左邊是空或

23、者人的左邊的左邊是家的時候箱子可以往左邊移動,vM0M1=0;vM0M1-2=xia ng;M1=M1-1;mo ve_num=move_nu m+1;push_ num=push_ nu m+1;if(temm=0&&comma nd='M' (vM0M1+1=0|vM0M1+1=jia|vM0M1+1=me n)vM0M1+1=re n;temm=temm+1;vM0M1=0;M1=M1+1;move_num=mo ve_num+1; /人的右邊是空的或者人的右邊是家或者人的右邊的門的時候人可以 往右邊走。if(temm=0&&comma n

24、d='M'(vM0M1+2=0|vM0M1+2=jia) vM0M1+1=re n;temm=temm+1;vM0M1=0;vM0M1+2=xiang; /人的右邊是箱子或者人的右邊是一個已經(jīng)找到家的箱子切右邊的右邊是空的或者右邊的右邊是家的時候可以推箱子M1=M1+1;mo ve_num=move_nu m+1;push _num=push _nu m+1;/ else if(comma nd=-122 | comma nd=-123);/ else ;/ else if(comma nd=0)/command=getch();/接收 Fn 的下一個字符 F1F10:5968

25、elseif(comma nd>=2&&comma nd<=26)if(comma nd=3)retur n1; else ;Ctrl+az:126當(dāng)為ctrl+c 的時候程序結(jié)束if(win=wan che ng()=0) tem=0;system("cls");dayi n();if(win= wancheng()=1 &&vdoor0door1=ren) Sleep(225);return0;return 0;/如果門的坐標(biāo)和人的坐標(biāo)相等的時候直接退出此語句,進入下一個程序(俗稱下一關(guān) )3 Dayi ng()Daying函

26、數(shù)在這個程序主要在游戲中的功能是畫出游戲中人和箱子和“完成門”家,人的 圖標(biāo)和對游戲中的關(guān)卡和人走的步數(shù)和推箱子的步數(shù)進行計數(shù)數(shù),根據(jù)游戲中玩家的操作 隨時的對游戲畫面進行變換。通過變量 i,j來獲得men, qiang, oxiang ,ren, jia, xiang(分別表示完成門、墻、箱子放在家中、人、家、箱子)的坐標(biāo)來找到各個變量的位置, 從而運用畫圖函數(shù)畫出對應(yīng)的圖標(biāo)。void day in()int i,j;for(i=0;i<=12;i+)for(j=0;jv=16;j+)if(fube n ij=jia&&vij=0)vij=jia;for(i=0;i&l

27、t;=12;i+)for(j=0;j<=16;j+)if(vij=qiang)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_INTENSITY);prii|l");elseif(vij=men)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE | FOREGROUND_RED);pri nffiT);elseif(vij=oxiang)SetConsol

28、eTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_GREEN);pr"("elseif(vij=ren)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKG ROUND_INTENSITY|FOREGROUND_INTEN|SITBYACKGROUND_RE| D BACKGROUND_GRE|EN BACKGROUND_BLUE|FOREGROUND_RED);panf"elseif

29、(vij=jia)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |FOREGROUND_GREEN | FOREGROUND_RED)"inf("elseif(vij=xiang)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE"")jtf("elseSetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);printf(" ");printf("n");SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREG

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論