|
4 |
GameFSMの改良 (21) |
夜空に瞬く星をシミュレーションする星の点滅プログラムです。
// pack ∘ st のラッパ (packed star)
function Bit#(SizeOf#(StarTwinkle)) ps(U8 x, U8 y, U8 p, U8 phi);
return pack(st(x, y, p, phi));
endfunction
// 星テーブル (packed ビット列)
Bit#(SizeOf#(Vector#(NumStars, StarTwinkle))) starTwinkleBits = {
// ps(x, y, P, phi) 形式
`include "stars_xy.vh"
};
// Vector#(NUM_STARS, StarTwinkle) に変換
Vector#(NumStars, StarTwinkle) starTwinkleTable =
reverse(unpack(starTwinkleBits));
// 1フレーム分、星の点滅を更新する Stmt
// frameCnt : グローバルフレームカウンタ (60Hzで+1される想定)
// baseX,baseY : 星描画の基準座標(ロゴ全体にオフセットを掛けたければここで指定)
function Stmt stepStarField();
let s = starTwinkleTable[i];
let phaseIdx = (truncate(counter) + s.phase) % s.period;
let on = (phaseIdx < (s.period >> 1));
return (seq
for (i <= 0; i < fromInteger(valueOf(NumStars)); i <= i + 1) seq
if (on)
setDot(s.x, s.y, 7);
else
setDot(s.x, s.y, 0);
endseq
endseq);
endfunction
ファイルstars_xy.vhは、サポートプログラムにより元画像から白点の位置を抜き出したデータであり、以下のようなものです。コメントにもありますが、 $$(x, y, P, \phi)$$ の形式です。これをStringでChatGPTに改善してもらったように{ps1, ps2, ...., psn}と並べます。 packed star形式としてps関数を用いて以下のように初期化し、
// loaded 76 stars from stars_xy.csv
// ps(x, y, P, phi) 形式
ps( 0, 0, 64, 19),
ps(204, 1, 16, 7),
ps( 63, 2, 16, 11),
:
ps( 33, 251, 32, 8),
ps(165, 254, 8, 0),
ps(232, 254, 64, 33)
使う場合はあらかじめunpackしてreverseしたテーブルのほうを引いて使います。
ChatGPT 5.1に各種サポートプログラムをpythonで作成してもらった他、bsvについて 9割方はChatによるもので ユーザはデバッグ係となっていました。
ChatGPT 5.1は慣れないbsvこそ時々文法誤りコードを吐くことがあるものの、pythonは完璧な出来映えで一度もバグを入れることはありませんでした。pythonの方が得意な印象ですが、世の中に有るコードベースを考えたら無理もありません。
これ程pythonが得意なら。今後もう人間がpythonを書くことは無くなり、pythonは機械語のような位置付けになるかもしれません。昔は機械語のバイナリを覚えたものですが(C3,00,80,...)それと同じことになりそうです。
幸いbsvはまだそこまで得意ではないので、まだ人間が書く楽しみが残されています。
Leave a Comment