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

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

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

プチコン作品一覧

プチコン3号作品

●7650
パックマンDLCを使ったパズルゲーム。
http://d.hatena.ne.jp/eidaht/20160612/1465755564

●MISSILE DEFENSE for プチコン3号
ミサイルコマンド風ゲームのプチコン3号移植。
http://d.hatena.ne.jp/eidaht/20141223/1419341732

ゲームブックドルアーガの塔」アドベンチャーシート for プチコン3号
ゲームブックドルアーガの塔」のアドベンチャーシート。
http://d.hatena.ne.jp/eidaht/20160313/1457835356

●EDSMILE ツール
スマイルボタンに登録して使う便利ツール。
http://d.hatena.ne.jp/eidaht/20160207/1454810930

●漢字入力プログラム EDKANJIPNL
漢字入力を行うプログラム。
http://d.hatena.ne.jp/eidaht/20160225/1456356091

●スター○ォーズ風タイトル表示デモ
mkIIで作ってた奥の方にスクロールしていくタイトルデモが高速かつ立体視3DSで。
http://d.hatena.ne.jp/eidaht/20141130/1417357718

●文字列関連操作ライブラリ
文字列等を操作する関数を集めたライブラリ。
http://d.hatena.ne.jp/eidaht/20151213/1450016205

正規表現ライブラリ
正規表現を実現するライブラリ。
http://d.hatena.ne.jp/eidaht/20150105/1420484771
http://d.hatena.ne.jp/eidaht/20150108/1420728132(正規表現ライブラリ使い方)

●EDBF Brainfu*kコンパイラ
Brainfu*kソースを実行可能なSMILE BASICソースにコンパイルする。
http://d.hatena.ne.jp/eidaht/20141207/1417943515


■3号プログラミング覚え書きまとめ
3号プログラミング覚え書き(1) 変数編
3号プログラミング覚え書き(2) DEF編
3号プログラミング覚え書き(3) 文字列編
3号プログラミング覚え書き(4) 数値編
3号プログラミング覚え書き(5) 配列編
3号プログラミング覚え書き(6) スマイルボタン編

■SMILE BASIC 小技 まとめ
SMILE BASIC 小技(1)
SMILE BASIC 小技(2)
SMILE BASIC 小技(3)
SMILE BASIC 小技(4)
SMILE BASIC 小技(5)
SMILE BASIC 小技(6)
SMILE BASIC 小技(7)
SMILE BASIC 小技(8)


プチコンmkII作品

●2048 (勝手移植版)
2014年初頭に旋風を巻き起こしたパズルゲーム2048のプチコン勝手移植版。
QRコード

●クイズ 1ミニットショック
2人対戦可能なクイズゲーム
概要、QRコード等

プチコンポーザー
スーパーファミコンのソフト「マリオペイント」の一機能である「コンポーザー」のアイデアを源流とする音楽作成・演奏ソフト。
遊び方 QRコード サンプル動画

●MISSILE DEFFENSE ミサイルコマンド風ゲーム。
 最新版 動画 QRコード

●140文字プログラム 140文字以内でできた超ショートプログラム
140文字プログラム集+α QRコード

 140文字プログラム集その1 リストと解説
 140文字プログラム集その2 リストと解説
 140文字プログラム集その3 リストと解説
 140文字プログラム集その4 リストと解説
 140文字プログラム集その5 リストと解説
 140文字プログラム集その6 リストと解説
 140文字プログラム集その7 リストと解説
 140文字プログラム集その8 リストと解説
 収録作:(1) 140スキー、140ゴルフ、140スロット
     (2)140タッチ、140ショット、140ジャンケン
     (3)140ペイント、140ペイント改、140ベーダ、140ランチャ、
       140ランチャ(RECV編)、140コンフィグ
     (4)140スノー、140ピラミッド、140ザカリテ、140ザオリク、140UFO
     (5)140STAR、140PAI、140コラッツ
     (6)140シュウォッチ、140テンカウント、140にじみフォント
     (7)140エディタ、140フィボナッチ、140ペルシア絨毯模様
     (8)140曜日計算、140アナログ時計、140コムソート


●タートルグラフィックス LOGO風タートルグラフィックス。
 V0.4 QRコードと解説
 V0.3 解説
 V0.2 解説
 V0.1 解説 図形サンプル

●MINOR MINER パズルゲームPITMAN移植作品。
 最新版 QRコードと解説

●8x8フォントエディタ 8x8ピクセルフォントエディタ。
 最新版 QRコードと解説 ひらがな/カタカナ混在表示サンプル

●簡易テキストエディタ ショートテキストエディタ
 V0.12 QRコードと解説

バイナリエディタ バイナリデータエディタ。
 最新版 QRコードと解説

●フライングゲッツ ミニアクションゲーム。
 最新版 QRコードと動画

●レトロレーシング ミニレースゲーム。
 最新版 QRコードと画像

●プチグマ プチコン暗号プログラム。
 最新版 QRコードと解説

●対戦ゲーム ミニ対戦ゲーム。
 最新版 リストと解説

●Brainfu*k for プチコン 難読プログラム言語Brainfu*kインタプリタ
 最新版 リスト QRコード


<<以下、開発中の作品。>>

ジャイラス風シューティング
ジャイラス風シューティング製作中 - プチコンで遊ぼう! (はてなブログ版)

●16進データ入力プログラム MON
16進データ入力を効率的に入力するための16進データ専用エディタ。
製作中:16進データ入力プログラム「MON」 - プチコンで遊ぼう! (はてなブログ版)

●ロングテキストエディタ LTEDIT
プチコンのプログラムソース入力を目的とした長文編集可能なテキストエディタ。(開発凍結中)
製作中:ロングテキストエディタのデモ - プチコンで遊ぼう! (はてなブログ版)

<<お知らせ>>

◆公開しているプログラムは、特に記載のない限り、Apacheライセンス2.0として公開しています。
好きなようにお使いください。


<<以下、自分用メモ>>

■PCとのデータ交換 プチコン3号用
◆ぷっちコンバーター
http://plaza.rakuten.co.jp/route21/diary/?ctgy=22
3号→PC 単方向 画像でテキストを渡す


■PCによる入力支援 プチコンmkII用

プチコン用画像コンバータ DSPCBMP
プチコン MkII プログラム
あおごん@さん作

◆PTCUtilites
PTCUtilities
micono @さん作

◆PetitEditor
http://www2.u-netsurf.ne.jp/~ozawa/petitcom/petiteditor.html
Gust Notch?@さん作

プチコン文法チェッカ
プチコン文法チェッカー
Actorbug@さん作


プチコン作品のリストへのリンク

プチコン3号作品データベース (Google Docs)
https://docs.google.com/spreadsheets/d/1ihBdTe0w3GRSE-NgzqTo7i0XtMvLKqWTZ6xuVmsHiJ4/edit#gid=0
OBONO@さん管理

プチコン3号作品データベース出張所
http://ptcm3db.chobi.net/
OBONO@さん管理


プチコンmkII作品データベース (Google Docs)
https://docs.google.com/spreadsheet/lv?key=0AqLEdMVWXjvPdEFKam1zSm45Ry1FeVlETDJBdmF5b1E&type=view&gid=0&f=true&sortcolid=-1&sortasc=true&rowsperpage=500
OBONO@さん管理

スターウォーズ風タイトルの立式

先日作ったスターウォーズ風タイトルのデモだけど、表示には透視投影変換を使っている。
透視投影変換については今までよく理解していなかったので、いろんなページを見て勉強しようとしたのだけど、大抵はしょって結果だけ書いてあるので、今回やろうとしていることを組み立てようとしてもできなかった。

なので結局、式を立てるところからやってみた。

で、ノートに書いた式が以下。
久しぶりに数式をいじくったので、本当にバカ正直に式の代入だけでやってる。

ベクトルと三角関数の基礎知識は使ってるがその位。
高校1〜2年くらいの数学なんだけど、久しぶりにやってみるととてつもなく時間がかかった。
やっぱり定期的にスキルのリフレッシュってのは必要なんだなぁと実感。


スターウォーズ風タイトルの表示デモ

スターウォーズ風タイトルの表示デモですが、遅いです。
あと、音楽がしょぼいのは仕様ですw。

プチコン3号が出たら立体表示化したいのでmkIIのうちに作ってみましたが、作ってみたら思いのほか遅かったです。(汗)
今回は透視投影変換の勉強ということで、最初の立式からやったらまたまた完成まで時間がかかってしまいました。


ソースは汚すぎるので、きれいにしてからQRコード公開します。

プチコン版2048の再修正

プチコン版2048にまたまた別のバグが見つかってしまいました。

4096以上を作っても一瞬しか表示されない、というもので、自分は作ったことがないので気がつきませんでした。(笑)
この問題の修正と、ついでに機能修正を入れました。
ゲームオーバーの表示を半透明っぽく表示するようにしたのと、上画面右下に時刻表示を追加しました。

修正版のQRは元記事のものを差し換えてありますので、そちらからどうぞ。

プチコン版2048 - プチコンで遊ぼう!

プチコン版2048のバグ修正

昨日公開したプチコン版2048に早速バグが見つかってしまいました。

2048を作っても、最後に作った2048の分のスコアが加算されていない、というものです。

QRは差し替え済みですが、
もしすでにダウンロードされた方がいましたら、次のように直すと簡単です。

73行目にある「GOSUB @DISP_SCORE」をコピーして、
68行目と69行目の間にペーストします。
これだけです。
すでにダウンロードされた方には大変お手間おかけします。

プチコン版2048

プチコン3号版はこちらです->
eidaht.hatenablog.com



スマホで遊んでいたオープンソースのゲーム、2048をプチコンに移植してみました。

オリジナルは以下です。
http://gabrielecirulli.github.io/2048/
ソースも公開されてますが、参考にしたのはタイルの色と4のタイルの出現確率くらいで、完全にゼロからソースを起こしました。
なので細かいルールに関しては違うところがあるかもしれません。


ゲームの遊び方:
タイル同士をくっつけて、2048のタイルを作るのが目的です。
十字キーまた下画面スワイプで、タイルを上下左右に寄せることができます。
その時、同じ数字のタイルはくっついて、元の2倍の数字のタイルになります。
これを繰り返して2048を目指してください。

動かせなくなるとゲームオーバーです。
ゲームオーバー時は、Aボタンを押すか、右下のNEWGAMEボタンで再ゲームです。


QRは以下です。

PRG:ED2048 と CHR:ED2048 に分かれており、両方必要です。

更新情報:
2014/06/10 バグによりPRGのQRを差し替えました。
2014/06/30 バグ修正と一部機能修正。PRGのQRを差し替えました。
・4096以上が一瞬しか表示されない問題を修正。
・ゲームオーバー時の表示を半透明っぽくした。
・上画面右下に時刻を表示するようにした。

PRG:ED2048



CHR:ED2048

動画等については後日。


その他のTIPS:
慣れてきて、2048作るのは簡単だよーという場合は24行目にある MD=2 を MD=0 に変えるとエンドレスになります。
(一応タイルは32768まで用意してありますが、まずそこまでは行かないでしょう。)

式を用いた移動処理について(補足)

先日の「式を用いたX座標の移動処理について」に関して、
「右下に入れたら逆に動くんじゃないの?」という突っ込みを受けましたので補足したいと思います。

まず、紹介した式

X=X-(BUTTON()+1)%3+1

はいつでも使えるものではありません。
これを使った140スキーは、
・とにかく短く書くことが最優先である
・右、左、ニュートラルは正しく動作するが、それ以外のキーが入力された場合は知ったこっちゃない
という設計です。
ということで右下を押したら違う方向に動くことは承知の上で記述の短さ優先で書いたものになっています。

ということで、上下も含めて正しく動くためにはどうするか、ということになりますが、やはり、長さ最短でしかも押した方向にしか動かない、というただ一つの最適解はないので、記述の長さと機能性の最適解をどこに置くかということになります。

加えて言うならば、記述のわかりやすさも考慮する要素の中に入ります。
すでに上式でわかりやすさからはかけ離れていますが、さらに複雑な技法を使うと作った本人が「後で何をやってるのかわからない」ということにもなりかねません。
(実際、一部の140文字作品にもすでに不明確なところがあります。)

それらを意識した上で、上式の8方向化を行っておこうかと思います。
できるだけここまでの流れを維持したまま、一部修正で対応できるようにします。

今回は縦横の8方向に動けるとします。前回同様、画面端の処理は省略します。


(1)基本的な移動処理

短縮記述でないごく普通の書き方で8方向の移動処理を書くと以下のようになるでしょう。

B=BUTTON()
IF (B AND 4)==4 THEN X=X-1
IF (B AND 8)==8 THEN X=X+1
IF (B AND 1)==1 THEN Y=Y-1
IF (B AND 2)==2 THEN Y=Y+1

今回は、BUTTON()の記述が多く出てくるため、先頭で変数BにBUTTON()を代入しておきましたが、BをBUTTON()と読み替えていただいてもほぼ同じです。

IF文の条件左辺にカッコが付きましたが、ANDの方が==よりも演算の優先順位が低いためです。
このANDはビット演算子と呼ばれるものですが、この時点でわからない場合にはすみませんが各個人で調べてみてください。
直接質問された場合には、別途解説するかもしれません。

また、IF文での記述では、この条件右辺自体が実はいらないのですが、これも解説するとややこしくなるのでここでは省かせていただきます。


(2)論理式を使った書き換え

前回同様に論理式で書き換えてみましょう。
詳しいやり方は前回をご覧ください。

まずは直接置き換えます。

B=BUTTON()
X=X-((B AND 4)==4)
X=X+((B AND 8)==8)
Y=Y-((B AND 1)==1)
Y=Y+((B AND 2)==2)

X同士、Y同士は四則演算なので合体できます。
よって、

B=BUTTON()
X=X-((B AND 4)==4)+((B AND 8)==8)
Y=Y-((B AND 1)==1)+((B AND 2)==2)

となります。


(3)計算式を使った書き換え

前回同様に剰余を使って書き換えを行ってみましょう。
しかし、基本式は変わりません。
○○ % 3 - 1 という形の式を使ってキャラの座標を±1するのは同じです。

前回は○○の中に BUTTON()+1を入れたのを少し変えるだけです。

まず、X方向だけ考えましょう。
要はこのBUTTON()のところに4と8と0以外の数字が入らないようすればいいわけです。

ここで上述のAND演算のところに戻ります。
なぜ(1)や(2)の時にはAND演算しているのでしょうか。
それはBUTTON()が各ボタンの入力をビットで返すようになっていて、そのビットの数値表現が4とか8になっているからです。

実際は左右を同時に押すことはできないですが、仮に全部のボタンが同時に押されているとすると、BUTTON()が返す値は以下になります。

&B11111111111 = 2047

左辺の&Bは2047の二進数表現です。

ここから左方向を押したかどうかのビットを取り出すには、AND演算を行います。

&B11111111111 = 2047
AND
&B00000000100 =    4
↓
&B00000000100 =    4

左だけを押していない時とのAND演算をすると、以下のようになります。

&B11111111011 = 2043
AND
&B00000000100 =    4
↓
&B00000000000 =    0

つまりAND演算にて左方向を押した時のビットを取得でき、その結果としてビットの数値表現である、4または0を得られることになります。

同じように右方向を押したかどうかのビットを取り出すAND演算は以下のようになります。

&B11111111111 = 2047
AND
&B00000001000 =    8
↓
&B00000001000 =    8

右だけを押していない時とのAND演算をすると、以下のようになります。

&B11111110111 = 2039
AND
&B00000001000 =    8
↓
&B00000000000 =    0

これで右方向を押した時ののビットを取得でき、その結果としてビットの数値表現である、8または0を得られることになります。

これを合成するのはどうすればよいでしょうか。
すなわち左か右を押しているときだけビットを取得するのです。
それにはこうします。

&B11111111111 = 2047
AND
&B00000001100 =   12
↓
&B00000001100 =   12

本当にこれで左右の入力を正しくとれるでしょうか。やってみましょう。
まず、全部のうち右は押してなくて、左は押している時です。(つまり左を押している。)

&B11111110111 = 2039
AND
&B00000001100 =   12
↓
&B00000000100 =    4

結果は4ですので、左を押しているのを取得できました。

次に、全部のうち左は押してなくて、右は押している時です。(つまり右を押している。)

&B11111111011 = 2043
AND
&B00000001100 =   12
↓
&B00000001000 =    8

結果は8ですので、右を押しているのを取得できました。


最後に、左右とも押されていない時です。

&B11111110011 = 2035
AND
&B00000001100 =   12
↓
&B00000000000 =    0

結果は0ですので、左右とも押されていないことを取得できました。

つまり、BUTTON() AND 12 で左右のいずれかだけ押しているかどうかを取得できることがわかりました。

上記のように、取得したいビットを立てた値をANDの右側の値に入れると、それ以外のビットを消し去ることができます。
この方法をビットマスクと言ったりします。
特定のビットにだけマスクをかけてそれ以外のところは0にしているからです。(フォトショップで領域にマスクをかけてそれ以外を消しているのを考えるとわかりやすいかも)
画像処理を行う場合などには現代のプログラミング言語でも使う場面がありますので、覚えておいて損はありません。

ここで、元の式に戻って、 (BUTTON()をBで置き換えたのを思い出してください)

B=BUTTON()
X=X-(B+1)%3+1

の『B』のところを『(B AND 12)』で置き換えると上記の通りになるといえますので、

B=BUTTON()
X=X-((B AND 12)+1)%3+1

とすると、上下ボタンや別なボタンを押されても、左右移動に影響がなくなります。

X方向ができましたので、Y方向も考えてみましょう。

○○ % 3 - 1 の式にあてはまる、うまい○○を考えます。
実は、上下しかボタンが押されないという前提で考えると、Xと全くで、

B=BUTTON()
Y=Y-(B+1)%3+1

が使えます。

しかし今回は左右もボタンが押されますので、上記同様にBを上下を押された時だけに制限したいです。
上はBUTTON()の値は1、下はBUTTON()の値は2なので、1と2を表すビットだけに制限すればよいことがわかります。
つまり、

&B00000000011 =    3

とのANDをとればよいということになるので、以下のように書けます。

B=BUTTON()
Y=Y-((B AND 3)+1)%3+1

ここまでをまとめると、8方向に動かすには、

B=BUTTON()
X=X-((B AND 12)+1)%3+1
Y=Y-((B AND 3)+1)%3+1

と書けばよいことになります。

剰余をうまく使えばもっと短く書くこともできますが、前回までの流れを逸脱しない範囲で書くと上記のようになるでしょうか。
いずれにしろ、ただ一つの最適解は存在しませんので、その時に優先することにより、いろいろと書き方を考えてみてください。


なお、すべての場合において(3)のような書き方をすすめるものではありません。
一画面プログラムのような制約がある中でのみ使うべきもので、本来であれば、(1)のようなわかりやすい記述にしておくのが望ましいと思います。


これでお伝えできる大体のところは書いたでしょうか。
後は画面端の判定がありますが、それはここまでの知識を持った上で、いろいろとあるソースを読むと理解できるものと思います。
リクエストがあった場合にはまた書くかもしれません。

以上です。

ゲームブック ドルアーガの塔のアドベンチャーシートをプチコンで

ゲームブックドルアーガの塔のアドベンチャーシートをプチコンにて製作中。

1,2巻にはアドベンチャーシートがついてるのだが、3巻にはついてない。
それもあってプチコンで製作してみることにした。

本当は12月中に最初の版ができる予定だったが、まだまだ使える レベルになってない。

ゲームブックはやっているがプチコンは知らない人に、
また、プチコンはやってみてがゲームブックはやってないという人に、
相互に興味をもってもらうといいなと思って作っております。

最低限動くレベルになったらQR公開したいと思いますので、しばしお待ちください。

式を用いたX座標の移動処理について

コメントにて質問がありましたので、移動処理を1画面プログラムなどで短縮記述するときの考え方を説明します。

(2014/01/22 本記事へのコメントに基づき一部追記・修正)

左右の十字キーを押すと、それに応じてプレイヤーキャラが左右に移動するとします。簡略のため画面端の検出処理は省略します。


(1)基本的な移動処理

短縮記述でないごく普通の書き方でX方向の移動処理を書くと以下のようになるでしょう。

IF BUTTON()==4 THEN X=X-1
IF BUTTON()==8 THEN X=X+1

(2)論理式を使った書き換え

短くプログラムを書く時の基本的な手段である論理式はぜひ覚えておきましょう。

(1)でIF文の条件として書いた BUTTON()==4 という条件は、実は、これ自体が値を返す式になっています。このようなものを論理式といいます。

論理式(BUTTON()==4)の値は、左キーを押している時は1、左キーを押していないときは0になります。
(BUTTON()==8)の値は、右キーを押している時に1、押していない時に0です。
0をXに足したり引いたりしても、Xの値は変わらないので、この論理式をXに足したり引いたりすると、キーを押した時だけ、Xに1を足したり1を引いたりできます。
これを使うと、(1)のIF文は以下のように書き換えることができます。

X=X-(BUTTON()==4)
X=X+(BUTTON()==8)

よく見るとこれは単なる四則演算の式になっているので、さらに式を合体してしまうと以下のように書くことができます。

X=X-(BUTTON()==4)+(BUTTON()==8)

これが論理式を使った書き方の基本です。



(3)剰余等の計算式を使った書き換え

論理式での書き方は、理解してしまえばそれほどむずかしいことをやっているわけではないことはわかったかと思いますが、条件ごとに一つの論理式を書かざるを得ないため、それ以上の短縮は望めません。
それ以上は、ケース・バイ・ケースで方法を編み出す必要があるので、若干のヒラメキが必要となってきます。
ヒラメキと書きましたがある程度の定石はあり、特にメジャーな方法としては剰余を使う方法があります。

剰余はプチコンでは X % 3 などと書きます。
これは X を 3 で割った余りを表します。
剰余を使うと、大きな数値を自分が思った範囲の中に押し込めることができます。

例えば、上記の X % 3 は、Xが正の整数である限り、0,1,2のいずれかの値だけをとります。
これを -1 すると、 -1,0,1のいずれかの値をとることになり、この X % 3 - 1 という式がキャラのX座標を±1するのに使えそうです。
後はこの式の中に入るXを調整するだけです。

BUTTON()の左右がとる値は、左が4、右が8、何も押さないと0です。

まずそのままX=BUTTON()として、(BUTTON()) % 3 - 1 という式で考えてみます。
十字キー右の時、BUTTON()は4 なので 4 % 3 は 1 で、-1 すると 0
・同じく左の時、BUTTON()は8 なので 8 % 3 は 2 で、-1 すると 1
・同じく押してない時、BUTTON()は0 なので 0 % 3 は 0 で、-1すると -1
となってしまいうまくいきません。

そこでX=BUTTON()+1としてみます。
全体としての式は (BUTTON()+1) % 3 - 1 となります。
十字キー右の時、BUTTON()は4 なので (4+1) % 3 は 2 で、-1 すると 1
・左の時、BUTTON()は8 なので (8+1) % 3 は 0 で、-1 すると -1
・押してない時、BUTTON()は0 なので (0+1) % 3 は 1 で、-1すると 0
となりました。

しかし、これだと左を押した時にXに+1、右を押した時にXに-1することになり、左右逆になってしまっています。

そこで、全体にマイナスをかけて、 -1*((BUTTON()+1) % 3 - 1)とすると、
十字キー右の時、(4+1) % 3 は 2 で、-1 すると 1、さらに-1をかけて -1
・左の時、(8+1) % 3 は 0 で、-1 すると -1、さらに-1をかけて 1
・押してない時、(0+1) % 3 は 1 で、-1すると 0、さらに-1をかけて 0
となり、思った数値を得られました。

したがって、

X=X-1*( (BUTTON() + 1) % 3 -1)

で思った結果を得られることがわかりました。
この式を変形すると、

X=X-(BUTTON()+1)%3+1

になります。

以上です。