高校生の子供が、情報の授業でプログラミングの課題が出たと言っていた。
プログラミング言語はJavaScript。環境はGoogle ChromeインストールしたWebMakerという拡張機能。WebMakerはコードペインに書いたHTML/CSS/JavaScriptの内容が即座にプレビューペインに反映されるというもの。プログラミング環境としてみると、コード補完どころかシンタックスエラーですら表示されがないので、かなり使いづらい。Consoleウインドウにエラーメッセージは表示されるが、どの行で起きたエラーなのか表示されないので、単純なシンタックスエラーでも場所の特定のためにはひたすらソースを眺めるしかなくて面倒。
とりあえず、Atomやサクラエディタを使って、子供が作りたいと言っていた機能をプログラムできることは確認した。が、これを子供に渡しては意味がないので、別の言語に書き直したものを見せることにした。
CじゃJavaScriptとどこが違うのかわからなくなってしまうので(いや、違いはわかるけど)、ここは昔馴染んだ Pascal にしてみることにした。懐かしいなあ。30年ぶりだよ。
とりあえずJavaScriptで書いたものをPascalに直しつつ、動かすための環境を探してみた。FreePascal + Lazarusが手頃そう。なんと今でも継続して開発されているし、マルチプラットフォームだし、規模も小さい。
MacにインストールしてLazarusを起動してみると、Windows 3.1の頃に少し触ったことがあるDelphi風味のあるIDEが立ち上がってきた。自分が一番親しんだのはCP/M版TurboPascal 3.0と、MS-DOS版TurboPascal 5.xあたり。
Lazarusで一番最小限な規模のコンソールアプリケーションを選んでビルドしてみた。400 KBほどの実行ファイルができた。ターミナルで実行すると、ちゃんと動いてくれる。面白い。
ということで、うちの子供のためにPascalのソースコードを晒しておく。
PROGRAM JANKEN(INPUT, OUTPUT);
CONST
Hands: array[0..2] of String = ('Rock', 'Scissors', 'Paper');
OneTurn: array[0..2] of String = ('A tie', 'You win', 'PC win');
VAR
WinCount: array[0..2] of Integer;
MyHand, PCHand, Winner: Integer;
PrmptStrBase, PrmptStr: String;
AbortFlg: Boolean;
PROCEDURE InitializeVars();
VAR
i: Integer;
BEGIN
FOR i:=0 TO 2 DO BEGIN
WinCount[i] := 0;
END;
MyHand := 0;
PCHand := 0;
Winner := 0;
PrmptStrBase := '';
PrmptStr := '';
AbortFlg := False;
END;
BEGIN
InitializeVars();
PrmptStrBase := 'Input your choice (' + Hands[0] + ':0, ' + Hands[1] + ':1, ' + Hands[2] + ':2, to abort 3)';
PrmptStr := PrmptStrBase;
REPEAT
Write(PrmptStr);
ReadLn(MyHand);
IF (MyHand <0) Or (MyHand > 2) THEN
BEGIN
AbortFlg := True;
Break;
END;
PCHand := Random(3);
Winner := PCHand - MyHand;
IF (Winner < 0) THEN Winner := Winner + 3;
WinCount[Winner] := WinCount[Winner] + 1;
PrmptStr := Hands[MyHand] + 'x' + Hands[PCHand] + '->' + OneTurn[Winner];
WriteLn(PrmptStr);
PrmptStr := PrmptStr + ' ' + PrmptStrBase;
UNTIL (WinCount[1] = 2) Or (WinCount[2] = 2);
IF (AbortFlg) THEN
WriteLn('Abort.')
ELSE
BEGIN
WriteLn;
IF WinCount[1] = 2 THEN Write('You')
ELSE Write ('PC');
WriteLn(' win.');
END;
END.
その後、うちの子は別のネタでプログラムを作って提出した。が、コーディング:子供、デバッグ:お父さんとなったのであった。
最近のコメント