MACではじめるC言語 第3回 Ver.0.5

☆取り敢えずやってみよう!
 以下のプログラムを入力してして、コンパイル・実行してみて下さい。

#include <stdio.h>
int main(void){

struct address{
  char name[256]; //名前
  char addr[1024]; //住所
  int age; //年齢
};
  struct address data[3];
  for(int i=0; i<=2; i++){
   printf(“名前を入力して下さい : ”);
    scanf(“%s”,data[i].name);
    printf(“住所を入力して下さい : ”);
    scanf(“%s”,data[i].addr);
    printf(“年齢を入力して下さい : ”);
    scanf(“%d”,&data[i].age);
  }

  printf(“入力されたデータは\n\n”);
  printf(“名前 : %s\n”,data[0].name);
  printf(“住所 : %s\n”,data[0].addr);
  printf(“年齢 : %d\n”,data[0].age);
  printf(“名前 : %s\n”,data[1].name);
  printf(“住所 : %s\n”,data[1].addr);
  printf(“年齢 : %d\n”,data[1].age);
  printf(“名前 : %s\n”,data[2].name);
  printf(“住所 : %s\n”,data[2].addr);
  printf(“年齢 : %d\n”,data[2].age);
  return 0;
}

 前と同じく、コピー&ペーストではコンパイル時にエラーが発生しますので、必ず自身で入力して下さい。
 コンパイルが終わったら、実行してみて下さい。名前、住所、年齢などの入力を求められた後、一覧(3件だけですが)が表示されたと思います。
 これは、簡単な住所録プログラムです。データを保存出来るようにすれば、住所録が出来上がります。まだそれは先の話ですが……。
 このプログラムでは最初から見慣れないキーワードが登場していますね。struct と言う単語ですが、これは構造体宣言と言われる物で、関係のある幾つかのデータを一つにまとめることの出来る優れものです。
 氏名や住所、年齢などのデータを個別に宣言することは勿論可能です。しかし、扱うデータの種類がもっと増えてプログラムが複雑化すれば、一体このデータは何のデータなのか?とわからなくなってくるときがあります。構造体は関係のあるデータを一纏めにして、言うなれば新しい「型」を作れるというものです。上記のプログラムでは「address型」として作成しています。その中身はnameやaddr、ageと言ったメンバ(これらをそうして言う)から成り立っています。
 構造体は作成しただけでは使うことが出来ません。通常の変数と同じように、使用するために宣言をする必要があります。それが、

struct address data[3];

 と言う行です。これは作成したaddress型の変数をdataと言う名前で、配列として宣言しています。配列は同じ型を複数用意するというものでしたね。ここではaddress型の変数を3つ用意しています。
 次の行でも見慣れない構文があります。

  for(int i=0; i<=2; i++){
    printf(“名前を入力して下さい : ”);
    scanf(“%s”,data[i].name);
    printf(“住所を入力して下さい : ”);
    scanf(“%s”,data[i].addr);
    printf(“年齢を入力して下さい : ”);
    scanf(“%d”,&data[i].age);
  }
 ここで注目すべきは、{の記号と}の記号です。この二つの記号で囲まれた範囲を「ブロック」と呼びます。そして、for(の次から書かれている条件を満足するまで、このブロックを繰り返し実行すると言う意味です。ここでは。(int i=0;i<=2;i++)と書かれています。これは、「このブロックの中だけで有効なint型の変数iを宣言し、0を代入して、iを毎回1だけ加算しながら、iが2以下になるまでブロックの内容を実行しなさい」と言う意味です。つまり、iが0、1、2のの時、つまり3回このブロックのプログラムが実行されるわけです。

 そしてdata[i]は、「address型の変数dataのi 番目」を表し、「.name」は、そのメンバ「name」を表しています。

 全く初めての方には難しいかも知れませんが、自分でプログラムを改造するなどして、色々試して理解するようにして下さい。プログラミングの習得は、とにかく模倣と改造に尽きます。ここを弄ったらどうなるか? と言う好奇心を常に持ち続けていて下さい。

 最後のprintf群は、入力したデータの表示です。

 次回は「条件分岐」と「ループ」を勉強します。

MacではじめるC言語 番外編2

☆printf色々

#include <stdio.h>

int main(void)
{
  int a = 15;    // ※1
  char str[256];  // ※2

  printf(“8進数 %o \n 10進数 %d \n 16進数 %x\n”,a, a, a);

  printf(“文字列を入力して下さい :”);
  scanf(“%s”,str);  // ※3
  printf(“あなたの入力した文字列は %s です。\n”,str);


  int b,c;  // ※4
  printf(“1つめの数字を入力して下さい :”);
  scanf(“%d”,&b);  // ※5
  printf(“2つめの数字を入力して下さい :”);
  scanf(“%d”,&c);
  printf(“%d + %d = %d\n”,b, c, b+c);

  return 0;
}

 上のプログラムを入力して、コンパイル・実行して下さい。
 幾つか入力を求められるので、指示通りに入力して下さい。
 実行するとどうなりましたか?
 プログラムの解説をしていきます。まず※1ですが、int型でaと言う変数を作り、15と言う値で初期化しています。
 次の行で変数aを、8進数と10進数、16進数で表示しています。
 ※2では、chr型でstrと言う名前で256個の箱を作りました。これを配列と言います。この箱には半角文字で256個の文字を入れることが出来ます。
 ※3ではキーボードからの入力を待って、入力された文字列をstrと言う箱に格納しています。そして次の行でstrの中身を表示しています。
 文字列を表示するときには%sを使います。
 ※4では、int型の変数bとcを宣言しています。初期化はしていませんので、中には何が入っているかわかりません。
 そして※5で、数字の入力を待ち、入力された値を変数bに格納しています。scanfはキーボードからの入力を受け付ける関数です。ここで見慣れない&(「アンパサンド」と読みます)という記号が出ていますね。
 理由はこの先勉強していけばわかるようになりますが、今は「数字の入力時には変数名に&を付ける」と覚えておいて下さい。

 以上がざっくりとした解説になります。
 第3回では、構造体を勉強していきます。練習問題も用意しますので、是非チャレンジしてみて下さい。

MacではじめるC言語 第2回 Ver.1.0

「次回は型と変数を勉強します」と終わりましたが、一度に両方を深く学ぶのは対面の講義でもない限り難しいと判断しました。そこで双方軽く触れながら、余り深入りせずに進めていくことにしました。
 勉強を進めていくと嫌でも色々な型に出会いますので、その度に解説していくことにしようとおもいます。
 一応、以下に一覧だけ記しておきます。スマートフォンやタブレットで閲覧することは考慮しておりません。必ずパソコンの画面でご覧下さい。(表が変に表示されるため。)

<整数型>
bool        true(真)またはfalse(偽)
dhar        -128~127
unsigned char   0~255
short        -32768~32767
unsigned short   0~65535
int         longと同じ※
unsigned int     unsigned longと同じ※
long        -2147483648~2147483647
unsigned long   0~42949678295

<浮動小数点型>
float        約3.4の-28条~3.4の38条
double       約1.7の-308条~1.7の308条

※int型は時代や処理系によってshort型と同じだったり、必ずしもlon型と同じだとは限りません。お使いの処理系のリファレンスで必ず確認して下さい。豚がC言語を学んだ30年前は、intはshortと同じでした。bool型も最新の処理系では使えるようになりましたが、一昔前まではC++でしか使えませんでした。

 変数ですが、これは数学で習った変数と同じだと理解して頂いて結構です。
y=2x+5 ならば、yとxが変数に当たります。何かの値が入る箱だと思って下さい。
 箱の大きさは無制限では無く、先程の型で宣言してやる必要があります。

int x;    /*int型のサイズの変数xを作る*/

 の様に宣言します。下に簡単なプログラムを記しておきます。

#include <stdio.h>

int main(void)
{
  int a = 5;
  int b = 6;
  int c = a + b;
  printf(“%d + %d = %d です。\n”,a, b, c);
  return 0;
}

 このプログラムは、変数aに5、変数bに6、変数cにaとbの和を入れて、表示させています。printf文のなかの%dに関しては後ほど説明しますが、大体何をしているのかわかるでしょうか。おさらいですが、\は[option]+¥で入力できます。
 また、リストをコピペしてはいけません。必ずエラーが出ます。必ず自分で入力して下さいね。

 次回はお楽しみと言うことで!(何をするか決めていない……)

見違えた。

 一昨年から50インチの4Kモニタを使っているのですが、何が悪いのか「これが4K画質?」と思えるほど、写真の表示が酷い有様でした。まぁ安物のモニタだし……と、安かろう悪かろうでこれが当たり前かと思っていましたが、今日、ほぼ2年ぶりにRadeonのドライバを最新の物に更新しました。
 すると、なんと言うことでしょう!(サザエさん風に) 写真もグラフィックも見違えるように綺麗に表示されるようになりました。
 かなり古いドライバを安定しているという理由だけで使い続けていたので、最新ドライバの画質を目の当たりにして感動しています。
 でも、そろそろモニタが駄目になってきている模様……。モニタの上部に黒い影がうっすらと見えてきているので、バックライトが駄目になってきているのかな……?

 まぁでも買い換える余裕なんてないし、完全にぶっ壊れるまでこの環境で頑張ります。折角綺麗に表示されるようになったことですし。
 それに一度50インチに慣れると、それ以下の画面では小さすぎて……。リビングにあるマシンは28インチのモニタを繋いでいますが、やはりかなり小さく感じます。プログラムを書くのにIDEやら電子書籍やらを広げていると、やはり大きな画面の方が使いやすいですね……。

 午前0時15分

MacではじめるC言語 お知らせ

☆鬱休み
 元々不定期の予定でしたが、ちょっと鬱状態が酷いので、暫くお休みを頂きます。
 こんな感じでこれからも休み休みになると思いますが、宜しくお願い致します。

MacではじめるC言語 番外編1

☆test.cppについて。
 C言語を少しでも囓ったことのある方なら「あれ?」と思うかも知れません。
 最初のプログラムの保存名がtest.cppになっていますね。C言語のプログラムなら test.c にならなければいけないはずです。

 実は.cppと言うのはC言語の上位言語であるC++言語の拡張子なんです。C++言語はC言語を包括しているので、C言語のプログラムがほぼそのまま使えます。将来的にこの講座を「MacではじめるC++言語」に昇格させる目論見があるので、はじめからC++のファイル形式で保存して貰い、C++のコンパイラでコンパイルして貰ったわけです。
 純粋にC言語のみを扱う場合は、.c形式で保存するのが正しい方法です。豚の勝手な方針で混乱させてしまい、申し訳ありません。

 ちなみに「コンパイラ」とか「コンパイル」という用語に関しては、後に本編にて説明したいと思います。今は「人間が辛うじてわかる言語を、コンピュータがわかる言語に変換する」ことと思っておいてください。

MacではじめるC言語言語 第1回 Ver.0.1

☆前回の解説から。

 第0回では、最も簡単なプログラムで有名な「Hello C World!」を表示させるだけのプログラムを書いてみました。
 今回は大雑把ながら、前回のプログラムが何をしているのかを解説していこうと思います。

 まず1行目

#include <stdio.h>

 ですが、これは stdio.h と言うファイルを取り込み、この場所に書き加えなさいと言う意味です。では、stdio.h とは何か?と言う事になりますが、これは次行以降に登場する

printf

 と言う命令(正確には「関数」)に関係します。
 そして、printfと言う関数の本体はstdio.hと言うファイルに存在します。
 ここでC言語についてもう少し詳しく触れておきます。
 C言語は「関数型言語」と呼ばれていて、殆どの処理は関数で行います。「関数」と言うと学校で習ったf(x)と言うものを思い出したかも知れませんが、その通りです。

printf(“Hello C World!\n”);

 と言うのは、「printf関数に Hello C World!\n と言う文字列を渡しなさい」と言う事です。この Hello C World!\n に当たる部分を引数(「ひきすう」と読みます。)と言います。
 そして printf関数は、「渡された引数を表示する」と言う働きをする関数です。
 行末の;は、関数の呼び出し時の最後に、必ず記述しなくてはなりません。
(これから例外は幾つも出てきますが、基本的に記述するものと覚えておいて下さい。)

 プログラムの解説に戻ります。
 次行の int main(void) ですが、これはここから main と言う関数が始まるという宣言です。C言語では、プログラムは必ず main関数から始まることとされています。この関数だけはprintf関数の様にどこからか呼び出す事は出来ず、プログラマ自ら記述しなくてはなりません。
 それではmain関数を詳しく見ていきましょう。

int main(void)
{

}

 int main(void)の次行にある{からメイン関数は始まり、一番最後の行の}でメイン関数は終わります。
 行頭の int は、int型の戻り値が有ることを示しています。int型とは、C言語で数値を扱う場合には、値の大きさによって色々な型を使い分ける必要があり、その中の整数型と言う意味です。型については後々詳しい解説をしていきますので、今はmain関数の戻り値はint型なんだと覚えておいて下さい。

 ちなみに戻り値とは、その関数を呼び出したときに返してくる値の事です。下から2行目の

return 0;

 にかかってくる物で、ここでmain関数は呼び出し元に整数の0を返しています。
 return は英語で「帰る」とか「返す」と言う意味ですね。
 また、main関数は引数に void を指定していますが、void とは何も無いと言う意味です。すなわち、main関数には何も引数を渡さないと言う意味です。
 学習が進むと、main関数に引数を渡す方法も勉強しますので、今はvoidを指定して下さい。

 そして先に解説した printf 関数ですが、「Hello C World!」の最後に「\n」と言う文字列が記述されています。これは「ここで改行しなさい」と言う命令だと思っておいて下さい。これも先の章で詳しく解説します。
 ここで実験をしてみましょう。下のプログラムを記述して、最初のプログラムと同じ方法で実行してみて下さい。
(ファイル名は同じにして下さい)

#include <stdio.h>

int main(void)
[
  printf(“Hello C World!”);
  return 0;
}

 どうですか? 違いはわかるでしょうか?

 次回は「変数」と「型」について勉強していきます。

MacではじめるC言語 第0回 Ver.0.5

☆まずは下準備
 本日から不定期でMacを使ってC言語のプログラムを勉強していきます。
 但し、便宜上Macを使ったと言うだけで、WindowsマシンやLinuxマシンでも実行可能な内容にしていくつもりです。
 Mac以外のプラットフォームで勉強される方は、それぞれに対応した開発環境をご自分で準備して下さい。
 取り敢えず手元に必要な物は、Macの入門書(基本操作がわかるもの)のみです。入門書に書かれているような事柄は、敢えて解説を致しませんので、各自で確認しておいて下さい。

 さて、まず下準備としてプログラムのコードを書くためのエディタをインストールしましょう。個人個人使いやすいエディタは色々と有ると思うので、お好みの物をインストールして下さい。
 豚はMicrosoft社製の「VisualStudio.Code」を使っていきます。
https://code.visualstudio.com よりダウンロード出来ますので、宜しければ使ってみて下さい。Windowsでの代表的な開発環境「VisualStudio」を名乗っているだけ有って、かなり本格的なエディタとなっています。勿論無料で使用できるので、安心して下さい。

☆取り敢えず書いてみる
 今回は「macc」と言うフォルダを作成して、プログラムや実行ファイルを格納することにします。
 ターミナルを立ち上げて、
$mkdir macc
 と入力し、「maccフォルダ」を作成して下さい。そして、
$cd ./macc
 と入力して、カレントフォルダをmaccフォルダにします。これで下準備は終わりました。早速プログラムを書いて行きましょう。任意のテキストエディタを起動して、次のコードを書いて、「test.cpp」と言う名前で保存して下さい。
(コピーアンドペーストはしないで下さい。エラーになります。)

test.cpp

#include <stdio.h>
int main(void)
{
  printf(“Hello C World!\n”);
  return 0;
}

 \(バックスラッシュ)は半角で入力して下さい。入力方法は[option]+[¥]です。
 もしWindowsマシンで動かすのなら\は¥マークに置き換えて下さい。
 入力・保存出来ましたら、

$C++ test.cpp

と入力してみて下さい。 入力間違いがあればエラーメッセージが表示されます。何も表示されなかったら、カレントフォルダに a.out と言うファイルが作られているはずです。
 難しいことは考えずに、この a.out と言うファイル(実行ファイル)を実行してみましょう。

$./a.out
Hello C World!
$

と表示されれば成功です。

 今回は用語の解説やコードの説明などは一切行わないで、取り敢えずC言語での一番簡単なプログラムを書いて、実行してみました。
 次回以降、今回行った作業の詳しい解説とプログラムの中身について見ていくことにします。

2018年はここまで。

 暫く更新していませんでしたが、一応ドラクエ移植プロジェクトは「スムーズスクロールの改善」「ジョイパッド対応」「自動的にウィンドウが表示される」所まで作成しました。しかし、これはゲームの構造やモジュール分けを全く考えないで、ただ書いてみただけの落書きコードです。2019年はゲームの構造を考えて、必要モジュールを徹底的に洗い出し、それらを一つ一つ丁寧に作っていく事を目標に頑張りたいと思います。

 未だ鬱病は回復してくれる気配は無く、鬱の波に呑まれて身動きが取れないときも多いと思いますが、自分の第一の仕事は療養、第二の仕事は弟の介護、第三の仕事がスキルアップを兼ねたドラクエ移植プロジェクトと優先順位を付けて、決して無理をせずにコツコツとやっていこうと思います。

 来年はUnityも触ってみようかとも思いましたが、あれこれ手を出すと収拾が付かなくなりそうなので、軽く入門書を読んでみて自分の手に負えそうだったら少し触ってみる程度にしようと思います。どのみちスマホゲームをすぐに作りたいわけではないので、その知識はこの際気にしないで、あくまでPCに特化するつもりでいます。まぁ、触る余裕があればの話ですが。

 それでは、今年もありがとうございました。来年も宜しくお願い致します。

 午前11時59分

根本的な違い。

 ファミコン版ドラクエⅢと豚が作っているドラクエⅢ(偽)とは、根本的な違いがあります。FC版は1キャラクタが16ドット四方で作成されていますが、豚の偽ドラクエⅢは32ドット四方になっています。これはPCが高解像度のために、16ドット四方にすると解像度を落としても小さすぎるからです。想定では800×600ドットの解像度でプレイできるようにしています。更に解像度を落として640×480ドットにしても良いのですが、今からドット数を変えるとなると、今まで作ってきたマップチップが全て無駄になってしまうので、作り直しが面倒です。まぁ今ならまだ間に合うので、検討してみても良いのですが。その場合、キャラクタエディタとマップエディタにも少し手を入れる必要があります。

 マップチップはレトロフリークでスキャンしたpng形式の画像を相当倍拡大して、キャラクタエディタで手入力していくという形式をとります。非常に面倒なんですが、最初に述べたとおりマップチップのサイズが違っているので、修正しながら作成していくことになります。また色数も256色使えるので、同じ色合いを出すのが難しいです。もっと厳密にFC版を分析して的確に色を抽出出来れば良いのですが、そこまでやるには時間も手間もかかるのでやりません。

 FC版のマルチウィンドウのウィンドウは、やはりマップチップと同じ方法で作成されており、ウィンドウを開くときに重なる背景部分を一時退避させ、閉じるときに元に戻すと言う至ってオーソドックスな方法がとられています。これはDXライブラリの関数で対応出来るので、そんなに難しいものではありません。計算さえしっかり出来れば、2重ループ一つで出来てしまいます。

 後プレイしていて気が付いたのは、各種エフェクトです。旅の扉に入ったときや乾きの壺を使った時の浅瀬が陸に変わる演出。その他にもまだ多数有ると思います。それらも洗い出していく必要があり、中々大変な作業になりそうです。世界の設計図を制作する堀井雄二さんは勿論大変ですが、出来上がった世界から設計図を起こしていくのも大変な作業になりそうです。早くも投げ出したい気持ちで一杯ですが、焦らずコツコツと制作していこうと思います。

午前8時30分