亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

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這個程序完


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品在线视频| 在线视频中文亚洲| 91亚洲精品视频| 成人亚洲欧美一区二区三区| 国产一区二区三区在线观看网站| 97久久久免费福利网址| 亚洲久久久久久久久久久| 亚洲日韩欧美视频一区| 国产精品久在线观看| 成人两性免费视频| 亚洲精品中文字幕有码专区| 成人免费淫片视频软件| 欧美色videos| 欧美午夜精品伦理| 91久久国产婷婷一区二区| 2019亚洲日韩新视频| 久久精品99国产精品酒店日本| 国产精品福利无圣光在线一区| 成人午夜一级二级三级| 国产午夜精品久久久| 亚洲午夜色婷婷在线| 91免费看视频.| www国产精品com| 97久久精品人搡人人玩| 国产精品极品美女粉嫩高清在线| 91av视频在线免费观看| www高清在线视频日韩欧美| 国产精品人成电影在线观看| 韩国精品久久久999| 精品女同一区二区三区在线播放| 国产盗摄xxxx视频xxx69| 久久久久久久国产精品| 亚洲三级 欧美三级| 日韩欧美在线观看视频| 日韩视频免费看| 欧美黄网免费在线观看| 亚洲欧美色图片| 96pao国产成视频永久免费| 欧美日韩美女视频| 日韩av影院在线观看| 黄网动漫久久久| 亚洲人成网在线播放| 久久躁狠狠躁夜夜爽| 国产精品国产三级国产专播精品人| 日韩中文综合网| 少妇高潮久久77777| 日韩欧美综合在线视频| 疯狂做受xxxx欧美肥白少妇| 91最新在线免费观看| 亚洲人成绝费网站色www| 亚洲最大的成人网| 久久国产精品久久国产精品| 亚洲欧美日韩图片| 国产中文字幕91| 国产v综合ⅴ日韩v欧美大片| 亚洲男女自偷自拍图片另类| 91禁外国网站| 久久久在线观看| 青青草原一区二区| 国产精品第1页| 亚洲美女性视频| 97超视频免费观看| 精品中文字幕久久久久久| 国产精品三级美女白浆呻吟| 亚洲色图35p| 91欧美视频网站| 91牛牛免费视频| 国产亚洲欧洲在线| 国产精品一区二区久久国产| 97精品视频在线观看| 久久久精品久久| 久久99国产精品久久久久久久久| 欧美精品在线免费播放| 成人午夜在线视频一区| 欧美一级在线播放| 亚洲国产精品人人爽夜夜爽| 欧洲成人免费aa| 日本成人免费在线| 91精品一区二区| 成人免费网站在线看| 亚洲一区制服诱惑| 一区二区三区视频观看| 日韩黄色高清视频| 欧美理论电影网| xvideos国产精品| 国产美女扒开尿口久久久| 成人日韩av在线| 欧美亚洲国产精品| 日韩免费在线电影| 97福利一区二区| 亚洲欧美日韩网| 91超碰caoporn97人人| 欧美在线免费观看| 久久久中精品2020中文| 久久精品欧美视频| 中文日韩电影网站| 精品久久在线播放| 国产激情999| 欧美性受xxx| 国产精品视频yy9099| 精品一区二区三区四区| 1769国产精品| 欧美电影免费观看大全| 欧美在线观看网址综合| 中文字幕v亚洲ⅴv天堂| 欧美伊久线香蕉线新在线| 欧美激情国产高清| 日韩中文字幕国产| 欧美高清视频在线观看| 国产精品一区二区3区| 伊人久久精品视频| 欧美综合一区第一页| 国产一区视频在线播放| 久久国产加勒比精品无码| 欧洲成人在线视频| 国产啪精品视频网站| 亚洲激情视频在线观看| 91精品国产综合久久香蕉最新版| 97精品视频在线播放| 久久精品国产亚洲| 成人在线国产精品| 欧美电影在线观看高清| 亚洲国产中文字幕久久网| 色综合久综合久久综合久鬼88| 久久噜噜噜精品国产亚洲综合| 国产欧美亚洲精品| 成人免费淫片aa视频免费| 亚洲欧美一区二区精品久久久| 欧美大人香蕉在线| 午夜欧美不卡精品aaaaa| 精品国产欧美一区二区三区成人| 成人国产在线视频| 亚洲变态欧美另类捆绑| 国产欧美一区二区三区视频| 国产精品jizz在线观看麻豆| 欧美三级xxx| 日韩成人av在线| 国产精品网红福利| 国产一区二区三区久久精品| 精品国产精品自拍| 欧美日韩一区二区免费视频| 成人美女免费网站视频| 91中文字幕在线观看| 亚洲精品一区二区三区婷婷月| 成人黄色在线观看| 国产精品人成电影在线观看| 96pao国产成视频永久免费| 亚洲人午夜色婷婷| 国产视频一区在线| 国产一区二区三区三区在线观看| 国产91精品网站| 欧美中文字幕在线| 精品欧美一区二区三区| 中文字幕精品国产| 日韩美女写真福利在线观看| 美女av一区二区| 成人免费直播live| 欧美综合激情网| 7m精品福利视频导航| 91国产高清在线| 国产高清在线不卡| 成人免费看片视频| 在线观看日韩av| 国产精品私拍pans大尺度在线|