畢業(yè)設計(論文)-基于C語言的俄羅斯方塊游戲的設計與實現(xiàn)_第1頁
畢業(yè)設計(論文)-基于C語言的俄羅斯方塊游戲的設計與實現(xiàn)_第2頁
畢業(yè)設計(論文)-基于C語言的俄羅斯方塊游戲的設計與實現(xiàn)_第3頁
畢業(yè)設計(論文)-基于C語言的俄羅斯方塊游戲的設計與實現(xiàn)_第4頁
畢業(yè)設計(論文)-基于C語言的俄羅斯方塊游戲的設計與實現(xiàn)_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 基于C語言的俄羅斯方塊游戲的設計與實現(xiàn) 摘要 俄羅斯方塊是一款由俄羅斯人阿列克謝·帕基特諾夫于1984年6月發(fā)明的休閑游戲。為了實現(xiàn)俄羅斯方塊這一經(jīng)典游戲,決定在Dev-C+集成開發(fā)環(huán)境下采用C語言開發(fā)完成。開發(fā)工程遵循軟件工程的知識,從問題定義,可行性研究、需求分析、概要設計、詳細設計,到最后對軟件進行測試,整個開發(fā)過程貫穿軟件工程的知識體系。本游戲由界面模塊、運行模塊等構成,其中界面模塊實現(xiàn)了游戲菜單以及選擇菜單的打印;運行模塊通過制作俄羅斯方塊,打印俄羅斯方塊,消除俄羅斯方塊等函數(shù)實現(xiàn)。此游戲可以使我們重溫這款游戲的帶給我們的童年快樂,增加我們對美好童年的回憶。關鍵字:俄羅斯

2、方塊;C語言;數(shù)據(jù)結構 Design and implementation of tetris Abstract Tetris is a kind of casual games designed by Alexey Pajitnov,a Russian, in June 1984. In order to spread this classical game, we decide to realize it by C programming language in Dev-C+ integrated development environment.Knowledge abiding by a

3、 software engineering, definition begins from software problem,proceed to carry out feasibility study,need analysis,essentials design,detailed design,at last implemented the test on the software. Entire exploitation process has run through the software engineering knowledge hierarchy. This game cons

4、ists of interface module, operation module and so on. Interface module can print the game menu and the selection menu while operation module can be achieved by functions, such as making tetris, printing tetris and removing tetris. Tetris makes us review our joyful childhood and enriches our memories

5、 during the years of childhood. Key words: tetris;c language;data structure; 目錄1. 引言11.1 設計背景11.2 系統(tǒng)配置11.3 開發(fā)工具與平臺12.系統(tǒng)分析32.1可行性分析32.2 需求分析33. 概要設計53.1模塊組織54. 數(shù)據(jù)庫設計64.1 概念模型設計(E-R圖)64.2數(shù)據(jù)庫需求分析74.3 數(shù)據(jù)庫表結構75.詳細設計95.1 程序設計95.2 游戲頁面的設計與實現(xiàn)105.3運行功能模塊的實現(xiàn)115.3.1制作俄羅斯方塊165.3.2 打印俄羅斯方塊。175.3.3 清除俄羅斯方塊185.3.4

6、 判斷方塊是否可以移動195.3.5判斷是否滿行216.游戲運行測試246.1 系統(tǒng)測試原理及測試原則246.1.1系統(tǒng)測試原理246.1.2 系統(tǒng)測試原則246.2 系統(tǒng)測試的方法256.3本游戲測試26結 論29參考文獻30致 謝31外文翻譯32英文譯文32附英文原文:381. 引言1.1 設計背景 隨著計算機技術的不斷發(fā)展,以及計算機的普及,越來越多的人擁有了自己的電腦,越來越多的人從事計算機行業(yè)。許多人掌握了一些計算機的編程語言以及相關的技術,希望通過自己所學的知識來實現(xiàn)自己童年時代玩過的一些經(jīng)典游戲,俄羅斯方塊可謂是經(jīng)典中的經(jīng)典。本游戲使用C語言,數(shù)據(jù)結構等相關知識來實現(xiàn)。玩家首先通

7、過點擊游戲圖標進入游戲,進入游戲后通過觀看后面的選擇菜單來開始游戲,俄羅斯方塊的基本規(guī)則是移動、旋轉和擺放游戲自動輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。1.2 系統(tǒng)配置運行本系統(tǒng)需要滿足以下的一些配置要求。操作系統(tǒng):Windows 2000/2003/XP/win7開發(fā)環(huán)境: Dev-C+1.3 開發(fā)工具與平臺(1)C語言C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機器碼以及不需要任何運行環(huán)境支持便能運行的編程語言。盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平臺的特性,以一個標準規(guī)格寫出的C語言

8、程序可在許多電腦平臺上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業(yè)平臺。二十世紀八十年代,為了避免各開發(fā)廠商用的C語言語法產(chǎn)生差異,由美國國家標準局為C語言訂定了一套完整的國際標準語法,稱為ANSI C,作為C語言最初的標準。(2)Dev-C+開發(fā)環(huán)境Dev-C+是一個Windows環(huán)境下C/C+的集成開發(fā)環(huán)境(IDE),它是一款自由軟件,遵守GPL許可協(xié)議分發(fā)源代碼。它集合了MinGW等眾多自由軟件,并且可以取得最新版本的各種工具支持,而這一切工作都是來自全球的狂熱者所做的工作。Dev-C+是NOI、NOIP等比賽的指定工具,缺點是Debug功能弱。由于原開發(fā)公司

9、在開發(fā)完4.9.9.2后停止開發(fā),所以現(xiàn)在正由其它公司更新開發(fā),但都基于4.9.9.2.Dev-C+ 最新版本:5.11。Dev-C+使用MingW64/TDM-GCC編譯器,遵循C+ 11標準,同時兼容C+98標準。開發(fā)環(huán)境包括多頁面窗口、工程編輯器以及調試器等,在工程編輯器中集合了編輯器、編譯器、連接程序和執(zhí)行程序,提供高亮度語法顯示的,以減少編輯錯誤,還有完善的調試功能,適合初學者與編程高手的不同需求,是學習C或C+的首選開發(fā)工具!多國語言版中包含簡繁體中文語言界面及技巧提示,還有英語、俄語、法語、德語、意大利語等二十多個國家和地區(qū)語言提供選擇。該軟件采用 Delphi 開發(fā)。 2.系統(tǒng)

10、分析2.1可行性分析可行性分析是在全面調查基礎上,針對新系統(tǒng)的開發(fā)是否具備必要性和可能性,對新系統(tǒng)的開發(fā)從技術、經(jīng)濟、運行的方面進行分析和研究,以避免投資失誤,保證新系統(tǒng)開發(fā)成功。可行性研究的目的就是用最小的代價在盡可能短的時間內確定問題是否能夠解決。這部分將從以下四個方面進行研究:技術可行性、經(jīng)濟可行性、操作可行性和調度可行性。(1)技術可行性因為計算機硬件的發(fā)展越來越快,現(xiàn)在PC機的性能已經(jīng)可以完全勝任小型游戲的運行。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產(chǎn)生少量的機器碼以及不需要任何運行環(huán)境支持便能運行的編程語言。(2)經(jīng)濟可行性根據(jù)調查的資料,只需要一臺計算機安

11、裝上一款集成開發(fā)工具軟件就可以成本5000元。(3)操作可行性由于這個課題是以PC機作為運行平臺,為了滿足對這款經(jīng)典游戲的實現(xiàn),只要掌握C語言的一些基本技能就可以開發(fā),玩家通過閱讀菜單就可以來玩游戲。2.2 需求分析對軟件需求分析就是通過調查研究,建立系統(tǒng)的數(shù)據(jù)模型、功能模型、行為模型,用戶和開發(fā)人員在“系統(tǒng)必須做什么”這個問題上實現(xiàn)相互理解,達到共識,從而形成雙方認可的軟件產(chǎn)品的需求規(guī)格說明書。這樣有益于提高軟件開發(fā)過程中的能見度,便于對軟件開發(fā)過程中的控制與管理,便于采用工程方法開發(fā)軟件,提高軟件的質量,便于開發(fā)人員、維護人員、管理人員之間的交流、協(xié)作,并作為工作成果的原始依據(jù),并且在向潛

12、在用戶傳遞軟件功能、性能需求,使其能夠判斷該軟件是否與自己的需求相關。19種狀態(tài)的方塊隨機產(chǎn)生,自由下落,落下時可由玩家用上、左、右控制鍵控制翻轉和移動,以便以玩家所需要的形態(tài)和位置落下。落下時,方塊的方格如果能填滿某一行,則這一行消去。消去一行后,游戲可給玩家加分,若由存在空格的方塊填滿整個窗口,則游戲失敗。游戲功能需求如下: 游戲界面需求:良好的游戲界面可以讓玩家充分感受到游戲帶來的娛樂性,游戲的背景色是黑色,方塊用白色邊框。   游戲形狀需求:一共有19種狀態(tài),即長條形、Z字形、反Z形、田字形、7字形、反7形、T字型,各個方塊要能實現(xiàn)它的變形,可設為逆時針。

13、  鍵盤處理事件需求:方塊下落時,可通過鍵盤方向鍵(上、左、右鍵)對該方塊進行變形,、向左、向右移動。  顯示需求:方塊形狀的變換,分數(shù)、等級的顯示,以及游戲幫助等功能。當不同的方塊填滿一行時可以消行,剩余方塊向下移動并統(tǒng)計分數(shù)。當達到一定分數(shù)的時候,會增加相應的等級,游戲難度也隨之增加。3. 概要設計3.1模塊組織俄羅斯方塊游戲由界面模塊、運行模塊等構成,其中界面模塊實現(xiàn)了游戲菜單以及選擇菜單的打印;運行模塊通過制作俄羅斯方塊,打印俄羅斯方塊,消除俄羅斯方塊等函數(shù)實現(xiàn)。 俄羅斯方塊界面模塊運行模塊圖3-1 俄羅斯方塊游戲模塊組織圖打印俄羅斯方塊制作俄羅斯方塊判斷是否可移清

14、除俄羅斯方塊判斷是否滿行4. 數(shù)據(jù)庫設計4.1 概念模型設計(E-R圖)數(shù)據(jù)模型是是數(shù)據(jù)特征的抽象,從抽象層次上描述了系統(tǒng)的靜態(tài)特征、動態(tài)行為和約束條件,為數(shù)據(jù)庫系統(tǒng)的信息表與操作提供一個抽象的框架。描述了數(shù)據(jù)結構、數(shù)據(jù)操作及數(shù)據(jù)約束。 E-R圖概念化地構建實體間關系的模型,這使得它們區(qū)別于數(shù)據(jù)庫模型圖。E-R圖的理念是:項目所有參與者能理解E-R圖。E-R圖由不同實體類型、關系、特性和類型構成。實體是諸如用戶的實際對象,有時更抽象,但必須有業(yè)務意義。特性用于描述實體,關系用于實體之間。實體:現(xiàn)實世界中的事物;屬性:事物的特性;聯(lián)系:現(xiàn)實世界中事物間的關系。實體集的關系有一對一、一對多、多對多

15、的聯(lián)系。 等級用戶名字 分數(shù)圖4-1 玩家的E-R圖4.2數(shù)據(jù)庫需求分析作為一個簡單的游戲,不同于其他類型的系統(tǒng),需要包含的信息量不是很大。只需要包含用戶的名字和分數(shù)即可。4.3 數(shù)據(jù)庫表結構根據(jù)需求分析,設計數(shù)據(jù)庫表結構如下:玩家得分表中包括有玩家姓名和分數(shù)具體設計如表4-3所示。表4-3 用戶基本信息表t_user編號字段名稱數(shù)據(jù)類型說明1namechar用戶ID(主鍵)2scoreint分數(shù)通過對文件的操作來模擬數(shù)據(jù)庫,通過函數(shù)save_result()來實現(xiàn)對玩家姓名,等級和分數(shù)的存儲。 實現(xiàn)的代碼如下:void save_result(struct Tetris *tetris)FI

16、LE *fp; /聲明文件類型指針 char ch; /聲明一個char類型變量 if(fp=fopen("file.c","a")=NULL)/判斷是否可以打開文件 printf("can not open filen");exit(0);ch=getchar();/輸入玩家姓名 while(ch!='#')fputc(ch,fp);ch=getchar(); fprintf(fp,"level:%d score:%d",tetris->level,tetris->score);/輸入

17、玩家等級和得分 fputc(10,fp);/輸入一個換行符 fclose(fp);/關閉指針 5.詳細設計在本章將具體討論如何實現(xiàn)功能模塊,最終實現(xiàn)整個系統(tǒng)。經(jīng)過這個階段的設計工作,應該得出對游戲的描述,從而在編碼階段可以把這個描述直接翻譯成用C語言書寫的程序。5.1 程序設計本游戲的設計包含界面設計和運行設計。數(shù)據(jù)結構是計算機存儲、組織數(shù)據(jù)的方式。數(shù)據(jù)結構是指相互之間存在一種或多種特定關系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結構可以帶來更高的運行或者存儲效率。數(shù)據(jù)結構往往同高效的檢索算法和索引技術有關。本游戲中的俄羅斯方塊結構體Tetris包括中心方塊的x軸坐標,中心方塊的y軸坐標,

18、標記方塊類型的序號,下一個俄羅斯方塊類型的序號,俄羅斯方塊移動的速度,產(chǎn)生俄羅斯方塊的個數(shù),游戲的分數(shù)游戲的等級。struct Tetris int x; /中心方塊的x軸坐標 int y; /中心方塊的y軸坐標 int flag; /標記方塊類型的序號 int next; /下一個俄羅斯方塊類型的序號 int speed; /俄羅斯方塊移動的速度 int count; /產(chǎn)生俄羅斯方塊的個數(shù) int score; /游戲的分數(shù) int level; /游戲的等級; 5.2 游戲頁面的設計與實現(xiàn)界面模塊主要由一個界面函數(shù)make_frame()實現(xiàn)。通過一個函數(shù)conio.h中gotoxy()

19、函數(shù)來控制光標的移動,來繪制出游戲的主界面。并且通過數(shù)字2來標記游戲界面的邊框。 void make_frame() HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); /定義顯示器句柄變量 gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); /打印游戲名稱 printf("俄羅斯方塊"); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7); /打印選擇菜單 printf("*下一個方塊:"); gotoxy(hOut,FrameX+2*

20、Frame_width+3,FrameY+13); printf("*"); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17); printf("鍵:變體"); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19); printf("空格:暫停游戲"); gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15); printf("Esc :退出游戲"); gotoxy(hOut,FrameX,Frame

21、Y); /打印框角并記住該處已有圖案 printf(""); gotoxy(hOut,FrameX+2*Frame_width-2,FrameY); printf(""); gotoxy(hOut,FrameX,FrameY+Frame_height); printf(""); gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height); printf(""); aFrameXFrameY+Frame_height=2; aFrameX+2*Frame_width

22、-2FrameY+Frame_height=2; for(i=2;i<2*Frame_width-2;i+=2) gotoxy(hOut,FrameX+i,FrameY); printf(""); /打印上橫框 for(i=2;i<2*Frame_width-2;i+=2) gotoxy(hOut,FrameX+i,FrameY+Frame_height); printf(""); /打印下橫框 aFrameX+iFrameY+Frame_height=2; /記住下橫框有圖案 for(i=1;i<Frame_height;i+) go

23、toxy(hOut,FrameX,FrameY+i); printf(""); /打印左豎框 aFrameXFrameY+i=2; /記住左豎框有圖案 for(i=1;i<Frame_height;i+) gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i); printf(""); /打印右豎框 aFrameX+2*Frame_width-2FrameY+i=2; /記住右豎框有圖案 5.3運行功能模塊的實現(xiàn)整個游戲分為界面模塊和運行模塊。下面詳細討論主要的幾個運行函數(shù)的實現(xiàn)。在每個函數(shù)的介紹中,將具體說明一些

24、涉及要點。運行模塊分為制作俄羅斯方塊,打印俄羅斯方塊,清除俄羅斯方塊,判斷是否可以移動,判斷是否滿行。運行的主模塊主要通過上鍵,左鍵,右鍵來分別控制方塊的翻轉,向左,向右移動。通過空格鍵來控制游戲的暫停和繼續(xù)。其中運行的主模塊代碼如下:void start_game() HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); /定義顯示器句柄變量 struct Tetris t,*tetris=&t; /定義結構體的指針并指向結構體變量 unsigned char ch; /定義接收鍵盤輸入的變量 tetris->count=0; /初始化俄

25、羅斯方塊數(shù)為0個 tetris->speed=300; /初始移動速度為300ms tetris->score=0; /初始游戲的分數(shù)為0分 tetris->level=1; /初始游戲為第1關 while(1) /循環(huán)產(chǎn)生方塊,直至游戲結束 get_flag(tetris); /得到產(chǎn)生俄羅斯方塊類型的序號 temp=tetris->flag; /記住當前俄羅斯方塊序號 /打印下一個俄羅斯方塊的圖形(右邊窗口) tetris->x=FrameX+2*Frame_width+6; tetris->y=FrameY+10; tetris->flag =

26、tetris->next; print_tetris(hOut,tetris); tetris->x=FrameX+Frame_width; /初始中心方塊x坐標 tetris->y=FrameY-1; /初始中心方塊y坐標 tetris->flag=temp; /取出當前的俄羅斯方塊序號 while(1) /控制方塊方向,直至方塊不再下移 label:print_tetris(hOut,tetris);/打印俄羅斯方塊 Sleep(tetris->speed); /延緩時間 clear_tetris(hOut,tetris); /清除痕跡 temp1=tetri

27、s->x; /記住中心方塊橫坐標的值 temp2=tetris->flag; /記住當前俄羅斯方塊序號 if(kbhit() /判斷是否有鍵盤輸入,有則用ch接收 ch=getch(); if(ch=75) /按鍵則向左動,中心橫坐標減2 tetris->x-=2; if(ch=77) /按鍵則向右動,中心橫坐標加2 tetris->x+=2; if(ch=72) /按鍵則變體即當前方塊順時針轉90度 if( tetris->flag>=2 && tetris->flag<=3 ) tetris->flag+; tetris

28、->flag%=2; tetris->flag+=2; if( tetris->flag>=4 && tetris->flag<=7 ) tetris->flag+; tetris->flag%=4; tetris->flag+=4; if( tetris->flag>=8 && tetris->flag<=11 ) tetris->flag+; tetris->flag%=4; tetris->flag+=8; if( tetris->flag>=12

29、&& tetris->flag<=15 ) tetris->flag+; tetris->flag%=4; tetris->flag+=12; if( tetris->flag>=16 && tetris->flag<=19 ) tetris->flag+; tetris->flag%=4; tetris->flag+=16; if(ch=32) /按空格鍵,暫停 print_tetris(hOut,tetris); while(1) if(kbhit() /再按空格鍵,繼續(xù)游戲 ch=ge

30、tch(); if(ch=32) goto label; if(if_moveable(tetris)=0) /如果不可動,上面操作無效 tetris->x=temp1; tetris->flag=temp2; else /如果可動,執(zhí)行操作 goto label; tetris->y+; /如果沒有操作指令,方塊向下移動 if(if_moveable(tetris)=0) /如果向下移動且不可動,方塊放在此處 tetris->y-; print_tetris(hOut,tetris); del_full(hOut,tetris); break; for(i=tetri

31、s->y-2;i<tetris->y+2;i+) /游戲結束條件:方塊觸到框頂位置 if(i=FrameY) j=0; /如果游戲結束,j=0 if(j=0) system("cls"); getch(); break; /清除下一個俄羅斯方塊的圖形(右邊窗口) tetris->flag = tetris->next; tetris->x=FrameX+2*Frame_width+6; tetris->y=FrameY+10; clear_tetris(hOut,tetris); 5.3.1制作俄羅斯方塊這個模塊通過make_tet

32、ris()實現(xiàn)。這個函數(shù)的作用是通過隨機產(chǎn)生的俄羅斯方塊的標志數(shù)來制作出相對應的方塊。其中俄羅斯方塊的標志隨機數(shù)通過get_flag()函數(shù)得到。get_flag()函數(shù)代碼如下:void get_flag(struct Tetris *tetris) tetris->count+; /記住產(chǎn)生方塊的個數(shù) srand(unsigned)time(NULL); /初始化隨機數(shù) if(tetris->count=1) tetris->flag = rand()%19+1; /記住第一個方塊的序號 tetris->next = rand()%19+1; /記住下一個方塊的序號

33、5.3.2 打印俄羅斯方塊。打印俄羅斯方塊通過print_tetris()函數(shù)實現(xiàn),首先對數(shù)組b進行修改,修改標記位為1,通過對制作好的俄羅斯方塊在數(shù)組中的一定范圍的標記掃描來打印出俄羅斯方塊。print_tetris()函數(shù)代碼如下: void print_tetris(HANDLE hOut,struct Tetris *tetris) for(i=0;i<4;i+) bi=1; /數(shù)組b4的每個元素的值都為1 make_tetris(tetris); /制作俄羅斯方塊 for( i=tetris->x-2; i<=tetris->x+4; i+=2 ) for(j

34、=tetris->y-2;j<=tetris->y+1;j+) if( aij=1 && j>FrameY ) gotoxy(hOut,i,j); printf(""); /打印邊框內的方塊 5.3.3 清除俄羅斯方塊清除俄羅斯方塊通過clear_tetris()函數(shù)實現(xiàn),首先對數(shù)組b進行修改,修改標記位為0,通過對制作好的俄羅斯方塊在數(shù)組中的一定范圍的標記的掃描來消除出俄羅斯方塊。clear_tetris()代碼如下:void clear_tetris(HANDLE hOut,struct Tetris *tetris) for(i

35、=0;i<4;i+) bi=0; /數(shù)組b4的每個元素的值都為0 make_tetris(tetris); /制作俄羅斯方塊 for( i=tetris->x-2; i<=tetris->x+4; i+=2 ) for(j=tetris->y-2;j<=tetris->y+1;j+) if( aij=0 && j>FrameY ) gotoxy(hOut,i,j); printf(" "); /清除方塊 5.3.4 判斷方塊是否可以移動判斷方塊是否可以移動通過if_moveable()函數(shù)實現(xiàn),當中心方塊位置上

36、有圖案時,返回值為0,即不可移動,其他"口"字方塊位置上無圖案時,返回值為1,即可移動。if_moveable()代碼如下:int if_moveable(struct Tetris *tetris) if(atetris->xtetris->y!=0)/當中心方塊位置上有圖案時,返回值為0,即不可移動 return 0; else if( /當為田字方塊且除中心方塊位置外,其他"口"字方塊位置上無圖案時,返回值為1,即可移動 ( tetris->flag=1 && ( atetris->xtetris->y

37、-1=0 && atetris->x+2tetris->y-1=0 && atetris->x+2tetris->y=0 ) ) | /或為直線方塊且除中心方塊位置外,其他"口"字方塊位置上無圖案時,返回值為1,即可移動 ( tetris->flag=2 && ( atetris->x-2tetris->y=0 && atetris->x+2tetris->y=0 && atetris->x+4tetris->y=0 ) ) |

38、( tetris->flag=3 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y-2=0 && atetris->xtetris->y+1=0 ) ) | ( tetris->flag=4 && ( atetris->x-2tetris->y=0 && atetris->x+2tetris->y=0 && atetris->xtetris->y+1=0 ) )

39、| ( tetris->flag=5 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y+1=0 && atetris->x-2tetris->y=0 ) ) | ( tetris->flag=6 && ( atetris->xtetris->y-1=0 && atetris->x-2tetris->y=0 && atetris->x+2tetris->y=0 )

40、) | ( tetris->flag=7 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y+1=0 && atetris->x+2tetris->y=0 ) ) | ( tetris->flag=8 && ( atetris->xtetris->y+1=0 && atetris->x-2tetris->y=0 && atetris->x+2tetris->y+1=

41、0 ) ) | ( tetris->flag=9 && ( atetris->xtetris->y-1=0 && atetris->x-2tetris->y=0 && atetris->x-2tetris->y+1=0 ) ) | ( tetris->flag=10 && ( atetris->xtetris->y-1=0 && atetris->x-2tetris->y-1=0 && atetris->x+2tetris

42、->y=0 ) ) | ( tetris->flag=11 && ( atetris->xtetris->y+1=0 && atetris->x+2tetris->y-1=0 && atetris->x+2tetris->y=0 ) ) | ( tetris->flag=12 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y+1=0 && atetris->x-2

43、tetris->y-1=0 ) ) | ( tetris->flag=13 && ( atetris->x-2tetris->y=0 && atetris->x-2tetris->y+1=0 && atetris->x+2tetris->y=0 ) ) | ( tetris->flag=14 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y+1=0 && atetris

44、->x+2tetris->y+1=0 ) ) | ( tetris->flag=15 && ( atetris->x-2tetris->y=0 && atetris->x+2tetris->y-1=0 && atetris->x+2tetris->y=0 ) ) | ( tetris->flag=16 && ( atetris->xtetris->y+1=0 && atetris->xtetris->y-1=0 &&

45、 atetris->x+2tetris->y-1=0 ) ) | ( tetris->flag=17 && ( atetris->x-2tetris->y=0 && atetris->x-2tetris->y-1=0 && atetris->x+2tetris->y=0 ) ) | ( tetris->flag=18 && ( atetris->xtetris->y-1=0 && atetris->xtetris->y+1=0 &a

46、mp;& atetris->x-2tetris->y+1=0 ) ) | ( tetris->flag=19 && ( atetris->x-2tetris->y=0 && atetris->x+2tetris->y+1=0 && atetris->x+2tetris->y=0 ) ) ) return 1; return 0;5.3.5判斷是否滿行判斷是否滿行通過del_full()函數(shù)實現(xiàn)。在del_full()函數(shù)首先豎坐標依次從下往上,橫坐標依次由左至右判斷是否滿行(判斷是否滿

47、足k=Frame_width),如果底層方塊滿行,先對底層行清除后再把上面的方塊下移然后在判斷是否滿行。void del_full(HANDLE hOut,struct Tetris *tetris) /當某行有Frame_width-2個方塊時,則滿行 int k,del_count=0; /分別用于記錄某行方塊的個數(shù)和刪除方塊的行數(shù)的變量 for(j=FrameY+Frame_height-1;j>=FrameY+1;j-) k=0; for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2) if(aij=1) /豎坐標依次從下往上,橫坐標依次

48、由左至右判斷是否滿行 k+; /記錄此行方塊的個數(shù) if(k=Frame_width-2) for(k=FrameX+2;k<FrameX+2*Frame_width-2;k+=2) /刪除滿行的方塊 akj=0; gotoxy(hOut,k,j); printf(" "); Sleep(1); for(k=j-1;k>FrameY;k-) /如果刪除行以上的位置有方塊,則先清除,再將方塊下移一個位置 for(i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2) if(aik=1) aik=0; gotoxy(hOut,i,k

49、); printf(" "); aik+1=1; gotoxy(hOut,i,k+1); printf(""); j+; /方塊下移后,重新判斷刪除行是否滿行 del_count+; /記錄刪除方塊的行數(shù) tetris->score+=100*del_count; /每刪除一行,得100分 if( del_count>0 && ( tetris->score%1000=0 | tetris->score/1000>tetris->level-1 ) ) /如果得1000分即累計刪除10行,速度加快20m

50、s并升一級 tetris->speed-=20; tetris->level+; 6.游戲運行測試6.1 系統(tǒng)測試原理及測試原則6.1.1系統(tǒng)測試原理測試主要依據(jù)是被試系統(tǒng)的研制任務書和技術規(guī)格書,是對軟件雄體功能和性能的綜合測試與評估。測試原理是軟件測試活動的理論基礎,測試方法是鍘試原理的實際應用和獲得測試數(shù)據(jù)的手段。基于軟件的共性,對于軟件的測試要遵循一般軟件的測試原理和方法。同時,針對軟件的特性,必須找到合適的測試方法。測試用例的合理性對于軟件的測試與評估具有關鍵作用,而如何使設計的用例、合理并且典型有效并不容易。所以應該與軟件的研制人員以及最終用戶一起,有針對性地研究實際操

51、作環(huán)境并加以描述,形成合理的測試用例集。另一方面,軟件運行環(huán)境的復雜程度對軟件評估具有重要作用,所以應產(chǎn)生盡量逼真的運行背景以便于研究。軟件測試的周期如圖6.1所示。圖6.1 軟件測試周期示意圖6.1.2 系統(tǒng)測試原則程序員應避免測試自己編寫的程序;測試用例的設計必須包括預期的輸出結果;測試用例應包括有效的和期望的輸入情況,也要包括無效的和不期望的輸入情況;所有的測試都應追溯到用戶需求,所有測試活動都應該是有計劃的,并且計劃能夠得到保障。只檢查程序是否做了它應該做的事這僅完成了測試工作的一半,另一半則是要檢查程序是否做了它不該做的事;一段程序中存在錯誤的概率與在這段程序中已發(fā)現(xiàn)的錯誤數(shù)成比例;

52、測試上作必須有明確的目標;盡早地和不斷地進行軟件測試;窮舉測試是不可能的,充分覆蓋程序邏輯是有可能的。6.2 系統(tǒng)測試的方法軟件測試的方法和技術是多種多樣的。對于軟件測試技術,可以從不同的角度加以分類:從是否需要執(zhí)行被測軟件的角度,可分為靜態(tài)測試和動態(tài)測試。從測試是否針對系統(tǒng)的內部結構和具體實現(xiàn)算法的角度來看,可分為白盒測試和黑盒測試。 (1)黑盒測試 黑盒測試也稱功能測試或數(shù)據(jù)驅動測試或基于規(guī)范的測試,它是在己知產(chǎn)品所應具有的功能的前提下,通過測試來檢測每個功能是否都能正常使用,在測試時,把程序看作一個不能打開的黑盒子,在完全不考慮程序內部結構和內部特性的情況下,測試者對程序接口進行測試,它

53、只檢查程序功能是否按照需求規(guī)格說明書的規(guī)定正常使用,程序是否能適當?shù)亟邮蛰斎霐?shù)據(jù)而產(chǎn)生正確的輸出信息,并且保持外部信息(如數(shù)據(jù)庫或文件)的完整性。黑盒測試方法主要有等價類劃分、邊值分析、因果圖、錯誤推測等。“黑盒”法著眼于程序外部結構,不考慮內部邏輯結構,只是針對軟件的界面和軟件需求規(guī)格說明中規(guī)定的功能進行測試。“黑盒”法是窮舉輸入測試,只有把所有可能的輸入都作為測試情況使用,才能以這種方法查出程序中所有的錯誤。實際上測試情況有無窮多個,人們不僅要測試所有合法的輸入,而且還要對那些不合法但是可能的輸入進行測試。(2)白盒測試白盒測試也稱結構測試或邏輯驅動測試或基于實現(xiàn)的測試,它是知道產(chǎn)品內部工作過程。可通過測試來檢測產(chǎn)品內部動作是否按照規(guī)格說明書的規(guī)定止常進行,按照程序內部的結構測試程序,檢驗程序中的每條通路是否都能按預定要求正確工作。白盒測試的主要方法有程序邏輯驅動測試、基本路徑測試和數(shù)據(jù)流測試等。“白盒”法需要全面了解程序的內部邏輯結構、對所有邏輯路徑進行測試。因此,白盒”法是窮舉路徑測試。但即使每條路徑都測試了仍然可能有錯誤。第一,窮舉路

溫馨提示

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

評論

0/150

提交評論