簡單的字元遊戲

2021-08-13 20:44:59 字數 3242 閱讀 4713

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()

x = rand() % 40 + 1; y = rand() % 20 + 1;

}}

在上面的_life()函式裡吃掉食物時會返回為2,這就便於我們進行食物被吃、和蛇身變長的判定

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類 建構函式 析構函式 英雄類新增技能踢腿 成員函式 抱摔...