麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

《俄羅斯方塊》程序編寫詳解

2019-11-17 05:45:58
字體:
來源:轉載
供稿:網友

  Tc2.0 編寫俄羅斯方塊游戲

很多編程愛好者都編寫過俄羅斯方塊的游戲程序。很久以前,我用Tc2.0也做過一個;最近有好些朋友看見我以前的俄羅斯方塊的程序后,
問我是怎么做的。我一直想把這個程序的整個過程寫一份具體的東西,與各位編程愛好者分享,一直沒空。正好現在放假了,而且離回家還有幾天。于是我就把這個程序重新寫了一遍,盡量使程序的結構比較清楚好懂一些。同時寫了下面的這份東西。

  俄羅斯方塊游戲的程序中用到了一些方法。為了比較輕易理解這些方法,我在講述的同時寫了些專門針對這些方法的示例程序。這些示例程序力求短小,目的是用最小的代碼能夠清楚的示例所用的方法。這些示例程序都經過tc2.0測試。最后還附了完整的俄羅斯方塊游戲的源代碼,和最終的可執行程序。假如你看了這份東東,有什么意見和想法,請發電子郵件告訴我。我將會繼續更新這分東東,最新的版本可以在我的個人主頁上下載。

  下面的問題是有關俄羅斯方塊程序的,其中有些是朋友問我的,有些是我認為可能會被問到的。我盡量按問題從易到難排列這些問題。 關于俄羅斯方塊程序的一些問題:
******************************************************

Tc2.0中怎么樣設置圖形顯示?
Tc2.0中常用圖形函數的用法?
怎樣獲取鍵盤輸入?
怎樣控制方塊的移動?
怎樣控制時間間隔(用于游戲中控制外形的下落)?
游戲中的各種外形及整個游戲空間怎么用數據表示?
游戲中怎么判定左右及向下移動的可能性?
游戲中怎么判定某一外形旋轉的可能性?
按向下方向鍵時加速某一外形下落速度的處理?
怎么判定某一外形已經到底?
怎么判定某一已經被填滿?
怎么消去已經被填滿的一行?
怎么消去某一外形落到底后能夠消去的所有的行?(如長條最多可以消去四行)
怎樣修改游戲板的狀態?
怎樣統計分數?
怎樣處理升級后的加速問題?
怎樣判定游戲結束?
關于計分板設計的問題。
關于“下一個”外形取法的問題。
剩下的問題。

******************************************************
新的問題:
 我想有一個最高記錄的顯示,應該怎么做呀?
 我想實現一個進度存儲功能,應該怎么做呀?



Tc2.0中怎么樣設置圖形顯示?

  Tc2.0中有兩種顯示模式,一種是我們所熟知的字符模式,另一種是圖形模式。在字符模式下只能顯式字符,如ASCII字符。一般是顯示25
行,每行80個字符。程序缺省的是字符模式。在字符模式下不能顯式圖形和進行繪圖操作。要想進行圖形顯示和繪圖操作,必須切換到圖形模
式下。

  Tc2.0中用initgraph()函數可以切換到圖形模式,用closegraph()可以從圖形模式切換回字符模式。initgraph()和closegraph()都是圖形
函數,使用圖形函數必須包括頭文件"graphics.h"。

  void far initgraph(int far *graphdriver,int far *graphmode,char far *pathtodriver);graphdriver是上漲指向圖形驅動序號變量的指針;graphmode是在graphdriver選定后,指向圖形顯示模式序號變量的指針。pathtodriver表示存放圖形驅動文件的路徑。

  Tc2.0中有多種圖形驅動,每種圖形驅動下又有幾種圖形顯示模式。在我的程序中圖形驅動序號為VGA,圖形顯示模式序號為VGAHI。這是一種分辨率為640*480(從左到右坐標依次為0-639,從上到下坐標依次為0-479),能夠顯示16種顏色的圖形模式。別的圖形驅動序號和圖形顯示模式序號,可以從手冊或聯機幫助中找到。

  pathtodriver指示存放圖形驅動文件的路徑。圖形驅動序號不同,圖形驅動文件也不同。序號為VGA圖形驅動對應"egavga.bgi"這個圖形驅動文件。"egavga.bgi"一般在Tc目錄下。

void far closegraph(void);
  沒有參數,從圖形模式直接返回字符模式。

initgraph()和closegraph()的常用用法如下:
int gdriver = VGA, gmode=VGAHI, errorcode;

/* initialize graphics mode */
initgraph(&gdriver, &gmode, "e://tc2");

/* read result of initialization */
errorcode = graphresult();

if (errorcode != grOk) /* an error occurred */
{
printf("Press any key to halt:");
getch();
exit(1); /* return with error code */
}

/* return to text mode */
closegraph();


Tc2.0中常用圖形函數的用法?

在這里講幾個游戲中用到的繪圖用的圖形函數:
setcolor();
line();
rectangle();
settextjustify();
outtextxy();
setfillstyle();
bar();

void far setcolor(int color);
  設置畫線、畫框和在圖形模式下顯示文字的當前顏色。這個函數將影響line()、rectangle()和outtextxy()函數繪圖的顏色。
color可以取常的顏色常量:
BLACK ? 0
BLUE ? 1
GREEN ? 2
CYAN ? 3
RED ? 4
MAGENTA ? 5
BROWN ? 6
LIGHTGRAY ? 7
DARKGRAY ? 8
LIGHTBLUE ? 9
LIGHTGREEN ?10
LIGHTCYAN ?11
LIGHTRED ?12
LIGHTMAGENTA ?13
YELLOW ?14
WH99vE ?15

void far line(int x1,int y1,int x2,int y2);
用當前顏色從(x1,y1)畫一條到(x2,y2)的線段。

void far rectangle(int left,int top,int right,int bottom);
用當前顏色畫一個左上角為(left,top)、右下角為(right,bottom)的矩形框。

void far settextjustify(int horz,int vert);
設置圖形模式下文字輸出的對齊方式。主要影響outtextxy()函數。
horiz和vert可取如下枚舉常量:
horiz ?LEFT_TEXT ? 0 ?Left-justify text
?CENTER_TEXT ? 1 ?Center text
?RIGHT_TEXT ? 2 ?Right-justify text
vert ?BOTTOM_TEXT ? 0 ?Justify from bottom
?CENTER_TEXT ? 1 ?Center text
?TOP_TEXT ? 2 ?Justify from top

void far outtextxy(int x,int y,char * textstring);
在(x,y)處用當前
字體(缺省的字體是DEFAULT_FONT)顯示字符串textstring,字符串的對齊方式由settextjustify()指定。

void far setfillstyle(int pattern,int color);
設置圖形的填充模式和填充顏色,主要影響bar()等函數。
pattern一般取枚舉常量值SOLID_FILL,color的取值與setcolor(int color)中color的取值范圍相同。

  介紹完了前面兩個問題,現在來寫一個程序。這個程序演示前了面所介紹的幾個圖形函數。
程序prog1.c


怎樣獲取鍵盤輸入?

  在Tc2.0中有一個處理鍵盤輸入的函數bioskey();
int bioskey(int cmd);
  當cmd為1時,bioskey()檢測是否有鍵按下。沒有鍵按下時返回0;有鍵按下時返回按鍵碼(任何按鍵碼都不為0),但此時并不將檢測到的按
鍵碼從鍵盤緩沖隊列中清除。
  當cmd為0時,bioskey()返回鍵盤緩沖隊列中的按鍵碼,并將此按鍵碼從鍵盤緩沖隊列中清除。假如鍵盤緩沖隊列為空,則一直等到有鍵按
下,才將得到的按鍵碼返回。

  Escape鍵的按鍵碼為0x11b,下面的小程序可以獲取按鍵的按鍵碼。

for (;;)
{
key=bioskey(0); /* wait for a keystroke */
printf("0x%x/n",key);
if (key==0x11b) break; /* Escape */
}

常用按鍵的按鍵碼如下:

#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define VK_DOWN 0x5000
#define VK_UP 0x4800
#define VK_HOME 0x4700
#define VK_END 0x4f00
#define VK_SPACE 0x3920
#define VK_ESC 0x011b
#define VK_ENTER 0x1c0d


  完整的程序請參見prog2.c、prog3.c。
prog2.c獲取按鍵的按鍵碼,按Escape鍵退出程序。
prog3.c根據不同的按鍵進行不同的操作,按Escape鍵退出程序。


怎樣控制方塊的移動?
  方塊移動的實現很簡單,將方塊原來的位置用背景色畫一個同樣大小的方塊,將原來的方塊涂去。然后在新的位置上重新繪制方塊就可以
了。這樣就實現了方塊的移動。完整的程序請參見prog4.c。這個用方向鍵控制一個黃色的小方塊在屏幕上上、下、左、右移動。這個程序用到了前面幾個問題講的內容,假如你有點忘了,還要回頭看看哦。:)


怎樣控制時間間隔(用于游戲中控制外形的下落)?
  解決這個問題要用到時鐘中斷。時鐘中斷大約每秒鐘發生18.2次。截獲正常的時鐘中斷后,在處理完正常的時鐘中斷后,將一個計時變量
加1。這樣,每秒鐘計時變量約增加18。需要控控制時間的時候,只需要看這個計時變量就行了。


  截獲時鐘中斷要用到函數getvect()和setvect()。
兩個函數的聲明如下:
?void interrupt (*getvect(int interruptno))();
?void setvect(int interruptno, void interrupt (*isr) ( ));

  保留字interrupt指示函數是一個中斷處理函數。在調用中斷處理函數的時候,所有的寄存器將會被保存。中斷處理函數的返回時的指令是iret,而不是一般函數用到的ret指令。

getvect()根據中斷號interruptno獲取中斷號為interruptno的中斷處理函數的入口地址。
setvect()將中斷號為interruptno的中斷處理函數的入口地址改為isr()函數的入口地址。即中斷發生時,將調用isr()函數。


  在程序開始的時候截獲時鐘中斷,并設置新的中斷處理。在程序結束的時候,一定要記著恢復時鐘中斷哦,不然系統的計時功能會出問題
的。具體演示程序請參見prog5.c。由于中斷處理大家可能用的不多,所以我把prog5.c這個程序完


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品一品二区三区四区18 | 国产69精品久久久久99尤 | 欧美性猛交xxxxx按摩国内 | 久久精品视频免费 | 爱操成人网 | 欧美精品一二三区 | 免费在线观看成人av | 国产精品爱久久久久久久 | 免费视频一区 | 蝌蚪久久窝 | 免费91在线 | 午夜视频在线免费播放 | 一级做a爱片久久毛片a高清 | 福利在线小视频 | 久久免费精品视频 | 久久影院午夜 | 毛片在线免费 | 国产成人精品午夜 | 操毛片| 国产精品成人av片免费看最爱 | 美女黄网站免费观看 | 日韩精品久久久久久久电影99爱 | 香蕉秀 | 久久久中 | a视频在线免费观看 | 成人三级视频网站 | 51色视频 | 在线中文字幕播放 | 国产精品久久久乱弄 | av在线一区二区三区四区 | 午夜影视一区二区 | 免费一级a毛片在线播放视 日日草夜夜操 | 国产精品久久久久久久不卡 | 成人性生活视频在线观看 | 成年人免费高清视频 | 天天透天天狠天天爱综合97 | 97黄色网 | 成年免费视频黄网站在线观看 | 91成人在线免费视频 | 久草在线最新免费 | 狠狠干夜夜操 |