【POKEでキャラ作成】みんなでワイワイ『視力検査ゲーム』 for IchigoJam / めがねのまち 鯖江
目の健康にも力を入れて発信しています。
IchigoJamでも視力検査ゲームをつくってみました。
みんなでワイワイ測りましょう!
【プログラム】
5 CLV:CLP:V=7
6 COPY 233*8,232*8,8*4
10 POKE 232*8,0
11 POKE 233*8+7,0
12 POKE 234*8+2,67,1,1,67
13 POKE 235*8+2,194,128,128,194
20 CLS:VIDEO V
30 C=232+RND(4)
40 Z=2*(V=1)+4*(V=3)+8*(V=5)+16*(V=7)
50 X=31/Z:Y=23/Z
60 LC X,Y:?CHR$(C)
70 K=INKEY():IF K=0 WAIT10:CONT
80 IF K=10&&V>1 V=V-2:M=0
90 IF M=2 VIDEO3:?"シリョク:";S:END
100 IF K=8 M=M+1:GOTO20
110 S=S+1
120 GOTO20
<遊び方>
2人でプレイヤー側と審判側に分かれて遊びます。
審判は、表示された方向とプレイヤーの言った方向が合っていればEnter、間違っていればBackSpaceを押します。
3回連続で間違うとゲームオーバー。スコア(視力)が表示されます。
<解説>
V:画面サイズ C:方向を示す文字のコード
Z:表示する位置を画面サイズによって調整する
X:方向を示す文字のヨコ座標 Y:方向を示す文字のタテ座標
M:ミスした回数 S:スコア(視力)
20 CLS:VIDEO V VIDEO7からスタート
30 C=232+RND(4) ランダムに↑↓←→方向の文字コードを決定
40 Z=2*(V=1)+4*(V=3)+8*(V=5)+16*(V=7) 画面サイズによって中心の座標を補正
50 X=31/Z:Y=23/Z 方向文字の位置の決定
60 LC X,Y:?CHR$(C) 方向文字の表示
70 K=INKEY():IF K=0 WAIT10:CONT 何かキーを押すまで同じ行繰り返し
80 IF K=10&&V>1 V=V-2:M=0 Enterキーを押すと、画面サイズが半分になる
90 IF M=2 VIDEO3:?"シリョク:";S:END 同じ大きさで3回ミスをすると終了
100 IF K=8 M=M+1:GOTO20 BackSpaceキーを押すとミスカウントを増やし、同じ大きさで再表示
110 S=S+1 スコア増加
120 GOTO20
<補足>
6行目で文字コード232(○)を3つコピーして用意します。
1文字あたり8つのアドレスで構成されているので、8*3の32個分にコピーします。
10〜13行目でコピーした○文字を、↑↓←→方向に穴を空けていきます。
例えば、10行目だと○文字の一番上の部分(アドレス:232*8)を0に書き換えることで、○の上方向に穴の開いた文字になります。
※文字コード224〜255の文字はPCGといって、POKEで書き換え可能な文字です。
【文字コード232の初期状態】
POKE 232*8,0 を実行すると
↑方向の文字ができました!
?CHR$(232) を実行して書き換わっているか確認しましょう。
あとは同じように、
11行目で↓(233番)、12行目で←(234番)、13行目で→(235番)の方向文字を作成しています!
<改造方法>
さらに4つの方向文字、右上、左上、右下、左下を追加していきます。
下のプログラムを追加すればOKです。
6 COPY 233*8,232*8,8*7
14 POKE 236*8+1,96,193
15 POKE 237*8+1,6,131
16 POKE 238*8+5,193,96
17 POKE 239*8+5,131,6
30 C=232+RND(8)
6 COPY 233*8,232*8,8*7 ○の文字を7個分コピー
14 POKE 236*8+1,96,193 右上 方向の文字作成
15 POKE 237*8+1,6,131 左上 方向の文字作成
16 POKE 238*8+5,193,96 右下 方向の文字作成
17 POKE 239*8+5,131,6 左下 方向の文字作成
30 C=232+RND(8) 8つの方向からランダムに1つ決定
合計で8個の文字(232〜239番)をつくりましたね。
前方向ということで○をそのまま使うのもありかも?w
これを期にPOKEによるキャラクターづくりをマスターしましょう!
CC BY shoichi1031da / @shoichi1031da
【人気ゲーム】『プロ飛行士をめざせ!!』for IchigoJam / 『プログラミング教育マスター』がドランクドラゴンさんの番組で紹介
お久しぶりです、Hana道場師範です。
僕も作成に協力させていただいた『プログラミング教育マスター』がドランクドラゴンさんの番組で紹介されました。
『プログラミング教育マスター』を手掛けた株式会社リオの浅田さんのFacebookでこんな嬉しい投稿を!
僕のブログIchigoJamで画像保存?お絵かきゲーム&イラスト保存プログラムを参考に、ねばーる君をつくってくれました。
活用してくれる方がいるということで、ブログを再開しようと思います。
Hana道場で人気のアクションゲーム『プロ飛行士をめざせ』
改造の余地も大きくとてもおすすめのプログラムです。
こちらの本でも収録されています。
『アニメーションとゲームをつくりながら学ぶ Hana道場式プログラミング』by 師範
【プログラム】
10 FOR X=10 TO 18 STEP4
20 Z=RND(19)+2:IF Z=A CONT
30 FOR Y=0 TO 22
40 LC X,Y:?CHR$(1-(Y=Z))
50 NEXT:A=Z
60 NEXT
70 LC W,Z:?"🚁"
80 WAIT3
90 LC W,Z:?" "
100 K=INKEY():IF K>28&&K<32 C=K
110 C=C-(Z>21)+(Z<1)
120 W=W+(C=29)
130 Z=Z+(C=31)-(C=30)
140 IF SCR(W,Z)!=1 GOTO70
<操作方法>
↑↓→で操作します。
壁にぶつかったら終了です。壁を全てくぐり抜けたらクリアです。
<解説>
X:壁のヨコ座標 Y:壁のタテ座標 Z:壁穴のタテ座標 A:一つ前の壁穴のタテ座標
W:ヘリのヨコ座標 Z:ヘリのタテ座標(変数のリユース)
K:入力したキーのコード C:ヘリの自動移動用
10 FOR X=10 TO 18 STEP4 壁はヨコ座標10,14,18の3箇所に表示
20 Z=RND(19)+2:IF Z=A CONT 穴をランダムに決定。同じ位置ならやり直し
30 FOR Y=0 TO 22 壁はタテ座標0〜22に表示
40 LC X,Y:?CHR$(1-(Y=Z)) 壁(文字コード1番)と穴(文字コード0番)を表示
50 NEXT:A=Z 一つ前の壁穴のタテ座標を変数Aに記憶させる
60 NEXT
70 LC W,Z:?"🚁" ヨコW,タテZの位置にヘリを表示
80 WAIT3
90 LC W,Z:?" " ヘリを消す
100 K=INKEY():IF K>28&&K<32 C=K ←↓↑→どれかを押したらCにキーコードを代入
110 C=C-(Z>21)+(Z<1) ヘリの上下の移動制限
120 W=W+(C=29) →方向の自動移動
130 Z=Z+(C=31)-(C=30) ↑↓方向の自動移動
140 IF SCR(W,Z)!=1 GOTO70 もし 壁(1番)に当たっていなければ 70行目へ
<改造方法>
- 穴を広げる
40 LC X,Y:?CHR$(1-(Y=Z)-(Y=Z+1))
- クラッシュ演出をつける
150 LC W,Z:?CHR$(244):BEEP50,80
- クリアしたら次のステージへ
135 IF W=25 W=0:C=0:GOTO10
- 壁を増やす
10 FOR X=10 TO
- ステージ数を追加
- ステージをクリアする毎にスピードアップ
- 最終ステージ(第5ステージ)の演出
4〜7は自分でやってみて下さい!
『アニメーションとゲームをつくりながら学ぶ Hana道場式プログラミング』by 師範
に5〜7のプログラムが載っていますので、知りたい方はぜひお買い求めください^^
IF文や文字コードなども学ぶことができます!
CC BY shoichi1031da / @shoichi1031da
【VRAM書き換え】たった4行の『○○をさがせ!!ゲーム』for IchigoJam
たった4行のお手軽ゲームです。
一つだけ違うキャラを見つけたら指を指します。
一つの画面でみんなでやると楽しいです。
【プログラム】
10 POKE#900,249
20 COPY#901,#900,32*24-1
30 POKE RND(32*24)+#900,250
40 CONT
【改造プログラム】
5 S=0:C=250:CLT
10 POKE#900,249
20 COPY#901,#900,32*24-1
30 POKE RND(32*24)+#900,C
40 X=15:Y=12
50 LCX,Y,1
60 WAIT6
70 X=X-BTN(28)+BTN(29)
80 Y=Y-BTN(30)+BTN(31)
90 IF BTN(32)*SCR(X,Y)=C S=S+1:GOTO10
100 IF S<3 GOTO50
110 CLK
120 LC12,12:?"タイム ";TICK()/60
カーソルを違うキャラに合わせてスペースを押そう。
3回当てるまでのタイムを競います。
<改造プログラムの解説>
5 S=0:C=250:CLT 文字コード250のキャラを見つけるゲーム
10 POKE#900,249 画面左上(#900)に文字コード249のキャラを表示
20 COPY#901,#900,32*24-1 アドレス#900にある文字を画面いっぱいにコピー
30 POKE RND(32*24)+#900,C 画面上のランダムな位置に250のキャラを表示
40 X=15:Y=12 カーソルの座標
50 LCX,Y,1 ヨコX,タテYの位置にカーソルを表示
60 WAIT6
70 X=X-BTN(28)+BTN(29) カーソルの←→移動
80 Y=Y-BTN(30)+BTN(31) カーソルの↑↓移動
90 IF BTN(32)*SCR(X,Y)=C S=S+1:GOTO10 もし 250番のキャラの位置でスペースを押したら スコアを1増やし、再表示
100 IF S<3 GOTO50 スコアが3未満ならゲーム続行
110 CLK
120 LC12,12:?"タイム ";TICK()/60 3回見つけるまでのタイムを表示(終了)
CC BY shoichi1031da / @shoichi1031da
【メモリの読み書きコピー】スネークゲーム風プログラム for IchigoJam
実行画面はYouTubeからご覧ください。
いちごを食べるたびに猫ちゃんが増殖していきます。
壁に当たるか、自分の体に当たるとゲームオーバーです。
プログラム自体は短いですが、メモリの読み書きコピーと配列を組み合わせているため難易度は高めの4.5です(5でもいいかも?)。
【プログラム】
10 CLS:CLV:K=28:X=#A4F:S=1
20 POKE#900,1:POKE#91F,1
30 COPY#920,#900,32*21
40 COPY#901,#900,31
50 COPY#BA1,#BA0,31
60 R=RND(32*22)+#900:IF PEEK(R) CONT ELSE POKER,255
70 POKEX,236
80 WAIT3
90 POKE[B],0:[B]=X:B=(B+1)%S
100 A=INKEY():IF A K=A
110 X=X-(K=28)+(K=29)-32*(K=30)+32*(K=31)
120 IF PEEK(X)=255 S=S+1:GOTO60
130 LC0,22:?"Score:";S-1;" ";
140 IF PEEK(X)=0 GOTO70
【コメントつきプログラム】
// Xは自キャラ(猫)の座標。VRAMのアドレス
10 CLS:CLV:K=28:X=#A4F:S=1
// 壁表示プログラム(ver1.4以上ならDRAWコマンドでも可)
20 POKE#900,1:POKE#91F,1
30 COPY#920,#900,32*21
40 COPY#901,#900,31
50 COPY#BA1,#BA0,31
// いちごの出現位置をランダムに決定。いちごの出現位置になにかあればやりなおし
60 R=RND(32*22)+#900:IF PEEK(R) CONT ELSE POKER,255
// 猫を表示
70 POKEX,236
80 WAIT3
//配列[B]に先頭猫の位置を代入。猫の数分配列を使い回す(配列節約のため)
90 POKE[B],0:[B]=X:B=(B+1)%S
// 一度押した方向へ進み続けるために変数Aを用意
100 A=INKEY():IF A K=A
// 猫の位置を押したキーによって決定
110 X=X-(K=28)+(K=29)-32*(K=30)+32*(K=31)
// いちごをとったらスコアが増える
120 IF PEEK(X)=255 S=S+1:GOTO60
130 LC0,22:?"Score:";S-1;" ";
// 当たり判定。当たったら次の行へ(終了)
140 IF PEEK(X)=0 GOTO70
【ポイント】
- VRAMに直接書き込めば、処理も早くなり、変数もひとつ(今回でいう変数X)で済むようになります。
- 90行目がこのプログラムの最重要ポイント。猫の先頭の座標Xを配列に保存し、文字コード0で残像を消す作業をしています。たとえば、猫が3匹(S=3)のとき配列は[0]〜[2]の3つを使い回すことになります。
理屈的には↑のように増えていっています。
なので、配列は102個あるので102匹まで猫を増やすことができるはず!
メモリの読み書きコピーを使った時短術と、配列の節約術のご紹介でした!
CC BY shoichi1031da / @shoichi1031da
【人気ゲーム】2人対戦シューティングゲームでゲーム大会!? for IchigoJam
プロジェクターで画面を映し出して、トーナメント形式でシューティングゲーム大会をした様子はこちら↓
大盛り上がり!
#IchigoJam シューティング大会決勝戦の模様をお届けします。
— Hana道場 (@hanadojo_sabae) December 26, 2019
一発撃ったら攻守交代のハラハラ感#出張Hana道場 pic.twitter.com/ehvbiZO8Ma
当時のプログラムはこちら↓
#IchigoJam で2人対戦シューティングゲームをつくりました!
— Hana道場【師範】 (@sihan_ichigojam) September 12, 2019
一発撃ったら、攻守交代です。#Hana道場 でも盛り上がったのでオススメです。 pic.twitter.com/NW9m5Ss1uf
子どもたちから、攻守がどちらかわかりやすくして欲しいと要望を受けたので、改良版をつくりました。
【改良版プログラム】
5 X=12:W=3:VIDEO3
20 K=INKEY()
30 LCX,0:?CHR$(249-244*!F)
40 LCW,10:?CHR$(249-244*F);
50 X=(X-(K=28)+(K=29))&15
60 W=(W-(K=90)+(K=67))&15
70 IF K=31&&!F Y=0:GSB110
80 IF K=88&&F Y=10:GSB110
90 GOTO10
100 ?"|"
110 Y=Y-F+!F
120 IF F LCW,Y ELSE LCX,Y
130 IF Y>0&&Y<10 GOTO100
140 IF X!=W F=!F:CLK:RTN
150 ?CHR$(244)
<操作方法>
プレイヤー1:左右キーで移動、下キーで発射
プレイヤー2:Zキー・Cキーで移動、Xキーで発射
<ルール>
攻撃側が文字コード5のキャラになる。1発打って外したら攻守交代。
【プログラム解説】
5 X=12:W=3:VIDEO3
20 K=INKEY()
30 LCX,0:?CHR$(249-244*!F) F=0のときはプレイヤー1が攻め(文字コード5のキャラになる)
40 LCW,10:?CHR$(249-244*F); F=1のときはプレイヤー2が攻め(文字コード5のキャラになる)
50 X=(X-(K=28)+(K=29))&15 &は論理積(ヨコ座標を0〜15に指定)
60 W=(W-(K=90)+(K=67))&15 &は論理積(ヨコ座標を0〜15に指定)
70 IF K=31&&!F Y=0:GSB110 F=0かつ下キーを押したら、ビームのサブルーチンへ
80 IF K=88&&F Y=10:GSB110 F=1かつXキーを押したら、ビームのサブルーチンへ
90 GOTO10
100 ?"|" ビームアニメーションのサブルーチン
110 Y=Y-F+!F プレイヤーによって変わるビームの上下方向をFで制御
120 IF F LCW,Y ELSE LC X,Y プレイヤーによって変わるビームの座標をFで分岐
130 IF Y>0&&Y<10 GOTO100 サブルーチン繰り返し条件
140 IF X!=W F=!F:CLK:RTN 当たり判定。外れたらFを0⇄1を入れ変える(攻守交代)
150 ?CHR$(244) 当たった場合、爆発キャラを表示
プログラムを少しでも短くするために、攻守フラグ用変数のFを多用しています。
<改造ポイント>
子どもたちにトーナメントをした時に、攻め側がなかなか発射しないことがありました。攻めには制限時間を設けて、画面に表示するのがいいと思います。
【実行画面】
CC BY Hana道場師範 / @shihan_hanadojo
【人気ゲーム】ver1.4でつくれる糸通し<Hana道場ver> for IchigoJam
三角関数で糸通しみたいなアニメーションできた!と投稿した去年のツイート
#IchigoJam 版「糸通し」をつくってみた!
— 初代 *Hana道場【師範】 (@shoichi1031da) December 30, 2019
ガラケー時代によくやっていたゲームです^^
ver1.4は可能性が広がりますね〜https://t.co/d7CXg8DlO7 pic.twitter.com/GerQeehSQg
その後、すぐにPCN上田の斎藤さんが三角関数なしで実装してくれました。
by Shiro SAITO
小学校でも作ったそうです↓
by taisuke fukuno
今回は、斎藤さんのプログラムを改良してつくった、Hana道場でも大人気の糸通し<Hana道場ver>を紹介していきます。
(去年にはできていましたが、ブログにするのを忘れていました...)
Hana道場でのランキング表(最高記録:35)
【Hana道場公式プログラム】ver1.4〜
10 CLV:CLS:Y=3:C=31:H=10
20 R=RND(35)+2
30 IF S>1&&S%5=0&&H>2 H=H-1
40 DRAW 62,0,62,47
50 DRAW 62,R,62,R+H,0
60 FOR X=0TO25
70 B=BTN(30)
80 V=V-B+!B
90 Z=Y+V
100 SCROLL 3
110 DRAW 7,Y,9,Z:Y=Z
120 LC 0,0:?S
130 WAIT 6
140 NEXT
150 IF R<=Y&&Y<=R+H S=S+1:GOTO20
160 IF S>PEEK(#FFF) POKE#FFF,S:SAVE FILE()
170 ?"ハイスコア";PEEK(#FFF)
<操作方法>
↑キーのみで操作します。
↑キーを押すと上昇、押さないと落下していきます。
<変数>
Y:糸の高さ(始点) Z:糸の高さ(終点)
V:糸の高さの増減
K:押したキーのコード C:次にキーが押されるまで保存するコード
R:針の穴の上端の高さ H:針の穴の大きさ
X:スクロール回数(26回スクロールすると、針穴がひとつ生成)
【プログラム解説】
10 CLV:CLS:Y=3:C=31:H=10
20 R=RND(35)+2 針穴の始点を決定
30 IF S>1&&S%5=0&&H>2 H=H-1 針穴を小さく条件を記述
40 DRAW 62,0,62,47 針穴用の直線を引く
50 DRAW 62,R,62,R+H,0 直線に針穴をあける
60 FOR X=0TO25 スクロールアニメーション開始
70 B=BTN(30) ↑キーを押したら1,押してないと0を変数Bに代入
80 V=V-B+!B 加速度的に変数Vを増減させる
90 Z=Y+V 糸の高さ
100 SCROLL 3 左スクロール
110 DRAW 7,Y,9,Z:Y=Z 糸(直線)を始点(7,Y)から終点(9,Z)に引く
120 LC 0,0:?S スコア表示
130 WAIT 6
140 NEXT
150 IF R<=Y&&Y<=R+H S=S+1:GOTO20 穴より高くても低くてもダメ(当たり判定)
160 IF S>PEEK(#FFF) POKE#FFF,S:SAVE FILE() ハイスコアの保存
170 ?"ハイスコア";PEEK(#FFF) ハイスコアの表示
数1,数2の座標から数3,数4の座標へ線を引く(座標は最大63x47)、数5に0指定で線を消し、2指定で反転する、省略時または1指定で線を引く *ver1.4以上
【ポイント①】スコアを5更新ごとに針穴を小さくする
30 IF S>1&&S%5=0&&H>2 H=H-1
Hの最小値は3
【ポイント②】ハイスコアをファイルに保存
150 IF S>PEEK(#FFF) POKE#FFF,S:SAVE FILE()
160 ?”ハイスコア”;PEEK(#FFF)
プログラム領域の最後のアドレス#FFFに書き込んでセーブ
CC BY shoichi1031da / @shoichi1031da
IchigoJamで画像保存?お絵かきゲーム&イラスト保存プログラム
実行画面はyoutubeからご確認できます。
お絵かきゲームの正規版は『アニメーションとゲームをつくりながら学ぶ Hana道場式プログラミング』by 師範 に収録されています!
【0番:お絵描きゲーム】
10 CLS:X=15:Y=12:C=1
15 K=INKEY():IF K>32 C=K:BEEP:IF C<58 C=C%48
20 LC X,Y,1
30 X=X-(X>0)*BTN(28)+(X<31)*BTN(29)
40 Y=Y-(Y>0)*BTN(30)+(Y<22)*BTN(31)
50 WAIT5
60 IF BTN(32) LC X,Y:?CHR$(C)
70 IF BTN(88) LC X,Y:?CHR$(0)
80 IF K=83 LRUN1,100
90 GOTO15
<操作方法>
・上下左右キーでカーソル移動
・スペースキーで塗る、Xキーで消す
・その他のキーでキャラ選択
・Sキーで画像保存(1番のプログラムの100行目から実行)
<解説>
15行目▶︎塗る文字を変更する用。例えばAと押すと塗る文字がAにかわり、1と押すと文字コード1の文字になります。初期値は1。変更すると音が鳴ります。
20行目▶︎LC数1,数2,数3で数1を0以外にすると、カーソルを表示できます。
(数1,数2はカーソルのX座標とY座標)
キー操作をINKEY()ではなくBTN()を使っているのは、長押ししたいからです。
例えば、スペースを長押ししながらカーソルを操作すると 連続で塗ることができます。
(Xキーで消すときも同様)
【1番:画像保存プログラム】
10 COPY#900,#D00,32*24
20 IF BTN()=0 CONT
30 LRUN 0
100 COPY#D00,#900,32*24
110 LC 0,0
120 INPUT ”SAVE”,N
130 SAVE N
<操作方法>
SAVEと画面に表示されるので、絵を保存したいファイル番号を入力。エンターを押すとセーブ完了。
実行すると絵が表示。
IchigoJamのボタンを押すと、0番のお絵描きプログラムを実行。
<解説>
100行目以降が画像保存プログラムです。
100行目▶︎メモリのプログラム領域(LIST)#D00〜#FFFに、画面領域(VRAM)#900〜#BFFをコピー
110行目▶︎カーソルの位置を0,0に
120行目▶︎画像の保存先を指定
130行目▶︎指定先に保存
10,20,30行目が画像表示プログラムです。
10行目▶︎メモリのVRAM領域に#900〜#BFFに、メモリのプログラム領域#D00〜#FFFをコピー
20,30行目▶︎IchigoJamのボタンを押すと、お絵描き開始。それ以外は画像表示
<その他>
外部メモリを使えば何枚でも保存できますね!
CC BY shoichi1031da / @shoichi1031da