兩個(gè)月C語言的初學(xué)者滤蝠,我利用easyx圖形庫所做的球球作戰(zhàn)小游戲(一)
1.2 在隨機(jī)位置出現(xiàn)一個(gè)減肥果apple
這個(gè)就比較簡單可通過兩個(gè)函數(shù)實(shí)現(xiàn)
通過rand函數(shù)隨機(jī)初始化apple的坐標(biāo)
void initApple()
{
int x, y;
x = GRAPH_WIDE - apple.r;//規(guī)定坐標(biāo)(x稿辙,y) 的取值范圍航厚,防止出現(xiàn)再墻外
y = GRAPH_HIGH - apple.r;
apple.x = rand() % x;
apple.y = rand() % y;
}
根據(jù)現(xiàn)有apple坐標(biāo)畫出它
void makeApple()
{
setfillcolor(LIGHTRED);//畫出不同顏色蘋果
setlinecolor(LIGHTRED);
fillcircle(apple.x, apple.y, apple.r);
setfillcolor(CYAN);//畫完apple后要把顏色恢復(fù)成原始設(shè)置
setlinecolor(CYAN);
}
1.3 給小球賦予碰邊界死亡和吃果子的屬性
思考一下會發(fā)現(xiàn)顷歌,碰邊界死亡和吃果子的屬性很類似,我們可以通過一個(gè)判斷界限的函數(shù)來實(shí)現(xiàn)這個(gè)功能
基本原理是通過計(jì)算球心距離來判斷球是否撞墻和兩球是否相遇
int checkBound()//0死亡 1存活 2吃果子
{
float distance;//player和apple的圓心距離
distance = sqrt((player.x - apple.x)*(player.x - apple.x) + (player.y - apple.y)*(player.y - apple.y));
if (player.x<player.r || player.x>GRAPH_WIDE - player.r || player.y<player.r || player.y>GRAPH_HIGH - player.r)//撞墻
{
return 0;
}
else if (distance <= player.r + apple.r)//兩球相遇
{
return 2;
}
return 1;//以上兩種情況都沒有發(fā)生就表示狀態(tài)未改變
}
1.4 果子被吃要換個(gè)位置再次出現(xiàn)
這一步不用單獨(dú)編寫函數(shù)幔睬,而是在playgame()函數(shù)中添加已有的函數(shù)把功能結(jié)合起來眯漩。
也就是說,零件已經(jīng)造好了麻顶,現(xiàn)在我們來搭積木赦抖。
apple在游戲開始的時(shí)候就應(yīng)該出現(xiàn),那我們把它加到 initgame()函數(shù)里
void initgame()//為了易于觀看辅肾,本函數(shù)只寫了新添加內(nèi)容
{
apple.r = 8;//初始化apple的半徑
initApple();//初始化蘋果坐標(biāo)
makeApple();//初始化蘋果圖形
}
void playgame()
{
int sign;//用于存儲player的狀態(tài)
initgame();
while (1)
{
if (_kbhit())//如果有輸入的話队萤,改變方向.沒有就方向不變
{
g_direction = _getch();
}
moveOrder();//改變玩家的坐標(biāo)
sign = checkBound();//把player狀態(tài)的判斷結(jié)果存儲下來
if (sign == 0)//如果死了
{
cleardevice();//清屏后跳出while循環(huán)
break;
}
else if (sign == 2)//如果吃到了減肥果
{
initApple();//新蘋果坐標(biāo)初始化,也就是更換蘋果位置
}
cleardevice();//清屏
makePlayer();//畫player圖形
makeApple();//畫apple
}
}
下圖錄制的有一些問題矫钓,實(shí)際運(yùn)行是勻速運(yùn)動的小球要尔,并不會卡頓和跳躍前進(jìn)
至此,我們預(yù)想的游戲核心功能已經(jīng)全部實(shí)現(xiàn)了
現(xiàn)在看來我們的游戲游戲有一些無聊新娜,我們來為它添加一些 有趣的屬性
2.增加功能
開始我們預(yù)想赵辕,player 吃了 apple 后會變小而且移動速度會更快以至于讓游戲難度慢慢增加
我們就暫且增加這一個(gè)功能做示范,如果你想的話概龄。你可以增加“傳送門”毒性果子”“炸彈”还惠,或者加入HP的概念,甚至加入一些你獨(dú)特的概念旁钧,這些都是可以通過增加簡單的函數(shù)來實(shí)現(xiàn)的。
實(shí)現(xiàn)目標(biāo) player 每吃一個(gè)apple 會變小一圈互拾,每吃三個(gè)移動速度會變快
是不是一下就想到了 play.step 和 player.r 的屬性歪今,沒錯(cuò),我們就是通過改變這兩點(diǎn)來實(shí)現(xiàn)颜矿。但是我們?nèi)绻麌L試會發(fā)現(xiàn)寄猩,就算把play.step設(shè)置為1,(也就是一次只移動一個(gè)像素點(diǎn)的距離)小球依然會移動的過快。
為此我們加入一個(gè)Sleep()函數(shù)骑疆,讓程序再適當(dāng)?shù)奈恢眠\(yùn)行“慢”一點(diǎn)
#include <windows.h>
Sleep (500) ; //注意第一個(gè)字母是大寫,作用是讓系統(tǒng)運(yùn)行到此代碼處等待500毫秒再繼續(xù)運(yùn)行
增加功能示例代碼
int g_score = 0;//記分用
int g_step = 10;//玩家實(shí)際每秒移動像素個(gè)數(shù)=1000/STEP*player.step
void playgame()
{
int sign;
initgame();
while (1)
{
if (_kbhit())//如果有輸入的話田篇,改變方向.沒有就方向不變
{
g_direction = _getch();
}
moveOrder();//改變玩家的坐標(biāo)
sign = checkBound();//把player狀態(tài)的判斷結(jié)果存儲下來
if (sign == 0)//如果死了
{
cleardevice();
break;
}
else if (sign == 2)//如果吃到了減肥果
{
g_score++;
if (g_score % 3 == 0)//每吃3個(gè)速度變快一次
{
player.step++;
}
player.r -= 3;//減肥吧player~
initApple();//新蘋果坐標(biāo)初始化
}
Sleep(g_step);//讓程序睡一會兒
cleardevice();//清屏
makePlayer();//畫player圖形
makeApple();//畫apple
}
}
如果你想改變 player 的初始移動速度和大小,可以在 initgame(); 里改變相關(guān)參數(shù)和g_step實(shí)現(xiàn)箍铭。
如果你想改變移動速度增加的頻率 參考公式: *玩家實(shí)際每秒移動像素個(gè)數(shù)=1000/STEPplayer.step **
這個(gè)的運(yùn)行效果需要長時(shí)間的動圖來觀察泊柬,就不放圖了。
結(jié)語
今天我們完成了游戲的核心功能并為游戲增添了一些有趣的屬性
在下一篇文章中诈火,我們將為游戲做一些美化以及排除一些游戲中的bug
如果你也是是C語言的初學(xué)者兽赁,并對此文章有興趣,請持續(xù)關(guān)注更新。
如果你跟我一樣是萌新刀崖,遇到了我能理解的問題歡迎私信惊科,我會很樂意交流。
如果你是編程界的前輩亮钦,對我有一些中肯的建議馆截,更加歡迎私信。
我是 Aha_斌蜂莉,一個(gè)對編程有著濃厚興趣的學(xué)生蜡娶。