引言
昨天我們實作出商店頁面,可以由賺到的錢換取能力值。
但要賺到錢的話,就必須冒生命危險去跟怪物搏鬥QQ
這時候玩家得到的資訊就很重要了,
需要有個功能讓玩家得知此層中存在的怪有哪些、能力是什麼。
所以今天我們來設計「顯示怪物們的數值」功能,方便玩家們計算~
幫怪物點名 monster_list
這次設計的查看怪物資訊功能也是參考魔塔的,
但差別在於魔塔的資訊必須在玩家取得筆記本時才能啟用,而我們設計的則一開始就能使用了。
這個功能的程式執行步驟是這樣子的:
所以第一步我們要事先定義總怪物種類數,並建立monster_list陣列,且在.c檔初始化它:
/* File: PlayGround.h */
// 新增以下兩行
#define TOTAL_MONSTER_NUM 5 // 目前怪物共5種
int monster_list[TOTAL_MONSTER_NUM]; // 怪物的點名單,確認該地圖有無各怪物存在
/* File: PlayGround.c */
void initMonster()
{
m1.skin = '1';
m1.atk = 18;
m1.def = 1;
m1.hp = 35;
m2.skin = '2';
m2.atk = 20;
m2.def = 2;
m2.hp = 45;
m3.skin = '3';
m3.atk = 38;
m3.def = 3;
m3.hp = 35;
m4.skin = '4';
m4.atk = 32;
m4.def = 8;
m4.hp = 60;
m5.skin = '5';
m5.atk = 42;
m5.def = 6;
m5.hp = 50;
m1.drop = 1;
m2.drop = 2;
m3.drop = 3;
m4.drop = 5;
m5.drop = 6;
// ------------新增部分-------------------
int i = 0;
for(i=0; i<TOTAL_MONSTER_NUM; i++)
{
monster_list[i] = 0; // 初始化怪物點名單
}
// --------------------------------------
}
蒐集怪物資訊、顯示怪物資訊 函數
一共有兩個函數,一個是在playGround開始時先蒐集地圖所存在的怪物,一個是按下F12時顯示用的函數:
/* File: PlayGround.h */
void collectMonsterInfo(); // 蒐集地圖所存在的怪物
void displayMonsters(); // 顯示用的函數
/* File: PlayGround.c */
void collectMonsterInfo() // 由地圖蒐集該地圖怪物資訊
{
int i = 0, j = 0;
for(i = 0; i < MAP_HEIGHT; i++)
{
for(j = 0; j < MAP_WIDTH; j++)
{
if(game_map[i][j] == '1') // 如果1號怪在地圖內
{
monster_list[0] = 1; // 幫它點名(紀錄在monster_list內)
}
else if(game_map[i][j] == '2')
{
monster_list[1] = 1;
}
else if(game_map[i][j] == '3')
{
monster_list[2] = 1;
}
else if(game_map[i][j] == '4')
{
monster_list[3] = 1;
}
else if(game_map[i][j] == '5')
{
monster_list[4] = 1;
}
}
}
}
void displayMonsters() // 顯示怪物資訊
{
int i = 0;
for(i=0; i<TOTAL_MONSTER_NUM; i++)
{
if(monster_list[i] == 1)
{
switch(i)
{
case 0:
printf("[怪物1號] HP: %4d, ATK: %4d, DEF: %4d\n", m1.hp, m1.atk, m1.def);
break;
case 1:
printf("[怪物2號] HP: %4d, ATK: %4d, DEF: %4d\n", m2.hp, m2.atk, m2.def);
break;
case 2:
printf("[怪物3號] HP: %4d, ATK: %4d, DEF: %4d\n", m3.hp, m3.atk, m3.def);
break;
case 3:
printf("[怪物4號] HP: %4d, ATK: %4d, DEF: %4d\n", m4.hp, m4.atk, m4.def);
break;
case 4:
printf("[怪物5號] HP: %4d, ATK: %4d, DEF: %4d\n", m5.hp, m5.atk, m5.def);
break;
}
}
}
system("pause");
system("cls");
}
函數呼叫
寫好函數後,將函數綁定到合適的位置:
/* File: PlayGround.c */
void playGround(char *mapPath, int initX, int initY)
{
system("cls");
loadMap(mapPath);
// ------------新增部分-------------------
collectMonsterInfo(); // 由game_map中蒐集存在的怪物列表
// --------------------------------------
initPlayer('@', initX, initY);
while(isPlaying)
{
selfCls();
showMap();
playerStatus();
if(GetAsyncKeyState(VK_ESCAPE) != 0)
{
playMusic(SYSTEM_OK, SE_MODE);
exit(0);
}
if(GetAsyncKeyState(VK_RIGHT) != 0)
{
movePlayer(p.x + 1, p.y);
}
if(GetAsyncKeyState(VK_LEFT) != 0)
{
movePlayer(p.x - 1, p.y);
}
if(GetAsyncKeyState(VK_UP) != 0)
{
movePlayer(p.x, p.y - 1);
}
if(GetAsyncKeyState(VK_DOWN) != 0)
{
movePlayer(p.x, p.y + 1);
}
// ------------新增部分-------------------
if(GetAsyncKeyState(VK_F12) != 0) // 按下F12後,顯示該地圖怪物資訊
{
displayMonsters();
}
// --------------------------------------
}
system("cls");
}
執行
完成後就來執行吧!以下有兩種情況示範,大家可以自己在地圖上加入怪物,測試看看。
地圖中有1, 2, 3, 4四種怪,則按下F12後顯示該四種怪的資訊:
地圖中雖然很多隻怪,但「種類」上只有1, 2, 3三種,因此按下F12後只顯示該三種怪的資訊: