版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
課程設(shè)計——俄羅斯方塊實用文檔—共23頁—第24頁目錄一、 課程設(shè)計的目的與要求 31.1課程設(shè)計的目的 31.2課程設(shè)計的要求 31.3選題背景 3二、 游戲的分析與設(shè)計 42.1需求分析 42.1.1游戲需求 42.2.2游戲界面需求: 42.2.3游戲形狀(方塊)需求: 42.2算法分析 42.2.2概要流程圖 52.2.2定義方塊的數(shù)據(jù)結(jié)構(gòu) 62.2.3游戲設(shè)計分析 7三、程序主要功能的實現(xiàn) 73.3游戲功能的實現(xiàn) 7.3.3.1游戲界面 73.3.2生成方塊 83.3.3方塊變形 83.3.4方塊顯示 93.3.5消行 93.3.6暫停退出 10四. 程序測試 10五.總結(jié)與體會 12六.附錄一(參考書) 12七.附錄二(程序源代碼) 12
用VC++實現(xiàn)俄羅斯方塊的程序設(shè)計課程設(shè)計的目的與要求1.1課程設(shè)計的目的本課程設(shè)計是一個綜合性的實踐教學環(huán)節(jié),其目的在于促進學生復習和鞏固計算機軟件設(shè)計知識,加深對軟件設(shè)計方法、軟件設(shè)計技術(shù)和設(shè)計思想的理解,并能運用所學知識進行開發(fā)。希望通過本課程設(shè)計中簡單系統(tǒng)的開發(fā),使學生掌握軟件設(shè)計的基本方法和基本流程,提高學生的綜合應用能力。1.2課程設(shè)計的要求利用MicrosoftVisualC++編寫一個文本窗口下的俄羅斯方塊游戲。要求:要求用VC++設(shè)計與實現(xiàn)俄羅斯方塊游戲。要求包括系統(tǒng)的需求分析;系統(tǒng)總框圖及每個模塊的設(shè)計分析;算法的設(shè)計與實現(xiàn);游戲的內(nèi)部實現(xiàn);游戲區(qū)域繪圖的實現(xiàn);系統(tǒng)存在的問題及錯誤處理;列出所有定義的函數(shù)及說明;附上程序源代碼。1.3選題背景俄羅斯方塊是家喻戶曉的益智小游戲,選擇這個題目一是為了將自己的所學知識加以運用,二是俄羅斯方塊是我第一個接觸到的游戲,它的實現(xiàn)方法也吸引著我。我希望通過探索實踐去實現(xiàn)它,在這次學習中從實踐和實際的項目中提高自己的編程能力。因此我選定了這個題目。游戲的分析與設(shè)計2.1需求分析2.1.1游戲需求隨機給出不同的形狀(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充給定的區(qū)域,若填滿一條便消掉,若在游戲中各形狀填滿了給定區(qū)域,為輸者。2.2.2游戲界面需求:良好的用戶界面,有關(guān)游戲的使用說明。讓方塊在一定的區(qū)域內(nèi)運動和變形,該區(qū)域用一種顏色表明,既用一種顏色作為背景,最好設(shè)為黑色。還需用另一種顏色把黑色圍起來,寬度適中,要實現(xiàn)美感。2.2.3游戲形狀(方塊)需求:良好的方塊形狀設(shè)計,繪制七種常見的基本圖形(長條形、Z字形、反Z形、田字形、7字形、反7形、T字型),各個方塊要能實現(xiàn)它的變形,可設(shè)為順時針或逆時針變形,一般為逆時針。2.2算法分析根據(jù)分析,俄羅斯方塊這個程序一共要實現(xiàn)如下幾個功能,開始游戲、游戲的暫停\繼續(xù)、游戲控制和退出游戲。其中游戲控制最為主要和重要,它控制著整個游戲的畫面和有關(guān)數(shù)據(jù)的操作,是游戲的核心部分。暫停和退出功能做成一體,在退出的提示下不做任何操作即可實現(xiàn)暫停的功能。程序結(jié)構(gòu)如圖2-2-1所示。圖2-2-1程序結(jié)構(gòu)圖2.2.2概要流程圖根據(jù)分析后的程序結(jié)構(gòu)圖設(shè)計出相應的流程圖。俄羅斯方塊的內(nèi)容主要包括游戲開始,畫背景和邊框,顯示分數(shù)等級和下一個方塊的預覽圖;根據(jù)速度沒隔一定時間方塊自動下落,當有按鍵操作時,根據(jù)相應按鍵執(zhí)行動作,每次動作前要判斷是否動作可以執(zhí)行。下落方塊滿一行時,消去該行,根據(jù)消去行數(shù)得到相應分數(shù)。分數(shù)達到一定程度,等級提升,速度加快。同時可以響應Esc按鍵,提示是否退出程序。圖2-2-2流程圖2.2.2定義方塊的數(shù)據(jù)結(jié)構(gòu)對于方塊在某一瞬間的位置標識,我們采用一個4×4的小數(shù)組標識出來,即用4個存儲單位空間存儲當前下墜物的每一子塊的位置,也就是說,用4個存儲單位空間存儲當前下墜物的每一子塊的位置來對整個下墜物件的位置進行標識,而每個存儲空間的大小就是一個典的坐標值(x,y),而每個方塊按照從左到右的方式進行編號,并且在編號過程中對于同一列的方塊實行從上到下進行編號[2]。01230123(x0,y0)(x1,y1)(x2,y2)(x3,y3)23032303(x0,y0)(x1,y1)(x2,y2)(x3,y3)圖2-2-3方塊編號+Diamond[0][0]和Diamond[0][1]則是第0號方塊的橫坐標x和縱坐標y;Diamond[2][0]和Diamond[2][1]則是第2號方塊的橫坐標x和縱坐標y。2.2.3游戲設(shè)計分析根據(jù)程序的結(jié)構(gòu),將俄羅斯方塊需要實現(xiàn)的功能細化為相應的成員函數(shù),每個成員函數(shù)實現(xiàn)一個功能,進而實現(xiàn)程序的運行。voidHomePage(HANDLEhandle); //首頁voidInitialize(); //初始化界面voidPlayMusic(); //播放背景音樂WORDCreateColors(WORDnewColor[1]); //產(chǎn)生隨機方塊顏色int*Setup(); //創(chuàng)建voidDraw(intDia[],intw,inth,intx,inty,WORDColors[],intcColors); //畫方塊voidTurnOver(intDia[][4],intw,inth,int*x,inty); //翻轉(zhuǎn)方塊*BOOLPutDown(intDia[],intx,inty,intw,inth); //判斷能否放下和移動*voidClearIn(int*a,intw,inth,intx,inty); //清除游戲區(qū)域內(nèi)的方塊voidClearOut(int*b,intw,inth,intx,inty); //清除游戲外圍的方塊voidDeleteRow(intm[][width],introw,intw,inth); //消除一行*voidGAMEOVER(); //行數(shù)超過界限游戲結(jié)束voidFlashScreen(); //刷屏效果三、程序主要功能的實現(xiàn)3.3游戲功能的實現(xiàn).3.3.1游戲界面俄羅斯方塊的游戲界面包括游戲區(qū)域邊框、下落方塊繪制、右部計分和預覽圖顯示等。游戲區(qū)域邊框的繪制比較簡單,循環(huán)中確定光標的位置輸出特定字符,即可完成邊框繪制。游戲區(qū)方塊的繪制,循環(huán)從數(shù)據(jù)數(shù)組中依次讀出數(shù)據(jù),根據(jù)讀到的數(shù)據(jù)顯示“■”,最后組成方塊的形狀,完成方塊的繪制。計分和預覽圖部分先畫出一個矩形區(qū)域,然后控制按鍵來控制方塊的移動如圖3-3-1所示(游戲的區(qū)域)。圖3-3-1游戲的區(qū)域3.3.2生成方塊本程序中生成的方塊有六種形狀,如圖3-3-2所示。每一種方塊以Diamond標記,在程序運行生成方塊時,調(diào)用Diamond[4][4]語句,確定當前要顯示的是哪一個方塊形狀。而在實際運行中,第一次需要調(diào)用兩次生成方塊函數(shù)Draw(),將先產(chǎn)生的賦給游戲當前方塊,第二個賦給預覽圖方塊。以后每次產(chǎn)生一個方塊,把預覽方塊賦給當前方塊,把新產(chǎn)生的賦給預覽方塊圖3-3-23.3.3方塊變形俄羅斯方塊的特點就在于通過方塊的變形拼滿整行來消去該行方塊從而使游戲可以繼續(xù)下去,很難想象不能變形的俄羅斯方塊是什么樣子。而變形的過程就是根據(jù)當前方塊形狀改變方塊的相對位置,這樣就可以改變方塊的形狀了。在程序中每當按下C鍵,程序判斷可以變形后,根據(jù)當前方塊的形狀序號Diamond[4][4]和變化形狀序號TurnOver()調(diào)用相應的方塊數(shù)值賦給draw()函數(shù),通過刷新重畫就可以顯示變化后的方塊了。3.3.4方塊顯示以上方塊的操作都是數(shù)據(jù)層面的操作,而真正要在游戲窗口中看到數(shù)據(jù)的變化,還必須把方塊不斷的繪制出來。這就是Draw()函數(shù)的作用。把當前運動的方塊對應節(jié)點存儲在一個4*4數(shù)組里,變形和生成方塊的過程就是更新該數(shù)組數(shù)據(jù)的過程。然后在draw()函數(shù)里檢測數(shù)組的各個值,并控制光標跳到一定位置,畫出“■”組成方塊。具體方塊對應數(shù)組數(shù)值關(guān)系如圖3-3-4所示。圖3-3-43.3.5消行游戲玩家拼滿一行后,程序消去滿行,。中當一個方塊下落停止后,程序檢查方塊是否充滿了游戲區(qū)域,如果是結(jié)束游戲。不是,則判斷是否構(gòu)成消行條件,從下落方塊的最低點依次向上檢查是否可以消行。如圖3-3-5所示圖3-3-53.3.6暫停退出游戲的友好性在于能考慮用戶的需要,隨時可以暫停/繼續(xù)游戲,在不愿繼續(xù)游戲時退出游戲。本程序可以在用戶需要的時候響應Esc按鍵,提示是否退出游戲,如果不做選擇即可暫停游戲,等待選擇程序測試經(jīng)過調(diào)試和修改,程序完全實現(xiàn)設(shè)計要求,成功模擬了俄羅斯方塊的運行過程和游戲效果,只是界面略微簡陋,但已從程序?qū)用嫔蠈崿F(xiàn)了游戲,達到了這次實訓的要求和目的。程序正常生成方塊,根據(jù)速度值每隔一定時間自動下落,如有操作按鍵按下,根據(jù)按鍵實現(xiàn)位移和變形。當方塊滿一行后,可以消除該行。游戲運行界面如圖4-4-1,圖4-4-2.圖4-4-3圖4-4-1(初始界面)圖4-4-2.(游戲界面)圖4-4-3(游戲結(jié)束界面)五.總結(jié)與體會通過這次課程設(shè)計,我收獲了很多。首先把所學知識加以利用和鞏固,其次在實踐中遇到問題去探索和學習,更增加了新知識。由于程序是用文本窗口模擬的圖形,界面比較簡陋,如果使用MFC用C++來實現(xiàn),那么界面將會非常好,只是由于所學知識有限,只有下一步去探索了。六.附錄一(參考書)1.《C++程序設(shè)計》——譚浩強北京:清華大學出版社2.《數(shù)據(jù)結(jié)構(gòu)》——嚴蔚敏北京:清華大學出版社3.《VisualC++游戲設(shè)計》——欽科技.北京:科海電子出版社
七.附錄二(程序源代碼)#include<windows.h>#include<conio.h>#include<time.h>#include<stdlib.h>#include"colorConsole.h"#defineleft 75#defineright 77#definedown 80//游戲區(qū)域大小#definewidth12#defineheight20intLleft[4][4]={{1,0,0,0}, {1,1,1,0}, {0,0,0,0}, {0,0,0,0}}; //左型LintLright[4][4]={{0,0,1,0}, {1,1,1,0}, {0,0,0,0}, {0,0,0,0}}; //右型LintZleft[4][4]={{1,1,0,0}, {0,1,1,0}, {0,0,0,0}, {0,0,0,0}}; //左型ZigzagintZright[4][4]={{0,1,1,0}, {1,1,0,0}, {0,0,0,0}, {0,0,0,0}}; //右型ZigzagintT[4][4]={{0,1,0,0}, {1,1,1,0}, {0,0,0,0}, {0,0,0,0}}; //T型intStick[4][4]={{1,1,1,1}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}}; //棒型intCube[4][4]={{1,1,0,0}, {1,1,0,0}, {0,0,0,0}, {0,0,0,0}}; //正方形intDiamond[4][4]; //用于表示不同方塊的數(shù)組intoffset_x=20; //打印偏移量intoffset_y=5; //打印偏移量intarea[height][width]; //游戲區(qū)域的數(shù)組voidHomePage(HANDLEhandle); //首頁voidInitialize(); //初始化界面voidPlayMusic(); //播放背景音樂WORDCreateColors(WORDnewColor[1]); //產(chǎn)生隨機方塊顏色int*Setup(); //創(chuàng)建voidDraw(intDia[],intw,inth,intx,inty,WORDColors[],intcColors); //畫方塊voidTurnOver(intDia[][4],intw,inth,int*x,inty); //翻轉(zhuǎn)方塊*BOOLPutDown(intDia[],intx,inty,intw,inth); //判斷能否放下和移動*voidClearIn(int*a,intw,inth,intx,inty); //清除游戲區(qū)域內(nèi)的方塊voidClearOut(int*b,intw,inth,intx,inty); //清除游戲外圍的方塊voidDeleteRow(intm[][width],introw,intw,inth); //消除一行*voidGAMEOVER(); //行數(shù)超過界限游戲結(jié)束voidFlashScreen(); //刷屏效果voidmain(){ HANDLEhandle; handle=initiate(); HomePage(handle); //游戲首頁 Initialize(); //進行初始化 //創(chuàng)建新的方塊 int*advance=NULL; advance=Setup(); intblank,x,y; boolflag; while(1) { //復制已創(chuàng)建的方塊 for(inti=0;i<4;i++) for(intj=0;j<4;j++) if(Diamond[i][j]=*(advance+i*4+j)) blank=i; y=1-blank;x=4; ClearOut(&Diamond[0][0],4,4,13,13);//清除上一個方塊 advance=Setup(); WORDColors[1]; Colors[0]=FOREGROUND_RED|FOREGROUND_INTENSITY;//游戲區(qū)域外圍即將出現(xiàn)的下一個方塊的顏色 Draw(advance,4,4,13,13,Colors,1);//游戲區(qū)域外圍即將出現(xiàn)的下一個方塊 WORDnewColor[1]; Colors[0]=CreateColors(newColor);//游戲區(qū)域中出現(xiàn)的方塊的顏色 Draw(&Diamond[0][0],4,4,x,y,Colors,1);//游戲區(qū)域中出現(xiàn)方塊 while(_kbhit())//清除鍵盤緩沖區(qū) _getch(); flag=true; while(flag) { intputoff=0,putoff_max=50;//延遲量 while(putoff<putoff_max) { if(_kbhit()) { intd=0; intkey=_getch(); switch(key) { case224: switch(_getch()) { casedown: putoff=putoff_max; break; caseleft: if(PutDown(&Diamond[0][0],x-1,y,4,4))//能否左移 { ClearIn(&Diamond[0][0],4,4,x,y);//若能清除當前方塊 x--;//左移x值減1 d=1; } break; caseright: if(PutDown(&Diamond[0][0],x+1,y,4,4))//能否右移 { ClearIn(&Diamond[0][0],4,4,x,y);//若能清除當前方塊 x++;//右移x值加1 d=1; } break; } break; case99://翻轉(zhuǎn)方塊 ClearIn(&Diamond[0][0],4,4,x,y); TurnOver(Diamond,4,4,&x,y); d=1; break; } if(d)//有按鍵操作后 { HANDLEhandle; handle=initiate(); WORDColors[1]={CreateColors(newColor)}; Draw(&Diamond[0][0],4,4,x,y,Colors,1); d=0; } } Sleep(10); putoff++; } if(PutDown(&Diamond[0][0],x,y+1,4,4))//是否能下移 { ClearIn(&Diamond[0][0],4,4,x,y);//若能清除當前方塊 y++;//下移y值加1 HANDLEhandle; handle=initiate(); WORDColors[1]={CreateColors(newColor)}; Draw(&Diamond[0][0],4,4,x,y,Colors,1); } else { flag=!flag;//跳出while(flag)循環(huán),產(chǎn)生新方塊 if(y<=1) GAMEOVER(); //結(jié)束游戲 for(inti=0;i<4;i++)//放下方塊 for(intj=0;j<4;j++) if(Diamond[i][j]&&((i+y)<height-1)&&((j+x)<width-1))//////////此條件還沒懂////////// area[i+y][j+x]=Diamond[i][j]; intfull; for(i=y;i<min(y+4,height-1);i++) { //如果第i行全是1:某行,第一個元素是1,則括號內(nèi)為假,不執(zhí)行full=0, //返回繼續(xù)for循環(huán),直到若全為1則結(jié)束for,full仍為1,則執(zhí)行消行的函數(shù) //同理若有一個元素為0了,則括號內(nèi)為真,full=0被執(zhí)行,則不執(zhí)行消行的函數(shù) full=1; for(intj=1;j<11;j++) if(!area[i][j]) full=0; if(full)//消掉一行 DeleteRow(area,i,width,height); } } } }}voidHomePage(HANDLEhandle){ handle=initiate(); WORDtitleColor[1]={FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY}; textout(handle,10,3,titleColor,1,"┓╭┓┓╮┏━┳━┳┓┓┏┏━╮━━╮┓┓"); textout(handle,10,4,titleColor,1,"┏╯┛┃┃┛┃┃┃┃┏┣┣┫┏━┳━━┛┏┣┏┣━┓"); textout(handle,10,5,titleColor,1,"┃┃━┣┣┛┗━┻━┻╯┣┫┃┣━━┓┃┃┃"); textout(handle,10,6,titleColor,1,"┃┃╭┣┃┃┣━━━━┓┣┫┣┳┛╭┃┃┃━┣━┻"); textout(handle,10,7,titleColor,1,"┃┛┃┣╯╯┗━━╮┃┗┻┻┫┃┃┃┃┃┃"); textout(handle,10,8,titleColor,1,"╰┛━╯╰┛┗━━━━╯┗╯┗┛┗╯┗━╯━╯┗┻┗╯━╯"); while(!_kbhit()) { textout(handle,29,15,titleColor,1,"按任意鍵開始"); Sleep(60); textout(handle,29,15,titleColor,1,""); Sleep(60); } intany_key=_getch(); srand(any_key);//按任意鍵 system("CLS");}voidInitialize(){ HANDLEhandle; handle=initiate(); for(inti=1;i<20;i++)//游戲區(qū)域高20 { area[i][0]=-1;//每行最后一個數(shù)組元素 area[i][11]=-1;//每行第一個數(shù)組元素 } for(i=1;i<12;i++)//游戲區(qū)域?qū)?2 area[19][i]=-2;//最后一行 WORDColors[1]={FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY}; textout(handle,offset_x+26,offset_y+2,Colors,1,"俄羅斯方塊"); textout(handle,offset_x+26,offset_y+4,Colors,1,"任意鍵開始"); textout(handle,offset_x+26,offset_y+6,Colors,1,"C鍵翻轉(zhuǎn)方塊,方向鍵→,←,↓控制方向"); textout(handle,offset_x+26,offset_y+8,Colors,1,"ESC:退出"); textout(handle,offset_x+26,offset_y+10,Colors,1,"下一個方塊"); textout(handle,offset_x+26,offset_y+16,Colors,1,"制作人:王魯恒"); textout(handle,offset_x+26,offset_y+18,Colors,1,"班級:1020562");textout(handle,offset_x+26,offset_y+20,Colors,1,"學號:28"); Colors[0]=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY; Draw(&area[0][0],12,20,0,0,Colors,1);//畫游戲界面的邊框 Colors[0]=FOREGROUND_RED|FOREGROUND_BLUE; for(intnet_y=offset_y+1;net_y<offset_y+height-1;net_y++) textout(handle,offset_x+2,net_y,Colors,1,"□□□□□□□□□□"); intstart=_getch();//有按鍵輸入 srand(start); //按鍵是任意的}voidPlayMusic(){ sndPlaySound("Theme.wav",SND_LOOP|SND_ASYNC);}WORDCreateColors(WORDnewColor[1]){ WORDwhiColor[1],yelColor[1],cyaColor[1]; whiColor[0]=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY; yelColor[0]=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY; cyaColor[0]=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY; srand(time(NULL)); intseed=rand()%3; switch(seed) { case0: newColor[0]=whiColor[0]; break; case1: newColor[0]=yelColor[0]; break; case2: newColor[0]=cyaColor[0]; break; } returnnewColor[0];}int*Setup(){ int*diamond=NULL; srand(time(NULL)); intseed=rand()%7; //七種方塊 switch(seed) { case0: diamond=&Lleft[0][0]; break; case1: diamond=&Lright[0][0]; break; case2: diamond=&Zleft[0][0]; break; case3: diamond=&Zright[0][0]; break; case4: diamond=&T[0][0]; break; case5: diamond=&Stick[0][0]; break; case6: diamond=&Cube[0][0]; break; } returndiamond;}voidDraw(intDia[],intw,inth,intx,inty,WORDColors[],intcolor){ HANDLEhandle; handle=initiate(); inttemp; for(inti=0;i<h;i++) for(intj=0;j<w;j++)//循環(huán)以訪問到每個數(shù)組元素 if((temp=Dia[i*w+j])&&y+i>0)//////////此條件還沒太懂////////// { if(temp==1) textout(handle,2*(x+j)+offset_x,y+i+offset_y,Colors,color,"■"); elseif(temp==-1)//只用于畫邊框 //Dia[]即邊框處元素(考慮是二維數(shù)組) textout(handle,2*(x+j)+offset_x,y+i+offset_y,Colors,color,"∫"); elseif(temp==-2)//只用于畫底框 //Dia[]即邊框處元素(考慮是二維數(shù)組) textout(handle,2*(x+j)+offset_x-1,y+i+offset_y,Colors,color,"∞"); }}voidTurnOver(intDia[][4],intw,inth,int*x,inty){ intchange[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; intflag=0,l=0; for(inti=h-1;i>=0;i--) { for(intj=0;j<w;j++) if(Dia[i][j]) { change[j][l]=Dia[i][j]; flag=1; } if(flag) { l++; flag=0; } } for(i=0;i<4;i++) if(PutDown(&change[0][0],*x-i,y,w,h)) { *x-=i; for(intk=0;k<h;k++) for(intj=0;j<w;j++) Dia[k][j]=change[k][j]; break; }}BOOLPutDown(inta[],intx,inty,intw,inth){ for(inti=max(y,1);i<y+h;i++)//max()--windef.h for(intj=x;j<x+w;j++) if(area[i][j]&&a[w*(i-y)+j-x]) return0; //不能移動 return1; //能移動}voidClearIn(int*a,intw,inth,intx,inty){ HANDLEhandle; handle=initiate(); WORDColors[1]={FOREGROUND_RED|FOREGROUND_BLUE}; for(inti=0;i<h;i++) for(intj=0;j<w;j++) if(a[i*w+j]&&i+y>0)//和Draw函數(shù)的條件一樣 textout(handle,2*(x+j)+offset_x,y+i+offset_y,Colors,1,"□");}voidClearOut(int*b,intw,inth,intx,inty){ HANDLEhandle; handle=initiate(); WORDColors[1]={FOREGROUND_RED|FOREGROUND_BLUE}; for(inti=0;i<h;i++) for(intj=0;j<w;j++) if(b[i*w+j]&&i+y>0) textout(handle,2*(x+j)+offset_x,y+i+offset_y,Colors,1,"");}voidDeleteRow(intm[][width],introw,intw,inth)//消行{ HANDLEhandle; handle=initiate(); WORDnewColor[1]; WORDColors[1]={CreateColors(newColor)}; textout(handle,2+offset_x,row+offset_y,Colors,1,"□□□□□□□□□□");//滿行寫一行空白10個 Sleep(100); for(inti=row;i>1;i--) { ClearIn(&m[i][1],width-2,1,1,i); for(intj=1;j<width-1;j++) m[i][j]=m[i-1][j]; Draw(&m[i][1],width-2,1,1,i,Colors,1); } for(i=1;i<width-1;i++) m[1][i]=0;}voidGAMEOVER(){ HANDLEhandle; handle=initiate(); WORDColors[1]={FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY}; FlashScreen(); while(1) { textout(handle,offset_x+9,offset_y+8,Colors,1,"ULOST!"); Sleep(300); textout(handle,offset_x+9,offset_y+8,Colors,1,""); Sleep(300); }}voidFlashScreen(){ HANDLEhandle; handle=initiate(); WORDfsColor[1]={FOREGROUND_BLUE|FOREGROUND_INTENSITY}; for(intyy=19;yy>0;yy--) for(intxx=0;xx<=11;xx++) { textout(handle,offset_x+xx*2,offset_y+yy,fsColor,1,"※"); Sleep(10); }}#include"colorConsole.h"HANDLEinitiate(){ HANDLEhOutput; hOutput=GetStdHandle(STD_OUTPUT_HANDLE); returnhOutput;}BOOLtextout(HANDLEhOutput,intx,inty,WORDwColors[],intnColors,LPTSTRlpszString){DWORDcWritten;BOOLfSuccess;COORDcoord; coord.X=x;//startatfirstcellcoord.Y=y;//offirstrowfSuccess=WriteConsoleOutputCharacter(hOutput,//screenbufferhandlelpszString,//pointertosourcestringlstrlen(lpszString),//lengthofstringcoord,//firstcelltowriteto&cWritten);//actualnumberwrittenif(!fSuccess)cout<<"error:WriteConsoleOutputCharacter"<<endl; for(;fSuccess&&coord.X<lstrlen(lpszString)+x;coord.X+=nColors){fSuccess=WriteConsoleOutputAttribute(hOutput,//screenbufferhandlewColors,//pointertosourcestringnColors,//lengthofstringcoord,//firstcelltowriteto&cWritten);//actualnumberwritten}if(!fSuccess) cout<<"error:WriteConsoleOutputAttribute"<<endl; return0;}#include<windows.h>#include<iostream.h>HANDLEinitiate();BOOLtextout(HANDLEhOutput,intx,inty,WORDwColors[],intnColors,LPTSTRlpszString);/*++Copyright(c)MicrosoftCorporation.Allrightsreserved.ModuleName:basetsd.hAbstract:Typedefinitionsforthebasicsizedtypes.Author:RevisionHistory:--*/#ifndef_BASETSD_H_#define_BASETSD_H_#if_MSC_VER>1000#pragmaonce#endif#ifdef__cplusplusextern"C"{#endiftypedefsignedcharINT8,*PINT8;typedefsignedshortINT16,*PINT16;typedefsignedintINT32,*PINT32;typedefsigned__int64INT64,*PINT64;typedefunsignedcharUINT8,*PUINT8;typedefunsignedshortUINT16,*PUINT16;typedefunsignedintUINT32,*PUINT32;typedefunsigned__int64UINT64,*PUINT64;////Thefollowingtypesareguaranteedtobesignedand32bitswide.//typedefsignedintLONG32,*PLONG32;////Thefollowingtypesareguaranteedtobeunsignedand32bitswide.//typedefunsignedintULONG32,*PULONG32;typedefunsignedintDWORD32,*PDWORD32;#if!defined(_W64)#if!defined(__midl)&&(defined(_X86_)||defined(_M_IX86))&&_MSC_VER>=1300#define_W64__w64#else#define_W64#endif#endif////TheINT_PTRisguaranteedtobethesamesizeasapointer.Its//sizewithchangewithpointersize(32/64).Itshouldbeused//anywherethatapointeriscasttoanintegertype.UINT_PTRis//theunsignedvariation.////__int3264isintrinsicto64bMIDLbutnottooldMIDLortoCcompiler.//#if(501<__midl)typedef[public]__int3264INT_PTR,*PINT_PTR;typedef[public]unsigned__int3264UINT_PTR,*PUINT_PTR;typedef[public]__int3264LONG_PTR,*PLONG_PTR;typedef[public]unsigned__int3264ULONG_PTR,*PULONG_PTR;#else//midl64//oldmidlandC++compiler#ifdefined(_WIN64)typedef__int64INT_PTR,*PINT_PTR;typedefunsigned__int64UINT_PTR,*PUINT_PTR;typedef__int64LONG_PTR,*PLONG_PTR;typedefunsigned__int64ULONG_PTR,*PULONG_PTR;#define__int3264__int64#elsetypedef_W64intINT_PTR,*PINT_PTR;typedef_W64unsignedintUINT_PTR,*PUINT_PTR;typedef_W64longLONG_PTR,*PLONG_PTR;typedef_W64unsignedlongULONG_PTR,*PULONG_PTR;#define__int3264__int32#endif#endif//midl64////HALF_PTRishalfthesizeofapointeritintendedforusewith//withinstrcuturewhichcontainapointerandtwosmallfields.//UHALF_PTRistheunsignedvariation.//#ifdef_WIN64#defineADDRESS_TAG_BIT0x40000000000UI64typedef__int64SHANDLE_PTR;typedefunsigned__int64HANDLE_PTR;typedefunsignedintUHALF_PTR,*PUHALF_PTR;typedefintHALF_PTR,*PHALF_PTR;#if!defined(__midl)__inlineunsignedlongHandleToULong(constvoid*h){return((unsignedlong)(ULONG_PTR)h);}__inlinelongHandleToLong(constvoid*h){return((long)(LONG_PTR)h);}__inlinevoid*ULongToHandle(constunsignedlongh){return((void*)(UINT_PTR)h);}__inlinevoid*LongToHandle(constlongh){return((void*)(INT_PTR)h);}__inlineunsignedlongPtrToUlong(constvoid*p){return((unsignedlong)(ULONG_PTR)p);}__inlineunsignedintPtrToUint(constvoid*p){return((unsignedint)(UINT_PTR)p);}__inlineunsignedshortPtrToUshort(constvoid*p){return((unsignedshort)(unsignedlong)(ULONG_PTR)p);}__inlinelongPtrToLong(constvoid*p){return((long)(LONG_PTR)p);}__inlineintPtrToInt(constvoid*p){return((int)(INT_PTR)p);}__inlineshortPtrToShort(constvoid*p){return((short)(long)(LONG_PTR)p);}__inlinevoid*IntToPtr(constinti)//Caution:IntToPtr()sign-extendstheintvalue.{return((void*)(INT_PTR)i);}__inlinevoid*UIntToPtr(constunsignedintui)//Caution:UIntToPtr()zero-extendstheunsignedintvalue.{return((void*)(UINT_PTR)ui);}__inlinevoid*LongToPtr(constlongl)//Caution:LongToPtr()sign-extendsthelongvalue.{return((void*)(LONG_PTR)l);}__inlinevoid*ULongToPtr(constunsignedlongul)//Caution:ULongToPtr()zero-extendstheunsignedlongvalue.{return((void*)(ULONG_PTR)ul);}#endif//!_midl#else//!_WIN64#defineADDRESS_TAG_BIT0x80000000ULtypedef
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024蔬菜種植與農(nóng)產(chǎn)品電商銷售合作協(xié)議范本2篇
- 農(nóng)村預防煤氣中毒
- 壓瘡的5個分級和護理
- 家庭辦公環(huán)境下的養(yǎng)老服務策略
- 2025年度高端制造業(yè)設(shè)備買賣合同磋商與技術(shù)支持保障3篇
- 2025年度老舊小區(qū)物業(yè)承包與改造合同范本3篇
- 二零二五年度汽車抵押借款保險服務合同3篇
- 小學語文教學中的德育滲透策略研究
- 家庭教育對提高生活質(zhì)量的貢獻研究
- 2025年二零二五年度社區(qū)洗衣房租賃合作協(xié)議3篇
- 廣西桂林市2023-2024學年高二上學期期末考試物理試卷
- 《健康教育學》疾病預防
- 教育培訓機構(gòu)合規(guī)運營指南
- 廣場管理工程物業(yè)管理方案
- 幼兒園安保培訓記錄表2018年秋
- 保障房出租運營方案
- 高血壓急癥的急救與護理pt
- 【表格】新員工崗前培訓記錄表
- 醫(yī)學倫理學-南方醫(yī)科大學中國大學mooc課后章節(jié)答案期末考試題庫2023年
- 醫(yī)療安全(不良)事件總結(jié)分析會議記錄
- 建筑用砂采石場安全生產(chǎn)綜合應急預案
評論
0/150
提交評論