回答例のコードを見比べたときに、なぜ[EMPTY+1]と書かれている理由が分からない
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 509
前提・実現したいこと
ある入門書の課題に挑戦し、答え合わせをしていたときに理解できない箇所があり、
const char ELEMENT_SYMBOLS[EMPTY+1] = {'$','~','@','#','&', ' '};
const char ELEMENT_SYMBOLS[EMPTY+1] = {'$','~','@','#','&', ' '};
この上記のコードの EMPTY + 1 と書かかれている理由がわかりません。
自分がコードを書いたときは、上記のコードの部分は、
const char ELEMENT_SYMBOLS[] = {'$','~','@','#','&', ' '};
const char ELEMENT_SYMBOLS[] = {'$','~','@','#','&', ' '};
と、指定せずに書いていました。
なぜ、EMPTY + 1 と書いているのか理解できないので、解説お願いします。
該当のソースコード
/*=== puzmon2: 敵モンスター関連処理の実装 ===*/
/*** インクルード宣言 ***/
#include <stdio.h>
/*** 列挙型宣言 ***/
// (a)属性
typedef enum Element {FIRE, WATER, WIND, EARTH, LIFE, EMPTY} Element;
/*** グローバル定数の宣言 ***/
// (b)属性別の記号
const char ELEMENT_SYMBOLS[EMPTY+1] = {'$','~','@','#','&', ' '};
// (c)属性別のカラーコード(ディスプレイ制御シーケンス用)
const char ELEMENT_COLORS[EMPTY+1] = {1,6,2,3,5,0};
/*** 構造体型宣言 ***/
// (f) モンスター
typedef struct MONSTER {
char* name;
Element element;
int maxhp;
int hp;
int attack;
int defense;
} Monster;
// (g)ダンジョン
typedef struct DUNGEON {
Monster* monsters;
const int numMonsters;
} Dungeon;
/*** プロトタイプ宣言 ***/
int goDungeon(char* playerName, Dungeon* pDungeon);
int doBattle(char* playerName, Monster* pEnemy);
// ユーティリティ関数
void printMonsterName(Monster* monster);
/*** 関数宣言 ***/
// (1)ゲーム開始から終了までの流れ
int main(int argc, char** argv)
{
if(argc != 2) {
printf("エラー: プレイヤー名を指定して起動してください\n");
return 1;
}
printf("*** Puzzle & Monsters ***\n");
// ダンジョンの準備
Monster dungeonMonsters[] = {
{"スライム", WATER, 100, 100, 10, 5},
{"ゴブリン", EARTH, 200, 200, 20, 15},
{"オオコウモリ", WIND, 300, 300, 30, 25},
{"ウェアウルフ", WIND, 400, 400, 40, 30},
{"ドラゴン", FIRE, 800, 800, 50, 40}
};
Dungeon dungeon = {dungeonMonsters, 5};
// いざ、ダンジョンへ
int winCount = goDungeon(argv[1], &dungeon);
// 冒険終了後
if(winCount == dungeon.numMonsters) {
printf("***GAME CLEAR!***\n");
} else {
printf("***GAME OVER***\n");
}
printf("倒したモンスター数=%d\n", winCount);
return 0;
}
// (2)ダンジョン開始から終了までの流れ
int goDungeon(char* playerName, Dungeon* pDungeon)
{
printf("%sはダンジョンに到着した\n", playerName);
// そのダンジョンでバトルを繰り返す
int winCount = 0;
for(int i = 0; i < pDungeon->numMonsters; i++) {
winCount += doBattle(playerName, &(pDungeon->monsters[i]));
}
printf("%sはダンジョンを制覇した!\n", playerName);
return winCount;
}
// (3)バトル開始から終了までの流れ
int doBattle(char* playerName, Monster* pEnemy)
{
printMonsterName(pEnemy);
printf("が現れた!\n");
// ダミーのため速攻倒す
printMonsterName(pEnemy);
printf("を倒した!\n");
return 1;
}
/*** ユーティリティ関数宣言 ***/
// (A)モンスター名のカラー表示
void printMonsterName(Monster* pMonster)
{
char symbol = ELEMENT_SYMBOLS[pMonster->element];
printf("\x1b[3%dm", ELEMENT_COLORS[pMonster->element]);
printf("%c%s%c", symbol, pMonster->name, symbol);
printf("\x1b[0m");
}
お手柔らかにお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる