版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
.../課程設(shè)計(jì)設(shè)計(jì)題目俄羅斯方塊 俄羅斯方塊改進(jìn)設(shè)計(jì)題目俄羅斯方塊學(xué)生姓名學(xué)生姓名學(xué)號(hào)學(xué)號(hào)專(zhuān)業(yè)班級(jí)專(zhuān)業(yè)班級(jí)指導(dǎo)教師指導(dǎo)教師2016年4月20日...目錄1.課程設(shè)計(jì)目的12.功能分析13.程序設(shè)計(jì)實(shí)現(xiàn)過(guò)程23.1程序總體設(shè)計(jì)結(jié)構(gòu)23.2界面設(shè)計(jì)43.3重要數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)53.4函數(shù)設(shè)計(jì)74.運(yùn)行效果125.源代碼詳解136.參考文獻(xiàn)27俄羅斯方塊改進(jìn)1.課程設(shè)計(jì)問(wèn)題據(jù)百度百科,俄羅斯方塊〔Tetris是一款由俄羅斯人阿列克謝·帕基特諾夫于1984年6月發(fā)明的休閑游戲。游戲的基本規(guī)則是移動(dòng)、旋轉(zhuǎn)和擺放游戲自動(dòng)輸出的各種方塊,使之排列成完整的一行或多行并且消除得分。要求支持鍵盤(pán)操作和7種不同類(lèi)型方塊的旋轉(zhuǎn)變換,并且界面上顯示下一個(gè)方塊的提示以及當(dāng)前的玩家的得分,隨著游戲的進(jìn)行,等級(jí)越高,游戲難度越大,即方塊的下落速度越快,相應(yīng)的等級(jí),等級(jí)越高,消去一行所得到的分?jǐn)?shù)越高,為玩家提供了不同的選擇。2.功能分析俄羅斯方塊游戲需要解決的問(wèn)題包括:=1\*GB2⑴按任意鍵開(kāi)始游戲,隨機(jī)產(chǎn)生方塊并自動(dòng)下移=2\*GB2⑵用Esc鍵退出游戲。=3\*GB2⑶用鍵變換方塊=4\*GB2⑷用鍵和鍵左右移動(dòng)方塊=5\*GB2⑸用鍵使方塊加速下移=6\*GB2⑹用空格鍵使方塊暫停=7\*GB2⑺能正確判斷滿(mǎn)行并消行、計(jì)分、定級(jí)別=8\*GB2⑻設(shè)定游戲方塊為不同形狀重點(diǎn):*游戲面包的數(shù)據(jù)結(jié)構(gòu):二維數(shù)組*7種形狀方塊的數(shù)據(jù)結(jié)構(gòu):結(jié)構(gòu)體保存每種形狀方塊的坐標(biāo)3.程序設(shè)計(jì)實(shí)現(xiàn)過(guò)程3.1程序總體設(shè)計(jì)結(jié)構(gòu)首先初始化進(jìn)入圖形模式,進(jìn)入歡迎界面,玩家按任意進(jìn)入主菜單界面,按鍵進(jìn)入游戲界面,鍵然后設(shè)置新的時(shí)鐘中斷。開(kāi)始游戲后,進(jìn)入該程序最核心的部分——處理和實(shí)現(xiàn)進(jìn)行過(guò)程中的各種事件和函數(shù)。在處理中判斷游戲是否結(jié)束,如果沒(méi)有結(jié)束,則重新開(kāi)始游戲,否則結(jié)束游戲。詳解如下:〔1游戲方塊預(yù)覽功能。在游戲過(guò)程中,當(dāng)在游戲底板中出現(xiàn)一個(gè)游戲方塊時(shí),必須在游戲方塊預(yù)覽區(qū)域中出現(xiàn)下一個(gè)游戲方塊,這樣有利于游戲玩家控制游戲的策略。由于在此游戲中存在19種不同的游戲方塊,所以在游戲方塊預(yù)覽區(qū)域中需要顯示隨機(jī)生成的游戲方塊?!?游戲方塊控制功能。通過(guò)各種條件的判斷,實(shí)現(xiàn)對(duì)游戲方塊的左移、右移、快速下移、自由下落、旋轉(zhuǎn)功能,以及行滿(mǎn)消除行的功能。俄羅斯方塊游戲初始化圖形模式〔歡迎界面進(jìn)入菜單選項(xiàng)游戲幫助游戲排名退出游戲游戲說(shuō)明游戲幫助游戲排名退出游戲游戲說(shuō)明開(kāi)始新游戲開(kāi)始游戲開(kāi)始游戲否游戲結(jié)束退出功能速度分?jǐn)?shù)更新功能游戲顯示更新功能游戲結(jié)束退出功能速度分?jǐn)?shù)更新功能游戲顯示更新功能游戲方塊預(yù)覽功能游戲方塊控制功能游戲方塊預(yù)覽功能游戲方塊控制功能游戲結(jié)束游戲結(jié)束是恢復(fù)原有的時(shí)鐘中斷恢復(fù)原有的時(shí)鐘中斷關(guān)閉圖形模式返回菜單關(guān)閉圖形模式返回菜單游戲執(zhí)行主流程圖〔3游戲顯示更新功能。在判斷鍵值時(shí),有左移VK_LEFT、右移VK_RIGHT、下移VK_DOWN、變形旋轉(zhuǎn)VK_UP、退出VK_ESC鍵值的判斷。當(dāng)游戲方塊左右移動(dòng)、下落、旋轉(zhuǎn)時(shí),要清除先前的游戲方塊,用新坐標(biāo)重繪游戲方塊。當(dāng)消除滿(mǎn)行時(shí),要重繪游戲底板的當(dāng)前狀態(tài)?!?游戲速度分?jǐn)?shù)更新功能。在游戲玩家進(jìn)行游戲過(guò)程中,需要按照一定的游戲規(guī)則給玩家計(jì)算游戲分?jǐn)?shù)。比如,消除一行加10分。當(dāng)游戲分?jǐn)?shù)達(dá)到一定數(shù)量之后,需要給游戲者進(jìn)行等級(jí)的上升,每上升一個(gè)等級(jí),游戲方塊的下落速度將加快,游戲的難度將增加。〔5游戲幫助功能。玩家進(jìn)入游戲后,將有對(duì)本游戲如何操作的友情提示。主函數(shù):voidmain<>{InitializeGraph<>;SetTimer<newtimer>;/*設(shè)置新的時(shí)鐘中斷*/while<1>{StartGame<>;ProcessInGame<>;if<GameOver<>>break;bOver=FALSE;}KillTimer<>;closegraph<>;}3.2界面設(shè)計(jì)分為左右兩個(gè)部分:*左邊為游戲面板*右邊有三部分:下一個(gè)形狀提示框、速度框和計(jì)分框3.3重要數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)1定義方塊形狀:定義如下的結(jié)構(gòu)體來(lái)表示每一個(gè)形狀:structblock{intarrXY[8];intnColor;intnNext;};/*保存某一形狀信息的結(jié)構(gòu)體*/StructSHAPEshapes[MAX_BOX]={口口口口口口口口口口口口口口口口{0x88,0xc0,CYAN,1},{0xe8,0x0,CYAN,2},{0xc4,0x40,CYAN,3},{0x2e,0x0,CYAN,0},口口口口口口口口口口口口口口口口{0x44,0xc0,MAGENTA,5},{0x8e,0x0,MAGENTA,6},{0xc8,0x80,MAGENTA,7},{0xe2,0x0,MAGENTA,4},口口口口口口口口{0x8c,0x40,YELLOW,9},{0x6c,0x0,YELLOW,8},口口口口口口口口{0x4c,0x80,BROWN,11},{0xc6,0x0,BROWN,10},口口口口口口口口口口口口口口口口{0x4e,0x0,WHITE,13},{0x8c,0x80,WHITE,14},{0xe4,0x0,WHITE,15},{0x4c,0x40,WHITE,12},口口口口口口口口{0x88,0x88,RED,17},{0xf0,0x0,RED,16},口口口口{0xcc,0x0,BLUE,18,}2定義游戲的主界面:寬10、高20的游戲板〔1數(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/10=30?!?玩家進(jìn)行游戲時(shí),需要對(duì)游戲界面進(jìn)行初始化工作。此代碼被main<>函數(shù)調(diào)用。主要進(jìn)行的工作如下:①循環(huán)調(diào)用line<>函數(shù)繪制當(dāng)前游戲板。②調(diào)用nScore<>函數(shù)顯示初始的成績(jī),初始成績(jī)?yōu)?。③調(diào)用npeed<>函數(shù)顯示初始的速度<等級(jí)>,初始速度1。*****************************************************注:x,y為左上角坐標(biāo)**m,n對(duì)應(yīng)于Vertical_boxs,Horizontal_boxs**分別表示縱橫方向上方塊的個(gè)數(shù)<以方塊為單位>**BOARD_LEFT_X,BOARD_LEFT_Y*****************************************************3.4函數(shù)設(shè)計(jì)1、本程序有主函數(shù)和個(gè)函數(shù)組成:本程序總共由24個(gè)函數(shù)組成。2、函數(shù)相互作用關(guān)系見(jiàn)下圖KillLine<int>IsLineFull<int>DrawSquare<int,int>IsConflict<int,int,int>DrawBlock<int,int,int,int>KillLine<int>IsGameOver<>HandleDown<int,int*x,int*y>HandleUp<int*,int*x,int*y>HandleRight<int,int*x,int*y>HandleLeft<int,int*x,int*y>游戲介紹help〔初始化模式進(jìn)入歡迎界win<>主菜單menu<>InitializeGameboard<>KillLine<int>IsLineFull<int>DrawSquare<int,int>IsConflict<int,int,int>DrawBlock<int,int,int,int>KillLine<int>IsGameOver<>HandleDown<int,int*x,int*y>HandleUp<int*,int*x,int*y>HandleRight<int,int*x,int*y>HandleLeft<int,int*x,int*y>游戲介紹help〔初始化模式進(jìn)入歡迎界win<>主菜單menu<>InitializeGameboard<>初始化圖形模式InitializeGraph<>設(shè)置新的時(shí)鐘中斷SetTimer<*<void>><*IntProc><void>Interrupt〔初始化圖形模式InitializeGraph<>設(shè)置新的時(shí)鐘中斷SetTimer<*<void>><*IntProc><void>Interrupt〔否是開(kāi)始游戲StartGame<>開(kāi)始游戲StartGame<>恢復(fù)原來(lái)的時(shí)鐘中斷KillTimer<>關(guān)閉圖形模型關(guān)閉圖形模型返回到主菜單menu〔處理在游戲中的各種事件處理在游戲中的各種事件ProcessInGame<>退出程序退出程序游戲是否結(jié)束游戲是否結(jié)束GameOver<>函數(shù)運(yùn)用函數(shù)原型函數(shù)功能函數(shù)處理描述voidinterruptnewtimer<void>新的時(shí)鐘中斷處理函數(shù)調(diào)用〔*oldtimer<>函數(shù)語(yǔ)句柄,計(jì)時(shí)器自動(dòng)加1voidSetTimer<voidinterrupt<*IntProc><void>>指向原來(lái)時(shí)鐘中斷處理過(guò)程入口的中斷處理函數(shù)〔句柄voidKillTimer<>恢復(fù)原有的時(shí)鐘中斷處理過(guò)程調(diào)用setvect<>恢復(fù)原有的時(shí)鐘中斷處理過(guò)程voidInitializeGraph<>初始化圖形模式1、調(diào)用initgraph<>切換到圖形模式2、初始化若發(fā)生錯(cuò)誤,則返回錯(cuò)誤密碼voidInitializeGameboard<>初始化游戲面板以及下一形狀提示框、計(jì)分框和難度框1、調(diào)用bar<>\rectangle<>等庫(kù)函數(shù)繪圖函數(shù)繪制游戲界面2、調(diào)用outtextxy<>函數(shù)顯示文字voidDrawSquare<intx,inty>在坐標(biāo)〔x,y處畫(huà)方塊調(diào)用庫(kù)函數(shù)bar<>繪制方塊voidDrawBlock<intBlockIndex,intsx,intsy,intcolor>在坐標(biāo)〔sx,sy處繪制顏色為color的形狀調(diào)用DrawSqueare<>函數(shù)繪制形狀intIsConflict<intBlockIndex,intx,inty>判斷形狀是否存在于坐標(biāo)〔x,y處無(wú)沖突返回0,有沖突返回1voidHandleLeft<intBlockIndex,int*x,int*y>按下左方向鍵時(shí)的處理函數(shù)調(diào)用IsConflic<>函數(shù)判斷形狀是否可以左移,voidHandleRight<intBlockIndex,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),intHandleDown<intBlockIndex,int*x,int*y>按下向下方向鍵或者自由下落時(shí)的處理函數(shù)形狀在自由下落返回0,無(wú)法下落了返回1,并做相應(yīng)處理intIsLineFull<inty>判斷y行是否已被填滿(mǎn)填滿(mǎn)返回1,否則返回0voidKillLine<inty>消去第y行函數(shù)用于處理刪除一滿(mǎn)行的情況。Y指明具體哪一行為滿(mǎn)行,并將消去的行置為背景色intKillLines<inty>消去第y行以及與第y行連續(xù)的上面被填滿(mǎn)的行返回消去的行數(shù)intIsGameOver<>判斷游戲是否結(jié)束游戲結(jié)束返回1,否則返回0intGameOver<>在界面上輸出游戲結(jié)束的信息,并根據(jù)用戶(hù)按鍵選擇決定是否退出游戲退出游戲返回1,否則返回0voidStartGame<>游戲開(kāi)始時(shí)調(diào)用的函數(shù)1、繪制界面需要調(diào)用函數(shù)InitializeGameboard<>2、接下來(lái)初始化游戲面板的各個(gè)方塊和一些全局變量的初值。voidProcessInGame<>核心函數(shù),主要用于處理在游戲中的各種事件〔如按下各種按鍵調(diào)用HandleUpO、HandleDown<>、HandleLeft<>、HandleRight<>等事件處理函數(shù)Voidmain<>主流程函數(shù)主函數(shù)入口,整個(gè)游戲的主控部分4.運(yùn)行效果5.源代碼詳解#include<stdio.h>#include<windows.h>#include<conio.h>#include<time.h>//游戲窗口#defineFrameX4//游戲窗口左上角的X軸坐標(biāo)#defineFrameY4//游戲窗口左上角的Y軸坐標(biāo)#defineFrame_height20//游戲窗口的高度#defineFrame_width18//游戲窗口的寬度//定義全局變量inti,j,temp,temp1,temp2;//temp,temp1,temp2用于記住和轉(zhuǎn)換方塊變量的值inta[80][80]={0};//標(biāo)記游戲屏幕的圖案:2,1,0分別表示該位置為游戲邊框、方塊、無(wú)圖案;初始化為無(wú)圖案intb[4];//標(biāo)記4個(gè)"口"方塊:1表示有方塊,0表示無(wú)方塊charshape[10][4]={"□","■","○","●","☆","★","
","◆","△","▲"};intss=0;//聲明俄羅斯方塊的結(jié)構(gòu)體structTetris{intx;//中心方塊的x軸坐標(biāo)inty;//中心方塊的y軸坐標(biāo)intflag;//標(biāo)記方塊類(lèi)型的序號(hào)intnext;//下一個(gè)俄羅斯方塊類(lèi)型的序號(hào)intspeed;//俄羅斯方塊移動(dòng)的速度intcount;//產(chǎn)生俄羅斯方塊的個(gè)數(shù)intscore;//游戲的分?jǐn)?shù)intlevel;//游戲的等級(jí)};//函數(shù)原型聲明//光標(biāo)移到指定位置voidgotoxy<HANDLEhOut,intx,inty>;//制作游戲窗口voidmake_frame<>;//隨機(jī)產(chǎn)生方塊類(lèi)型的序號(hào)voidget_flag<structTetris*>;//制作俄羅斯方塊voidmake_tetris<structTetris*>;//打印俄羅斯方塊voidprint_tetris<HANDLEhOut,structTetris*>;//清除俄羅斯方塊的痕跡voidclear_tetris<HANDLEhOut,structTetris*>;//判斷是否能移動(dòng),返回值為1,能移動(dòng),否則,不動(dòng)intif_moveable<structTetris*>;//判斷是否滿(mǎn)行,并刪除滿(mǎn)行的俄羅斯方塊voiddel_full<HANDLEhOut,structTetris*>;//開(kāi)始游戲voidstart_game<>;voidmain<>{intt;for<t=0;t<10;t++>{printf<"%s",shape[t]>;}printf<"\n0123456789\n">;printf<"請(qǐng)輸入形狀編號(hào)">;scanf<"%d",&ss>;//制作游戲窗口make_frame<>;//開(kāi)始游戲start_game<>;}/******光標(biāo)移到指定位置**************************************************************/voidgotoxy<HANDLEhOut,intx,inty>{COORDpos;pos.X=x;//橫坐標(biāo)pos.Y=y;//縱坐標(biāo)SetConsoleCursorPosition<hOut,pos>;}/******制作游戲窗口******************************************************************/voidmake_frame<>{HANDLEhOut=GetStdHandle<STD_OUTPUT_HANDLE>;//定義顯示器句柄變量gotoxy<hOut,FrameX+Frame_width-5,FrameY-2>;//打印游戲名稱(chēng)printf<"俄羅斯方塊">;gotoxy<hOut,FrameX+2*Frame_width+3,FrameY+7>;//打印選擇菜單printf<"**********下一個(gè)方塊:">;gotoxy<hOut,FrameX+2*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,FrameY>;//打印框角并記住該處已有圖案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<"╝">;a[FrameX][FrameY+Frame_height]=2;a[FrameX+2*Frame_width-2][FrameY+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<"═">;//打印下橫框a[FrameX+i][FrameY+Frame_height]=2;//記住下橫框有圖案}for<i=1;i<Frame_height;i++>{gotoxy<hOut,FrameX,FrameY+i>;printf<"║">;//打印左豎框a[FrameX][FrameY+i]=2;//記住左豎框有圖案}for<i=1;i<Frame_height;i++>{gotoxy<hOut,FrameX+2*Frame_width-2,FrameY+i>;printf<"║">;//打印右豎框a[FrameX+2*Frame_width-2][FrameY+i]=2;//記住右豎框有圖案}}/******制作俄羅斯方塊********************************************************************/voidmake_tetris<structTetris*tetris>{a[tetris->x][tetris->y]=b[0];//中心方塊位置的圖形狀態(tài):1-有,0-無(wú)switch<tetris->flag>//共6大類(lèi),19種類(lèi)型{case1://田字方塊{a[tetris->x][tetris->y-1]=b[1];a[tetris->x+2][tetris->y-1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case2://直線(xiàn)方塊:{a[tetris->x-2][tetris->y]=b[1];a[tetris->x+2][tetris->y]=b[2];a[tetris->x+4][tetris->y]=b[3];break;}case3://直線(xiàn)方塊:|{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y-2]=b[2];a[tetris->x][tetris->y+1]=b[3];break;}case4://T字方塊{a[tetris->x-2][tetris->y]=b[1];a[tetris->x+2][tetris->y]=b[2];a[tetris->x][tetris->y+1]=b[3];break;}case5://T字順時(shí)針轉(zhuǎn)90度方塊{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y+1]=b[2];a[tetris->x-2][tetris->y]=b[3];break;}case6://T字順時(shí)針轉(zhuǎn)180度方塊{a[tetris->x][tetris->y-1]=b[1];a[tetris->x-2][tetris->y]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case7://T字順時(shí)針轉(zhuǎn)270度方塊{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y+1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case8://Z字方塊{a[tetris->x][tetris->y+1]=b[1];a[tetris->x-2][tetris->y]=b[2];a[tetris->x+2][tetris->y+1]=b[3];break;}case9://Z字順時(shí)針轉(zhuǎn)90度方塊{a[tetris->x][tetris->y-1]=b[1];a[tetris->x-2][tetris->y]=b[2];a[tetris->x-2][tetris->y+1]=b[3];break;}case10://Z字順時(shí)針轉(zhuǎn)180度方塊{a[tetris->x][tetris->y-1]=b[1];a[tetris->x-2][tetris->y-1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case11://Z字順時(shí)針轉(zhuǎn)270度方塊{a[tetris->x][tetris->y+1]=b[1];a[tetris->x+2][tetris->y-1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case12://7字方塊{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y+1]=b[2];a[tetris->x-2][tetris->y-1]=b[3];break;}case13://7字順時(shí)針轉(zhuǎn)90度方塊{a[tetris->x-2][tetris->y]=b[1];a[tetris->x-2][tetris->y+1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case14://7字順時(shí)針轉(zhuǎn)180度方塊{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y+1]=b[2];a[tetris->x+2][tetris->y+1]=b[3];break;}case15://7字順時(shí)針轉(zhuǎn)270度方塊{a[tetris->x-2][tetris->y]=b[1];a[tetris->x+2][tetris->y-1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case16://倒7字方塊{a[tetris->x][tetris->y+1]=b[1];a[tetris->x][tetris->y-1]=b[2];a[tetris->x+2][tetris->y-1]=b[3];break;}case17://倒7字順指針轉(zhuǎn)90度方塊{a[tetris->x-2][tetris->y]=b[1];a[tetris->x-2][tetris->y-1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}case18://倒7字順時(shí)針轉(zhuǎn)180度方塊{a[tetris->x][tetris->y-1]=b[1];a[tetris->x][tetris->y+1]=b[2];a[tetris->x-2][tetris->y+1]=b[3];break;}case19://倒7字順時(shí)針轉(zhuǎn)270度方塊{a[tetris->x-2][tetris->y]=b[1];a[tetris->x+2][tetris->y+1]=b[2];a[tetris->x+2][tetris->y]=b[3];break;}}}//******判斷是否可動(dòng)*************************************************************************/intif_moveable<structTetris*tetris>{if<a[tetris->x][tetris->y]!=0>//當(dāng)中心方塊位置上有圖案時(shí),返回值為0,即不可移動(dòng){return0;}else{if<//當(dāng)為田字方塊且除中心方塊位置外,其他"口"字方塊位置上無(wú)圖案時(shí),返回值為1,即可移動(dòng)<tetris->flag==1&&<a[tetris->x][tetris->y-1]==0&&a[tetris->x+2][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0>>||//或?yàn)橹本€(xiàn)方塊且除中心方塊位置外,其他"口"字方塊位置上無(wú)圖案時(shí),返回值為1,即可移動(dòng)<tetris->flag==2&&<a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y]==0&&a[tetris->x+4][tetris->y]==0>>||<tetris->flag==3&&<a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y-2]==0&&a[tetris->x][tetris->y+1]==0>>||<tetris->flag==4&&<a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y]==0&&a[tetris->x][tetris->y+1]==0>>||<tetris->flag==5&&<a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x-2][tetris->y]==0>>||<tetris->flag==6&&<a[tetris->x][tetris->y-1]==0&&a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y]==0>>||<tetris->flag==7&&<a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x+2][tetris->y]==0>>||<tetris->flag==8&&<a[tetris->x][tetris->y+1]==0&&a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y+1]==0>>||<tetris->flag==9&&<a[tetris->x][tetris->y-1]==0&&a[tetris->x-2][tetris->y]==0&&a[tetris->x-2][tetris->y+1]==0>>||<tetris->flag==10&&<a[tetris->x][tetris->y-1]==0&&a[tetris->x-2][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0>>||<tetris->flag==11&&<a[tetris->x][tetris->y+1]==0&&a[tetris->x+2][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0>>||<tetris->flag==12&&<a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x-2][tetris->y-1]==0>>||<tetris->flag==13&&<a[tetris->x-2][tetris->y]==0&&a[tetris->x-2][tetris->y+1]==0&&a[tetris->x+2][tetris->y]==0>>||<tetris->flag==14&&<a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x+2][tetris->y+1]==0>>||<tetris->flag==15&&<a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0>>||<tetris->flag==16&&<a[tetris->x][tetris->y+1]==0&&a[tetris->x][tetris->y-1]==0&&a[tetris->x+2][tetris->y-1]==0>>||<tetris->flag==17&&<a[tetris->x-2][tetris->y]==0&&a[tetris->x-2][tetris->y-1]==0&&a[tetris->x+2][tetris->y]==0>>||<tetris->flag==18&&<a[tetris->x][tetris->y-1]==0&&a[tetris->x][tetris->y+1]==0&&a[tetris->x-2][tetris->y+1]==0>>||<tetris->flag==19&&<a[tetris->x-2][tetris->y]==0&&a[tetris->x+2][tetris->y+1]==0&&a[tetris->x+2][tetris->y]==0>>>{return1;}}return0;}/******隨機(jī)產(chǎn)生俄羅斯方塊類(lèi)型的序號(hào)**********************************************************/voidget_flag<structTetris*tetris>{tetris->count++;//記住產(chǎn)生方塊的個(gè)數(shù)srand<<unsigned>time<NULL>>;//初始化隨機(jī)數(shù)if<tetris->count==1>{tetris->flag=rand<>%19+1;//記住第一個(gè)方塊的序號(hào)}tetris->next=rand<>%19+1;//記住下一個(gè)方塊的序號(hào)}/******打印俄羅斯方塊**********************************************************************/voidprint_tetris<HANDLEhOut,structTetris*tetris>{for<i=0;i<4;i++>{b[i]=1;//數(shù)組b[4]的每個(gè)元素的值都為1}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<a[i][j]==1&&j>FrameY>{gotoxy<hOut,i,j>;printf<"%s",shape[ss]>;//打印邊框內(nèi)的方塊□}}}//打印菜單信息gotoxy<hOut,FrameX+2*Frame_width+3,FrameY+1>;printf<"level:%d",tetris->level>;gotoxy<hOut,FrameX+2*Frame_width+3,FrameY+3>;printf<"score:%d",tetris->score>;gotoxy<hOut,FrameX+2*Frame_width+3,FrameY+5>;printf<"speed:%dms",tetris->speed>;}/******清除俄羅斯方塊的痕跡****************************************************************/voidclear_tetris<HANDLEhOut,structTetris*tetris>{for<i=0;i<4;i++>{b[i]=0;//數(shù)組b[4]的每個(gè)元素的值都為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<a[i][j]==0&&j>FrameY>{gotoxy<hOut,i,j>;printf<"">;//清除方塊}}}}/******判斷是否滿(mǎn)行并刪除滿(mǎn)行的俄羅斯方塊****************************************************/voiddel_full<HANDLEhOut,structTetris*tetris>{//當(dāng)某行有Frame_width-2個(gè)方塊時(shí),則滿(mǎn)行intk,del_count=0;//分別用于記錄某行方塊的個(gè)數(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<a[i][j]==1>//豎坐標(biāo)依次從下往上,橫坐標(biāo)依次由左至右判斷是否滿(mǎn)行{k++;//記錄此行方塊的個(gè)數(shù)if<k==Frame_width-2>{for<k=FrameX+2;k<FrameX+2*Frame_width-2;k+=2>{//刪除滿(mǎn)行的方塊a[k][j]=0;gotoxy<hOut,k,j>;printf<"">;Sleep<1>;}for<k=j-1;k>FrameY;k-->{//如果刪除行以上的位置有方塊,則先清除,再將方塊下移一個(gè)位置for<i=FrameX+2;i<FrameX+2*Frame_width-2;i+=2>{if<a[i][k]==1>{a[i][k]=0;gotoxy<hOut,i,k>;printf<"">;a[i][k+1]=1;gotoxy<hOut,i,k+1>;printf<"%s",shape[ss]>;}}}j++;//方塊下移后,重新判斷刪除行是否滿(mǎn)行del_count++;//記錄刪除方塊的行數(shù)}}}}tetris->score+=100*del_count;//每刪除一行,得100分if<del_count>0&&<tetris->score%1000==0||tetris->score/1000>tetris->level-1>>{//如果得1000分即累計(jì)刪除10行,速度加快20ms并升一級(jí)tetris->speed-=20;tetris->level++;}}/******開(kāi)始游戲******************************************************************************/voidstart_game<>{HANDLEhOut=GetStdHandle<STD_OUTPUT_HANDLE>;//定義顯示器句柄變量structTetrist,*tetris=&t;//定義結(jié)構(gòu)體的指針并指向結(jié)構(gòu)體變量unsignedcharch;//定義接收鍵盤(pán)輸入的變量tetris->count=0;//初始化俄羅斯方塊數(shù)為0個(gè)tetris->speed=300;//初始移動(dòng)速度為300mstetris->score=0;//初始游戲的分?jǐn)?shù)為0分tetris->level=1;//初始游戲?yàn)榈?關(guān)while<1>{//循環(huán)產(chǎn)生方塊,直至游戲結(jié)束get_flag<tetris>;//得到產(chǎn)生俄羅斯方塊類(lèi)型的序號(hào)temp=tetris->flag;//記住當(dāng)前俄羅斯方塊序號(hào)//打印下一個(gè)俄羅斯方塊的圖形<右邊窗口>tetris->x=FrameX+2*Frame_width+6;tetris->y=FrameY+10;tetris->flag=tetris->next;print_tetris<hOut,tetris>;tetris->x=FrameX+Frame_width;//初始中心方塊x坐標(biāo)tetris->y=FrameY-1;//初始中心方塊y坐標(biāo)tetris->flag=temp;//取出當(dāng)前的俄羅斯方塊序號(hào)while<1>{//控制方塊方向,直至方塊不再下移label:print_tetris<hOut,tetris>;//打印俄羅斯方塊Sleep<tetris->speed>;//延緩時(shí)間clear_tetris<hOut,tetris>;//清除痕跡temp1=tetris->x;//記住中心方塊橫坐標(biāo)的值temp2=tetris->flag;//記住當(dāng)前俄羅斯方塊序號(hào)if<kbhit<>>{//判斷是否有鍵盤(pán)輸入,有則用ch↓接收ch=getch<>;if<ch==75>//按←鍵則向左動(dòng),中心橫坐標(biāo)減2{tetris->x-=2;}if<ch==77>//按→鍵則向右動(dòng),中心橫坐標(biāo)加2{tetris->x+=2;}if<ch==72>//按↑鍵則變體即當(dāng)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 24630.2-2024產(chǎn)品幾何技術(shù)規(guī)范(GPS)平面度第2部分:規(guī)范操作集
- 農(nóng)村房屋購(gòu)買(mǎi)合同范文
- 個(gè)體戶(hù)車(chē)輛轉(zhuǎn)讓協(xié)議
- 電腦租賃合同范本2024年
- 2024年鉆機(jī)購(gòu)銷(xiāo)合同國(guó)際貿(mào)易合同
- 合作伙伴協(xié)議:有限合伙企業(yè)合作合同
- 短期運(yùn)輸合同書(shū)
- 勞務(wù)協(xié)議書(shū)范本中的風(fēng)險(xiǎn)防范
- 土地買(mǎi)賣(mài)合同范本2024年
- 校園意外傷害賠償協(xié)議
- 書(shū)法入門(mén)(三)課件
- 一年級(jí)數(shù)學(xué)上冊(cè)2位置第1課時(shí)上下前后作業(yè)新人教版
- 亮化維修協(xié)議書(shū)范本亮化維修方案(九篇)
- 發(fā)展?jié)h語(yǔ)(第二版)中級(jí)寫(xiě)作教案
- 熱交換器的定期檢驗(yàn)-全國(guó)壓力容器檢驗(yàn)員RQ-1
- 融資擔(dān)保機(jī)構(gòu)擔(dān)保代償管理指引
- GB 14194-1993永久氣體氣瓶充裝規(guī)定
- 如何做好行政執(zhí)法與刑事司法相銜接課件
- 注氮機(jī)司機(jī)講義
- 數(shù)據(jù)庫(kù)工程師考試大綱
- 小學(xué)數(shù)學(xué)西南師大六年級(jí)上冊(cè)七負(fù)數(shù)的初步認(rèn)識(shí) 西師大數(shù)學(xué)六上《負(fù)數(shù)的初步認(rèn)識(shí)》
評(píng)論
0/150
提交評(píng)論