読者です 読者をやめる 読者になる 読者になる

プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

140文字プログラム集(4)

Twitterアカウント(@eida_s)上でつぶやいた、140文字以内でできているプログラムのまとめ(4)です。

なお、まとめ(1)から(3)のリンクは以下の通り。
140文字プログラム集(1)
140文字プログラム集(2)
140文字プログラム集(3)


■140文字プログラムNo.11 140スノー (2012.02.17)


  1. @WЛ
  2. X=RND(32)Y=RND(22)C=(CHKCHR(X,Y)%128+1+(Y<1)*RND(4))%16Л
  3. LOCATE X,Y?” ”;Л
  4. LOCATE X,Y+1?CHR$((0<C)*(C<16)*(128+C));Л
  5. GOTO@W


(122文字)

【遊び方】
ただぼぉっと眺めるだけ。セミグラで雪を再現!のつもり。
調整に1時間近く費やしたけど、これが限界…。
もっといい調整できた人はぜひ発表してください。

【プログラムの解説】
セミグラフィックスで弾幕シューティングを試作している時に思いついたもの。
思いついた時はうまい具合に雪に見えるんじゃないかな?とか漠然と思ったんだけど、ぜんぜんそう見えず。
どうにかならないかと調整しているうちに1時間近く経過したので、見切りリリースとしました。
自分的にはこの140シリーズは、ワンアイデアを試す場みたいなものなので、1つの作品をごりごり完成度上げる、とかは考えていません。
(どちらにしても140文字では限界あるし...)

さて、プログラムの技術的な面ですが、セミグラのキャラ文字が0〜15のビット配列と同じ構造をしているのを利用しているのが特徴でしょうか。

■140文字プログラムNo.12 140ピラミッド (2012.02.19)

?"ワタシハ ピラミッドノ オウ ";↓
@Y↓
T=RND(9)>0?MID$("ミイラオトコミッ ",T*6,6);↓
BEEP 9VSYNC 22U=INKEY$()!="M"IF T*U THEN@Y↓
?:?MID$("ノロッテヤル!ヨカッタw",(T+U<1)*7,7)

(139文字)

■140文字プログラムNo.12' 140ザカリテ (2012.02.19)

?"ワタシハ ウチュウノ テイオウ ";↓
@Y↓
T=RND(9)>0?MID$("ザカリテザッ ",T*5,5);↓
BEEP 9VSYNC 22U=INKEY$()!="Z"IF T*U THEN@Y↓
?:?MID$("コロシテヤル!ヨカッタw",(T+U<1)*7,7)

(138文字)

■140文字プログラムNo.12'' 140ザオリク (2012.02.19)

?"ワタシハ ジュモンノ オウ ";↓
@Y↓
T=RND(9)>0?MID$("ザオリクザッ ",T*5,5);↓
BEEP:VSYNC 22U=INKEY$()!="Z"IF T*U THEN@Y↓
?:?MID$("イキカエラセテヤルシンデイロ!",(T+U>0)*9,9)

(140文字)

【遊び方】
相手が名前を言った瞬間に、ミイラはM、ザカリテ、ザオリクはZを押す。
早くても遅くてもやられます。
VSYNCは25だと簡単、20だと難しい、って感じです。

【プログラムの解説】
一部では有名なザカリテゲームの140文字移植版です。
プログラム発生の経緯については、pmanさんが http://togetter.com/li/265867 にまとめていますが、ここで書かれているピラミッドフルバージョンの前座です。

140文字で作るのは楽勝かと思いきや、文字データが多いため、意外と苦戦しました。
ザオリクは文字データの入れ換えだけでは140文字に収まらなかったので、若干プログラムそのものを修正したりしています。

技術的には、キーボードバッファがいつでもたまることを利用して、入力にINKEY$()を使っています。
表示からの時間猶予のためにVSYNCで20フレームほどの待ちを入れていますが、BUTTON()にすると、ボタンを押して離す、ができてしまうほどの時間になります。
キーボードバッファはVSYNC中でも活動しているので、20フレームのどこでキーボードが押されて、離されても、確実に検出可能です。


■140文字プログラムNo.13 140UFO (2012.03.08)

T=0U=1Z=63↓
@U↓
T=T+0.1+U*RND(5)X=Z+(SIN(T)+COS(T*3))/2*(Z-T)BEEP 36,0,90,X↓
VSYNC 8U=TCHST:Q=ABS(X-TCHX/2)<U*5ON Q+(T>30)GOTO@U↓
BEEP 14-Q?30-T

(140文字)

【遊び方】惑星αからやってきた見えないUFOをサウンドスキャナで探知し、音の位置をタッチして撃破せよ!
外すとタイムロスになるぞ。
侵略される前に撃破すれば得点が表示される。
ステレオイヤホン推奨

【プログラムの解説】
音だけを使ったゲームを作ろう!と思って製作したもの。
今回のこだわりは、ふらふら動く予測しがたい、でもランダムではなく規則性のあるUFOの動き、です。

これを実現するために、今回はSIN波を組み合わせて使いました。(COSも使っていますが、これは単に140シリーズの目標のキーワード稼ぎ用で、SINでも同じようになります。)
SIN一個だと、単純なSIN波になりますが、周期の異なるSIN波を組み合わせることで、非常に複雑な波形を表すことができる、という原理を用いています。
1980年代頃のFM音源を使ったシンセサイザーはこの原理を使っていました。(FM音源以前のアナログシンセサイザーも同様の原理をアナログ回路で作っていると思いますが、詳しくないので省略)
フーリエ変換の原理も同様なものです。
と、なんか難しい話をしてしまいましたが、要は異なる周期のSINを2つ組み合わせて、動きを複雑にしましたよ、ということです。

が、残念ながら十分には複雑ではなく、中央で待ち伏せしていると、簡単に捕らえることができてしまいます。
中央にあたる点をランダムにずらしてやるような修正ができれば、待ち伏せ対策にはなったのですが、140文字ではそこまで入れることができませんでした。
ゲームとして面白く改良したい人はこの点を改良するとよいと思います。

140文字プログラムは短いので、自分でゲームを作ったり改造してみたい人の土台としては割とよいと思います。
プログラミングの勉強をしたい人は改造するところから入ると面白いかもしれません。