《c語(yǔ)言俄羅斯方塊游戲程序設(shè)計(jì)報(bào)告.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《c語(yǔ)言俄羅斯方塊游戲程序設(shè)計(jì)報(bào)告.doc(33頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
C語(yǔ)言課程設(shè)計(jì)報(bào)告
主標(biāo)題: C語(yǔ)言課程設(shè)計(jì)
副標(biāo)題: 俄羅斯方塊游戲
----界面設(shè)計(jì)
姓 名:
指導(dǎo)教師:
院 系:
專(zhuān) 業(yè):
班 級(jí):
小組成員:
提交日期
俄羅斯方塊程序設(shè)計(jì)報(bào)告
一、 問(wèn)題描述:
要求支持鍵盤(pán)操作和7種不同類(lèi)型方塊的旋轉(zhuǎn)變換,并且界面上顯示下一個(gè)方塊的提示以及當(dāng)前的玩家的得分,隨著游戲的進(jìn)行,等級(jí)越高,游戲難度越大,即方塊的下落速度越快,相應(yīng)的等級(jí),等級(jí)越高,消去一行所得到的分?jǐn)?shù)越高,為玩家提供了不同的選擇。
二、 功能分析:
俄羅斯方塊游戲需要解決的問(wèn)題包括:
⑴按任意鍵開(kāi)始游戲,隨機(jī)產(chǎn)生方塊并自動(dòng)下移
⑵用Esc鍵退出游戲。
⑶用 鍵變換方塊
⑷用 鍵和 鍵左右移動(dòng)方塊
⑸用 鍵使方塊加速下移
⑹用空格鍵使方塊直接下移
⑺能正確判斷滿行并消行、計(jì)分、定級(jí)別
⑻能正確計(jì)時(shí)
⑼設(shè)定游戲?yàn)椴煌?jí)別,級(jí)別越高難度越大
重點(diǎn):
*游戲面包的數(shù)據(jù)結(jié)構(gòu):二維數(shù)組
*7種形狀方塊的數(shù)據(jù)結(jié)構(gòu):結(jié)構(gòu)體保存每種形狀方塊的坐標(biāo)、顏色
三、程序設(shè)計(jì):
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ī)生成的游戲方塊。
(2)、游戲方塊控制功能。通過(guò)各種條件的判斷,實(shí)現(xiàn)對(duì)游戲方塊的左移、右移、快速下移、自由下落、旋轉(zhuǎn)功能,以及行滿消除行的功能。
俄羅斯方塊游戲
初始化圖形模式
(歡迎界面)
進(jìn)入菜單選項(xiàng)
游戲說(shuō)明
游戲幫助
開(kāi)始新游戲
退出游戲
游
戲排名
開(kāi)始游戲
游戲顯示更新功能
游戲速度分?jǐn)?shù)更新功能
游戲結(jié)束退出功能
游戲方塊控制功能
游戲方塊預(yù)覽功能
否
游戲是否結(jié)束
是
恢復(fù)原有的時(shí)鐘中斷
關(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)消除滿行時(shí),要重繪游戲底板的當(dāng)前狀態(tài)。
(4)、游戲速度分?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ù):
void main()
{
InitializeGraph();
SetTimer(newtimer); /*設(shè)置新的時(shí)鐘中斷*/
while(1)
{
StartGame();
ProcessInGame();
if(GameOver())
break;
bOver = FALSE;
}
KillTimer();
closegraph();
}
2、界面設(shè)計(jì)
分為左右兩個(gè)部分:
*左邊為游戲面板
*右邊有三部分:下一個(gè)形狀提示框、速度框和計(jì)分框
3、重要數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
1)定義方塊形狀:
定義如下的結(jié)構(gòu)體來(lái)表示每一個(gè)形狀:
struct block{
int arrXY[8];
int nColor;
int nNext;
}; /*保存某一形狀信息的結(jié)構(gòu)體*/
Struct SHAPE shapes[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)。
2、 玩家進(jìn)行游戲時(shí),需要對(duì)游戲界面進(jìn)行初始化工作。此代碼被main()函數(shù)調(diào)用。主要進(jìn)行的工作如下:
(1) 循環(huán)調(diào)用line()函數(shù)繪制當(dāng)前游戲板。
(2) 調(diào)用nScore()函數(shù)顯示初始的成績(jī),初始成績(jī)?yōu)?。
(3) 調(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
*****************************************************
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()
開(kāi)始游戲
StartGame ()
處理在游戲中的各種事件
ProcessInGame()
、
初始化圖形模式
InitializeGraph()
設(shè)置新的時(shí)鐘中斷
SetTimer(* (void))
Interrupt()
(*IntProc) (void)
游戲是否結(jié)束
GameOver()
恢復(fù)原來(lái)的時(shí)鐘中斷
KillTimer()
否
是
關(guān)閉圖形模型
返回到主菜單
menu()
退出程序
4、 函數(shù)功能的描述:
5、
函數(shù)原型
函數(shù)功能
函數(shù)處理描述
void interrupt newtimer(void)
新的時(shí)鐘中斷處理函數(shù)
調(diào)用(*oldtimer)()函數(shù)語(yǔ)句柄,計(jì)時(shí)器自動(dòng)加1
void SetTimer(void interrupt(*IntProc)(void))
指向原來(lái)時(shí)鐘中斷處理過(guò)程入口的中斷處理函數(shù)(句柄)
void KillTimer()
恢復(fù)原有的時(shí)鐘中斷處理過(guò)程
調(diào)用setvect()恢復(fù)原有的時(shí)鐘中斷處理過(guò)程
void InitializeGraph()
初始化圖形模式
1、調(diào)用initgraph()切換到圖形模式2、初始化若發(fā)生錯(cuò)誤,則返回錯(cuò)誤密碼
void InitializeGameboard()
初始化游戲面板以及下一形狀提示框、計(jì)分框和難度框
1、調(diào)用bar()\rectangle()等庫(kù)函數(shù)繪圖函數(shù)繪制游戲界面2、調(diào)用outtextxy()函數(shù)顯示文字
void DrawSquare(int x, int y)
在坐標(biāo)(x,y)處畫(huà)方塊
調(diào)用庫(kù)函數(shù)bar()繪制方塊
void DrawBlock(int BlockIndex, int sx, int sy,int color)
在坐標(biāo)(sx,sy)處繪制顏色為color的形狀
調(diào)用DrawSqueare()函數(shù)繪制形狀
int IsConflict(int BlockIndex, int x, int y)
判斷形狀是否存在于坐標(biāo)(x,y)處
無(wú)沖突返回0,有沖突返回1
void HandleLeft(int BlockIndex,int *x, int *y)
按下左方向鍵時(shí)的處理函數(shù)
調(diào)用IsConflic()函數(shù)判斷形狀是否可以左移,
void HandleRight(int BlockIndex,int *x, int *y)
按下右方向鍵時(shí)的處理函數(shù)
調(diào)用IsConflic()函數(shù)判斷形狀是否可以右移,
void HandleUp(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,無(wú)法下落了返回1,并做相應(yīng)處理
int IsLineFull(int y)
判斷y行是否已被填滿
填滿返回1,否則返回0
void KillLine(int y)
消去第y行
函數(shù)用于處理刪除一滿行的情況。Y指明具體哪一行為滿行,并將消去的行置為背景色
int KillLines(int y)
消去第y行以及與第y行連續(xù)的上面被填滿的行
返回消去的行數(shù)
int IsGameOver()
判斷游戲是否結(jié)束
游戲結(jié)束返回1,否則返回0
int GameOver()
在界面上輸出游戲結(jié)束的信息,并根據(jù)用戶按鍵選擇決定是否退出游戲
退出游戲返回1,否則返回0
void StartGame()
游戲開(kāi)始時(shí)調(diào)用的函數(shù)
1、繪制界面需要調(diào)用函數(shù)InitializeGameboard()2、接下來(lái)初始化游戲面板的各個(gè)方塊和一些全局變量的初值。
void ProcessInGame()
核心函數(shù),主要用于處理在游戲中的各種事件(如按下各種按鍵)
調(diào)用HandleUpO、HandleDown()、HandleLeft()、HandleRight()等事件處理函數(shù)
Void main()
主流程函數(shù)
主函數(shù)入口,整個(gè)游戲的主控部分
五、運(yùn)行效果
六、源代碼詳解
#include
#include
#include
#include /*系統(tǒng)提供的頭文件*/
#define TIMER 0x1c /*定義時(shí)鐘中斷的中斷號(hào)*/
#define VK_LEFT 0x4b00/*左移鍵*/
#define VK_RIGHT 0x4d00/*右移鍵*/
#define VK_DOWN 0x5000 /*加速鍵*/
#define VK_UP 0x4800 /*變形鍵*/
#define VK_SPACE 0x3920 /*變形鍵*/
#define VK_END 0x4f00 /*暫停鍵*/
#define VK_ESC 0x011b
#define VK_ENTER 0x1c0d
#define BSIZE 16 /*方塊的邊長(zhǎng)是16個(gè)象素*/
#define MAX_SHAPE 19 /*總共有19種各形態(tài)的方塊*/
#define BOARD_WIDTH 10 /*游戲面板的寬度,以方塊的寬度為單位*/
#define BOARD_HEIGHT 20/*游戲面板的高度,以方塊的寬度為單位*/
#define BGCOLOR BLACK /*背景色*/
#define FORECOLOR WHITE /*前景色*/
#define FALSE 0
#define TRUE 1
#define EMPTY 0
#define FILLED 1
#define BOARD_LEFT_X 10 /*游戲面板左上角的橫坐標(biāo)*/
#define BOARD_LEFT_Y 5 /*游戲面板左上角的縱坐標(biāo)*/
/*定義全局變量*/
extern int Gameboard[BOARD_WIDTH+2][BOARD_HEIGHT+2];
extern int nCurrent_block_index ; /*當(dāng)前下落的方塊的索引號(hào)*/
extern int nNext_block_index ; /*下一個(gè)方塊的索引號(hào)*/
extern int nSpeed, nScore; /*速度和得分*/
extern int nSpeedUpScore; /*第一次要加速需達(dá)到的分?jǐn)?shù)*/
extern int bAccel, bOver;
extern int nOriginX, nOriginY;/*某一形狀的原點(diǎn)的絕對(duì)坐標(biāo)*/
extern unsigned int TimerCounter; /* 計(jì)時(shí)變量,每秒鐘增加18 */
struct block{
int arrXY[8];
int nColor;
int nNext;
}; /*保存某一形狀信息的結(jié)構(gòu)體*/
typedef struct block BLOCK;
extern BLOCK arrayBlock[19];
void interrupt newtimer(void);/*新的時(shí)鐘中斷處理函數(shù)*/
void SetTimer(void interrupt(*IntProc)(void));/*設(shè)置新的時(shí)鐘中斷處理過(guò)程*/
void KillTimer();/*恢復(fù)原有的時(shí)鐘中斷處理過(guò)程*/
void InitializeGraph();/*初始化圖形模式*/
void InitializeGameboard() ;/*初始化游戲面板*/
void DrawSquare(int x, int y);/*在坐標(biāo)(x,y)處畫(huà)方塊*/
void DrawBlock(int BlockIndex, int sx, int sy,int color);/*在(sx,sy)處繪制顏色為color的形狀*/
int IsConflict(int BlockIndex, int x, int y);/*判斷形狀能否存在于坐標(biāo)(x,y)處*/
void HandleLeft(int BlockIndex,int *x, int *y);/*左鍵處理函數(shù)*/
void HandleRight(int BlockIndex,int *x, int *y);/*右鍵處理函數(shù)*/
void HandleUp(int *BlockIndex,int *x, int *y);/*上鍵處理函數(shù)*/
int HandleDown(int BlockIndex,int *x, int *y);/*下鍵處理函數(shù)*/
int IsLineFull(int y);/*判斷y行是否填滿*/
void KillLine(int y);/*消去y行*/
int KillLines(int y);/*消去y行及上面被填滿的行*/
int IsGameOver();/*結(jié)束游戲*/
int GameOver();/*用戶自己決定是否結(jié)束游戲*/
void StartGame();/*開(kāi)始游戲*/
void ProcessInGame();/*處理游戲中各種事件*/
/**********************************************************
* 函數(shù)原型:void InitializeGraph() *
* 傳入?yún)?shù):無(wú) *
* 返 回 值:無(wú) *
* 函數(shù)功能:初始化進(jìn)入圖形模式 *
**********************************************************/
void InitializeGraph()
{
int gdriver = VGA, gmode=VGAHI, errorcode;
/* 初始化圖形模式*/
initgraph(&gdriver, &gmode, "c:\\turboc2");
/* 讀取初始化結(jié)果 */
errorcode = graphresult();
if (errorcode != grOk) /* 錯(cuò)誤發(fā)生 */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* 返回錯(cuò)誤碼 */
}
}
/**********************************************************
* 函數(shù)原型:void InitializeGameboard() *
* 傳入?yún)?shù):無(wú) *
* 返 回 值:無(wú) *
* 函數(shù)功能:初始化游戲面板以及下一形狀提示框、計(jì)分框和難度框 *
**********************************************************/
void InitializeGameboard()
{
/* 繪制游戲面板(即游戲區(qū)域)*/
setfillstyle(SOLID_FILL,BGCOLOR);
bar(BSIZE*BOARD_LEFT_X,BSIZE*BOARD_LEFT_Y,BSIZE*(BOARD_LEFT_X+BOARD_WIDTH),BSIZE*(BOARD_LEFT_Y+BOARD_HEIGHT));
setcolor(WHITE);
rectangle(BSIZE*BOARD_LEFT_X,BSIZE*BOARD_LEFT_Y,BSIZE*(BOARD_LEFT_X+BOARD_WIDTH),BSIZE*(BOARD_LEFT_Y+BOARD_HEIGHT));
/*繪制下一形狀提示框*/
setcolor(BLUE);
settextjustify(CENTER_TEXT, BOTTOM_TEXT);
outtextxy(BSIZE*(25+4), BSIZE*(5+1), "next");
setfillstyle(SOLID_FILL, BGCOLOR);
bar(BSIZE*(24.5+2), BSIZE*6, BSIZE*(24.5+2+5), BSIZE*(6+5));
setcolor(YELLOW);
rectangle(BSIZE*(24.5+2), BSIZE*6, BSIZE*(24.5+2+5), BSIZE*(6+5));
/*繪制速度框*/
setcolor(BLUE);
settextjustify(CENTER_TEXT, BOTTOM_TEXT);
outtextxy(BSIZE*(25+4), BSIZE*(12+1), "level");
setfillstyle(SOLID_FILL, BGCOLOR);
bar(BSIZE*25,BSIZE*13, BSIZE*(25+8), BSIZE*(13+1));
setcolor(YELLOW);
rectangle(BSIZE*25,BSIZE*13, BSIZE*(25+8), BSIZE*(13+1));
setcolor(RED);
settextjustify(CENTER_TEXT, BOTTOM_TEXT);
outtextxy(BSIZE*(25+4), BSIZE*(13+1), "0");
/*繪制計(jì)分框*/
setcolor(BLUE);
settextjustify(CENTER_TEXT, BOTTOM_TEXT);
outtextxy(BSIZE*(25+4), BSIZE*(19+1), "score");
setfillstyle(SOLID_FILL, BGCOLOR);
bar(BSIZE*25,BSIZE*20, BSIZE*(25+8), BSIZE*(20+1));
setcolor(YELLOW);
rectangle(BSIZE*25,BSIZE*20, BSIZE*(25+8), BSIZE*(20+1));
setcolor(RED);
settextjustify(CENTER_TEXT, BOTTOM_TEXT);
outtextxy(BSIZE*(25+4), BSIZE*(20+1), "0");
}
int Gameboard[BOARD_WIDTH+2][BOARD_HEIGHT+2];
int nCurrent_block_index;/* 當(dāng)前下落的方塊的索引號(hào)*/
int nNext_block_index ; /*下一個(gè)方塊的索引號(hào)*/
int nSpeed, nScore; /*速度和得分*/
int nSpeedUpScore = 1000; /*第一次要加速需達(dá)到的分?jǐn)?shù)*/
int bAccel, bOver;
int nOriginX=5, nOriginY=1;/*某一形狀的原點(diǎn)的絕對(duì)坐標(biāo)*/
BLOCK arrayBlock[19]={
/*x1,y1,x2,y2,x3,y3,x4,y4, color, next*/
{ 0,-2, 0,-1, 0, 0, 1, 0, CYAN, 1}, /* */
{-1, 0, 0, 0, 1,-1, 1, 0, CYAN, 2}, /* # */
{ 0,-2, 1,-2, 1,-1, 1, 0, CYAN, 3}, /* # */
{-1,-1,-1, 0, 0,-1, 1,-1, CYAN, 0}, /* ## */
{ 0,-2, 0,-1, 0, 0, 1,-2,MAGENTA, 5}, /* */
{-1,-1,-1, 0, 0, 0, 1, 0,MAGENTA, 6}, /* ## */
{ 0, 0, 1,-2, 1,-1, 1, 0,MAGENTA, 7}, /* # */
{-1,-1, 0,-1, 1,-1, 1, 0,MAGENTA, 4}, /* # */
{-1, 0, 0,-1, 0, 0, 1, 0,YELLOW, 9}, /* */
{-1,-1, 0,-2, 0,-1, 0, 0,YELLOW, 10}, /* */
{-1,-1, 0,-1, 0, 0, 1,-1,YELLOW, 11}, /* # */
{ 0,-2, 0,-1, 0, 0, 1,-1,YELLOW, 8}, /* ### */
{-1, 0, 0,-1, 0, 0, 1,-1, BROWN, 13}, /* ## */
{ 0,-2, 0,-1, 1,-1, 1, 0, BROWN, 12}, /* ## */
{-1,-1, 0,-1, 0, 0, 1, 0, WHITE, 15}, /* ## */
{ 0,-1, 0, 0, 1,-2, 1,-1, WHITE, 14}, /* ## */
{ 0,-3, 0,-2, 0,-1, 0, 0, RED, 17},/* # */
{-1, 0, 0, 0, 1, 0, 2, 0, RED, 16},/* # */
/* # */
/* # */
{ 0,-1, 0, 0, 1,-1, 1, 0, BLUE, 18},/* ## */
/* ## */
};
/**********************************************************
* 函數(shù)原型:void StartGame () *
* 傳入?yún)?shù):無(wú) *
* 返 回 值:無(wú) *
* 函數(shù)功能:游戲開(kāi)始時(shí)調(diào)用的函數(shù),其中繪制界面需調(diào)用函數(shù) *
* InitializeGameboard(), 接下來(lái)需初始化游戲面板的 *
* 各個(gè)方塊和一些全局變量的初值 *
**********************************************************/
void StartGame()
{
int i,j;
/*設(shè)置游戲面板中每個(gè)方塊的初始值*/
for(j=0;j<=BOARD_HEIGHT;j++)
for(i=0;i(20-nSpeed*2))
if(HandleDown(nCurrent_block_index,&nOriginX,&nOriginY))
break;
if(bOver)
return;
}
}
}
/**********************************************************
* 函數(shù)原型:void main() *
* 傳入?yún)?shù):無(wú) *
* 返 回 值:無(wú) *
* 函數(shù)功能:入口函數(shù),包含俄羅斯方塊程序的主流程 *
**********************************************************/
void main()
{
InitializeGraph();
SetTimer(newtimer); /*設(shè)置新的時(shí)鐘中斷*/
while(1)
{
StartGame();
ProcessInGame();
if(GameOver())
break;
bOver = FALSE;
}
KillTimer();
closegraph();
}
unsigned int TimerCounter=0; /* 計(jì)時(shí)變量,每秒鐘增加18 */
/**********************************************************
* 函數(shù)原型:void interrupt (*oldtimer)(void) *
* 傳入?yún)?shù):無(wú) *
* 返 回 值:無(wú) *
* 函數(shù)功能:指向原來(lái)時(shí)鐘中斷處理過(guò)程入口的中斷處理函數(shù)指針(句柄) *
**********************************************************/
void interrupt (*oldtimer)(void);
/**********************************************************
* 函數(shù)原型:void interrupt newtimer(void) *
* 傳入?yún)?shù):無(wú) *
* 返 回 值:無(wú) *
* 函數(shù)功能:新的時(shí)鐘中斷處理函數(shù) *
**********************************************************/
void interrupt newtimer(void)
{
(*oldtimer)();
TimerCounter++;
}
/**********************************************************
* 函數(shù)原型:void SetTimer(void interrupt(*)(void)) *
* 傳入?yún)?shù):無(wú) *
* 返 回 值:無(wú) *
* 函數(shù)功能:設(shè)置新的時(shí)鐘中斷處理函數(shù) *
**********************************************************/
void SetTimer(void interrupt(*IntProc)(void))
{
oldtimer=getvect(TIMER);
disable();
setvect(TIMER,IntProc);
enable();
}
/**********************************************************
* 函數(shù)原型:void KillTimer() *
* 傳入?yún)?shù):無(wú) *
* 返 回 值:無(wú) *
* 函數(shù)功能:恢復(fù)原先的時(shí)鐘中斷處理函數(shù)
*
**********************************************************/
void KillTimer()
{
disable();
setvect(TIMER,oldtimer);
e
鏈接地址:http://italysoccerbets.com/p-9447875.html