iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
2

引言

昨天我們實作出商店頁面,可以由賺到的錢換取能力值。

但要賺到錢的話,就必須冒生命危險去跟怪物搏鬥QQ
這時候玩家得到的資訊就很重要了,
需要有個功能讓玩家得知此層中存在的怪有哪些能力是什麼

所以今天我們來設計「顯示怪物們的數值」功能,方便玩家們計算~


幫怪物點名 monster_list

這次設計的查看怪物資訊功能也是參考魔塔的,
但差別在於魔塔的資訊必須在玩家取得筆記本時才能啟用,而我們設計的則一開始就能使用了。

這個功能的程式執行步驟是這樣子的:

  1. 建立陣列monster_list紀錄每個怪物是否存在一張地圖中,初始化時每個皆設為0。
  2. 搜索game_map二維陣列看看目前的地圖中每個元素是否有各種怪物存在,有的話在monster_list對應位置記為1。
  3. 當玩家按下F12時,挑出所有monster_list中標記為1的怪物,列出他們的能力值,並暫停遊戲,按下任意鍵繼續。

所以第一步我們要事先定義總怪物種類數,並建立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. 地圖中有1, 2, 3, 4四種怪,則按下F12後顯示該四種怪的資訊:
    https://ithelp.ithome.com.tw/upload/images/20191011/20111429jU4wf0buwy.jpg

  2. 地圖中雖然很多隻怪,但「種類」上只有1, 2, 3三種,因此按下F12後只顯示該三種怪的資訊:
    https://ithelp.ithome.com.tw/upload/images/20191011/20111429QRCERVgXU1.jpg


上一篇
[11屆鐵人賽Day26] 2D遊戲—錢$$、商店
下一篇
[11屆鐵人賽Day28] 2D遊戲—自動存檔、跳關機制
系列文
若沒有遊戲引擎、合作夥伴...做得出遊戲嗎? 不試試看不知道吧? [使用C語言]30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言