c語言簡潔強大,我們可以利用它寫出許多程式,甚至製作一些小遊戲,比如貪吃蛇。筆者在第一次用c語言製作貪吃蛇遊戲時,頭都大了,因為完全不懂該從何處下手開始寫**。後來借鑑了前輩的經驗才明白,需要用到自頂向下、逐步求精的方法,將乙個貪吃蛇遊戲細分為幾個小問題:列印地圖、蛇的移動、gameover的判定、食物的產生。然後再慢慢化簡各個小問題中的難題。在這裡給大家記錄下筆者的學習記錄,若能給大家一點幫助則是萬幸。
列印地圖我們首先要構造乙個地圖,筆者的想法是構建乙個整數型的二維陣列用來表示地圖:0表示空地(「 」),1表示蛇頭(「h」),2表示蛇身(「x」),3表示牆壁(「*
」),4表示食物("$")。這樣做的好處就是每次列印新地圖時可以用同乙個函式,同時也便於後續的一些判定。以下是地圖的構造。
int map[22][42] = ;//地圖全部初始化為空地,最好把map設為全域性變數
for (int i = 0; i < 22; i++)
//設定牆壁
map[1][5] = 1;//設定蛇頭
map[1][1] = 2; map[1][2] = 2; map[1][3] = 2; map[1][4] = 2;//設定蛇身
接下來再寫乙個列印地圖的函式,讓蛇每次移動後列印新地圖。
void new_map()
printf("\n");
}
蛇如何移動是整個遊戲中最關鍵的一部分,若是一開始就考慮整條蛇的移動是很困難的,於是筆者先從最簡單的頭部的移動開始寫**:用x、y表示頭的橫縱座標,讀入相應的方向字元後對座標進行相應的加減就好了,如下
while (1)//死迴圈,之後可加入gameover的判定
//移動
map[y][x] = 1;//新蛇頭
}
接著再考慮蛇身的移動,這裡許多前輩使用了資料構造的辦法,無奈在下學得不精,不得不放棄使用另一種方式來實現蛇的身體構造。但是一些思想還是通用的,蛇身的移動其實就是蛇頭的位置變成蛇身,然後蛇的尾巴消失。這樣一來就豁然開朗了,筆者只需要利用乙個二維資料儲存每個蛇身的座標位置,再分別用兩個指標指向蛇的脖子(頭的下一節)和蛇尾,每次移動就讀入舊蛇頭即新蛇脖的座標,蛇尾座標歸零後再指向下乙個蛇尾即可。**形式如下
int head = 4, tail = 1,body[801][2] = ;//筆者構建的地圖為20×40,考慮蛇身最大長度所以設定了801
body[1][0] = 1; body[1][1] = 1; body[2][1] = 1; body[2][0] = 2; body[3][1] = 1; body[3][0] = 3; body[4][1] = 1; body[4][0] = 4;//初始蛇身的座標,0代表x軸,1代表y軸
while (1)
map[y][x] = 1;
map[body[tail][1]][body[tail][0]] = 0;//去掉蛇尾
tail = (tail + 1) % 801;//指向新蛇尾
new_map();//列印蛇移動後的新地圖
}
這個問題其實很簡單,我們只需要判斷蛇頭的新座標上的數字是不是為0就好了(如果是食物只需要多加乙個分支而已),寫乙個函式_life(),給新蛇頭的位置,若該位置為0就返回1,若為蛇身或牆壁就返回0,讓迴圈結束(只需要把返回值的結果給while迴圈就好了),**如下
int _life(int a)
}
需要注意的是_life()函式的判斷要在新蛇頭生成前,即map[y][x] = 1;的上一條。
我們需要設立乙個變數來監控食物是否被吃,以及乙個函式來在地圖中隨機生成食物。看似簡單,但會牽扯到上面的許多函式。食物隨機生成函式
void _food()在上面的_life()函式裡吃掉食物時會返回為2,這就便於我們進行食物被吃、和蛇身變長的判定x = rand() % 40 + 1; y = rand() % 20 + 1;
}}
if (life != 2)
else food = 0;//吃到食物就跳過尾巴消失,則蛇自然變長,同時食物變數歸零
最後只需要把上面的內容整合下,並做些調整就可以製作出最簡單的貪吃蛇遊戲了,下面是完整的**
#include#include#include#include #include int map[22][42] = , food = 0;
int _life(int a);
void move();
void _food();
void new_map();
int main()
map[1][5] = 1;
map[1][1] = 2; map[1][2] = 2; map[1][3] = 2; map[1][4] = 2;
move();
return 0;
}int _life(int a)
}void move()
, life = 1;
body[1][0] = 1; body[1][1] = 1; body[2][1] = 1; body[2][0] = 2; body[3][1] = 1; body[3][0] = 3; body[4][1] = 1; body[4][0] = 4;
char m = 'd', m1 = 'd';//設定初始的移動方向
while (life)
else
case 's':if (m1 == 'w')
else
case 'a':if (m1 == 'd')
else
case 'd':if (m1 == 's')
else
default:m = m1;
break;
}m1 = m;//m1為了不讓蛇回頭
life = _life(map[y][x]);
map[y][x] = 1;
if (life != 2)
else food = 0;
sleep(300);//用到 螢幕重新整理的間隔,可以控制蛇的速度
system("cls");//重新整理螢幕,讓遊戲看起來像在乙個地圖裡執行的
new_map();}}
void _food()
x = rand() % 40 + 1; y = rand() % 20 + 1;}}
void new_map()
printf("\n");
}}
簡單的傳球遊戲
題目意思 有k個人相互傳球,從甲開始到甲結束,傳n次球。注,自己不能傳給自己 分析與解答 設第n次傳球後,球又回到甲手中的傳球方法有a n 種,可以想象前n 1次傳球,如果每一次傳球都任選其他k 1人中的一人進行傳球,也就是每次傳球都有k 1種可能,由乘法原理,共有 k 1 n 1 種 這些傳球方式...
簡單的light off 遊戲
just for fun 系列!define crt secure no warnings include include include define row 7 define col 7 void initmap char tic col int row,int col for i 0 i ro...
簡單的戰鬥遊戲
一次實訓作業 題目要求 設計並編寫 自動格鬥類遊戲。角色類crole為基類 建構函式 析構函式 成員變數 頭像 hp 血量 atk 攻擊力 def 防禦力 lv 等級 exp 經驗值 成員函式 攻擊 跳躍。2 英雄類chero繼承於crole類 建構函式 析構函式 英雄類新增技能踢腿 成員函式 抱摔...