* 初心者向けプログラミング体験ワークショップ#2
-(by [[K]], 2021.12.02)

** (0)
-今回紹介するのは、「坂道を走ってきれいな石を拾い集めるゲーム」です。20行で書けます。

-このページは[[「初心者向けプログラミング体験ワークショップ」>a21_edu01]]の教材のうちの一つです。

** (1) ストーリー & ルール
-ぼくはきれいな石をひろって集めるのが大好きです。
-このあいだ、しんせきのおじさんにきれいな石がたくさんある場所を教えてもらいました。
-そこはちょっと坂道になっていて、一度走り出したら止まれなくなってしまいました。しかもぬかるんでいるところや、つまづきそうな石があるところもあるので、そこはよけなければいけません。すごくたいへんです。
-ぼくはとりあえず100個くらいはひろいたいと思っています。いっぱいひろえたら仲良しのお友達にもあげようと思います。・・・どうかこんなぼくの夢をかなえてください!
----
| http://k.osask.jp/files/pic20211202a.png |
-画面は右から左に流れていきます。黄色で顔があるのが「ぼく」です。カーソルキーで上下左右に動かせます。
-白い丸が「きれいな石」です。とてもたくさんあります。しかし足がとまらないので、ほとんどを見のがすことになります。
-赤いバツは通ってはいけない場所を表しています。ここはどうにかしてよけてください。
-なお、100個ひろえてもゲームクリアとかにはならず、そのままゲームは続きますので、力つきるまでひろい続けましょう。
-ゲームをやめたくなったら、いつでも ESCキー を押せば終了できます。

** (2-1) HLX-BASICでのプログラム(20行)
-プログラム中に日本語で説明を書き込んでいますが、その部分は入力しないでください。矢印も入力しないでください。
 
 CANVAS 16,16,"RUN";                    ← ゲーム画面を作ります。よこ16マス、たて16マスの大きさです。
 FOR;                                   ← 一番下のNEXTまでの範囲を繰り返します。
   X=2; Y=8; S=0;                       ← XとYは自分の場所で、Sは点数を表します。
   CLS@ 0;                              ← ゲーム画面を黒(色番号0)で塗りつぶして全部消します。
   FOR;                                 ← 下から4行目のNEXTまでの範囲を繰り返します。
     SCROLL@ 15,15,1,1,-1,0,1;          ← 画面を1マス分だけスクロールします。
     PRINT@ 1,0,7,0,"SCORE:%d",S;       ← 画面の上の場所(1,0)に色(7,0)で点数を書きます。ここのdだけは小文字なので注意。
     CHAR@ 15,RND(15)+1,2,7,0;          ← 画面の場所(15,RND(15)+1)に、白丸(番号2)を色(7,0)でかきます。
     CHAR@ 15,RND(15)+1,3,4,0;          ← 画面の場所(15,RND(15)+1)に、バツ(番号3)を色(4,0)でかきます。
     IF GETCH@(X,Y)==2 THEN S++; FI;    ← もし自分の場所(X,Y)のキャラクタが白丸(番号2)だったら、点数を1増やします。
     IF GETCH@(X,Y)==3 BREAK;           ← もし自分の場所(X,Y)のキャラクタがバツ(番号3)だったら、繰り返しをやめます。
     CHAR@ X,Y,6,6,0;                   ← 自分の場所(X,Y)に顔マーク(番号6)を色(6,0)でかきます。
     I=INKEY@WRC(200);                  ← 200ミリ秒(0.2秒のこと)だけ待ってキー入力がないか調べます。
     CHAR@ X,Y,0,0,0;                   ← 自分の場所(X,Y)に空白(番号0)を色(0,0)書きます。つまり自分が消えます(自分は移動するので消さないといけないのです)。
     X=MINMAX(X+XMOVE(I),1,14);         ← キー入力内容におうじて、Xを増やしたり減らしたりしますが、1~14の範囲からは出ないようにします。
     Y=MINMAX(Y+YMOVE(I),1,15);         ← キー入力内容におうじて、Yを増やしたり減らしたりしますが、1~15の範囲からは出ないようにします。
   NEXT;                                ← 上から5行目のFORの場所に戻って処理を続けます。
   CHAR@ X,Y,6,5,0;                     ← 繰り返しをやめるとここに来ます。自分の場所(X,Y)に顔マーク(番号6)を色(5,0)でかきます。
   WAITKEY@ 10;                         ← Enterキー(キー番号10)が押されるまで待ちます。
 NEXT;                                  ← 上から2行目のFORの場所に戻って処理を続けます。
 
-ほそく説明:
--色番号の表
|0:黒|1:青|2:みどり|3:水色|4:赤|5:むらさき|6:黄色|7:白|
--色を2つの数字で表すときは、1つ目の数がキャラクターの色で、2つ目の数が背景の色です。
--キャラクターの表示位置は、2つの数字で表します。1つ目が左から数えて何番目のマスか(0番から数えます)、2つ目が上から数えて何番目のマスか(0番から数えます)。
---このゲームでは16x16マスを用意しているので、0,0~15,15までが使えます。
--キャラクター番号の表
|0:空白|1:四角|2:丸|3:バツ|4:よこぼう|5:たてぼう|6:顔マーク|7:ひしがた|8:ななめせん|9:ななめせん|
--RND(15)について: RNDは乱数(らんすう)の命令で、RND(15)は0~14までのどれかの数を適当に決める命令です。

** (2-2) HLX-BASICのプログラムを実行するための方法(大人の方へ)
-もしWindowsでHLX-BASICを使うなら、話は簡単です!
-[[a21_hlx003]]のページへ行って、 hlx003b.zip をダウンロードして、中にある hlx_x86_win.exe を入手してください。それだけあれば十分で他のファイルは捨ててしまってもかまいません。
-[[a21_hlx003]]のページへ行って、 hlx003c.zip をダウンロードして、中にある hlx_x86_win.exe を入手してください。それだけあれば十分で他のファイルは捨ててしまってもかまいません。
-このhlx_x86_win.exeを適当なフィルだ内において、同じフォルダの中にrun.txtというテキストファイルを作ります。このテキストファイルをお子さんに入力させてあげてください。
--入力の際にはまずテキストエディタを開き(メモ帳でもいいですが、私はTeraPadが好きです)、キーボードのCapsLockをオンにした状態で、大人がテキストを一文字ずつ読んであげて、お子さんがキーを探して入力する、というスタイルがおすすめです。大人は1とI、0とOの入力間違いが起こりやすいので、特にそこを注意してみてあげます。
--キーを見つけられないときは、ほらここにあるよと教えてあげますが、それでもキーボードのキーを指さすだけにして、実際の入力はお子さんにやらせてあげてください。入力ミスがあった時の訂正も、「矢印キーを使ってカーソルをここに動かして、そこでDelキーを押して。」みたいに操作の指示はしても、実際の操作はお子さんにやらせてみてください。
--そうすると、「これは全部自分がやった。」という満足感が得られるはずです。
--(何回もやって慣れてきたら、自分でプログラムを読んで入力できるようになると思います。)
-入力が終わったら、先ほどのhlx_x86_win.exeを起動して、そこで
 hlx>run run.txt
-と入力してください。入力ミスがなければゲームが始まるはずです。
-ミスがあった場合は、エラーメッセージを見ながら間違いを探して直してください(エラーメッセージはかなり不親切なので、大人の方の手伝いが不可欠です。よろしくお願いします。お手数をおかけしてすみません)。
-なおゲーム中のキー操作は、ゲーム画面が入力アクティブになっていないと有効ではありませんので、あれ?操作が効かないなと思ったら、ゲーム画面が一番上のウィンドウになっているかどうかをまず確認してください。

-Windows以外のOSの方は、[[a21_hlx003]]のページを見て、ソースコードからhlxをビルドしなければいけません。そこがクリアできれば、あとは同じようにできるはずです。

** (2-3) 改造のポイント
-このゲームは自分で入力したのですから、自分で改造することだってできます。ただ遊ぶだけじゃなくて改造も楽しんでほしいです。

-もしこのゲームが簡単で、すぐに100点をとれるのなら、少しむずかしくしましょう。一番簡単な改造はゲームのスピードを速くすることです。
-速さを変えるには、200ミリ秒待っているところの数字を変えます。さて速くするには数字を100にすればいいでしょうか?それとも300にすればいいでしょうか?(正解は自分でやって確かめてみてね!)

-もしこのゲームがむずかしすぎたなら、やっぱりまずはゲームの速さを変えるのが簡単です。それは上の説明を参考にしてみてください。

-さてそれでもむずかしければ・・・じゃあ、他の改造を考えましょう。たとえば、点数を1点ずつではなく、3点ずつ増やすのはどうですか?それは S++; のところを S+=3; にすればできますよ。
-別の改造としては、バツが出てくる場所を狭くしましょう。そうすれば画面の下の方は安全になります。バツの RND(15) を RND(5) に変えてみてください。
-もっとすごい改造としては・・・じゃあ「ぼく」を無敵にしてみましょう。 IF GETCH@(X,Y)==3 BREAK; の行を消してしまいます。これでバツかどうか調べなくなるので、無敵になるのです。

-これはゲームの難しさには関係ないですが、キャラクターやキャラクターの色を変えるのも面白いでしょう。興味があったらチャレンジしてみてください。

** (3-1) C言語でのプログラム(aclライブラリ利用)(25行)
-内容的に、(2-1)とほぼ一対一で対応しているので、細かい説明は省略します。
 
 #include <acl.c>
 
 void aMain()
 {
   AWindow *w = aOpenWinEx(16, 16, "driving", 0);
   for (;;) {
     int x = 2, y = 8, s = 0, i;
     aCls(w, 0);
     for (;;) {
       aScroll(w, 15, 15, 1, 1, -1, 0, 1, 0, 0, 0);
       aGrPrintf(w, 1, 0, 7, 0, "score: %d", s);
       aEch(w, 15, aRnd(15) + 1, 2, 7, 0);
       aEch(w, 15, aRnd(15) + 1, 3, 4, 0);
       if (aGetEch(w, x, y) == 2) s++;
       if (aGetEch(w, x, y) == 3) break;
       aEch(w, x, y, 6, 6, 0);
       i = aInkey_waitRC(w, 200);
       aEch(w, x, y, 0, 0, 0);
       x = aSaturateInt(aMoveDx(i) + x, 1, 14);
       y = aSaturateInt(aMoveDy(i) + y, 1, 15);
     }
     aEch(w, x, y, 6, 5, 0);
     aWaitKey(w, AKEY_ENTER);
   }
 }
 
** (3-2) C言語のプログラムを実行するための方法(大人の方へ)
-このプログラムは、C言語でありながらHLXのサポート範囲内の機能だけで書かれているので、HLXで実行することができます。この場合、C言語やaclライブラリのインストールは不要です(もしWindows以外で、まずhlx自身のビルドからやらなければいけない場合は、Cコンパイラやaclライブラリのインストールが必要です)。
-使い方もほとんど同じで、run.cを作って、
 hlx>run run.c
-とするだけでOKです。

-もし、HLXを使わずに普通のCコンパイラとaclライブラリの組み合わせでやる場合は、[[a21_acl01]]のページを見てaclライブラリを使えるようにしたうえで、上記のrun.cをビルドしてください。

-そのほかの操作方法や改造方法などは、(2-2)、(2-3)と同等なのでここでは省略します。

* こめんと欄
#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS