C++語言課程設計-拼圖游戲_第1頁
C++語言課程設計-拼圖游戲_第2頁
C++語言課程設計-拼圖游戲_第3頁
C++語言課程設計-拼圖游戲_第4頁
C++語言課程設計-拼圖游戲_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、255793717c+語言課程設計一拼圖游戲一、實驗內(nèi)容玩家通過鼠標單擊相鄰位有空位的方塊來移動方塊,從而最終將一副散亂的圖片拼成完 整的圖片。要求如下:1. 游戲的初始界面如圖一,單擊空格鍵進入游戲,進入游戲之后系統(tǒng)將完成的圖片分 成大小相同的15分并隨機擺放成如圖二。圖_圖二2. 啟動游戲,單擊空格鍵進入游戲。通過鼠標單擊周圍有空格的方塊來移動方塊,直 到全圖拼接成圖二中右下角的圖案樣式,游戲結朿,重新回到圖一界面。3. 游戲的原理是定義一個4 * 4的方塊矩陣(二維數(shù)組),前15個的值按順序從1-15依 次遞增,第16個留空為0。按照這個順序排列的矩陣值代表游戲勝利。初始化的時 候,將該

2、16個矩陣值隨機排布即得到本局關卡。為0的空位代表附近上下左右的4 個方塊可以移動過來4. 每次單擊鼠標左鍵,方塊移動一格。鼠標必須移動到方塊范圍內(nèi)單擊才能有效移動 方塊。二、實驗指南實驗一開始實驗【實驗任務】步驟一、打開funcode,創(chuàng)建一個的c+語言項目;步驟二、導入puzzle模板。【實驗思路】 按實驗指導完成。【實驗指導】1、打開funcode,點擊“項目”菜單,選擇“創(chuàng)建c+工程”注意:工程名名稱要求字母開頭,只能包含字母和數(shù)字,且名字中間不能有空格。2、點擊菜單“項目”中的“導入地圖模塊”,如圖一。跳出一個對話框,選中“puzzle” 模板,點擊“導入到工程”按鈕,如圖二。視圖幫

3、助運行游戲恢復至初始地圏打開工敕怦創(chuàng)建c語宮工程 創(chuàng)建c+工程 創(chuàng)建java工程導入啊模板 保存地圖為模板圖二圖一3、導入成功后的,界而如下圖所示:實驗二單擊空格鍵,開始游戲【實驗內(nèi)容】步驟、啟動游戲顯示“空格開始”,單擊空格鍵進入游戲初始界面?!緦嶒炈悸贰肯到y(tǒng)會自動響應onkoydown函數(shù)來響應鍵盤按下消息,這部分代碼實現(xiàn)在main, cpp里。 我們要做的就是通過在main, cpp的onkeydown函數(shù)里實現(xiàn)我們的代碼。當用戶單擊鍵 盤上的空格鍵之后,設置gamebegin即“空格開始”精靈不可見。【實驗指導】1、進入lessonx.h文件中添加“空格開始”精靈變量的聲明以及我們自定

4、義處理系統(tǒng) 響應鍵盤按下消息的函數(shù)onkeydown的聲明(如系統(tǒng)已給出,則省略定義 onekeydown 的步驟):csprite* m_spgamebegin;”空格開始”精靈void onkeydown( const int ikey, const int iaitpress, const int ishiftpress, const int ictrlpress);2、進入lessonx.cpp的構造函數(shù)里面初始化“空格開始”精靈成員變量:m_spgamebegin二new csprite(hgamebegin”);在文件的最后面添加onkeydown函數(shù)的定義代碼:void cgam

5、emain:onkeydown( const int ikey, const int iaitpress, const int ishiftpress, const int ictrlpress)3、空格鍵的鍵值為key_space,當系統(tǒng)判斷玩家單擊了空格鍵以及游戲的狀態(tài)時未進 行(即m igamestate的值0)則游戲開始設置m igamestate的值為1,同時隱藏掉“空格開始”精靈。在步驟2的函數(shù)里面添加下面的代碼:if( key_space = ikey && 0 = m_igamestate )mgamestate =1;/隱藏提示開始文字m_spgamebegi

6、 n->setspritevisible(o);4、進入main.卬p函數(shù)里面,將系統(tǒng)捕獲到的鍵盤按下消息的參數(shù)傳給我們自定義的函 數(shù),需要在onkeydown函數(shù)里面添加下面一行代碼:g_garnemainonkeydown(ikey,baltpress,bshiftpress,bctrlpress);至此,本實驗結束。實驗三初始化隨機顯示方塊【實驗內(nèi)容】步驟一、添加一個4x4的二維數(shù)組,將圖案分成15份,隨機擺放,剩下一個位置留空, 用于移動方塊?!緦嶒炈悸贰坑螒虻脑硎窃谝粋€4 * 4的方塊矩陣(二維數(shù)組),前15個的值按順序從依次遞增, 第16個留空,我們設置為一個名稱為“nul

7、l”的精靈。按照這個順序排列的矩陣值代表游 戲勝利。精靈名稱依次是 pictureblockl, pictureblock2.pictureblockl5o 因此,初始化的時候, 用一個數(shù)組iranddata順序保存1到15,對應表示15個方塊精靈。再用一個二維數(shù)組 mbiockstate表示這16個位置。每次隨機從iranddata中取一個值,賦給mjbiockstate,表示某個位置放置哪張方塊圖 片。為了保證同一張方塊圖片不會被重復使用,每次從iranddata隨機取一個值以后,將該 隨機數(shù)后面的數(shù)組值往前移一位,并且數(shù)組大小減1?!緦嶒炛笇А?、進入lessonx.h里面,添加如下的變

8、量聲明:1)添加成員變量聲明:static const floatmblockstartx;/按方塊大小,在編輯器電擺放的第-塊方塊的起始坐標static const floatm_fblockstarty;static const floatmblocksize ;/ 屏幕高度 75/4 塊=18.75 每塊的大小.編輯器里預先擺放好的方塊寬和高必須與此值一致intblockstateblock_countblock_count; / 二維數(shù)組,存儲 n*n 的矩陣方塊信息csprite* m_spblockblock_count*block_count;/方塊精靈注意,mblockstar

9、tx, mblockstarty, m_fblocksize三個變量是不能改變的, 因此我們需要將它們設置為const類型,const在廿+里面表示只讀,即后面程 序只能讀取使用它的值而不能對其進行賦值改變。c+類屮的成員變量如果是 const類型,則需要在其前面加上一個static的聲明,即靜態(tài)變量的聲明,這樣, 我們才能在cpp文件里面使用這個變量。2) 添加 block_count define 聲明:在lessonx.h的#include后面添加下面一行:#define block_count 4/n * n的矩陣方塊,一個n的大小#define相當于告訴編譯器,如果遇到block_c

10、ount則它相當與一個int類型的 變量,且值為4。使用#define可以方便改變我們需要的值。2、進入lessonx.cpp中在最后面添加下面的成員變量的聲明:const float cgamemain:m_fblocksize=18.75f;const float cgamemain:m_fblockstartx=-40.625f; const float cgamemain:m_fblockstarty=-28.125f;因為這三個變量的類型是const類型,因此我們不能在構造函數(shù)里面定義它, 需要單獨拿出來進行定義。相當于c里面的全局變量的定義。3進入lessonx.cpp中的game

11、lnit兩數(shù)里面填寫初始化代碼。1) 填寫下面兒行變量的定義:int iloopx= 0, iloopy= 0, iloop = 0;intionelndex=0, irandlndex = 0;/用做隨機的數(shù)組,當隨機抽収到此數(shù)組中的一個時,比如隨機到第五個,則 將第五個取出來用/第五個后面的數(shù)組都往前移動一位,將第五個覆蓋掉,數(shù)組總數(shù)減一,下次再 在這剩余的14個數(shù)值里隨機抽取int idatacount = block_count * block_count 1;int i ra nd data block_cou nt * block_count 1 = 1, 2, 3, 4, 5,

12、6, 7, 8, 9,10,11, 12,13,14,15;idatacount用于記錄方塊的數(shù)目,iranddata是一個二維數(shù)組,里面存放了 1至 15的int值,對應表示1-15個方塊精靈,用于后面對方塊進行隨機生成。每次 隨機從此數(shù)組中抽取一個值,比如隨機到第五個,則將第五個取出來用,第五 個后面的數(shù)組都往前移動一位,將第五個覆蓋掉,數(shù)組總數(shù)減一,下次再在這剩 余的14個數(shù)值里隨機抽取。這樣做的好處是確保不會重復兩次以上使用同一個 方塊。2) 由于我們用于記錄方塊位置的成員變量是一個二維數(shù)組mjbiockstate,而我們 用于保存所有方塊精靈的數(shù)組是一個一維數(shù)組,所以下面我們需要用到

13、一些自 定義的函數(shù)用于從二維數(shù)組轉(zhuǎn)換到一維數(shù)組。其實二維數(shù)組的存放在內(nèi)存里面 也是連續(xù)存放的,我們在讀取他們的值得時候當然可以使用一維數(shù)組的方法來 讀取它,只不過這里需要進行數(shù)組下標數(shù)值的相應改變。例:二維數(shù)組axy 轉(zhuǎn)換為一維數(shù)組的計算方法是:x*二維數(shù)組屮每行的元素數(shù)+y。進入lessonx.h中添加我們自定義的二維數(shù)組索引轉(zhuǎn)換成一維數(shù)組索引的函數(shù) xytoonelndex 聲明:int xytoonelndex( const int ilndexx, const int ilndexy );進入lessonx.cpp屮添加上而函數(shù)的定義:int cgamemain:xytoonelnde

14、x( const int ilndexx, const int ilndexy )return (ilndexy * block_count + ilndexx);4、我們使用兩個for循環(huán)來遍歷二維數(shù)組,第一個for循環(huán)遍歷二維數(shù)組mblockstate 的第二個下標,第二個for循環(huán)遍歷二維數(shù)組mjbiockstate的第一個下標。在 gamelint函數(shù)里面添加下面的代碼:for( iloopy = 0; iloopy < block_count; iloopy+ )for( iloopx = 0; iloopx < block_count; iloopx卄)5、我們首先用剛

15、剛我們自定義的數(shù)組下標轉(zhuǎn)換函數(shù)xytoonelndex將二維數(shù)組下標轉(zhuǎn) 換成一維數(shù)組的下標。在 for( iloopx = 0; iloopx < block_count; iloopx+ )里面填寫 下面的代碼: ionelndex= xytoonelndex( iloopx, iloopy );ionelndex即是二維數(shù)組在一維數(shù)組里面的下標值。1) 如果遍歷到數(shù)組的最后一個,我們就將其設定為空位精靈,它的名稱為nulls 后面我們只要判斷一個精靈的周圍有沒有名稱為"null"的精靈就可以知道他周 圍是否有空位,它在二維數(shù)組中的值以0來代替。添加下面的代碼:/數(shù)

16、組的最后一個if( block_count 1 二二 iloopx && block_count 1 二二 iloopy ) m_i blockstateiloopyiloopx = 0; m_spblockionelndex = new csprite("null");2) 如果沒有遍歷到最后一個位置,我們隨機從iranddata取一個值賦給mblockstate,并且給對應名字的精靈數(shù)組m_spblock初始化,同時將該精靈 移動到對應的位置。添加下面代碼:else/在當前剩余未使用到的數(shù)值里隨機一個出來,賦值給二維數(shù)組 irandlndex= csys

17、tem:randomrange( 0, idatacount -1);m_i blockstateiloopyiloopx = iranddatairandlndex;char* tmpname=csystem:makespritename("pictureblock"/m_iblockstateiloopyiloopx); m_spblockionelndex二new csprite(tmpname);/將該精靈移動到對應的位置movespritetoblockf m_spblockionelndex, iloopx, iloopy );在這里我們需要添加-個移動精靈到特

18、定位置的函數(shù)movespritetoblocko進入 lessonx.h中添加函數(shù)的聲明:void movespritetoblock( csprite *tmpsprite, const int ilndexx, const int ilndexy ); 進入lessonx.cpp屮添加該函數(shù)的定義:void cgamemain:movespritetoblock( csprite *tmpsprite, const int ilndexx, const int ilndexy)float fposx = m_fblockstartx + ilndexx * m_fblocksize;flo

19、at fposy= m fblockstarty + ilndexy * m fblocksize;tmpsprite->setspriteposition(fposx, fposy);3) 由于是隨機從iranddata數(shù)組里面取一個數(shù)賦給mjbiockstate,所以我們每次 賦一個需要將iranddata數(shù)組后面的值往前面移動覆蓋掉改值。因此我們需要 用for循環(huán),將抽取到的索引irandlndex后面的數(shù)組值依次往前移動一位,同吋方塊總數(shù)目減一。代碼如下:for( iloop = irandlndex; iloop < idatacount -1; iloop+ ) ira

20、nddatailoop = iranddatailoop + 1;/剩余有效值總數(shù)減一idatacou nt-;至此,本實驗結束。實驗四移動方塊【實驗內(nèi)容】步驟一、獲取鼠標單擊消息步驟二、判斷鼠標點擊的方塊步驟三、判斷周圍是否有空位,移動方塊【實驗思路】遍歷一維數(shù)組m_spblock,使用ispointlnsprite函數(shù)判斷當前鼠標坐標是否位于某個名 字的精靈內(nèi)部。如果找到某個名字的精靈被點擊中,請將當前循環(huán)變量iloop賦值給 iciicklndexo再判斷該方塊精靈周圍有沒有名稱為“null”的精靈,有的有的話移動到 該位置?!緦嶒炛笇А?、進入lessonx.h中添加我們白定義的處理鼠

21、標單擊的函數(shù)聲明:void onmouseclickf const int imousetype, const float fmousex, const float fmousey );2、進入lessonx.cpp中添加該函數(shù)的定義:void cgamemain:onmouseclickf const int imousetype, const float fmousex, const float fmousey)3、判斷游戲是否正在進行,在上面的函數(shù)里面添加下面的代碼:/只處理游戲進行中的鼠標響應if( 2 != mgamestate )return;4、獲取鼠標點擊的坐標,使用一個for

22、循環(huán)遍歷存儲所以方塊精靈的一維數(shù)組 m_spblock,判斷該坐標是否在某一個方塊精靈中,是的話得到該精靈的下標值。添加下面的代碼:int iciicklndex=-1;int iloop=0;for( iloop = 0; iloop < block_count * block_count; iloop+ ) iff "null" = m_spblockiloop->getname()continue;/使用api dlspointlnsprite判斷指定朋標是否位j:某個名字的精靈內(nèi)部 if(m_spblockiloop->lspointlnsprit

23、e(fmousex, fmousey)iciickl ndex = iloop; break;5、這里我們需要用到將一維數(shù)組轉(zhuǎn)換為二維數(shù)組,原理與我們前面二維數(shù)組轉(zhuǎn)換為一 維數(shù)組的方面相反。只要將一維數(shù)組下標值對二維數(shù)組中每行的元素數(shù)進行求余就 能得到二維數(shù)組的x下標值,將一維數(shù)組對二維數(shù)組中的每行的元素數(shù)進行求商就 能得到二維數(shù)組的y下標值。為簡化操作,我們分別將這兩個操作定義為函數(shù)形式 直接調(diào)用。在lessonx.h中添加這兩個函數(shù)的聲明:int onelndextox( const int ilndex );int onelndextoy( const int ilndex );在les

24、sonx.cpp中添加這兩個函數(shù)的定義:int cgamemain:onelndextox( const int ilndex )return (ilndex % block_count);int cgamemain:onelndextoy( const int ilndex )return (ilndex / block_count);6、我們將步驟4得到的一維數(shù)組下標值轉(zhuǎn)換為二維數(shù)組mbiockstate的下標值。這樣 我們就可以在blockstate中查找該鼠標點擊到的方塊精靈周圍是否有空位。在二 維數(shù)組里查找鼠標點擊的方塊上下左右4個方向上是否有空位。注意邊界判斷,否 則數(shù)組訪問會越界

25、。比如判斷左邊時,需要判斷是否已經(jīng)是最左邊的索引(ilndexx= 0)。如果有空位(值為0),則將該空位的索引賦值給下面這2個變u: iemptylndexx 和iemptylndexy保存。在onmouseclick中添加下面代碼:/判斷鼠標是否點中方塊if( -1 = iciicklndex )return;將該一維數(shù)組的index轉(zhuǎn)換成二維數(shù)組的x,yint ilndexx =onelndextox( iciicklndex);int ilndexy =onelndextoy( iciicklndex);int iemptylndexx = -1, iemptylndexy =/x左方

26、向(4個方向均需要判斷是否是位于邊緣,ilndexx >0即起此作用)if( ilndexx >0)if( 0 = m_iblockstateilndexyilndexx -1) iemptyl ndexx = iln dexx 1; iempt yin dexy = iln dexy;/x右方向if( -1 = iemptylndexx && ilndexx < block_count -1)if( 0 = m_iblockstateilndexyilndexx + 1)iemptylndexx = ilndexx + 1;iempt yin dexy =

27、iln dexy;/y上方向if( -1 = iemptylndexy && ilndexy > 0 )iff 0 = m_iblockstateilndexy - lilndexx)iemptyl ndexx = iln dexx; iemptylndexy = ilndexy -1;y下方向if( -1 = iemptylndexy && ilndexy < block_count 1)if( 0 = m_iblockstateilndexy + lilndexx)iemptyl ndexx = iln dexx; iemptylndexy =

28、ilndexy + 1;7、如果找到空位,則將鼠標點擊的方塊精靈移動到該空位上。在二維數(shù)組里,將該索 引對應的值進行交換以及將兩個方塊精靈的名稱交換,然后再將鼠標點擊的精靈移 動到新的位置上。添加下面代碼:/判斷是否找到空位if( -1 = iemptylndexx 11 -1 = iemptylndexy )return;/有空位,在二維數(shù)組里,將該索引對應的值進行交換m_i blockstateiemptylndexy iemptylndexx = m_i blockstateilndexy ilndexx; mblockstateilndexy ilndexx =0;/對應的名字也進行交

29、換int ionelndex = xytoonelndex( iemptylndexx, iemptylndexy);const char* tmpname=m_spblockionelndex->getname();m_spblockionelndex二new csprite(m_spblockiclicklndex->getname(); m_spblockiclicklndex=new cspritef'null");/將該精靈移動到對應的位置movespritetoblock( m_spblockionelndex, iemptylndexx, iemptylndexy );8、最后我們需要在main.cpp中的onmouseclick函數(shù)里面添加對鼠標點擊消息的響應 代碼:g_gamemain .onm ouseclick(imousetype,fmousex,fmousey);至此,本實驗結束。實驗五判斷游戲是否勝利【實驗內(nèi)容】步驟一、循壞遍歷判斷是否勝利步驟二、重新開始游戲【實驗思路】判斷游戲是否勝利主要是看所有方塊的排列順序是否為1至15,并且第16個位置的值 為oo判斷是否勝利的函數(shù)需要程序每次調(diào)用主函數(shù)的時候檢測一次?!緦嶒炛笇А?、進入lessonx.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論