ゆるいにっき
2048のクローンゲームを作るまで
投稿日: 2019-07-29
こんにちわ。PCN愛媛西予のプログラム担当YUNGLE(うつのみやかずや)です。
普段はWEBプログラマとしてサーバー上で動くアプリを作っているので、Ichigojam BASICの制限のきつさが新鮮だし昔のパソコンを触っているみたいで面白く感じてきています。
それでゲームを作ってみることにしましたので、作成までにどんなことをしたか書きたいと思います。
プログラムしやすい環境を作ってみる
大事なのはやりやすい環境を作ることですよね。やりながらでも少しづつ整えて、面倒だと思うことが続けばとても完成まで続けることはできません。環境を作ることがとっても大切。
IchigojamにPC接続するのはかなり良さそうに思えました。Ichigojamに直接キーボードとミニディスプレイをつなげると少なくとも2つはコンセントを使うし接続ケーブルが多くてセッティングするのが面倒になってしまいます。それでPCとつなげてPCから電源とキーボードを取れるようにしてみました。
イチゴジャムレシピのこちらのページを参考にPCと接続しました。
ノートパソコン(MacBookPro)のUSBモジュールにamazonで買ったUSBシリアルコンバータを指しています。これにジャンプワイヤとかいうのを使ってIchigojamと接続しました。それぞれ注文するのが大変ですが、値段は数百円程度ですしこういうことも初めてなので面白いですね。
PCと繋いでケーブルが減る
USBの電源を取ることができるので、コンセントが一つ節約できました!
さらにキーボードも不要になります。
私はMacを使っているので操作ツールにIJUtilitiesというのをインストールしました。プログラムソースをPCとIchigojamの間でインポート、エクスポートを行うのが目的です。セーブスロット3つの制限を越えてテキストファイルでPCに保存できますので、思う存分開発できるというものです。
また、入力と出力もPCの方で取れます。キーボードだけかと思ったらIJUtilitiesでディスプレイを表示することもできました。接続ケーブルが減るととても気持ちいいですね。ただPCで表示されるIchigojam画面は擬似的なものですしキーボードのファンクションキーが使えなかったりもありましたので全くいらなくなるわけではないです。
IchigojamBASICを1.4ベータにアップデート
ついでファームウェアのバージョンアップもしました。1.4ベータに。1.3からは行番号を再割り振りしてくれるRENUMが賢くなってるので絶対1.3にはした方がいいと思います。
いよいよプログラムできる準備が整ってきました!
ここでIchigoJam web の存在に気づく
WEBブラウザでIchigojamBASIC動かせるんですね!
・・・なんだかんだで、ほとんどの開発はここでやってしまいました。
打ち込んだソースをIchigojamに取り込むのにPC接続環境は必要になる(手で打ち込むのは大変でしょう?)んですが、シンプルなプログラムを書くのにシンプルなエディタと実行環境があるのはとても良いですね。
作ったゲームの公開
いくつかアイデアはあったのですが、完成させたかったので好きなゲームのクローンを作ることにしました。2048というゲームです。1日徹夜して、でもほとんどのソースは目が覚めた後1時間で書き上げてようやく動くものができました。
作ったゲームはプログラム投稿サイトKidspod;に公開してみました。
またIchigojam webではソースが入力済みの画面がありますので、そちらを開いて「RUN」と入力してリターンキーを押せばゲームが始まります。開発環境と全く同じなのでソースの改造などもできます。実機より少し動作が重いですが、ご覧ください。
Ichigojam webのイチゴジャム2048
作った感想
Ichigojamはグラフィックも白黒で演算も遅いし、とにかく制限があるんですが、だからこそ、シンプルさを追求できるのがすごいです。今回作ったゲームはちょっと複雑だったかもしれません。ソースコードを1画面で収めたかったのですがオーバーしてしまいました。
Ichigojamなら最後までゲームを作ったことがなくても完成の喜びはすぐそこにあります。そんな経験を積み重ねていっていつかオリジナル版2048のようなすごいゲームを作ってみたくなりました。
100 '2048 for ichigojam
110 'CLS:CLV:LET[0],8,4,2:X=3:Y=3:A=X*Y-1
120 CLS:VIDEO3:CLV:X=3:Y=3:A=X*Y-1
130 FOR I=0 TO 8
140 POKE #700+I,PEEK(#32*8+I)^#FF
150 NEXT
160 P=RND(A):[P]=2
170 FOR I=0 TO A
180 LC I%X*5,I/Y*Y+2
190 IF I=P ?CHR$(#E0); ELSE ?[I];
200 ? " "
210 NEXT
220 LC0,0:?"SCORE ";S
230 K=INKEY():IF K=0 GOTO230
240 CLK:FOR I=0 TO A
250 IF I%X=0 N=I
260 M=(K=28)*I+(K=29)*(A+1+~I)+(K=30)*(I%Y*Y+I/X)+(K=31)*(A+1+~(I%X*X+I/Y))
270 FOR L=I TO N STEP -1
280 J=(K=28)*L+(K=29)*(A+1+~L)+(K=30)*(L%X*X+L/Y)+(K=31)*(A+1+~(L%X*X+L/Y))
290 IF J=M GOTO 320
300 IF [J]=0 [J]=[M]:[M]=0
310 IF [J]=[M] [J]=[J]<<1:[M]=0:Z=0:S=S+[J]
320 NEXT:N=I
330 NEXT
340 I=0
350 IF [I]=0 GOTO 380
360 I=I+1:IF I<=A GOTO 350
370 LC0,Y*Y:?"GAME OVER":END
380 P=RND(A+1):IF [P]>0 GOTO 380 ELSE [P]=2
390 GOTO 170