貪吃蛇開發隨筆 V1.0版本
貪吃蛇是我用c語言寫的真正意義上的一個程序。感覺很新奇。以前都是用c語言解題,現在用c語言寫了一個游戲,中間的差距還是挺大的。這個貪吃蛇,基本上是照著別人的源碼抄的。自己還沒有這方面的思維。抄完了之后,又修改了一下。感覺思維正在發生跳轉。通過這個程序,認識到自己的水平還是挺差勁的。不過,估計在抄上幾個小游戲后,就應該能形成自己的思維。到時候就能開發出自己的程序了。
另外還學到了一點。就是在這個程序中,把一個游戲分成了很多的模塊,然后每個模塊寫一個函數,這樣寫出來的程序很耐讀。調試也方便。學習之。
還需努力 ———————————————————————————————————
V1.1版本(Sarah,thinking獻禮版)
與v1.0版本改進說明
1.注冊BGI驅動,使之可以脫離.BGI文件運行
2.增加啟動界面,引入音樂
3.改進注釋,增加函數注釋。
這三項都是收別的程序的啟發。第一項的方法在TC的示例程序中就有。第二項很簡單,一個圖形結束后,然后再清屏就是了。第三個是看著別人的注釋很不錯。尤其是對函數的注釋。
/*******************************************************************************
** 函數名稱:drawmat
** 函數描述:依次:字模指針、點陣大小、起始坐標(x,y)、顏色
** 輸入參數:*mat,matsize,x,y,color
** 輸出參數:無
*******************************************************************************/
雖然占用的行數有點多了。不過注釋的很清晰,于是引進之。 在下面的學習中,希望能找到用C語言引進位圖,和音樂的方法。是游戲更生動一些。
———————————————————————————————————
V1.2版本(自動尋路版)
此版本與前面版本的不同之處在于,增加了自動尋路函數。在開始畫面中可以選擇,如果選1。則手動。選2。則自動。
想法:增加一個findway()函數。此函數的功能是判斷蛇頭與食物之間的坐標關系。蛇頭的橫坐標減去食物的橫坐標,負則發出右行指令;正責發生左行指令。縱坐標減去食物的縱坐標,負責發出下行指令;正則發出上行指令。(注:計算機中坐標系的原點在左上角)。但是要注意的是:1。發出的指令不能與行使的方向相反。這樣的話,則需要在函數中添加一個判斷,如果發出的指令與蛇行駛的方向相反的話,先讓蛇垂直運動一下。2:在某些特殊情況下,在會撞墻,因此還需要加個撞墻判斷條件。
bug:1.容易撞到自己。2.如果食物出現在墻壁,容易死亡。
此版本是個失敗的版本。蛇的走法千奇百怪,撞墻的方法多種多樣。目前的水平還不能考慮到那么多情況。寫出來一個很容易自身的貪吃蛇。哎。,。
———————————————————————————————————
在家編的這個小程序,深深地體會到自己的不足。學完c語言,僅僅開了一扇門而已。也體會到為啥能成為一個程序員,至少需要兩年的時間。太多的領域需要我們去探索。windows,Linux,Unix,算法,網絡,圖像,3D,引擎。。。。每一項都有著很深的學問。浩浩蕩蕩,無窮無盡。我們必須不斷地努力,在繁雜的表面下,找到共同的地方。抓住根源,才能成為一代宗師。 我們還太嫩,即使學完c語言,學完數據結構,學完算法分析。看著電腦里滿滿的一點都看不懂得資料,我們必須有壓力。突然想起一個有人評論以前的中美黑客大戰,讀來汗顏不止“你們在美國人的系統上,利用美國人發現的漏洞,拿著美國人寫的工具,去攻擊美國人”。在此不做評論。 現在不想說過多的廢話,最后只想問自己一句,你盡力了么?
/* WIN-TC BGI 圖形編程模板 */
#include "Conio.h"
#include "graphics.h"
#define closegr closegraph
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同樣效果 */
registerbgidriver(EGAVGA_driver);/* 注冊BGI驅動后可以不需要.BGI文件的支持運行 */
initgraph(&gd, &gm, "");
}
int main(void)
{
initgr(); /* BGI初始化 */
/*****此部分添加你自己的代碼,例如
line(25, 25, 220, 220);
circle(100, 100, 50);
等等*****/
getch(); /* 暫停一下,看看前面繪圖代碼的運行結果 */
closegr(); /* 恢復TEXT屏幕模式 */
return 0;
}
|