人工智能課程設(shè)計(jì)報(bào)告-俄羅斯方塊_第1頁
人工智能課程設(shè)計(jì)報(bào)告-俄羅斯方塊_第2頁
人工智能課程設(shè)計(jì)報(bào)告-俄羅斯方塊_第3頁
人工智能課程設(shè)計(jì)報(bào)告-俄羅斯方塊_第4頁
人工智能課程設(shè)計(jì)報(bào)告-俄羅斯方塊_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1.1 項(xiàng)目名稱俄羅斯方塊游戲1.2 設(shè)計(jì)平臺Visual C+ 6.0, 它是以C+語言作為其基本語言的一種可視化編程工具。1.3程序設(shè)計(jì)思想從游戲的基本玩法出發(fā),主要就是俄羅斯方塊的形狀和旋轉(zhuǎn),我們在設(shè)計(jì)中在一個(gè)圖片框中構(gòu)造了一個(gè)4*4的網(wǎng)狀小塊,由這些小塊組合成新的形狀,每四個(gè)小塊連接在一起就可以構(gòu)造出一種造型,因此我們總共設(shè)計(jì)了7中造型,每種造型又可以通過旋轉(zhuǎn)而變化出2到4種形狀,利用隨機(jī)函數(shù)在一個(gè)預(yù)覽窗體中提前展示形狀供用戶參考,然后將展示的形狀復(fù)制到游戲窗體中進(jìn)行擺放,在游戲窗體中用戶就可以使用鍵盤的方向鍵來控制方塊的運(yùn)動,然后利用遞歸語句對每一行進(jìn)行判斷,如果有某行的方塊是滿的,

2、則消除這行的方塊,并且使上面的方塊自由下落,其中,方塊向下的速度是有時(shí)鐘控件控制的,在游戲中,用戶也可以使用向下鍵加快下落速度,定義一個(gè)變量,對消除的函數(shù)進(jìn)行記錄,最后就可以得出用戶的分?jǐn)?shù),用if 語句對分?jǐn)?shù)判斷,達(dá)到一定的積分就可以升級到下一個(gè)檔次。俄羅斯方塊游戲設(shè)計(jì)的主要步驟為以下6個(gè)方面:(1)游戲界面的設(shè)計(jì)。(2)俄羅斯方塊的造型。(3)俄羅斯方塊的旋轉(zhuǎn)。(4)俄羅斯方塊的運(yùn)動情況(包括向左,向右和向下)。(5)俄羅斯方塊的自動消行功能。當(dāng)不同的方塊填滿一行時(shí)可以消行,剩余方塊向下移動并統(tǒng)計(jì)分?jǐn)?shù)。(6)游戲得分的計(jì)算。當(dāng)達(dá)到一定的分?jǐn)?shù)時(shí)過關(guān)。設(shè)置六關(guān),每關(guān)方塊下落的速度不同。1.4主要

3、實(shí)現(xiàn)的功能我們開發(fā)的俄羅斯方塊游戲,主要實(shí)現(xiàn)了以下幾種功能:1.可以靈活控制方塊在圖形框中運(yùn)動。2.游戲過程中方塊可以自由旋轉(zhuǎn)。3.當(dāng)某一行的方塊排列滿時(shí),將自動將這一行方塊消除,然后將上面所有方塊向下移動,可以支持連續(xù)消行。4.游戲前可以選擇游戲的速度和游戲的等級,游戲速度既為方塊下落速度,游戲等級為初始游戲時(shí)在基層隨機(jī)生成一定行數(shù)的無規(guī)律方塊,對于游戲高手來說,無疑不是一個(gè)新的挑戰(zhàn)。2.1 需求分析隨著信息技術(shù)的迅速發(fā)展,給人們帶來了各種各樣的信息和更多更新的娛樂。其中游戲又最為常見和普遍。所以我們實(shí)現(xiàn)了一個(gè)俄羅斯方塊的小游戲,來對所學(xué)到的知識進(jìn)行實(shí)踐。2.2 關(guān)于游戲界面我們制作了一個(gè)良

4、好的用戶界面,有關(guān)數(shù)顯示和分?jǐn)?shù)顯示。讓方塊在一定的區(qū)域內(nèi)運(yùn)動和變形,該區(qū)域用一種顏色表明,既用一種顏色作為背景,最好設(shè)為黑色。還需用另一種顏色把黑色圍起來,寬度適中,要實(shí)現(xiàn)美感。方塊下落時(shí),可通過鍵盤方向鍵(上、下、左、右鍵)對該方塊進(jìn)行向上(變形),向下(加速)、向左、向右移動。2.3 游戲的數(shù)據(jù)結(jié)構(gòu) 相信大家都玩過俄羅斯方塊,對這個(gè)游戲的玩法和方塊形狀都比較熟悉。我們這個(gè)游戲只選擇了最基本的7中造型,包括長條型,正方型,正S型,反S型,正7型,反7型,T型。在旋轉(zhuǎn)的過程中我們以逆時(shí)針旋轉(zhuǎn)為基礎(chǔ)。為此,我們對于方塊在某一瞬間的位置標(biāo)識,采用一個(gè)42的小數(shù)組標(biāo)識出來,即用4個(gè)存儲單位空間存儲當(dāng)

5、前下墜物的每一子塊的位置,也就是說,用4個(gè)存儲單位空間存儲當(dāng)前下墜物的每一子塊的位置來對整個(gè)下墜物件的位置進(jìn)行標(biāo)識,而每個(gè)存儲空間的大小就是一個(gè)點(diǎn)的坐標(biāo)值(x,y),而每個(gè)方塊按照從左到右的方式進(jìn)行編號,并且在編號過程中對于同一列的方塊實(shí)行從上到下進(jìn)行編號。123ActiveStatus00和ActiveStatus01則是第0號方塊的橫坐標(biāo)x和縱坐標(biāo)y ;ActiveStatus20和ActiveStatus21則是第2號方塊的橫坐標(biāo)x和縱坐標(biāo)y。(x0,y0)(x1,y1)(x2,y2)(x3,y3)2.3 創(chuàng)建主框架 首先建立一個(gè)項(xiàng)目工程,名為skyblue_Rect,并在AppWiza

6、rd的架構(gòu)選擇過程中選擇單文檔方式,其他保持默認(rèn)選項(xiàng)。其項(xiàng)目的架構(gòu)類視圖信息如圖所示: 在構(gòu)架類視圖中是MFC基本架構(gòu)組合:App(應(yīng)用程序)類、Document(文檔)類、View(視圖)類、Frame(框架)類和用于提示關(guān)于作者的對話框CAboutDlg類,至于COptionDlg類是用作俄羅斯方塊參數(shù)選擇的對話框類對象。 2.4 游戲區(qū)域繪圖首先將外部位圖文件rect.bmp中的位圖動態(tài)導(dǎo)入(映射)到內(nèi)存位圖里面,根據(jù)游戲區(qū)域中的二維數(shù)組GameStatusMAX_ROWMAX_COL中的內(nèi)部數(shù)據(jù)將所有數(shù)據(jù)狀態(tài)中為被占用狀態(tài)MAP_STATE_NOT_EMPTY的小方塊區(qū)域用指定的小方塊

7、圖樣類型來填充,然后將已經(jīng)繪制好的游戲區(qū)域圖像一次性的拷貝到與屏幕關(guān)聯(lián)的設(shè)備環(huán)境中,從而達(dá)到屏幕的顯示。2.5 游戲設(shè)計(jì)分析我先虛擬出俄羅斯方塊游戲的類對象,并抽象出核心的數(shù)據(jù)屬性和操作方法等,然后再作細(xì)化,最后將整個(gè)虛擬類的外殼脫掉,再移植到視圖類中去,其實(shí)現(xiàn)如下:CRectGameView : public CView/內(nèi)部存取數(shù)據(jù)結(jié)構(gòu)int m_stateMapMAX_ROWMAX_COL;/初始化操作GameInitnal(); /游戲的初始化/用于判斷數(shù)據(jù)相關(guān)狀態(tài)的操作IsLeftLimit(); /下墜物件是否可向左移動IsRightLitmit(); /IsBottom(); /

8、是否已經(jīng)到達(dá)了底部IsGameEnd(); /是否游戲已經(jīng)結(jié)束/方塊物件下墜過程中的操作RectChange(); /下墜物件變形RectDown(); /下墜物件正常下落RectArrow(); /下墜物件方向移動(左,右,下加速) /狀態(tài)控制操作GameStart(); /游戲開始GamePause(); /游戲暫停GameEnd(); /游戲結(jié)束2.6正常流程設(shè)計(jì) (1)定時(shí)制機(jī)制 從分析游戲的特性可以知道,定時(shí)器的產(chǎn)生與生效應(yīng)該在游戲開始的時(shí)候,而在游戲暫?;蛘哂螒蚪Y(jié)束時(shí)則將已經(jīng)設(shè)定的定時(shí)器失效/銷亡(對于暫停的情況,使它銷亡,當(dāng)游戲從暫停狀態(tài)又進(jìn)入游戲狀態(tài)時(shí)候,則重新創(chuàng)建一個(gè)定時(shí)器并

9、激活它的運(yùn)作),所以分別在游戲的開始函數(shù)、暫停函數(shù)已經(jīng)結(jié)束函數(shù)中實(shí)現(xiàn)定時(shí)器的激活與去激活工作。這里,先在資源編輯器菜單資源里面添加三個(gè)菜單選項(xiàng),分別是游戲的“開始”、“暫停”、和“結(jié)束”,然后利用ClassWizard直接在視圖類對象Cskyblue_RectView中為它們添加空白的處理函數(shù),(2)定時(shí)處理 經(jīng)過定時(shí)器的設(shè)置后,這里通過利用ClassWizard跳到定時(shí)器到時(shí)候的處理函數(shù)OnTimer()去實(shí)現(xiàn),當(dāng)固定時(shí)間片間隔到達(dá)后,先檢測當(dāng)前下墜物是否已經(jīng)到達(dá)了底部,不是則進(jìn)行RectDown()下墜物向下移動一個(gè)單位的操作,是則到底后產(chǎn)生一個(gè)新的“下一個(gè)下墜物”,并代替舊的,將原先舊的

10、“下一個(gè)下墜物”用作當(dāng)前激活狀態(tài)下正在使用的下墜物,并對使用后的一些狀態(tài)進(jìn)行檢測:是否馬上到達(dá)底部,使則進(jìn)行銷行操作;是否在到達(dá)底部的同時(shí)到達(dá)游戲區(qū)域的頂部,從而判定游戲是否因違規(guī)而結(jié)束。 產(chǎn)生的隨機(jī)數(shù)函數(shù):int CSkyblue_RectView:Random(int MaxNumber)/部下隨機(jī)種子srand( (unsigned)time( NULL ) );/產(chǎn)生隨機(jī)數(shù)int random = rand() % MaxNumber;/保證非0if(random = 0 ) random+;return random;視圖類創(chuàng)建了m_icurrentStatus和m_inextSta

11、tus兩個(gè)成員變量來記錄下墜物的類型,共有七種形狀,并從7種方塊中隨機(jī)抽取圖形。而m_currentRect除了記錄下墜物的類型外,還需記錄其當(dāng)前的變形狀態(tài),最多用兩位表示,第1位用作類型標(biāo)識(17),第2位用作同種類型的不同表現(xiàn)方式,最多有4種狀態(tài)(14)。 在產(chǎn)生新的下一個(gè)下墜物前,需要先將當(dāng)前狀態(tài)物的記錄和舊的下一個(gè)下墜物保存下來,然后用隨機(jī)函數(shù)Random()產(chǎn)生一個(gè)最大值不大于指定值的隨機(jī)正整數(shù),將這個(gè)新生成的正整數(shù)用作新的“下一個(gè)下墜物”的形狀值。(3)底部到達(dá)的判斷與銷行的實(shí)現(xiàn)將新的下墜物放置到游戲區(qū)域中去,這時(shí)可能出現(xiàn)馬上到達(dá)底部的情況,因此需要對它進(jìn)行判斷,如果是到達(dá)底部,則

12、進(jìn)行銷行處理,并且修改相應(yīng)的數(shù)據(jù)狀態(tài)。而判斷是否已經(jīng)到達(dá)了底部,可以通過當(dāng)前下墜物件所對應(yīng)的接觸面的方塊位置為被占用狀態(tài)(MAP_STATE_NOT_EMPTY=1)來確定,利用數(shù)組InterFace744記錄17種下墜物的14種形態(tài)的接觸面信息。統(tǒng)計(jì)分?jǐn)?shù):在消行處理里面有一個(gè)專門用來統(tǒng)計(jì)消行數(shù)的變量,然后根據(jù)變量的值決定分?jǐn)?shù)的多少,程序統(tǒng)計(jì)分?jǐn)?shù)是:消一行得100分,同時(shí)消2行得400分,銷掉x行,則分?jǐn)?shù)為:x*(x*100)。如果總分?jǐn)?shù)達(dá)到過關(guān)條件就過關(guān),改變游戲速度,游戲初始化,開啟新的一關(guān),然后再加載方塊。沒有達(dá)到過關(guān)分?jǐn)?shù)或者沒有滿行,則加載下一個(gè)方塊繼續(xù)游戲。檢測游戲區(qū)域中的所有行,并

13、對每行的所有縱列狀態(tài)進(jìn)行檢測,如果其中有一列是空閑狀態(tài)則不可以銷行。如果可以銷行的話,將增加單位分?jǐn)?shù),并且將該行清空,再將該行上面的所有物件都向下偏移一個(gè)單位,以填充該行的空缺。例銷行與積分if (m_isBottom)/判斷是否已得分for (i=0;im_iRow;i+)m_bIsSucced = TRUE;for (j=0;j0;k-)for (j=0;jm_iCol;j+)GameStatuskj = GameStatusk-1j;/第1行清零for (j=0;j0) & IsLeftLimit() & !m_isBottom)/清原來的方塊GameStatusx1y1=MAP_STA

14、TE_EMPTY;GameStatusx2y2=MAP_STATE_EMPTY;GameStatusx3y3=MAP_STATE_EMPTY;GameStatusx4y4=MAP_STATE_EMPTY;/InvalidateCurrent();/添加新的移動后數(shù)據(jù)狀態(tài)ActiveStatus01 -= 1;ActiveStatus11 -= 1;ActiveStatus21 -= 1;ActiveStatus31 -= 1;GameStatusx1y1-1=MAP_STATE_NOT_EMPTY;GameStatusx2y2-1=MAP_STATE_NOT_EMPTY;GameStatusx

15、3y3-1=MAP_STATE_NOT_EMPTY;GameStatusx4y4-1=MAP_STATE_NOT_EMPTY;InvalidateCurrent();Break;case RIGHT:if ( (ActiveStatus31 m_iCol-1) & IsRightLitmit() & !m_isBottom)/清原來的方塊GameStatusx1y1=MAP_STATE_EMPTY;GameStatusx2y2=MAP_STATE_EMPTY;GameStatusx3y3=MAP_STATE_EMPTY;GameStatusx4y4=MAP_STATE_EMPTY;/Inval

16、idateCurrent();/添加新的移動后數(shù)據(jù)狀態(tài)ActiveStatus01 += 1;ActiveStatus11 += 1;ActiveStatus21 += 1;ActiveStatus31 += 1;GameStatusx1y1+1=MAP_STATE_NOT_EMPTY;GameStatusx2y2+1=MAP_STATE_NOT_EMPTY;GameStatusx3y3+1=MAP_STATE_NOT_EMPTY;GameStatusx4y4+1=MAP_STATE_NOT_EMPTY;InvalidateCurrent();break;case DOWN:RectDown();break; 2.9 游戲主界面 游戲設(shè)置界面 2.8總結(jié) 著手開始做的時(shí)候,發(fā)現(xiàn)很多東西并不容易實(shí)現(xiàn)。比如:如何顯示每一個(gè)俄羅斯小方塊,如何預(yù)測下一個(gè)俄羅斯小方塊,如何控制每一個(gè)方塊的下落速度,如何判斷俄羅斯方塊是否可以停止,如何通過鍵

溫馨提示

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

最新文檔

評論

0/150

提交評論