從零開始教你用C語言編遊戲【如鵬】
阿新 • • 發佈:2019-01-07
純真童趣的《泡泡堂》,還有武林情仇,笑傲江湖的《劍俠情緣on line》。它是e時代常談的話題,是互動式娛樂的主力軍,是一種高層次的綜合藝術,更是一個民族的文化,世界觀的全新傳播方式 。作為遊戲玩家的我們,是不是想設計一個屬於自己的遊戲呢? 愛玩是人的天性,而C語言是我們計算機專業都要學習的一門基礎 學科。一般來說,是比較枯燥的。那麼,我們能不能通過編一些小 遊戲來提高它的趣味性呢?這樣學習程式設計,就不會是一件艱苦,枯燥的事,它變得象電腦遊戲一樣充滿好奇,富有樂趣。
/>
1、總是從Hello,world開始
/>/>學習程式設計的第一個程式,一般就是列印一個親切的詞語——"Hello,world!"。讓我們來看看這個最簡單的C程式:
#incolude <stdio.h>
/*把輸入輸出函式的標頭檔案包含進來*/
int main()
/>/>
{
/>/>/>printf("Hello, world!");/*在螢幕上輸出字串"Hello,world!"*/
/>/>/>return 0;/*退出main函式,並返回0*/
}
/>/>下面我們發現幾個值得改進的地方:
1、程式的執行結果一閃而過。
/>/>
2、每執行這個程式一次都能看見上次執行留下的字元。
/>/>
3、我們還希望螢幕輸出一個笑臉來歡迎我們。(大家不要小看了這個笑臉曾經有人發貼專門問呢)
/>/>讓我們來改進一下這個程式吧!
1、在return語句的前面加一句:getch();表示按任意鍵結束。
/>/>
2、在printf語句前用clrscr函式清屏,要使用這個函式和getch()函式,需要在程式開頭再包含標頭檔案conio.h。
/>/>
3、ASCII碼也有許多非常好玩的字元,比如ASCII碼值為2的就是一個笑臉,我們可以用printf("%c", 2)來輸出一個笑臉。
/>/>
現在我們把Hello,world程式改成一個更好看的Hello,world了。
/>/>
下面讓我們開始做遊戲吧!
2、心動的開始,一個運動中的笑臉
/>/>大家小時侯喜歡看動畫片嗎?哈哈,我猜你們都喜歡吧!下面就讓我們來做一個小動畫吧。在螢幕上顯示一個運動的小笑臉,而且當它到達螢幕的邊緣時會自動彈回來。
/>/>
/>/>先在程式定義一個在螢幕中運動的點的結構:
struct move_point
/>/>
{
int x, y;/*該點的位置,包括x座標和y座標*/
int xv, yv;/*該點在x軸,y軸的速度*/
};
/>/>
/>/>運動的原理是,先擦去物體先前的軌跡,讓物體按其速度移動一段距離,再畫出該物體。讓我們看到以下程式碼:
gotoxy(man。x, man。y);/*把游標移到指定的座標*/
printf(" ");/*輸出一個空格,把先前的字元擦去*/
/>/>然後我們讓物體按其速度運動:
man。x += man。xv;/*水平方向按x軸的速度運動*/
man。y += man。yv;/*垂直方向按y軸的速度運動*/
/>/>運動後還要判斷物體是否出界,如果出了界,就令物體反彈,即讓 它下一刻的速度等於現在的速度的相反數。最後打印出這個笑臉:
gotoxy(man。x, man。y);
/>/>
printf("%c\b",
2);
/*輸出ASCII碼值為2的"笑臉"字元*/
/>/>怎麼樣?是不是很有趣呢?不過這個笑臉一直是自己運動,能不能讓我們來控制它運動呢?答案是肯定的,讓我們繼續往下學吧!
3、互動的實現——讓我們來控制笑臉運動
/>/>這個程式的主要功能是接受按鍵,如果接收的是方向鍵,就讓笑臉順著方向移動,如果接收的是ESC鍵就退出程式,其他按鍵則忽略處理。接受按鍵我們用以下兩條語句:
while (bioskey(1)
==
0);/*等待按鍵*/
key = bioskey(0);/*把接收的按鍵的鍵盤碼賦給變數key*/
/>/>然後用switch語句來判斷按鍵以及執行相關操作,如下:
switch (key)
/*對變數key的值進行判斷*/
{
/>/>/>case UP:
/*如果按的是向上鍵*/
… break;
/*讓物體向上運動,並退出switch*/
/>/>/>case DOWN:
/*如果按的是向下鍵*/
… break;
/*讓物體向下運動,並退出switch*/
/>/>/>case LEFT:
/*向左鍵*/
… break;/*向左運動*/
/>/>/>case RIGHT:
/*向右鍵*/
… break;/*向右運動*/
/>/>/>default:
/>/>
break;/*其他按鍵則忽略處理*/
}
/>/>怎麼樣,是不是有了玩遊戲的感覺了?不過這個程式沒有什麼目的 ,也沒有什麼判斷勝負的條件。下面我們就利用這個能控制它移動的笑臉來做一個更有趣的遊戲吧!
4、在迷宮中探索
/>/>小時侯,我常在一些小人書和雜誌上看見一些迷宮的遊戲,非常喜歡玩,還常到一些書上找迷宮玩呢。好的,現在我們用C語言來編個迷宮的遊戲,重溫一下童年的樂趣。
/>/>
/>/>首先,我們定義一個二維陣列map,用它來儲存迷宮的地圖,其中map[x][y] == '#'表示在(x,y)座標上的點是牆壁。DrawMap函式在螢幕上輸出迷宮的地圖和一些歡迎資訊。在main函式裡,我們定義了"小人"man的座標和"目的地"des的座標。在遊戲迴圈中,我們增加了一些用來判斷勝負的語句:
if (man。x == des。x && man。y == des。y) /*如果人的座標等於目的地的座標*/
{
gotoxy(35,
3);
/>/>
printf("Ok! You win!"); /*輸出勝利資訊*/
…
/>/>
}
/>/>在判斷按鍵時,如果玩家按的是方向鍵,我們還要先判斷前面是不是有"牆壁",如果有的話,就不能往前移動了。好的,我們在判斷按鍵的switch語句的各個分支加上了判斷語句,如下:
if (map[…][…==
'#')
break;/*如果前面是牆壁,就不執行下去*/
/>/>哇噻!真棒,我們做出了一個完整的遊戲了。當然你還可以通過修改二維陣列map來修改迷宮的地圖,讓它更有挑戰性。不過,我們要設計一個更好玩的遊戲。
/>/>
5、聰明的搬運工
/>/>大家一定玩過"搬運工"的遊戲吧!這是在電腦和電子字典上較流行的益智遊戲,讓我們動手做一個屬於自己的"搬運工"吧!程式依然用陣列map來儲存地圖,陣列元素如果為空格則表示什麼也沒有,'b'表示箱子,'#'表示牆壁,'*'表示目的地,'i '表示箱子在目的地。我們以後每推一下箱子,不但要改變螢幕的顯示,也要改變map相應元素的值。遊戲的主迴圈依然是接受按鍵。當接收一個方向鍵,需要判斷小人前面一格的狀態,如果是空地或目的地,則人物可以直接移動;如果是牆壁,則不可移動;如果是箱子或目的地上的箱子,則需要繼續判斷箱子前面一格的狀態:如果前一格是空地或目的地,則人推 箱子前進,否則不可移動。好的,我們在switch中增加了這些判斷語句。
/>/>
/>/>程式還有一個重要的功能就是判斷勝利。陣列Des用來記錄全部目的地的座標,我們每執行一步操作後,程式就要通過Des陣列判斷這些目的地上是否都有箱子了。真棒啊!我們可以做遊戲了。而且是一個老少皆宜,趣味十足的遊戲呢!當然,我們可以通過修改map陣列來製作不同的遊戲地圖, 我們還可以相互分享好的遊戲地圖呢。
/>/>
6、尾聲:
/>/>在C++等高階語言還沒出來的時候,很多應用程式也是C語言開發的。C語言在與硬體聯絡緊密的程式設計中,也佔有重要地位。其實我覺得學習程式設計,可以通過一些小遊戲,實用的例子來學習。 象學習音樂的人,不是要等到把全部樂理學完後才演奏一個完整的曲子。而是剛開始學時就有一些簡單的曲子讓你演奏,讓你立刻就有成就感,讓你很快就能賣弄出來在別人面前表現自己了。通過編 遊戲來學習程式設計,把學習變成遊戲,不失為學習計算機的一種好方法。
/>/>
/>/>好了,編遊戲就這麼簡單,希望大家也嘗試用C語言或其他的語言來做幾個自己喜歡的小遊戲。
/>
1、總是從Hello,world開始
/>/>學習程式設計的第一個程式,一般就是列印一個親切的詞語——"Hello,world!"。讓我們來看看這個最簡單的C程式:
#incolude <stdio.h>
/*把輸入輸出函式的標頭檔案包含進來*/
int main()
/>/>
{
/>/>/>printf("Hello, world!");/*在螢幕上輸出字串"Hello,world!"*/
/>/>/>return 0;/*退出main函式,並返回0*/
}
/>/>下面我們發現幾個值得改進的地方:
1、程式的執行結果一閃而過。
/>/>
2、每執行這個程式一次都能看見上次執行留下的字元。
/>/>
3、我們還希望螢幕輸出一個笑臉來歡迎我們。(大家不要小看了這個笑臉曾經有人發貼專門問呢)
/>/>讓我們來改進一下這個程式吧!
1、在return語句的前面加一句:getch();表示按任意鍵結束。
/>/>
2、在printf語句前用clrscr函式清屏,要使用這個函式和getch()函式,需要在程式開頭再包含標頭檔案conio.h。
/>/>
3、ASCII碼也有許多非常好玩的字元,比如ASCII碼值為2的就是一個笑臉,我們可以用printf("%c", 2)來輸出一個笑臉。
/>/>
現在我們把Hello,world程式改成一個更好看的Hello,world了。
/>/>
下面讓我們開始做遊戲吧!
2、心動的開始,一個運動中的笑臉
/>/>大家小時侯喜歡看動畫片嗎?哈哈,我猜你們都喜歡吧!下面就讓我們來做一個小動畫吧。在螢幕上顯示一個運動的小笑臉,而且當它到達螢幕的邊緣時會自動彈回來。
/>/>先在程式定義一個在螢幕中運動的點的結構:
struct move_point
/>/>
{
int x, y;/*該點的位置,包括x座標和y座標*/
int xv, yv;/*該點在x軸,y軸的速度*/
};
/>/>
/>/>運動的原理是,先擦去物體先前的軌跡,讓物體按其速度移動一段距離,再畫出該物體。讓我們看到以下程式碼:
gotoxy(man。x, man。y);/*把游標移到指定的座標*/
printf(" ");/*輸出一個空格,把先前的字元擦去*/
/>/>然後我們讓物體按其速度運動:
man。x += man。xv;/*水平方向按x軸的速度運動*/
man。y += man。yv;/*垂直方向按y軸的速度運動*/
/>/>運動後還要判斷物體是否出界,如果出了界,就令物體反彈,即讓 它下一刻的速度等於現在的速度的相反數。最後打印出這個笑臉:
gotoxy(man。x, man。y);
/>/>
printf("%c\b",
2);
/*輸出ASCII碼值為2的"笑臉"字元*/
/>/>怎麼樣?是不是很有趣呢?不過這個笑臉一直是自己運動,能不能讓我們來控制它運動呢?答案是肯定的,讓我們繼續往下學吧!
3、互動的實現——讓我們來控制笑臉運動
/>/>這個程式的主要功能是接受按鍵,如果接收的是方向鍵,就讓笑臉順著方向移動,如果接收的是ESC鍵就退出程式,其他按鍵則忽略處理。接受按鍵我們用以下兩條語句:
while (bioskey(1)
==
0);/*等待按鍵*/
key = bioskey(0);/*把接收的按鍵的鍵盤碼賦給變數key*/
/>/>然後用switch語句來判斷按鍵以及執行相關操作,如下:
switch (key)
/*對變數key的值進行判斷*/
{
/>/>/>case UP:
/*如果按的是向上鍵*/
… break;
/*讓物體向上運動,並退出switch*/
/>/>/>case DOWN:
/*如果按的是向下鍵*/
… break;
/*讓物體向下運動,並退出switch*/
/>/>/>case LEFT:
/*向左鍵*/
… break;/*向左運動*/
/>/>/>case RIGHT:
/*向右鍵*/
… break;/*向右運動*/
/>/>/>default:
/>/>
break;/*其他按鍵則忽略處理*/
}
/>/>怎麼樣,是不是有了玩遊戲的感覺了?不過這個程式沒有什麼目的 ,也沒有什麼判斷勝負的條件。下面我們就利用這個能控制它移動的笑臉來做一個更有趣的遊戲吧!
4、在迷宮中探索
/>/>小時侯,我常在一些小人書和雜誌上看見一些迷宮的遊戲,非常喜歡玩,還常到一些書上找迷宮玩呢。好的,現在我們用C語言來編個迷宮的遊戲,重溫一下童年的樂趣。
/>/>
/>/>首先,我們定義一個二維陣列map,用它來儲存迷宮的地圖,其中map[x][y] == '#'表示在(x,y)座標上的點是牆壁。DrawMap函式在螢幕上輸出迷宮的地圖和一些歡迎資訊。在main函式裡,我們定義了"小人"man的座標和"目的地"des的座標。在遊戲迴圈中,我們增加了一些用來判斷勝負的語句:
if (man。x == des。x && man。y == des。y) /*如果人的座標等於目的地的座標*/
{
gotoxy(35,
3);
/>/>
printf("Ok! You win!"); /*輸出勝利資訊*/
…
/>/>
}
/>/>在判斷按鍵時,如果玩家按的是方向鍵,我們還要先判斷前面是不是有"牆壁",如果有的話,就不能往前移動了。好的,我們在判斷按鍵的switch語句的各個分支加上了判斷語句,如下:
if (map[…][…==
'#')
break;/*如果前面是牆壁,就不執行下去*/
/>/>哇噻!真棒,我們做出了一個完整的遊戲了。當然你還可以通過修改二維陣列map來修改迷宮的地圖,讓它更有挑戰性。不過,我們要設計一個更好玩的遊戲。
/>/>
5、聰明的搬運工
/>/>大家一定玩過"搬運工"的遊戲吧!這是在電腦和電子字典上較流行的益智遊戲,讓我們動手做一個屬於自己的"搬運工"吧!程式依然用陣列map來儲存地圖,陣列元素如果為空格則表示什麼也沒有,'b'表示箱子,'#'表示牆壁,'*'表示目的地,'i '表示箱子在目的地。我們以後每推一下箱子,不但要改變螢幕的顯示,也要改變map相應元素的值。遊戲的主迴圈依然是接受按鍵。當接收一個方向鍵,需要判斷小人前面一格的狀態,如果是空地或目的地,則人物可以直接移動;如果是牆壁,則不可移動;如果是箱子或目的地上的箱子,則需要繼續判斷箱子前面一格的狀態:如果前一格是空地或目的地,則人推 箱子前進,否則不可移動。好的,我們在switch中增加了這些判斷語句。
/>/>
/>/>程式還有一個重要的功能就是判斷勝利。陣列Des用來記錄全部目的地的座標,我們每執行一步操作後,程式就要通過Des陣列判斷這些目的地上是否都有箱子了。真棒啊!我們可以做遊戲了。而且是一個老少皆宜,趣味十足的遊戲呢!當然,我們可以通過修改map陣列來製作不同的遊戲地圖, 我們還可以相互分享好的遊戲地圖呢。
/>/>
6、尾聲:
/>/>在C++等高階語言還沒出來的時候,很多應用程式也是C語言開發的。C語言在與硬體聯絡緊密的程式設計中,也佔有重要地位。其實我覺得學習程式設計,可以通過一些小遊戲,實用的例子來學習。 象學習音樂的人,不是要等到把全部樂理學完後才演奏一個完整的曲子。而是剛開始學時就有一些簡單的曲子讓你演奏,讓你立刻就有成就感,讓你很快就能賣弄出來在別人面前表現自己了。通過編 遊戲來學習程式設計,把學習變成遊戲,不失為學習計算機的一種好方法。
/>/>
/>/>好了,編遊戲就這麼簡單,希望大家也嘗試用C語言或其他的語言來做幾個自己喜歡的小遊戲。