第2章07 変数に配列を使う@イチからゲーム作りで覚えるC言語

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章08 プログラムにコメントを書く
NEXT : 2章08 プログラムにコメントを書く
2章06 いろんな書式指定子 : PREV

この記事でやること

前回はプロジェクト「0050_stringformatid」を新しく作り、いろいろな変数を形式を指定して画面表示するプログラムを作成しました。
今回は、新しくプロジェクト「0055_array」を作り、複数の変数を使うことのできる”配列”についてお話します。

この記事はゆる~くC言語でコンソールゲームを作りながらプログラミングを学ぶための連載記事です。シリーズものですので記事の一覧はこちらを参照してくださいね。

配列を使ったプログラム

配列とは一つの変数で同じ型(int型とかchar型とか)を大量に扱うことのできる仕組みです。非常の利用の幅が広く、たとえばゲームでは大量の敵データや地形データなど、同じような型をつかった大量のデータを配列で扱ったりします。

同じオブジェクトを配列で

ではでは配列を取り扱うサンプルプログラムを作成してみましょう。
プロジェクト「0055_array」を新しく用意し、プロジェクトに空の「Array.c」を追加し、下のソースコードをコピペして動かしてみましょう。

#include <stdio.h>
int main() {
 int level = 3;
 int maxhitpoint[6] = { 10, 15, 20, 26, 151, 157 };
 char magicName[7] = "Check";
 char enemyName[10] = "鬼うさぎ";
 printf("ぷらんく:ステータス調査魔法「%s」を敵「%s」につかおう。"
    , magicName, enemyName);
 printf("ふむふむ、%s はレベル %d で、最大HPは %d くらい。\n"
    , enemyName, level, maxhitpoint[level]);
 level++;
 printf("%s はレベル %d で、最大HPは %d !?\n"
    , enemyName, level, maxhitpoint[level]);
 printf("1 レベル差でステータス上がりすぎだね。成長期かな。\n");
}

コピペなりして、実行してみて下さい。

ぷらんく:ステータス調査魔法「Check」を敵「鬼うさぎ」につかおう。
ふむふむ、鬼うさぎ はレベル 3 で、最大HPは 26 くらい。
鬼うさぎ はレベル 4 で、最大HPは 151 !?
1 レベル差でステータス上がりすぎだね。成長期かな。

敵キャラ「鬼うさぎ」のステータスを「Check」という魔法でしらべたときの想定です。

鬼ウサギに Check の魔法

配列とバッファーの中身

配列とは「〇〇型をたくさん並べて、大量に使えるようにする」ということです。並べられた一つ一つは要素とよばれます。たくさん並べた要素はPCのメモリの中で保存され、スペースが確保されます。このようなスペースをバッファーと呼びます。

配列の要素のイメージ

配列の要素のイメージ

 int maxhitpoint[6] = { 10, 15, 20, 26, 151, 157 };

4行目では、int型の要素を6個もつ配列で maxhitpoint という変数名で宣言と初期化をしています。
この 「要素を6 個もつ」ということを記号[] の中で書いています。
また記号 {} の中で順番に 6 個のint型(整数)を代入しています。
この6個の要素には
変数名[添え字]
という書き方でアクセスできます。添え字(そえじ)とは、配列の要素の番号みたいなものととらえてください。maxhitpoint は下のように初期化されています。

  • maxhitpoint[0] に整数 10 が代入されている。
  • maxhitpoint[1] に整数 15 が代入されている。
  • maxhitpoint[2] に整数 20 が代入されている。
  • maxhitpoint[3] に整数 26 が代入されている。
  • maxhitpoint[4] に整数 151 が代入されている。
  • maxhitpoint[5] に整数 157 が代入されている。

ここで、添え字は 0 から始まることに気を付けてください。ちょっと戸惑うかもしれませんが添え字は 0 から始まって、 5 で終わっているので、6個の要素を持つ配列が作られています。

int型の配列の中身と添え字

int型の配列の中身と添え字

読み出す方法は簡単で、例えばここ配列の添え字 3 つ目の中身を見たい時は、

printf("%d", maxhitpoint[3]);

のように書けば、「26」と表示されますし、この要素の内容の変更も

maxhitpoint[3] = 20;

と書けば、「26」から「20」に変更することができます。

バッファーの中身

プログラムを実行したとき、maxhitpoint の配列の中身はこんな感じです。

maxhitpoint のそれぞれの要素の中身
添え字[0][1][2][3][4][5]
内容10152026151157

文字列を使ったときの配列とバッファーの中身

おさらいにもなりますが、「char 変数名[] 」は前のページで「char 型変数をたくさん並べて、たくさんの文字(日本語含む)を保存できるようにしている」というお話をしたかと思います。
これも配列のことで、たとえば下のような書き方で char型で要素を 7 個もった変数(配列)を作成しています。

 char magicName[7] = "Check";

実際に「char magicName[7] =”Check”;」が実行されたとき、メモリの中では下のようにスペースが確保されています。行「内容」と行「数値」は表現を変えただけで、同じ内容です。
例えば ‘C’ とは ASCII コード表でみると 67 であり、同じ内容です。

 magicName のそれぞれの要素の中身
添え字[0][1][2][3][4][5][6]
内容‘C’‘h’‘e’‘c’‘k’‘\0’
数値67104101991070

例えば ‘C’ は ASCIIコード上の数値では 67 で表せます。
「’\0’」はASCIIコード表での制御文字であり、数値では 0 になります。これはNULL終端文字とよばれています。

文字列とNULL終端文字
過去のページ「文字列変数の宣言、初期化と表示」でお話しましたが、文字列を扱うときは文字列の終わりがどこかを示すために、配列の最後に数値 0 が必要となります。
今回は「Check」で5文字で6文字目に、終わりを示す数値 0 が代入されています。
ここで気を付けないといけないのは、
char name[7]; で文字の記憶に使えるのは、実質 6 文字ぶんまでで、 1 文字は NULL終端文字に使う必要がある
ということです。

今回 magicName は 7 文字ぶんのサイズを用意しているため、NULL終端文字ぶんを除くと最大、6文字までが記憶できます。今回は 5 文字までしかつかってませんので、1文字分余裕がある状態、ということですね。
実際、添え字 6 番目の要素は使われてません。

NULL終端文字が文字列の最後になぜ必要なのでしょうか。 printf 関数などでchar型配列を文字列として扱うとき、このNULL終端文字で、文字列の終わりだと判断しているためです。もしこのNULL終端文字が書いていなければ、NULL終端文字を見つけるまで、メモリの中を表示しつづけてしまいます。(バグってしまいます)

日本語の文字列をchar型配列に代入したときの配列の中身

標準設定で日本語版 Windows OS コンソール上で日本語を扱うとき、日本語1文字で char 型 2 個ぶんを使います。(ASCIIコード表にのっているような英文字や数字は1文字で1バイトというサイズを使い、日本語は倍の 2 バイトを使う)
この時、enemyName は下のように配列の中身がそれぞれ代入されています。

 enemyName の中身
添え字[0][1][2][3][4][5][6][7][8][9]
内容ぎ ‘\0’

日本語についてはchar型の配列の添え字と1対1の関係になってなかったりして、ちょっと扱いづらいですね。
日本語のような char 型1個文で一文字が収まらない文字はワイド文字と呼ばれます。ASCIIコード表の文字だけでは表現できない、英語圏以外の国の言葉でもC言語上で扱えるように、char型ではなく専用のワイド文字用の機能( wchar型や専用の入力、出力用の関数)があったりします。
そのあたりは、また別のページでお話しようと思います。

配列の中身の表示

このページのここまでのお話で、すでにのこりのソースコードの各行がやっていることはわかるんじゃないかと思います。

 printf("ぷらんく:ステータス調査魔法「%s」を敵「%s」につかおう。"
    , magicName, enemyName);
 printf("ふむふむ、%s はレベル %d で、最大HPは %d くらい。\n"
    , enemyName, level, maxhitpoint[level]);

ここでは、文字列の中身を表示しています。
この時点で変数level には整数 3 が入っているので、maxhitpoint[level] はmaxhitpoint[3] ということになります。
配列の変数 maxhitpoint の要素[3]には整数 26 が入っていますので、「最大HPは 23 くらい。」と表示されることになります。

あとがき

今回はここまで。お疲れさまでした。

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章08 プログラムにコメントを書く
NEXT : 2章08 プログラムにコメントを書く
2章06 いろんな書式指定子 : PREV

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日更新内容
更新なし