8.2.1趣味程序案例 - 趣味程序案例解析-教學(xué)課件_第1頁
8.2.1趣味程序案例 - 趣味程序案例解析-教學(xué)課件_第2頁
8.2.1趣味程序案例 - 趣味程序案例解析-教學(xué)課件_第3頁
8.2.1趣味程序案例 - 趣味程序案例解析-教學(xué)課件_第4頁
8.2.1趣味程序案例 - 趣味程序案例解析-教學(xué)課件_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第八章大型趣味程序設(shè)計(jì)第2節(jié)趣味程序案例前言目的:通過案例解析,領(lǐng)略大型程序的設(shè)計(jì)思想和開發(fā)方法,了解程序評(píng)價(jià)標(biāo)準(zhǔn)案例:通訊錄簡(jiǎn)單計(jì)算器俄羅斯方塊主要內(nèi)容通訊錄范例解析簡(jiǎn)易計(jì)算器范例解析俄羅斯方塊范例解析通訊錄問題描述:

以文件的方式保存用戶錄入的通訊錄數(shù)據(jù)供用戶查詢和使用通訊錄信息通訊錄功能分析:

記錄項(xiàng)的基本屬性:姓名、性別、住址、聯(lián)系電話、電子郵件等操作功能:錄入:操作添加一條新的記錄項(xiàng)刪除:刪除一條已經(jīng)存在的記錄項(xiàng)

通訊錄功能分析:修改:改變記錄項(xiàng)的一個(gè)或多個(gè)屬性,并用新的記錄項(xiàng)覆蓋已經(jīng)存在的記錄項(xiàng)查找:根據(jù)用戶輸入的屬性值查找符合條件的記錄項(xiàng)。通訊錄功能分析:通訊錄數(shù)據(jù)以文件形式存儲(chǔ)在磁盤上,根據(jù)實(shí)際需要定義文件的存儲(chǔ)格式;在程序運(yùn)行中需要對(duì)文件進(jìn)行讀取操作。程序中還要對(duì)輸入數(shù)據(jù)的容錯(cuò)性進(jìn)行檢查,可以保證通訊錄數(shù)據(jù)的合法性。通訊錄設(shè)計(jì):程序總體結(jié)構(gòu):輸入輸出模塊:人機(jī)交互,包括程序界面顯示、用戶輸入響應(yīng)、結(jié)果輸出等管理模塊:管理模塊從輸入輸出模塊讀取用戶命令并進(jìn)行相應(yīng)的操作,包括錄入、刪除、修改、查找、列表等文件操作模塊:進(jìn)行存儲(chǔ)文件的讀寫通訊錄模塊結(jié)構(gòu)圖輸入輸出終端輸入輸出模塊管理模塊文件操作模塊存儲(chǔ)文件用戶輸入系統(tǒng)輸出文件寫入文件讀出通訊錄界面設(shè)計(jì):通訊錄數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):

struct

myrecord{ unsignedintnum; unsignedintgroup; charname[MAXLEN+1]; chargender; datebirthday; charaddress[MAXLEN+1]; charphone[MAXLEN+1]; charemail[MAXLEN+1];};通訊錄數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):

struct

mydate{ unsignedintyear; unsignedintmonth; unsignedintday;};typedef

struct

mydatedate;通訊錄數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):三個(gè)查詢關(guān)鍵字:記錄編號(hào)、組別和聯(lián)系人姓名

unionmysearch_entry{ unsignedintnum; unsignedintgroup; charname[MAXLEN+1];};typedefunionmysearch_entrysearch_entry;通訊錄-函數(shù)設(shè)計(jì)函數(shù)原型函數(shù)功能函數(shù)處理描述voidmenulist(void)以文本方式顯示程序主菜單,同時(shí)響應(yīng)用戶輸入調(diào)用bioske(0),獲取按鍵的值voidupbar(inty)向上滾動(dòng)光標(biāo)條通過改變字體顏色實(shí)現(xiàn)光標(biāo)條移動(dòng)voiddownbar(inty) 向下滾動(dòng)光標(biāo)條通過改變字體顏色實(shí)現(xiàn)光標(biāo)條移動(dòng)voidmydelay(void)等待用戶響應(yīng)調(diào)用getch()實(shí)現(xiàn)voidformat(void)結(jié)果輸出時(shí)打印輸出的格式信息調(diào)用printf()實(shí)現(xiàn)voidsearchmenu(void)輸出查詢功能的子菜單調(diào)用printf()實(shí)現(xiàn)voidinput_search(charch)處理查詢時(shí)用戶的輸入,將關(guān)鍵字讀入根據(jù)輸入?yún)?shù)ch,執(zhí)行相應(yīng)的操作intinput_num(void)讀入一個(gè)整型數(shù)值(記錄編號(hào)),進(jìn)行合法性檢查采用了遞歸的方法循環(huán)讀取數(shù)據(jù)int

input_new(myrecord*p)進(jìn)行數(shù)據(jù)修改時(shí),讀入一個(gè)新的記錄項(xiàng),并用它覆蓋輸入?yún)?shù)所指向的數(shù)據(jù)記錄項(xiàng)。參數(shù):新記錄項(xiàng)的指針返回值:返回是否進(jìn)行了修改的信息,已修改返回1,否則返回0。myrecord*input_app(void)錄入信息時(shí)處理鍵盤輸入,對(duì)輸入進(jìn)行合法性檢查逐項(xiàng)錄入通訊記錄int

date_legal(int

year,int

month,intday)檢查日期是否為合法參數(shù):年、月、日的信息返回值:合法日期返回1,否則返回0menu.c輸入輸出文件通訊錄-函數(shù)設(shè)計(jì)file.c文件處理文件int

file_app(myrecord*p)添加一條新的記錄項(xiàng)參數(shù):要錄入的記錄項(xiàng)的指針返回值:操作結(jié)果(插入成功返回1,失敗返回0)myrecord*read_record(intn)從文件中讀出下標(biāo)為n的塊(記錄項(xiàng))參數(shù):下標(biāo)值返回值:讀取結(jié)果的指針int

write_record(myrecord*p,intn)向文件中寫入某一塊(如果該塊已經(jīng)存在,將進(jìn)行覆蓋)參數(shù):指向記錄項(xiàng)的指針和要寫入的塊位置返回值:操作結(jié)果(插入成功返回1,失敗返回0)intfile_search(search_entry*s,intf)對(duì)存儲(chǔ)文件進(jìn)行遍歷,查找符合輸入的記錄項(xiàng)并輸出參數(shù):指向查詢項(xiàng)的指針和查詢類型返回值:符合條件的記錄項(xiàng)總數(shù)(如果是0則查找失?。﹊nt

file_delete(intn)刪除文件中某個(gè)記錄塊參數(shù):下標(biāo)值返回值:操作結(jié)果(插入成功返回1,失敗返回0)通訊錄-函數(shù)設(shè)計(jì)control.c控制文件voidappend(void)執(zhí)行數(shù)據(jù)錄入操作調(diào)用input_app()完成數(shù)據(jù)錄入,調(diào)用file_app()完成數(shù)據(jù)保存。voiddelet(void)執(zhí)行數(shù)據(jù)記錄項(xiàng)刪除操作調(diào)用file_search查找要?jiǎng)h除的記錄,然后調(diào)用file_delete()進(jìn)行刪除voidsearch(void)執(zhí)行數(shù)據(jù)查找操作調(diào)用searchmenu()進(jìn)入查找的菜單,調(diào)用input_search(ch)獲得要查找的內(nèi)容,file_search()進(jìn)行查找voidchange(void)執(zhí)行數(shù)據(jù)記錄項(xiàng)修改操作調(diào)用input_num()輸入待修改的記錄,調(diào)用file_search()進(jìn)行查找,調(diào)用input_new()輸入新的內(nèi)容,調(diào)用write_record()進(jìn)行更新voidlist_all(void)列出當(dāng)前所有聯(lián)系人信息打開文件,遍歷所有記錄并輸出voidinit(void)系統(tǒng)初試化操作,保證文件的正確性和合法性調(diào)用fopen()打開文件,初始化voidquit(void)系統(tǒng)退出函數(shù),寫回文件以保證數(shù)據(jù)的一致性關(guān)閉文件,退出系統(tǒng)通訊錄-程序運(yùn)行示意圖通訊錄源程序:略主要內(nèi)容通訊錄范例解析簡(jiǎn)易計(jì)算器范例解析俄羅斯方塊范例解析簡(jiǎn)單計(jì)算器問題描述:

Windows操作系統(tǒng)提供了計(jì)算器應(yīng)用程序,它有標(biāo)準(zhǔn)型和科學(xué)型兩種模式,是標(biāo)準(zhǔn)的Windows圖形界面應(yīng)用程序,支持鼠標(biāo)和鍵盤操作。Windows提供的計(jì)算器簡(jiǎn)單計(jì)算器功能分析:簡(jiǎn)單計(jì)算器是對(duì)Windows計(jì)算器的模擬,設(shè)計(jì)其功能如下:具有加(+)、減(-)、乘(*)、除(/)四則運(yùn)算和求百分運(yùn)算;通過鼠標(biāo)輸入一個(gè)數(shù),單擊S按鈕還可計(jì)算該數(shù)的平方根簡(jiǎn)單計(jì)算器設(shè)計(jì):簡(jiǎn)單計(jì)算器的處理過程:首先進(jìn)行圖形和鼠標(biāo)初始化,接著顯示簡(jiǎn)單計(jì)算器外觀,并接受用戶的鼠標(biāo)控制使用。如果單擊了鼠標(biāo)右鍵,則程序關(guān)閉圖形方式并結(jié)束運(yùn)行。簡(jiǎn)單計(jì)算器簡(jiǎn)單計(jì)算器的流程圖主程序流程:voidmain(){

GraphInit();

initmouse(); picture(); compute();

closegraph();}簡(jiǎn)單計(jì)算器界面外觀

:簡(jiǎn)單計(jì)算器界面設(shè)計(jì):(1)背景采用淺藍(lán)色,用灰色作底色和紅色作前景色畫一個(gè)bar3d圖形,模擬立體效果;(2)第1行是數(shù)據(jù)輸入和結(jié)果輸出的信息顯示框,使用bar函數(shù),用黃色填充;(3)信息顯示框下面是4排按鈕,每排5個(gè),同樣使用bar函數(shù)。按鈕被設(shè)計(jì)成有按下和彈起兩種狀態(tài),初始是彈起狀態(tài);(4)在每個(gè)按鈕框上顯示相應(yīng)的按鈕標(biāo)簽;(5)在簡(jiǎn)單計(jì)算器下方輸出使用說明和設(shè)計(jì)單位信息。簡(jiǎn)單計(jì)算器數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):簡(jiǎn)單計(jì)算器沒有用到復(fù)雜的數(shù)據(jù)結(jié)構(gòu),計(jì)算時(shí)定義了兩個(gè)double變量u、v和一個(gè)字符數(shù)組s及幾個(gè)標(biāo)志變量。開始使用時(shí)u和v變量分別存儲(chǔ)第1次和第2次輸入的數(shù)據(jù),計(jì)算結(jié)果始終保存在u中。繼續(xù)運(yùn)算時(shí),輸入的數(shù)據(jù)存于v,并與u中的數(shù)據(jù)運(yùn)算后結(jié)果保存于u中。簡(jiǎn)單計(jì)算器數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):簡(jiǎn)單計(jì)算器進(jìn)行加減乘除運(yùn)算的函數(shù)compute()中,定義以下主要標(biāo)志變量:(1)sign:表示'+'、'-'、'*'、'/'等運(yùn)算符的整數(shù)變量。值為0表示當(dāng)前未單擊過運(yùn)算符。(2)flag:輸入數(shù)據(jù)時(shí)是否單擊了小數(shù)點(diǎn)。單擊了小數(shù)點(diǎn),flag為1,否則為0。簡(jiǎn)單計(jì)算器函數(shù)設(shè)計(jì):簡(jiǎn)單計(jì)算器采用了結(jié)構(gòu)化程序設(shè)計(jì)思想,由一個(gè).h文件和四個(gè).c文件組成,并構(gòu)造了TC工程文件來管理和生成簡(jiǎn)單計(jì)算器應(yīng)用。每個(gè)源文件包含多個(gè)函數(shù)的設(shè)計(jì),這些函數(shù)的功能設(shè)計(jì)及處理描述見下表。簡(jiǎn)單計(jì)算器-函數(shù)設(shè)計(jì)文件名函數(shù)原型函數(shù)功能處理描述mouse.cvoidinitmouse()鼠標(biāo)初始化調(diào)用0x33中斷的0號(hào)功能寄存器ax返回值不是-1,表明鼠標(biāo)初始化失敗voidget_mouse_position(int*x,int*y)獲取鼠標(biāo)位置坐標(biāo)調(diào)用0x33中斷的3號(hào)功能鼠標(biāo)位置存于寄存器cx和dx中,然后存于x、y指針變量指向的單元返回調(diào)用函數(shù)int

leftpress()判斷鼠標(biāo)左鍵是否單擊調(diào)用0x33中斷的3號(hào)功能鼠標(biāo)狀態(tài)存于寄存器bx,其第0位是1表明左鍵被按下int

rightpress()判斷鼠標(biāo)右鍵是否單擊調(diào)用0x33中斷的3號(hào)功能鼠標(biāo)狀態(tài)存于寄存器bx,其第1位是1表明右鍵被按下簡(jiǎn)單計(jì)算器-函數(shù)設(shè)計(jì)picture.cvoidpicture()繪制計(jì)算器界面使用圖形函數(shù)繪制計(jì)算器外框調(diào)用公用函數(shù)bottonup()繪制彈起效果的按鈕調(diào)用系統(tǒng)outtextxy()輸出按鈕標(biāo)簽調(diào)用系統(tǒng)outtextxy()輸出使用說明等信息注:函數(shù)開始繪制鼠標(biāo)圖標(biāo)并保存在全局變量imagep中,在compute()函數(shù)(見compute.c文件)中涉及顯示、移動(dòng)鼠標(biāo)等操作簡(jiǎn)單計(jì)算器-函數(shù)設(shè)計(jì)util.cvoidGraphInit()圖形初始化調(diào)用系統(tǒng)函數(shù)initgraph()進(jìn)行初始化失敗則程序結(jié)束運(yùn)行voidbottondown(int

x,inty)畫按下效果的按鈕框調(diào)用畫線及顏色設(shè)置函數(shù)繪制按下效果的按鈕框(x,y)表示按鈕框的左上角坐標(biāo)voidbottonup(int

x,inty)畫彈起效果的按鈕框調(diào)用畫線及顏色設(shè)置函數(shù)繪制彈起效果的按鈕框(x,y)表示按鈕框的左上角坐標(biāo)voidshow(int

x,inty)單擊按鈕的效果顯示顯示按下的按鈕延時(shí)顯示彈起的按鈕注:模擬按鈕被單擊簡(jiǎn)單計(jì)算器-函數(shù)設(shè)計(jì)util.cchargetnumber(int

x,inty)獲取單擊按鈕圖標(biāo)每個(gè)按鈕的位置是確定的(即矩形框的左上角坐標(biāo)和大小已知)根據(jù)單擊按鈕時(shí)鼠標(biāo)的(x,y)可確定單擊了哪個(gè)按鈕,函數(shù)返回按鈕的標(biāo)簽例:左上角坐標(biāo)為(150,105)和右下角為(200,135)的矩形框表示計(jì)算器上數(shù)字'7'按鈕voidclearscreen()清信息顯示框清除信息顯示框中的數(shù)據(jù)(可能是輸入的數(shù)或輸出的計(jì)算結(jié)果)int

kx(chard)獲取按鈕的左上角x坐標(biāo)d表示按鈕的圖標(biāo)根據(jù)d返回按鈕的左上角x坐標(biāo)按鈕左上角坐標(biāo)為模擬單擊按鈕服務(wù)簡(jiǎn)單計(jì)算器-函數(shù)設(shè)計(jì)util.cint

ky(chard)獲取按鈕的左上角y坐標(biāo)d表示按鈕的圖標(biāo)根據(jù)d返回按鈕的左上角y坐標(biāo)按鈕左上角坐標(biāo)為模擬單擊按鈕服務(wù)voidoutch(doublesum)在信息顯示框中輸出sumsum的絕對(duì)值大于1e20,輸出E,即對(duì)太大或太小的數(shù)顯示出錯(cuò)sum小于等于1e20且大于等于1e8,顯示格式為d.dExxsum大于等于-1e20且小于等于-1e8,顯示格式為-d.dExxsum的值在-1e8和1e8之間,若是0,顯示0.其他,按實(shí)際顯示compute.cvoidcompute()簡(jiǎn)單計(jì)算器的主處理函數(shù)最外層循環(huán)由鼠標(biāo)右鍵控制,單擊右鍵則計(jì)算器退出在其內(nèi)層,判斷鼠標(biāo)左鍵是否單擊,無則僅做移動(dòng)鼠標(biāo)光標(biāo)處理若單擊左鍵,且MouseLeftFlag全局變量為1,則置該變量為0,避免重復(fù)進(jìn)入,并進(jìn)行相應(yīng)處理若單擊的是'C',則啟用計(jì)算器若單擊'0'-'9'數(shù)字鍵,則進(jìn)行第1個(gè)或第2個(gè)輸入數(shù)據(jù)的處理若單擊加,減,乘,除,等號(hào)按鈕,進(jìn)行相應(yīng)的計(jì)算處理若單擊小數(shù)點(diǎn)按鈕的處理若單擊求平方根按鈕的處理若單擊+/-按鈕的處理doublecalculate(doubleu,doublev,intsign)加減乘除計(jì)算處理根據(jù)sign的運(yùn)算符進(jìn)行加減乘除的計(jì)算處理計(jì)算結(jié)果保存在u中,但由函數(shù)返回voidmain()計(jì)算器的main()函數(shù)應(yīng)用程序由多個(gè)文件組成時(shí),僅能有一個(gè)main()函數(shù)簡(jiǎn)單計(jì)算器-函數(shù)設(shè)計(jì)簡(jiǎn)單計(jì)算器源程序:略簡(jiǎn)單計(jì)算器測(cè)試:關(guān)于測(cè)試方法和特殊輸入的測(cè)試,針對(duì)簡(jiǎn)單計(jì)算器程序,我們可以從以下幾個(gè)方面來檢驗(yàn)程序功能是否正確。1.界面及按鈕單擊測(cè)試檢查界面布局是否合理、正確,單擊按鈕是否有按下再?gòu)椘鹦Ч?,單擊按鈕的輸入是否正確。簡(jiǎn)單計(jì)算器測(cè)試:2.簡(jiǎn)單計(jì)算器的功能測(cè)試(1)加、減、乘、除四則運(yùn)算的測(cè)試。(2)優(yōu)先級(jí)處理的測(cè)試單擊‘1’、‘+’、‘2’、‘*’、‘4’、‘=’按鈕,結(jié)果是12,即不支持四則運(yùn)算的優(yōu)先級(jí)。因?yàn)閱螕簟?’按鈕時(shí),1+2的結(jié)果3已經(jīng)計(jì)算并顯示在信息顯示框中,此時(shí)繼續(xù)計(jì)算乘4得結(jié)果12。簡(jiǎn)單計(jì)算器測(cè)試:

(3)求平方根運(yùn)算的測(cè)試

1)計(jì)算sqrt(9)

先單擊'9'、再'S'按鈕,看結(jié)果是否正確。

2)計(jì)算1+sqrt(9)

檢查是否能正確1+sqrt(9)。通過以上測(cè)試可以基本確定計(jì)算器程序是否實(shí)現(xiàn)了預(yù)定的功能。主要內(nèi)容通訊錄范例解析簡(jiǎn)易計(jì)算器范例解析俄羅斯方塊范例解析俄羅斯方塊問題描述:

要求支持鍵盤操作和7種不同類型方塊的旋轉(zhuǎn)變換,并且界面上顯示下一個(gè)方塊的提示以及當(dāng)前的玩家得分俄羅斯方塊功能分析:俄羅斯方塊游戲需要解決的問題包括:(

1)整個(gè)游戲界面的圖形顯示;(2)各種方塊形狀的表示;(3)如何控制方塊的移動(dòng)、旋轉(zhuǎn)和下落速度;(4)如何判斷方塊是否到底;(5)如何判斷一行是否填滿以及如何消去填滿的行;(6)如何判斷游戲的結(jié)束及如何終止游戲;(7)游戲難度的設(shè)計(jì)和得分規(guī)則

俄羅斯方塊功能分析:重點(diǎn):游戲面板的數(shù)據(jù)結(jié)構(gòu):二維數(shù)組7種形狀方塊的數(shù)據(jù)結(jié)構(gòu):結(jié)構(gòu)體保存每種形狀方塊的坐標(biāo)、顏色俄羅斯方塊設(shè)計(jì):程序總體結(jié)構(gòu):voidmain(){

InitializeGraph();

SetTimer(newtimer);/*設(shè)置新的時(shí)鐘中斷*/ while(1) {

StartGame();

ProcessInGame();

if(bOver)break; }

KillTimer();

closegraph();}俄羅斯方塊界面設(shè)計(jì):分為左右兩個(gè)部分:左邊為游戲面板右邊有三個(gè)框:下一形狀提示框、速度框和記分框俄羅斯方塊數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):定義如下的結(jié)構(gòu)體來表示每一個(gè)形狀:structblock{

intarrXY[8];

int

nColor;

int

nNext;};可用4*4的格子顯示7種形狀,并用4個(gè)數(shù)對(duì)來表示:arrXY[0]、arrXY[1]表示第一個(gè)數(shù)對(duì),arrXY[2]、arrXY[3]表示第二個(gè)數(shù)對(duì)…。例如,(-2,0)、(-1,0)、(0,0)、(1,0)表示左邊的方塊

-1012-3□□□□-2□■□□-1□■□□0□■■□俄羅斯方塊數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):每一種形狀都可以進(jìn)行旋轉(zhuǎn),旋轉(zhuǎn)后的變形體同樣可用結(jié)構(gòu)體block表示。所有的7種形狀和它們的旋轉(zhuǎn)體(共19個(gè))可保存在一個(gè)全局?jǐn)?shù)組arrayBlock中。Block中的nNext就是當(dāng)前形狀逆時(shí)針旋轉(zhuǎn)后的下一個(gè)形狀在該全局?jǐn)?shù)組中的索引。俄羅斯方塊數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):第一個(gè)形狀和它的旋轉(zhuǎn)體在arrayBlock中的表示□□□□□□□□□□□□□□□□□■□□□□□□□■■□□□□□□■□□□□■□□□■□■■■□□■■□■■■□□□■□■□□□BLOCKarrayBlock[19]={ /*x1,y1,x2,y2,x3,y3,x4,y4,color,next,第一種形狀*/ {0,-2,0,-1,0,0,1,0,CYAN,1},/*第一種形狀,對(duì)應(yīng)圖3-12的第一個(gè)*/ {-1,0,0,0,1,-1,1,0,CYAN,2},/*一種旋轉(zhuǎn)體,對(duì)應(yīng)圖3-12的第二個(gè)*/ {0,-2,1,-2,1,-1,1,0,CYAN,3},/*另一種旋轉(zhuǎn)體,對(duì)應(yīng)圖3-12的第三個(gè)*/ {-1,-1,-1,0,0,-1,1,-1,CYAN,0},/*第三種旋轉(zhuǎn)體,對(duì)應(yīng)圖3-12的第四個(gè)*/…….}俄羅斯方塊數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):游戲的主界面:寬10、高20的游戲板數(shù)據(jù)結(jié)構(gòu):全局?jǐn)?shù)組Gameboard[12][22],1表示已有方塊,0表示這個(gè)位置空著。在10*20基礎(chǔ)上各加2行、2列為了便于判斷形狀在移動(dòng)時(shí)是否到邊、到底。整個(gè)屏幕的坐標(biāo)系原先為640*480。在此游戲中,將16個(gè)像素定義為一個(gè)方格的邊長(zhǎng),所以坐標(biāo)系轉(zhuǎn)變成為了40*30(640/16=40,480/16=30)。俄羅斯方塊數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì):絕對(duì)坐標(biāo)和相對(duì)坐標(biāo)的轉(zhuǎn)換相對(duì)坐標(biāo)即指在結(jié)構(gòu)體block中的4對(duì)坐標(biāo)某個(gè)形狀的絕對(duì)坐標(biāo):指原點(diǎn)方塊(4*4格子中的第2列、第4行的方塊)在10*20的游戲面板中的坐標(biāo)

俄羅斯方塊-程序結(jié)構(gòu)1個(gè).h文件和4個(gè).c文件,共20個(gè)函數(shù);函數(shù)相互關(guān)系見右圖

俄羅斯方塊-函數(shù)設(shè)計(jì)Timer.c文件文件名函數(shù)原型函數(shù)功能函數(shù)處理描述Timer.cVoidinterrupt(*oldtimer)(void)指向原來時(shí)鐘中斷處理過程入口的中斷處理函數(shù)指針(句柄)Voidinterruptnewtimer(void)新的時(shí)鐘中斷處理函數(shù)調(diào)用(*oldtimer)()函數(shù)句柄,計(jì)時(shí)器自加1VoidSetTimer(voidinterrupt(*IntProc)(void))設(shè)置新的時(shí)鐘中斷處理過程調(diào)用setvect()設(shè)置新的時(shí)鐘中斷處理過程voidKillTimer()恢復(fù)原有的時(shí)鐘中斷處理過程調(diào)用setvect()恢復(fù)原有的時(shí)鐘中斷處理過程俄羅斯方塊-函數(shù)設(shè)計(jì)Drawing.c文件文件名函數(shù)原型函數(shù)功能函數(shù)處理描述Drawing.cvoidInitializeGraph()初始化圖形模式①調(diào)用initgraph()切換到圖形模式②初始化若發(fā)生錯(cuò)誤,則返回錯(cuò)誤碼。VoidInitializeGameboard()初始化游戲面板以及下一形狀提示框、計(jì)分框和難度框①調(diào)用bar()、rectangle()等庫(kù)函數(shù)繪圖函數(shù)繪制游戲界面。②調(diào)用outtextxy()函數(shù)顯示文字。俄羅斯方塊-函數(shù)設(shè)計(jì)Util.c文件函數(shù)原型函數(shù)功能函數(shù)處理描述Util.cvoidDrawSquare(intx,inty)在坐標(biāo)(x,y)處畫方塊調(diào)用庫(kù)函數(shù)bar()繪制方塊VoidDrawBlock(int

BlockIndex,int

sx,int

sy,intcolor)在坐標(biāo)(sx,sy)處繪制顏色為color的形狀調(diào)用DrawSquare()函數(shù)繪制形狀I(lǐng)nt

IsConflict(int

BlockIndex,intx,inty)判斷形狀是否能存在于坐標(biāo)(x,y)處無沖突返回0,有沖突返回1VoidHandleLeft(int

BlockIndex,int*x,int*y)按下左方向鍵時(shí)的處理函數(shù)調(diào)用IsConflic()函數(shù)判斷形狀是否可以左移,VoidHandleRight(int

BlockIndex,int*x,int*y)按下右方向鍵時(shí)的處理函數(shù)調(diào)用IsConflic()函數(shù)判斷形狀是否可以右移,VoidHandleUp(int*BlockIndex,int*x,int*y)按下上方向鍵(旋轉(zhuǎn)鍵)時(shí)的處理函數(shù)調(diào)用IsConflic()函數(shù)判斷形狀是否可以旋轉(zhuǎn),int

HandleDown(int

BlockIndex,int*x,int*y)按下向下方向鍵或自由下落時(shí)的處理函數(shù)形狀在自由下落返回0,無法下落了返回1,并做相應(yīng)處理int

IsLineFull(inty)判斷第y行是否已被填滿填滿返回1,否則返回0voidKillLine(inty)消去第y行將消去的行置為背景色int

KillLines(inty)消去第y行以及與第y行連續(xù)的上面被填滿的行返回消去的行數(shù)int

IsGameOver()判斷游戲是否結(jié)束游戲結(jié)束返回1,否則返回0

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論