【C言語プログラミング4】ルフィを描く!解説1
前回、C言語でルフィを描くプログラムを作りました。今回からそのソースコードの解説をして行きます。このプログラムでやっていることは、簡単に言うと”☐”(白い四角)と”■”(黒い四角)を決められた順に表示しているだけです。結果として、それがルフィに見えるわけ。
”☐”や”■”を点と考えて、それを並べて絵にしたものをドット絵と言います。ファミコンのキャラクター(マリオとか)はこれで描かれています。マリオはカラーですが、今回やったルフィは単純に白黒で表現しました。
ルフィ描画プログラムの全体構成
ルフィ描画プログラムは以下3つの関数で成り立っています。
1)main関数
2)DecompressLuffyData関数
3)PrintLuffy関数
main関数からDecompressLuffy関数とPrintLuffy関数を順に呼び出して終了です。ソースコードの冒頭に大量の16進数データがありますが、これがルフィのドット情報になります。つまり、”☐”と”■”の並びを定義した情報です。ルフィ描画プログラムはこのドット情報を解読して、コンソールに”☐”か”■”を表示します。では、main関数から順番に見て行きましょう。
main関数
main関数はこれまでずっと登場して来ましたが、main関数自体の説明はしていませんでしたね。main関数は特別な関数で、プログラムの起点になる関数です。プログラムは必ずmain関数から始まります。なので必ず最初に書かないといけません。今回のmain関数には引数も戻り値も必要ないので型はvoidにしています。(引数あり、戻り値ありにすることも出来ます)
void main(void)
{
}
このように書くと{ }の中は何も処理がありませんので、何もしないプログラムになります。今回のルフィ描画プログラムのmain関数は以下のようになっています。
void main(void)
{
DecompressLuffyData(); /* ルフィの画像データを解凍 */
PrintLuffy(); /* ルフィを表示する */
}
たったの2行ですね。DecompressLuffyData関数とPrintLuffy関数を順番に呼び出しているだけです。この2つの関数は自分で新しく作りました。関数の後ろに/**/こんなマークで囲まれている部分がありますが、これはコメントと言ってプログラムに注釈を付けられます。
DecompressLuffyData関数はルフィの画像データを解凍し、PrintLuffy関数でルフィを表示します。main関数は以上!シンプルですね。問題は自作関数の中身です。ここからが本番。
DecompressLuffyData関数
この関数がルフィ描画プログラムの心臓で、ソースコード冒頭のルフィのドット情報を解凍して、”☐”と”■”の並び順に変換します。この関数のソースコード行数はたったの16行ですが、この16行を理解するためには、結構な量のC言語知識が必要です。一つずつ理解して行きましょう。
一次元配列
一次元配列は単純に配列と言ったりしますが変数の一種です。変数については理解している前提で話を進めます。変数の宣言をする時は以下のように記述しますよね?
char sample;
これでchar型のsampleと言う名前の変数がメモリ上に配置されます。ここまでは大丈夫ですね。仮にchar型の変数が2個以上欲しい場合は、
char sample1;
char sample2;
char sample3;
・・
・
とすることも出来ますが。これが10000個とかになったらやってられませんね。そんな場合に配列を使います。
char sample[10];
こう記述すると、char型のsampleという名前の変数が10個ズラッ並びます。メモリ上のイメージは以下の通りです。
配列を扱う時の注意点として、先頭が0番から始まると言うことです。1からではありません。char sample[10];とするとメモリイメージの通り10個並ぶんですが、最後の番号は9です。配列の何番目かを表す番号のことを添え字と言います。例えば配列の先頭から3番目に100を入れたい場合、
sample[2] = 100;
とします。添え字2は先頭から3番目になります。また、配列の最後のつもりで誤って、
sample[10] = 100;
なんてことをすると、配列の最後を超えたメモリへのアクセスになりますので、大変なことになります。
最悪プログラムが暴走します。気を付けて下さい。
一次元配列の初期化
通常変数と同様に配列も宣言と同時に値を入れることができます。配列の宣言時に入れる値のことを初期値と言い、初期値を入れることを初期化と言います。初期値は{ }の中にカンマ区切りで指定します。配列を初期化する場合は、添え字を省略することができます。3行目のsampleは自動的にsample[5]となります。
char sample[10]; /* 配列を宣言しただけ */
char sample[10] = {1,2,3,4,5,6,7,8,9,10}; /* 宣言と同時に値をセット */
char sample[] = {1,2,3,4,5}; /* 宣言と同時に値をセット */
ルフィ描画プログラムにおける一次元配列の利用
ルフィ描画プログラムでは、一次元配列をルフィのドット情報の入れ物として使っています。実際のソースコードを抜粋します。
unsigned char gucImageData[1250] = {
0x00,0x00,0x00,0x41,0x08,0x07,0x00,0x00,・・・
0x00,0x40,0x58,0x3d,0x00,0x00,0x00,0x00,・・・
・・・
};
このコードではunsigned char型のgucImageDataという名前の配列を宣言し、宣言と同時に16進数のデータを全部で1250個入れています。このデータがなぜルフィになるのでしょうかね。今回はこの辺で。次は二次元配列に入ります。
この記事が気に入ったらサポートをしてみませんか?