俄羅斯方塊課程設(shè)計(jì).doc

上傳人:小** 文檔編號(hào):23328744 上傳時(shí)間:2021-06-07 格式:DOC 頁(yè)數(shù):27 大?。?76.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
俄羅斯方塊課程設(shè)計(jì).doc_第1頁(yè)
第1頁(yè) / 共27頁(yè)
俄羅斯方塊課程設(shè)計(jì).doc_第2頁(yè)
第2頁(yè) / 共27頁(yè)
俄羅斯方塊課程設(shè)計(jì).doc_第3頁(yè)
第3頁(yè) / 共27頁(yè)

下載文檔到電腦,查找使用更方便

5 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《俄羅斯方塊課程設(shè)計(jì).doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《俄羅斯方塊課程設(shè)計(jì).doc(27頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 附件1: 攀枝花學(xué)院 學(xué)生課程設(shè)計(jì)(論文) 題 目: 俄羅斯方塊 學(xué)生姓名: 陳小蝶 學(xué) 號(hào): 201310804005 所在院(系): 數(shù)學(xué)與計(jì)算機(jī)學(xué)院 專 業(yè): 2013級(jí)軟件工程 班 級(jí): 軟件工程1班 指 導(dǎo) 教 師: 張會(huì) 職稱: 2014年6 月 23日

2、 攀枝花學(xué)院教務(wù)處制 攀枝花學(xué)院本科學(xué)生課程設(shè)計(jì)任務(wù)書(shū) 題 目 俄羅斯方塊 1、課程設(shè)計(jì)的目的 通過(guò)本課程設(shè)計(jì)使學(xué)生能夠較全面的掌握面向?qū)ο蟪绦蛟O(shè)計(jì)的有關(guān)概念和開(kāi)發(fā)方法,以便能較全面地理解、掌握和綜合運(yùn)用所學(xué)的知識(shí),提高自身的編程能力。 2、課程設(shè)計(jì)的內(nèi)容和要求(包括原始數(shù)據(jù)、技術(shù)要求、工作要求等) 實(shí)現(xiàn)一個(gè)俄羅斯游戲,要求: (1)盡量使用圖形用戶界面方式實(shí)現(xiàn)(不作硬性要求) (2)可以實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn),自動(dòng)判斷勝負(fù) (3)界面美觀 3、主要參考文獻(xiàn) 4、課程設(shè)計(jì)工作進(jìn)度計(jì)劃 序號(hào) 時(shí)間(天) 內(nèi)容安排 備注 1 1 分析設(shè)計(jì)準(zhǔn)備

3、 周一 2 2 編程調(diào)試階段 周 至周三 3 1 編寫(xiě)課程設(shè)計(jì)報(bào)告 周四 4 1 考核 周五 總計(jì) 5(天) 指導(dǎo)教師(簽字) 日期 年 月 日 教研室意見(jiàn): 年 月 日 學(xué)生(簽字): 接受任務(wù)時(shí)間: 年 月 日 注:任務(wù)書(shū)由指導(dǎo)教師填寫(xiě)。 附件3: 課程設(shè)計(jì)(論文)指導(dǎo)教師成績(jī)?cè)u(píng)定表 題目名稱 評(píng)分項(xiàng)目 分值 得分 評(píng)價(jià)內(nèi)涵 工作 表現(xiàn) 20% 01 學(xué)習(xí)態(tài)度 6 遵守各項(xiàng)紀(jì)律,工作刻苦努力,具有良好的科學(xué)工作態(tài)度。

4、02 科學(xué)實(shí)踐、調(diào)研 7 通過(guò)實(shí)驗(yàn)、試驗(yàn)、查閱文獻(xiàn)、深入生產(chǎn)實(shí)踐等渠道獲取與課程設(shè)計(jì)有關(guān)的材料。 03 課題工作量 7 按期圓滿完成規(guī)定的任務(wù),工作量飽滿。 能力 水平 35% 04 綜合運(yùn)用知識(shí)的能力 10 能運(yùn)用所學(xué)知識(shí)和技能去發(fā)現(xiàn)與解決實(shí)際問(wèn)題,能正確處理實(shí)驗(yàn)數(shù)據(jù),能對(duì)課題進(jìn)行理論分析,得出有價(jià)值的結(jié)論。 05 應(yīng)用文獻(xiàn)的能力 5 能獨(dú)立查閱相關(guān)文獻(xiàn)和從事其他調(diào)研;能提出并較好地論述課題的實(shí)施方案;有收集、加工各種信息及獲取新知識(shí)的能力。 06 設(shè)計(jì)(實(shí)驗(yàn))能力,方案的設(shè)計(jì)能力 5 能正確設(shè)計(jì)實(shí)驗(yàn)方案,獨(dú)立進(jìn)行裝置安裝、調(diào)試

5、、操作等實(shí)驗(yàn)工作,數(shù)據(jù)正確、可靠;研究思路清晰、完整。 07 計(jì)算及計(jì)算機(jī)應(yīng)用能力 5 具有較強(qiáng)的數(shù)據(jù)運(yùn)算與處理能力;能運(yùn)用計(jì)算機(jī)進(jìn)行資料搜集、加工、處理和輔助設(shè)計(jì)等。 08 對(duì)計(jì)算或?qū)嶒?yàn)結(jié)果的分析能力(綜合分析能力、技術(shù)經(jīng)濟(jì)分析能力) 10 具有較強(qiáng)的數(shù)據(jù)收集、分析、處理、綜合的能力。 成果 質(zhì)量 45% 09 插圖(或圖紙)質(zhì)量、篇幅、設(shè)計(jì)(論文)規(guī)范化程度 5 符合本專業(yè)相關(guān)規(guī)范或規(guī)定要求;規(guī)范化符合本文件第五條要求。 10 設(shè)計(jì)說(shuō)明書(shū)(論文)質(zhì)量 30 綜述簡(jiǎn)練完整,有見(jiàn)解;立論正確,論述充分,結(jié)論嚴(yán)謹(jǐn)合理;實(shí)驗(yàn)正確,分析處理科學(xué)。

6、 11 創(chuàng)新 10 對(duì)前人工作有改進(jìn)或突破,或有獨(dú)特見(jiàn)解。 成績(jī) 指導(dǎo)教師評(píng)語(yǔ) 指導(dǎo)教師簽名: 年 月 日 摘 要 近年來(lái),隨著游戲產(chǎn)業(yè)的突飛猛進(jìn),游戲玩家的技術(shù)也是與日俱增,當(dāng)你看見(jiàn)游戲高手完美的表演時(shí),你是否想過(guò)我也能達(dá)到那種水平,本程序采用全世界最金典的游戲—俄羅斯方塊作為背景,程序設(shè)置了鼠標(biāo)和鍵盤兩個(gè)選擇方式,游戲運(yùn)行時(shí)隨著等級(jí)的提高而速度加快,這需要玩家快速操作。因此,本程序主要意義是為高手玩家提供訓(xùn)練平臺(tái)。其次也

7、可為剛踏入游戲領(lǐng)域的新手們,提供一個(gè)很好的鍛煉機(jī)會(huì)。 本次課程設(shè)計(jì)主要解決利用Visual C++設(shè)計(jì)實(shí)現(xiàn)俄羅斯方塊游戲的算法、游戲內(nèi)部功能、游戲區(qū)域的繪圖的程序設(shè)計(jì)。對(duì)于每個(gè)俄羅斯方塊各自的形態(tài)變化改變到下一個(gè)形態(tài)利用數(shù)組來(lái)實(shí)現(xiàn),在程序設(shè)計(jì)中,采用WIN32機(jī)制來(lái)實(shí)現(xiàn),并且直接從架構(gòu)的其中一個(gè)類對(duì)象中繼承下來(lái),將它完善而變成有某功能特性的物件對(duì)象。 關(guān)鍵詞 俄羅斯方塊 數(shù)據(jù)結(jié)構(gòu) 算法 數(shù)組 Visual C++ 目 錄 摘 要………………………………………………………………………………………Ⅰ 一、 緒論………………………

8、…………………………………………………………2 1.1 課題背景………………………………………………………………………………2 二、課程設(shè)計(jì)的要求與目的……………………………………………………3 2.1 課程設(shè)計(jì)的要求………………………………………………………3 2.2課程設(shè)計(jì)的目的…………………………………………………………3三、程序需求分析 3.1 功能需求………………………………………………………………………………… 3.2方塊及各種變化需求…………………………………………………………………… 3.3操作需求 3.31 向上鍵…………………………………………………

9、………………………………… 3.32向下鍵…………………………………………………………………………………… 3.33向右鍵…………………………………………………………………………………. 四、程序流程圖 4.1 主要功能設(shè)計(jì)………………………………………………………………………… 4.2 程序流程圖…………………………………………………………………………… 4.3 游戲界面……………………………………………………………………………… 4.4生成方塊…………………………………………………………………………… 4.5 方塊變形……………………………………

10、………………………………………… 4.6 方塊顯示…………………………………………………………………………… 4.7 障礙判斷……………………………………………………………………………… 4.8 消行記分……………………………………………………………………………… 4.9 暫停退出……………………………………………………………………………… 4.10 軟件使用說(shuō)明…………………………………………………………………………… 五、源程序代碼 5.1 源程序代碼……………………………………………………………………………… 六、程序結(jié)果 6.1 程序結(jié)果………

11、………………………………………………………………………… 參考文獻(xiàn)……………………………………………………………………………………… 致 謝……………………………………………………………………………………………56 第一章 緒論 俄羅斯方塊是個(gè)老幼皆宜的小游戲,是經(jīng)久不衰的一款游戲,自從它誕生那天起就一直深受人們的喜愛(ài)。幾乎每個(gè)人都玩過(guò)這個(gè)游戲,也是人們接觸最多的一款游戲,它實(shí)現(xiàn)由四塊正方形的色塊組成,然后存儲(chǔ)在一個(gè)數(shù)組的四個(gè)元素中,計(jì)算機(jī)隨機(jī)產(chǎn)生不同七種類型的方塊,根據(jù)計(jì)算機(jī)時(shí)鐘控制

12、它在一定的時(shí)間不停得產(chǎn)生,用戶根據(jù)鍵盤的四個(gè)方向翻轉(zhuǎn)、向左、向右和向下操作,(控制鍵的實(shí)現(xiàn)是由鍵盤的方向鍵消息函數(shù)實(shí)現(xiàn))。然后程序根據(jù)這七種方塊堆疊成各種不停得模型。 1.1游戲的背景 俄羅斯方塊是一款風(fēng)靡全球的電視游戲機(jī)和掌上游戲機(jī)游戲,它曾造成的轟動(dòng)與造成的經(jīng)濟(jì)價(jià)值可言說(shuō)是游戲史上的一件大事。這款游戲最初是由蘇聯(lián)的游戲制作人Alex Pajitnov制作的,它看似簡(jiǎn)單但卻變化無(wú)窮,令人上癮。相信大多數(shù)用戶都還記得為它癡迷得茶飯不思不想的那個(gè)俄羅斯方塊時(shí)代。 俄羅斯方塊最早還是出現(xiàn)在PC機(jī)上,而我國(guó)的用戶都是通過(guò)紅白機(jī)了解、喜歡上它的?,F(xiàn)在聯(lián)眾又將重新掀起這股

13、讓人沉迷的俄羅斯方塊風(fēng)潮。對(duì)于一般用戶來(lái)說(shuō),它的規(guī)則簡(jiǎn)單,容易上手,且u、游戲過(guò)程變化無(wú)窮,俄羅斯方塊游戲現(xiàn)在基本上是每個(gè)手機(jī)必備的游戲,種類千變?nèi)f化,多種多樣。 第二章 課程設(shè)計(jì)的目的與要求 2.1課程設(shè)計(jì)的目的 本課程是一個(gè)綜合性的實(shí)踐教學(xué)環(huán)節(jié),其目的在于促進(jìn)學(xué)生復(fù)習(xí)和鞏固計(jì)算機(jī)軟件設(shè)計(jì)知識(shí),加深對(duì)軟件設(shè)計(jì)方法、軟件設(shè)計(jì)技術(shù)和設(shè)計(jì)思想的理解,并能運(yùn)用所學(xué)知識(shí)進(jìn)行開(kāi)發(fā)。希望通過(guò)本課程設(shè)計(jì)中簡(jiǎn)單系統(tǒng)的開(kāi)發(fā),使學(xué)生掌握軟件設(shè)計(jì)的基本方法和基本的流程,提高學(xué)生的綜合應(yīng)用能力。 2.2課程設(shè)計(jì)的要求 要求用VC++編寫(xiě)與實(shí)現(xiàn)俄羅斯方塊。 要求包括系統(tǒng)

14、的需求分析; 系統(tǒng)總框圖及每個(gè)模塊的設(shè)計(jì)分析; 算法的設(shè)計(jì)與實(shí)現(xiàn); 游戲的內(nèi)部實(shí)現(xiàn); 游戲區(qū)域繪畫(huà)的實(shí)現(xiàn); 系統(tǒng)存在的問(wèn)題及錯(cuò)誤處理; 列出所有定義的函數(shù)及說(shuō)明; 附上源程序; 第三章 程序需求分析 3.1 功能需求 隨機(jī)給出不同的形狀下落填充給定的區(qū)域,若填滿一條便消掉,記分,設(shè)計(jì)不同的游戲難度,即方塊下落的速度不同,若在游戲中各形狀填滿了給定區(qū)域?yàn)檩斦摺? 3.2 方塊及各種變換需求 本游戲需要七種方塊,而每種方塊還可以進(jìn)行旋轉(zhuǎn)。每種方塊每行每列最多只有4個(gè)小方塊??梢詫⑺鼈兎旁谝粋€(gè)n*m的區(qū)域內(nèi),該區(qū)域可以看做是有許多個(gè)等面積小方塊構(gòu)成的區(qū)域,而這些區(qū)域的狀態(tài)

15、只有兩種,被方塊占據(jù)或空閑。因此,對(duì)于整個(gè)游戲區(qū)域的空間是被占據(jù)或空閑,可以用一位數(shù)來(lái)標(biāo)識(shí)。對(duì)于七種方塊和它們旋轉(zhuǎn)后的形態(tài)我們可以用不同的標(biāo)識(shí)進(jìn)行標(biāo)記。對(duì)于旋轉(zhuǎn),游戲中所有方塊都是按照逆時(shí)針旋轉(zhuǎn)的規(guī)則進(jìn)行的,而且在旋轉(zhuǎn)過(guò)程中它們不會(huì)因?yàn)樾D(zhuǎn)而下降,總會(huì)保持在同一高度。任何方塊經(jīng)過(guò)一個(gè)旋轉(zhuǎn)周期還會(huì)變 回原型。 3.3 操作需求 3.31 向上鍵 產(chǎn)生方塊旋轉(zhuǎn)操作,方塊并非任何情況都能旋轉(zhuǎn),如果旋轉(zhuǎn)后與小方塊矩陣顯示的方塊有沖突或超出邊界是,均不發(fā)生旋轉(zhuǎn)。因此首先要判斷是否有足夠的空間進(jìn)行旋轉(zhuǎn)。然后是旋轉(zhuǎn)是否旋轉(zhuǎn)。 3.32 向下鍵 產(chǎn)生方塊加速下落操作,如果方塊已經(jīng)

16、達(dá)到游戲區(qū)域底部或者有其他方塊遮擋,則方塊停止下降。 3.33 向右鍵 產(chǎn)生下落方塊右移操作。首先要判斷此方塊是否能夠發(fā)生右移,當(dāng)越界或被其他顯示方塊阻擋時(shí),則不能右移。 第四章 詳細(xì)設(shè)計(jì) 4.1 主要功能設(shè)計(jì) 根據(jù)分析,俄羅斯方塊這個(gè)程序一共要實(shí)現(xiàn)如下幾個(gè)功能,開(kāi)始游戲(F8)、游戲的暫停\繼續(xù)(S)和退出游戲(Q)。其中游戲控制最為主要和重要,它控制著整個(gè)游戲的畫(huà)面和有關(guān)數(shù)據(jù)的操作,是游戲的核心部分。暫停和退出功能做成一體,在退出的提示下不做任何操作即可實(shí)現(xiàn)暫停的功能。 4.2 程序流程圖 根據(jù)分析后的程序結(jié)構(gòu)圖設(shè)計(jì)出相應(yīng)的流程圖。俄羅斯

17、方塊的內(nèi)容主要包括游戲開(kāi)始,畫(huà)背景和邊框,顯示分?jǐn)?shù)等級(jí)和下一個(gè)方塊的預(yù)覽圖;根據(jù)速度沒(méi)隔一定時(shí)間方塊自動(dòng)下落,當(dāng)有按鍵操作時(shí),根據(jù)相應(yīng)按鍵執(zhí)行動(dòng)作,每次動(dòng)作前要判斷是否動(dòng)作可以執(zhí)行。下落方塊滿一行時(shí),消去該行,根據(jù)消去行數(shù)得到相應(yīng)分?jǐn)?shù)。分?jǐn)?shù)達(dá)到一定程度,等級(jí)提升,速度加快。同時(shí)可以響應(yīng)Esc按鍵,提示是否退出程序。 4.3 游戲界面 俄羅斯方塊的游戲界面包括游戲區(qū)域邊框、下落方塊繪制、右部計(jì)分和預(yù)覽圖顯示等。 游戲區(qū)域邊框的繪制比較簡(jiǎn)單,循環(huán)中確定光標(biāo)的位置輸出特定字符,即可完成邊框繪制。游戲區(qū)方塊的繪制,循環(huán)從數(shù)據(jù)數(shù)組中依次讀出數(shù)據(jù),根據(jù)讀到的數(shù)據(jù)顯示

18、“□”,最后組成方塊的形狀,完成方塊的繪制。計(jì)分和預(yù)覽圖部分先畫(huà)出一個(gè)矩形區(qū)域,然后控制光標(biāo)在其中顯示分?jǐn)?shù)、等級(jí)、預(yù)覽圖和提示信息。 4.4 生成方塊 本程序中生成的方塊有7種形狀,每一種方塊以shapeindex標(biāo)記,在程序運(yùn)行生成方塊時(shí),調(diào)用shapeindex=rand()%5+1;語(yǔ)句,確定當(dāng)前要顯示的是哪一個(gè)方塊形狀。而在實(shí)際運(yùn)行中,第一次需要調(diào)用兩次生成方塊函數(shù)make(),將先產(chǎn)生的賦給游戲當(dāng)前方塊,第二個(gè)賦給預(yù)覽圖方塊。以后每次產(chǎn)生一個(gè)方塊,把預(yù)覽方塊賦給當(dāng)前方塊,把新產(chǎn)生的賦給預(yù)覽方塊。 4.5 方塊變形

19、 俄羅斯方塊的特點(diǎn)就在于通過(guò)方塊的變形拼滿整行來(lái)消去該行方塊從而使游戲可以繼續(xù)下去,很難想象不能變形的俄羅斯方塊是什么樣子。而變形的過(guò)程就是根據(jù)當(dāng)前方塊形狀改變方塊的相對(duì)位置,這樣就可以改變方塊的形狀了。在程序中每當(dāng)按下“↑”鍵,程序判斷可以變形后,根據(jù)當(dāng)前方塊的形狀序號(hào)shapeindex和變化形狀序號(hào)changeindex調(diào)用相應(yīng)的方塊數(shù)值賦給draw()函數(shù),通過(guò)刷新重畫(huà)就可以顯示變化后的方塊了。 4.6 方塊顯示 以上方塊的操作都是數(shù)據(jù)層面的操作,而真正要在游戲窗口中看到數(shù)據(jù)的變化,還必須把方塊不斷的繪制出來(lái)。這就是draw()函數(shù)的作用。把當(dāng)前運(yùn)動(dòng)的方塊對(duì)應(yīng)節(jié)點(diǎn)存儲(chǔ)在一個(gè)4*4

20、數(shù)組里,變形和生成方塊的過(guò)程就是更新該數(shù)組數(shù)據(jù)的過(guò)程。然后在draw()函數(shù)里檢測(cè)數(shù)組的各個(gè)值,并控制光標(biāo)跳到一定位置,畫(huà)出“□”組成方塊。 4.7 障礙判斷 障礙判斷,就是在方塊運(yùn)動(dòng)中或者變形中判斷周圍是否有障礙阻礙下落、移位、變形。當(dāng)方塊下落遇到下面有方塊或者到達(dá)下邊界則應(yīng)停止下落并記錄數(shù)據(jù),存入背景數(shù)據(jù)數(shù)組。變形時(shí)應(yīng)判斷這個(gè)變形是否可以進(jìn)行,如果有障礙則不能變形。例如當(dāng)方塊達(dá)到右邊界,而若變形則會(huì)越過(guò)邊界,那么這個(gè)變形的命令是不應(yīng)執(zhí)行的。所有這些判斷都由meet()函數(shù)進(jìn)行,根據(jù)是否有障礙返回1或0,再由其他函數(shù)接收?qǐng)?zhí)行相應(yīng)操作。 4.8 消行計(jì)分

21、 游戲玩家拼滿一行后,程序消去滿行,并計(jì)分。中當(dāng)一個(gè)方塊下落停止后,程序檢查方塊是否充滿了游戲區(qū)域,如果是結(jié)束游戲。不是,則判斷是否構(gòu)成消行條件,從下落方塊的最低點(diǎn)依次向上檢查是否可以消行,根據(jù)消去行數(shù)分?jǐn)?shù)增加。分?jǐn)?shù)達(dá)到一定程度,等級(jí)提升,分?jǐn)?shù)暫定為每1000升一級(jí)。 4.9 暫停退出 游戲的友好性在于能考慮用戶的需要,隨時(shí)可以暫停/繼續(xù)游戲,在不愿繼續(xù)游戲時(shí)退出游戲。本程序可以在用戶需要的時(shí)候響應(yīng)Esc按鍵,提示是否退出游戲,如果不做選擇即可暫停游戲,等待選擇。 程序調(diào)試 經(jīng)過(guò)調(diào)試和修改,程序完全實(shí)現(xiàn)設(shè)計(jì)要求,成功模擬了俄羅斯方塊的運(yùn)行過(guò)程和游戲效果,只是界面略微簡(jiǎn)陋,但已從程序

22、層面上實(shí)現(xiàn)了游戲,達(dá)到了這次實(shí)訓(xùn)的要求和目的。程序正常生成方塊,根據(jù)速度值每隔一定時(shí)間自動(dòng)下落,如有操作按鍵按下,根據(jù)按鍵實(shí)現(xiàn)位移和變形。當(dāng)方塊滿一行后,可以消除該行,同時(shí)記錄分?jǐn)?shù)和等級(jí)。按下Esc鍵紅色提示信息正常顯示,可以響應(yīng)Y,N鍵決定是否退出游戲 4.10 軟件使用說(shuō)明 打開(kāi)俄羅斯方塊游戲后,通過(guò)控制方向區(qū)域的“↑”、“↓”、“←”、“→”來(lái)控制,“↑”鍵代表變形轉(zhuǎn)換,“↓”、“←”、“右”均代表方向鍵,“Q”代表退出游戲鍵。若想暫停游戲,可通過(guò)“S”鍵,當(dāng)初來(lái)詢問(wèn)框是,可不做選擇,則可達(dá)到暫停的效果 第五章 源代碼 源程序代碼(詳細(xì)的注釋) #include <

23、windows.h> #include #include #include #include class Console { public: Console() { hStdOutput = INVALID_HANDLE_VALUE; hStdError = INVALID_HANDLE_VALUE; } bool Open( void ) { hStdOutput = GetStdHandle

24、( STD_OUTPUT_HANDLE ); hStdError = GetStdHandle( STD_ERROR_HANDLE ); return INVALID_HANDLE_VALUE!=hStdOutput && INVALID_HANDLE_VALUE!=hStdError; } inline bool SetTitle( char* title ) // 設(shè)置標(biāo)題 { return TRUE==SetConsoleTitle(title); } bool RemoveCur

25、sor( void ) // 去處光標(biāo) { CONSOLE_CURSOR_INFO cci; if( !GetConsoleCursorInfo( hStdOutput, &cci ) ) return false; cci.bVisible = false; if( !SetConsoleCursorInfo( hStdOutput, &cci ) ) return false; if( !GetConsoleCursorInfo( hStdError, &cci ) ) retu

26、rn false; cci.bVisible = false; if( !SetConsoleCursorInfo( hStdError, &cci ) ) return false; return true; } bool SetWindowRect( short x, short y ) // 設(shè)置窗體尺寸 { SMALL_RECT wrt = { 0, 0, x, y }; if( !SetConsoleWindowInfo( hStdOutput, TRUE, &w

27、rt ) ) return false; if( !SetConsoleWindowInfo( hStdError, TRUE, &wrt ) ) return false; return true; } bool SetBufSize( short x, short y ) // 設(shè)置緩沖尺寸 { COORD coord = { x, y }; if( !SetConsoleScreenBufferSize( hStdOutput, coord ) ) return false;

28、 if( !SetConsoleScreenBufferSize( hStdError, coord ) ) return false; return true; } bool GotoXY( short x, short y ) // 移動(dòng)光標(biāo) { COORD coord = { x, y }; if( !SetConsoleCursorPosition( hStdOutput, coord ) ) return false; if( !SetConsoleCursorPositi

29、on( hStdError, coord ) ) return false; return true; } bool SetColor( WORD color ) // 設(shè)置前景色/背景色 { if( !SetConsoleTextAttribute( hStdOutput, color ) ) return false; if( !SetConsoleTextAttribute( hStdError, color ) ) return false; return true; }

30、 bool OutputString( const char* pstr, size_t len=0 ) // 輸出字符串 { DWORD n = 0; return TRUE==WriteConsole( hStdOutput, pstr, len?len:strlen(pstr), &n, NULL ); } bool OutputStringNoMove( short x, short y, const char* pstr, size_t len=0 ) // 輸出字符串 { COORD

31、coord = { x, y }; DWORD n = 0; return TRUE==WriteConsoleOutputCharacter( hStdOutput, pstr, len?len:strlen(pstr), coord, &n ); } private: HANDLE hStdOutput; HANDLE hStdError; }; const char bg[] = "┏━━━━━━━━━━━┓ " "┃■■■■■■■■■■■┃ ←↓→↑ "

32、"┃■■■■■■■■■■■┃ Begin: F8 " "┃■■■■■■■■■■■┃ " "┃■■■■■■■■■■■┃ Sleep " "┃■■■■■■■■■■■┃ Quit " "┃■■■■■■■■■■■┃ " "┃■■■■■■■■■■■┃ " "┃■■■■■■■■■■■┃ NEXT " "┃■■■■■■■■■■■┃┏━━━━┓" "┃■■■■■■■■■■■┃┃    ┃" "┃■■■■■■■■■■■┃┃    

33、┃" "┃■■■■■■■■■■■┃┗━━━━┛" "┃■■■■■■■■■■■┃ LEVEL " "┃■■■■■■■■■■■┃┏━━━━┓" "┃■■■■■■■■■■■┃┃ 0┃" "┃■■■■■■■■■■■┃┗━━━━┛" "┃■■■■■■■■■■■┃ SCORE " "┃■■■■■■■■■■■┃┏━━━━┓" "┃■■■■■■■■■■■┃┃ 00000┃" "┗━━━━━━━━━━━┛┗━━━━┛"; const char bk[7][4][4][4] = { {

34、 { { 0,1,1,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } }, { { 0,1,1,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 1,0,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } } } , { { { 1,1,0,0 },{ 0,1,1,0 }

35、,{ 0,0,0,0 },{ 0,0,0,0 } }, { { 0,1,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } }, { { 1,1,0,0 },{ 0,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 0,1,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } } } , { { { 1,1,1,0 },{ 1,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },

36、 { { 1,0,0,0 },{ 1,0,0,0 },{ 1,1,0,0 },{ 0,0,0,0 } }, { { 0,0,1,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 1,1,0,0 },{ 0,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } } } , { { { 1,1,1,0 },{ 0,0,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 1,1,0,0 },{ 1,0,0,0 },{

37、 1,0,0,0 },{ 0,0,0,0 } }, { { 1,0,0,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 0,1,0,0 },{ 0,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 } } } , { { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },

38、 { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 1,1,0,0 },{ 1,1,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } } } , { { { 0,1,0,0 },{ 1,1,1,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 0,1,0,0 },{ 1,1,0,0 },{ 0,1,0,0 },{ 0,0,0,0 } }, { { 1,1,1,0 },{ 0,1,0,0 },{ 0

39、,0,0,0 },{ 0,0,0,0 } }, { { 1,0,0,0 },{ 1,1,0,0 },{ 1,0,0,0 },{ 0,0,0,0 } } } , { { { 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } }, { { 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 } }, { { 1,1,1,1 },{ 0,0,0,0 },{ 0,0,0,0 },{ 0,0,0,0 } },

40、 { { 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 },{ 1,0,0,0 } } } }; const WORD COLOR_A = FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY; // 運(yùn)動(dòng)中的顏色 const WORD COLOR_B = FOREGROUND_RED; // 固定不動(dòng)的顏色 const WORD COLOR_C = FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_

41、BLUE; // 空白處的顏色 int score = 0, level = 0; char data[19][11] = { 0 }; int next = -1; int x=4, y=-2, c=-1, z=0; // x坐標(biāo),坐標(biāo),當(dāng)前方塊,方向 Console csl; // 定義控制臺(tái)對(duì)象 void DrawScoreLevel( void ) // 繪制得分 { char tmp[6]; sprintf( tmp, "%05d", score ); csl.OutputStringNoMove( 31, 19, tmp,

42、5 ); sprintf( tmp, "%1d", level ); csl.OutputStringNoMove( 35, 15, tmp, 1 ); } void DrawNext( void ) // 繪制 "next框" 中的圖形 { for( int i=0; i<2; ++i ) { for( int j=0; j<4; ++j ) { csl.OutputStringNoMove( 28+j*2, 10+i, bk[next][0][i][j]==0?" ":"■", 2

43、 ); } } } void DrawOver( void ) // 游戲結(jié)束 { csl.OutputStringNoMove( 28, 10, "GAME" ); csl.OutputStringNoMove( 28, 11, "OVER" ); } void Draw( WORD color ) { for( int i=0; i<4; ++i ) { if( y+i<0 || y+i>= 19 ) continue; for( int j=0; j<4; ++j )

44、 { if( bk[c][z][i][j] == 1 ) { csl.SetColor( color ); csl.GotoXY( 2+x*2+j*2, 1+y+i ); csl.OutputString( "■", 2 ); } } } } bool IsFit( int x, int y, int c, int z ) // 給定的x,y,c,z是否可行 {

45、 for( int i=0; i<4; ++i ) { for( int j=0; j<4; ++j ) { if( bk[c][z][i][j]==1 ) { if( y+i < 0 ) continue; if( y+i>=19 || x+j<0 || x+j>=11 || data[y+i][x+j]==1 ) return false; } } } retu

46、rn true; } void RemoveRow( void ) // 消行 { const char FULLLINE[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; int linecount = 0; for( int i=0; i<19; ++i ) { if( 0 == memcmp( data[i], FULLLINE, 11 ) ) { ++linecount; for( int m=0; m<11; ++m )

47、 { for( int n=i; n>1; --n ) { data[n][m] = data[n-1][m]; csl.SetColor( data[n][m]==1?COLOR_B:COLOR_C ); csl.GotoXY( 2+m*2, 1+n ); csl.OutputString( "■", 2 );

48、 } data[0][m] = 0; csl.OutputStringNoMove( 2+m*2, 1, "■", 2 ); } } } char data[19][11] = { 0 }; if( linecount == 0 ) return; int _score = 0; switch( linecount ) { case 1: _score = 100; break; case 2:

49、 _score = 300; break; case 3: _score = 700; break; case 4: _score = 1500;break; } score += _score; if( score > 99999 ) score = 99999; level = score/10000; DrawScoreLevel(); } void MoveTrans( void ) // 逆時(shí)針?lè)D(zhuǎn) { if( IsFit( x, y, c, (z+1)%4 ) ) {

50、 Draw( COLOR_C ); z=(z+1)%4; Draw( COLOR_A ); } } void MoveLeft( void ) // 向左移 { if( IsFit( x-1, y, c, z ) ) { Draw( COLOR_C ); --x; Draw( COLOR_A ); } } void MoveRight( void ) // 向右移 { if( IsFit( x

51、+1, y, c, z ) ) { Draw( COLOR_C ); ++x; Draw( COLOR_A ); } } void MoveDown( void ) // 向下移 { if( IsFit( x, y+1, c, z ) ) { Draw( COLOR_C ); ++y; Draw( COLOR_A ); } else if( y != -2 ) // 觸底

52、{ Draw( COLOR_B ); for( int i=0; i<4; ++i ) { if( y+i<0 ) continue; for( int j=0; j<4; ++j ) { if( bk[c][z][i][j] == 1 ) { data[y+i][x+j] = 1; } }

53、 } RemoveRow(); x=4, y=-2, c=next, z=0; next = rand()%7; DrawNext(); } else // 游戲結(jié)束 { DrawOver(); } } void MessageDeal( void ) { int cycle = 9 - level; for( ; ; ) { for( int i=0; i

54、 { if( _kbhit() ) { switch( _getch() ) { case Q: case q: // 退出 return; break; case S: // 暫停 case s: for

55、( ; ; ) { switch( _getch() ) { case Q: case q: // 退出 return; case S: case s:

56、 goto LABLE_CONTINUE; break; } } LABLE_CONTINUE: break; case 0xe0: // ←↓→ ↑ switch( _getch() )

57、 { case 0x4B: // ← MoveLeft(); break; case 0x50: // ↓ MoveDown(); break; case 0x4d: // → MoveR

58、ight(); break; // ↑ 變形 case 0x48: MoveTrans(); default: break; } break; default: break;

59、 } } Sleep( 55 ); } MoveDown(); } } int main() { csl.Open(); csl.SetTitle( "俄羅斯方塊 " ); // 設(shè)置標(biāo)題 csl.RemoveCursor(); // 去處光標(biāo) csl.SetWindowRect( 38-1, 21-1 ); // 設(shè)置窗體尺寸 csl.SetBufSize( 38, 21 ); // 設(shè)置緩沖尺寸 csl.

60、OutputStringNoMove( 0,0,bg ); // 輸出背景字符 srand( time(0) ); // 設(shè)置隨機(jī)種子 next = rand()%7; DrawNext(); { for( char c = (char)_getch(); c!=B&&c!=b; c=(char)_getch() ) // 開(kāi)始 Begin ;} x=4, y=-2, c=next, z=0; next = rand()%7; DrawNext(); MessageDeal(); return 0; } 第六章 實(shí)驗(yàn)結(jié)果 6.1 程序?qū)嶒?yàn)結(jié)果 參考文獻(xiàn) 參考文獻(xiàn) (1). 譚浩強(qiáng) C++程序設(shè)計(jì)(第2版) 清華大學(xué)出版社 參考網(wǎng)址 (1). (2). ( 3). 致謝 27

展開(kāi)閱讀全文
溫馨提示:
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. 裝配圖網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!