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

任天堂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@さん管理

再帰的アルゴリズムで迷路をつくる

ツイッター再帰アルゴリズムで迷路を作る画像が流れてきてエモい感じだったので早速つくってみました。

プログラム名: MAZE
公開キー: NKQE345D
公開日: 2018/12/12
バージョン: 0.01

元にしたのは以下のページです。
Buckblog: A Better Recursive Division Algorithm
ソースはよくわからなかったため、動画をもとに「こうなってるんだろう」という勝手な推測のもとにつくりましたw
なので領域のとり方のところとかが少しちがいます。

もともと再帰的な領域分割アルゴリズムはあって、それをもうちょっとそれらしくした、というのが「A Better Recursive Division Algorithm」ということのようです。
そのざっくりとした考え方を以下に示します。
(元ネタのページの番号とは対応していません。)

着目している領域を適当に2つの領域に分割し、その領域同士の境界にカベを立て、立てたカベのうち1か所に穴を開けます。
それをさらに小さい領域にどんどん適用していくと迷路になる、というものです。
以下では、着目している領域を黄色、2つに分割した領域の1つを赤、もう1つを緑と表現します。

(0) 領域全体を黄色に塗ります。
(1) 黄色に塗られた領域の2つのマスを適当(ランダム)にとり、1つを赤、もう1つを緑の初期点とします。
    この時、黄色の領域が1マスかしかなく、赤と緑の両方の初期点を置けない場合は再帰終了で、もとの処理に戻ります。
(2) 赤と緑の領域を1マスずつ交互にかつ適当(ランダム)に広げていきます。
    この時、塗ることができるのは黄色のマスだけで、他方の色に塗られたマスを塗ることはできません。
    塗るマスがなくなるまで(2)を繰り返します。
    赤と緑のどちらかが先にもう塗るマスがなくなっても、他方にまだ塗ることができる箇所があれば(2)を繰り返します。
(3) 赤と緑の境界にカベを作ります。
(4) (3)でつくったカベのどこか1か所、カベを消去します。
(5) 赤だった領域を黄色に塗って、(1)からの処理を再帰的に実行します。
(6) 緑だった領域を黄色に塗って、(1)からの処理を再帰的に実行します。

これで処理は終了です。

(2)のランダムに領域を広げていくところのやり方を変えると、形が変わってきます。
今回自分が作ったプログラムでは、作るのが簡単、という理由でランダムウォークにしましたが、この場合、細くて短い通路ができやすいため、十字路ができやすいように思います。(これはあまり自分の好みでないです。)
ここを元ネタのページのように初期位置から均等に近く広がっていくようにするといい感じになりそうな気がしますので、その気がありましたら改良してみてください。

以上です。

PiSTARTERことはじめ

■PiSTARTERとは

シングルボードコンピュータ(Raspberry Pi 3)上で動くSmileBASICです。」
smilebasic.com


SmileBASICは、スマイルブームが発売するプチコンシリーズでも採用されているBASIC言語です。
特徴としては、現代的なほとんどのプログラミング言語とは違い「非」オブジェクト指向であり、ゲームが作りやすく初心者が学びやすいように拡張されたBASIC言語となっていることです。
特にスプライト機能(キャラクターなどの画像を簡単に動かすことができる機能)が充実しており、非公式に「スプライト指向言語」とまで言われるほどです。

■PiSTARTERを使うには

以下のものが必要です。
Raspberry Pi 3 または 3+ (ZEROなどでも動くという情報もありますが公式サポートされていません)
・PiSTARTERパッケージ
・インターネット環境 (最初のアクティベーションにのみ必須)

PiSTARTERを使う前にバックアップをとることが公式でも強く推奨されています。
バックアップのすすめ - PiSTARTER

起動するには、Raspberry PiのマイクロSDカードスロットに、PiSTARTERのマイクロSDカードを差して起動するだけです。
初回起動時にアクティベーションコードを聞かれ、この時に有線LAN経由でのインターネット接続が必要です。
しかし、公式サポートではないものの、無線LAN経由でのインターネット接続も確認されています。

■情報ソースなどは

公式のリファレンスマニュアルは次の場所です。
SmileBASIC-R Reference Manual

公式のフォーラムは次の場所です。
PiSTARTER - トップページ

またTwitterではハッシュタグ#PiSTARTERが使えます。
twitter.com

また、MOTさんがまとめてくれたモーメントが大変役立ちます。
twitter.com


その他の情報は随時追加していきます。
それでは楽しいパイスタライフを!

LISPのメモリ構造をつくってみる (4)

つづき
とりあえず、文字列として出力する関数を作っておきます。(こうしておくと仕様もわかりやすいし)
f:id:eidaht:20180214220700j:plain
実装してない箇所には「Not Implemented」と表示して、実装忘れを防ぐようにしておきます。
f:id:eidaht:20180214220805j:plain
とりあえずbooleanやらintegerやらfloatを文字列として出力したところ。
f:id:eidaht:20180214221122j:plain
この部分はJSON文字列としての出力を想定したところなので、コンテナになっている型は、すべてJSONでのArrayまたはObjectにあてはめます。
このライブラリのTypedArray、Array、List、2WayListは、JSONでのArrayにあてはめます。
このライブラリのMap、Structureは、JSONのObjectにあてはめます。

とりあえず今日のところはこんなところで。

「ウィィィィース!(WYYYYS)」(未完成)

ウィィィィース!(α版)
赤毛の冒険者が半キャラずらしで、草原において犬とかの敵を倒していくゲーム。(未完成です)
ver.0.4 2017/05/13
【KRL3VKHV】
f:id:eidaht:20170513202958j:plain

ミバのアーカイブからサルベージ。はてぶろにアップしてなかったのでとりあえず...

えいだeida_s

Tuesday, January 3rd, 2017 4:11:00 PM

ウィィィィース!(α版)
 赤毛の冒険者が半キャラずらしで敵を倒していくゲーム。
 まだ敵が動かないよ!その他デバッグ情報が出っぱなしとかだけどとりあえず放流だよ!
 【J3KKXD36】



93
View WARC
	
ツララLongIceSword

Wednesday, January 4th, 2017 7:42:00 AM

チィイイイーッス!あ、ドールの果汁100%ジュースどうッスか?
 
 まだ敵が自立的に動かないと言ってもちゃんと向きに合わせてノックバックしてますし、背景キャラクターも端に寄った時だけスクロールとかばっちりッスね。
 総評:いーっす


00
View WARC
	
えいだeida_s

Wednesday, January 4th, 2017 2:38:00 PM

>ツララさん
 ウィィィィース!
 新年はみんなどこかにでかけたりしたですかね。ふぅ、い~なぁ。もっと僕にも休みをくれりあ!
 
 ところでさっそく敵もうごかしてみたので後でアップしときますね!

整数かどうか判定する方法

一つ前の記事で偶数・奇数の判定をする方法を書きました。
偶数・奇数というのは、整数の時に使わない区別だということも書きました。
では変数Xに入っている数値が整数かどうかを判別するにはどうすればよいでしょうか?
これが今回の話題です。

いきなり答えですが、次のようにすると変数Xに入っている数値が整数かどうかを調べることができます。

IF X == FLOOR(X) THEN
  PRINT "せいすう"
ELSE
  PRINT "せいすうでない"
ENDIF

プチコン入門」のタグは、プログラミング初心者の人に見てほしい内容を書いています。

偶数・奇数の判定の仕方

なぜか「偶数 奇数」という検索ワードが目についたので、もしかして偶数/奇数の判定の仕方がわからない人が情報を求めてやってきたかもしれないので書きます。
(主に小中学生を想定します。)

自分も小学生くらいにBASICを覚えたことですけど、その時は「そんなやり方でできるのか!」とちょっと感動しました。
その時に覚えたやり方も後で書いておきます。

その前にちょっとだけ問題です。

[問題1]
1.5は偶数ですか奇数ですか?
また、2.5は偶数ですか奇数ですか?

[答え1]
偶数でも奇数でもない。
偶数か奇数か、というのは整数の時だけ成り立ちます。
小数などにはそういう決まりはありません。なので偶数とも奇数ともいえないのです。

[問題2]
-1は偶数ですか奇数ですか?

[答え2]
-1は奇数。
また、-2は偶数、-3は奇数、以下同様です。

このような問題を出したのは、何を奇数や偶数と決めるかをはっきりさせたかったからです。
では偶数と奇数は以下のように決めましょう。
偶数は「2で割り切れる整数」、奇数は「2で割り切れない整数」。
この決まりからすると、0も偶数となります。
では具体的に判定する方法を書いていきましょう。
判別したい数字がX%に入っているものとします。


(1) MODを使う方法
MODというのは、割り算の余りを求めるものです。
5を2で割った余りを求めたい時、 5 MOD 2 のように書きます。
これが先ほど「2で割り切れる整数」という表現に最も近い書き方です。

IF (X% MOD 2)==0 THEN
  PRINT "グウスウ"
ELSE
  PRINT "キスウ"
ENDIF

ただしMODを使う場合、注意があります。
マイナスの数に対して使うとマイナスの数を返すのです。
例えば、-1 MOD 2 の答えは -1 になります。
だから奇数かどうかを調べたいからといって、

IF (X% MOD 2) == 1 THEN   '奇数かどうか調べたい(ダメ)

のように書いてしまうと思ったとおりの結果になりません。

IF (X% MOD 2) != 0 THEN   '奇数かどうか調べたい (よい)

のように書きましょう。


(2) ANDを使う方法
ANDは論理積というものです。
まずはプログラムを見てみましょう。

IF (X% AND 1) == 0 THEN
  PRINT "グウスウ"
ELSE
  PRINT "キスウ"
ENDIF

ANDは2進数で考えます。
例えば5は2進数で 101 です。1は 2進数でも 1です。
ANDは2進数の時のそれぞれの桁同士のかけ算と考えればわかりやすいです。
1の方は桁が足りないので頭に0を補って、 001 と考えます。
5=101
1=001
なので、
答え001
です。
4=100なので、 4 AND 1は 0 です。

このように、X% AND 1 のように書くと、X%を2進数で表した時の一番下の桁が 1 かどうかを調べることができます。
実は偶数は2進数で表すと一番下の桁は 0 、奇数は2進数で表すと一番下の桁は 1 になります。
従って最初に書いたやり方で偶数と奇数を判定することができるのです。

ところでマイナスの数の場合はどうでしょうか。
実はマイナスの数の場合でも同じです。
例えば、-1 は2進数で表すと(プチコンでは)、1が32桁分続いた数字になります。でも一番下の桁はやはり 1 です。
マイナスの数の場合でも同じように判定できるのです。


(3) FLOOR関数を使う方法
これが私が最初に覚えたやり方に一番近い方法です。
具体的には次のように書きます。

IF (X%/2) == FLOOR(X%/2) THEN
  PRINT "グウスウ"
ELSE
  PRINT "キスウ"
ENDIF

これは何をやっているのでしょう?
FLOOR関数は、数値の整数部分を取り出す、というものです。

具体的な例で考えてみましょう。
例えばX%は 5 とします。
5/2は2.5です。 FLOOR(5/2)は、2.5の整数部分を取り出すから 2 になります。
2.5と2を比較すると違うので、奇数と判定されます。
今度はX%を 4 とします。
4/2は2です。FLOOR(4/2)は2です。
2と2を比較すると同じなので、偶数と判定されます。

つまり、2で割り切れない時の余りの1の部分が、それを2で割った0.5として現れてくるのです。
だから奇数の時は、FLOORをとらない時とFLOORをとった時で結果が変わってくるのです。

ちなみにマイナスの数の時でも、同じ式で問題ありません。


さて、3つ方法を見ましたが、どれを使うのがよいでしょうか?
(1)の方法が、「2で割り切れない」のが奇数、という最初に書いた決まりを一番わかりやすく表しているので、これを使うのがまずはよいでしょう。
プログラムに慣れてきたら(2)の方法でもよいかもしれません。
(3)の方法はそんなにおすすめできません。ですが、別のことに応用できます。(次の記事にしますので興味があったら見てください。)

LISPのメモリ構造をつくってみる (3)

メモリに格納可能な値は、booleanやintegerなどの基本的な型や、文字列や浮動小数点数などです。
また、それらの値を格納したコンテナを複合型とします。
f:id:eidaht:20180208020857j:plain
ここに書いたのは組み込み型です。
これらのうち、nodeの類はlistなどから間接的に使い、ライブラリの外に直接的には公開されません。

組み込み型以外にもユーザー定義型を定義することができるようにします。
ユーザー定義型は、第4回プチコン大喜利作品のLowerdashのような記法で扱えるようにしてみます。
記法的には構造体のように扱えるようにします。
f:id:eidaht:20180208020916j:plain

LISPのメモリ構造をつくってみる (2)

前回はLISPのメモリ構造といいましたが、実はJSONを読み込んでそれをそのままオブジェクトとして使えるようなものにしたいと考えています。

さて話は戻ります。
プチコン3号にはポインタがないのでメモリ空間を配列を使って自前で実装します。
宣言部分はこんな感じになりました。

f:id:eidaht:20180124223915j:plain

実際はもっと進んでいますが、小出しにしていきます。w

今回はここまで。

LISPのメモリ構造をつくってみる

かなり久しぶりの更新です。
メインの開発機だったOld3DSLLが半年ほど前(2017年8月頃)に喪失してしまったため、活動が止まっていました。
遅まきながらNew3DSLLに2016年12月頃のバックアップを入れて活動再開です。

年が改まって最初の活動として、LISPのメモリ構造を自前で作ってみます。
LISPそのものの基礎的な実装はそこまではそんなに難しくないらしく、いろいろな言語でいろいろな方が作っていらっしゃいます。
しかしプチコンで作ろうとすると、ぶちあたるのが、
・構造体がないこと
・ポインタがないこと
です。
上記のどちらかがあれば作れると思いますが、どちらもありません。
そこで、メモリ構造を模擬したものからつくってみます。
以前に構造体ライブラリとして似たようなものを作っていましたが、それの再設計版です。
以前のものは文字列でメモリ構造を表すというアイデアでしたが、今回は整数の配列でメモリを表すという方法にします。
具体的な実装などはこれからです。
とりあえず今日はここまで。