Skip to content

Latest commit

 

History

History
 
 

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

拡匵機胜: Smalruby Koshien

🆕 Smalruby 独自 — upstream に存圚しない、Smalruby のために新芏远加された拡匵機胜

  • Smalruby ランタむム察応: ❌ブラりザ専甚
  • デフォルト衚瀺: ✅拡匵機胜ラむブラリにデフォルトで衚瀺される

抂芁

スモりルビヌ甲子園Smalruby Koshien競技甚の拡匵機胜。プレむダヌ参加者の AI プログラムがマップ䞊を移動し、アむテムを集めながらゎヌルを目指すタヌン制の競技。本拡匵は競技ず同じルヌルで動く**内蔵の緎習ゲヌムモック**を持ち、マップ情報取埗、移動コマンド、ルヌト蚈算などのブロックを 1 ぀ず぀実行しながら AI をデバッグできる。

内蔵緎習ゲヌムの特城:

  • 本番ず同じルヌル: 1 タヌンに行動 2 回たで・移動は 1 回・移動はタヌン終了時に確定予玄制・氎たたり/ダむナマむト/ばくだん/劚害キャラ/歩行ボヌナス/ゎヌルボヌナス/50 タヌン制限。ルヌル違反は本番ず同じ゚ラヌメッセヌゞで報告される
  • 壁時蚈タむムアりトなし: 本番の 1 タヌン制限時間は再珟しない。考えながら 1 呜什ず぀詊せる
  • 盞手 AI を遞べる: ゎヌル優先 / アむテム優先 / 停止 / ランダム緎習蚭定モヌダル
  • オリゞナル緎習マップを同梱: 競技マップず同じ圢匏17×17・倖呚壁・ゎヌル 1 ぀・ダむナマむトなしで到達可胜の Smalruby 専甚マップ

ナヌザヌストヌリヌ

  • 競技参加者の小孊生・䞭孊生ずしお、自分の AI プログラム (Smalruby スクリプト) を競技サヌバに接続しお動かしたい
  • 教垫ずしお、生埒たちがチヌムでアルゎリズムを考えお競い合う題材ずしお䜿いたい
  • 倧䌚運営ずしお、競技甚のサヌバず共通の API でやり取りできる拡匵機胜を提䟛したい
  • プログラミング孊習者ずしお、タヌン制ゲヌムを通じお経路探玢などのアルゎリズムを孊びたい

UI / 操䜜フロヌ

  1. ブロックパレットの「拡匵機胜を远加」から Smalruby Koshien を遞ぶこのずき緎習ゲヌムパネルが開く
  2. ブロックパレットに Koshien 専甚ブロックが衚瀺される
  3. connectGame ブロックで緎習ゲヌムを開始パネルが再衚瀺される
  4. タヌンごずに getMapArea でマップ情報を取埗し、moveTo などで移動を予玄
  5. turnOver でタヌンを終了するず、移動・蚭眮が確定し、盞手 AI ず劚害キャラが動く
  6. パネルの盀面・スコア・ログで結果を確認しながら 4〜5 を繰り返しお AI を育おる

緎習ゲヌムパネルkoshien-mock-panel

緎習ゲヌムパネル

移動・最小化・閉じるができる垞駐パネル。盀面党䜓地圢・アむテム・䞡プレむダヌ・劚害キャラ。自分の AI が未探玢のマスは暗く衚瀺、タヌン数、スコア、残り行動・移動・ダむナマむト・ばくだん、そしおすべおの行動ずルヌル゚ラヌのログを衚瀺する。1380×600pxChromebookの画面でも党䜓が芋えるサむズ。盀面のマップチップは垞に 1:1パネルサむズが倉わっおも瞊暪比が厩れない。

  • 衚瀺タむミング: 拡匵機胜の远加時 / connectGame 実行時に自動で開く
  • 閉じた埌: メニュヌバヌの「スモりルビヌ甲子園 > 緎習ゲヌムパネル」から再衚瀺
  • 盀面のスプラむトは公匏ビュヌアの画像を蚱可を埗お同梱

緑の旗・停止ボタン

「タヌン N / 50」の右端に緑の旗ず**停止赀**のボタンがある。ステヌゞの同名ボタンず完党に同じ挙動vm.greenFlag() / vm.stopAll()で、パネルがステヌゞを隠しおいおもゲヌムを開始・停止できる。未接続ヒント衚瀺のずきも衚瀺される。

緑の旗を抌すず: モックの状態がリセットされ、スクリプト゚リアの「プレむダヌ名を◯◯にしおゲヌムサヌバヌぞ接続する」HAT ブロックが起動しお、その䞋に぀ながったブロックが最初から実行されるマップが衚瀺され、AI が動き出す。VM 偎は PROJECT_START で startHats('koshien_connectGame') を呌ぶkoshien: green flag started N connect-game thread(s) をログ出力。副䜜甚は実 Runtime のテスト test/unit/koshien_green_flag_hats.js で担保。

「すべお」/「じぶん」衚瀺切替

じぶん衚瀺

盀面は 2 ぀の衚瀺をボタンで切り替えられる:

  • すべお: ゲヌムの真の状態未探玢マスにはうすい圱
  • じぶん: 自分の AI が知っおいる情報だけ。各マスは最埌に探玢した時点の倀のたた アむテムを取っおも、そのマスを再探玢するたで残っお芋える。未探玢マスは暗色、 ゎヌルは接続時に教えられるので金枠で衚瀺、盞手は最埌に芖界に入った䜍眮にだけ衚瀺。 「すべお」ず芋比べるこずで「探玢しおいないから差分が出おいる」こずを確認できる

ログの拡倧

ログ拡倧

「ログ」ラベル右端の「🔲 拡倧」ボタンで、じぶん/あいおペむンを隠しおログを瞊に広げられる衚瀺切替・タヌン・緑の旗/停止ボタンは残る。「🔳通垞」で元に戻る。長い実行ログを远いながらデバッグするずきに䜿う。

マスのツヌルチップ

ツヌルチップ

盀面のマスにマりスを 300ms 眮くず、そのマスの情報が吹き出しで衚瀺されるマりスを動かしおも 300ms は残る:

  • 座暙 x:y
  • マップ 倀 (名前) — 䟋: マップ 3 (ゎヌル)、マップ e (アむテム)
  • アむテム 倀 名前 埗点 — 䟋: アむテム e 草薙剣 +60、なければ なし
  • あいお / 劚害キャラクタヌがそのマスにいるかいなければ -

衚瀺䞭のビュヌに連動する: 「じぶん」ビュヌでは AI の map() が返す倀そのもの最埌に探玢した時点の倀・未探玢は -1が衚瀺されるので、プログラムから芋えおいる倀を盎接確認できる。

緎習蚭定モヌダルkoshien-settings-modal

緎習蚭定モヌダル

メニュヌバヌの「スモりルビヌ甲子園 > 緎習蚭定」から開く。緎習マップ・自分のプレむダヌplayer1/player2・盞手 AIゎヌル優先/アむテム優先/停止/ランダムを遞ぶ。蚭定は localStoragesmalruby:koshienMockConfigに保存され、次に connectGame を実行したずきから䜿われる。

Koshien テストモヌダル

開発・デバッグ甚の Koshien テストモヌダル (koshien-test-modal) があり、競技サヌバなしでロヌカルテストができる。

「AIを詊す」では、線集䞭スプラむト単䜓ではなく プロゞェクト党䜓ステヌゞ + すべおの スプラむト を 1 ぀のプログラムずしお出力する。これは「AIを保存」が曞き出す .rb ず 同䞀の生成結果であり、競技で実際に動く AI そのもの。「詊す」ず「保存」が同じコヌドに なるよう、䞡者は generateProjectCodesrc/lib/ruby-script-preview.jsを共有する。 線集䞭スプラむトだけを出力するず、AI 本䜓が別スプラむトにある堎合やステヌゞ遞択䞭に 「䞭身が空の小さな AI」ず誀刀定され、埌述のフォヌルバック導線も出ないIssue #845。 ステヌゞを先頭に出力するので「すべおのスプラむトで぀かう」グロヌバル倉数・リスト 䟋: $最短経路がステヌゞの def initialize で初期化され、実行可胜になるv1 / v2 䞡察応。 Ruby タブで線集䞭の未保存コヌドも targetsCode で取り蟌むため、ブロックぞ倉換する前の 状態でもそのたた詊せる。

AI ゜ヌスは base64 化しおビュヌアの ?player1=data:<base64> ク゚リパラメヌタに枡す src/lib/koshien-test-url.js の buildKoshienTestUrl / encodeAiToPlayerParam。 ただし耇雑な AI経路探玢などは゜ヌスが長く、URL 長制限MAX_KOSHIEN_TEST_URL_LENGTH = 8000 文字を超えおビュヌアの起動に倱敗しうる。そのため URL が長すぎる堎合は buildKoshienTestPlan が tooLong: true を返し、モヌダルは AI 無しの URL でビュヌアを ロヌドデフォルト AIしたうえで、AI を .rb ファむルずしお保存する導線 koshien-test-too-long-banner / koshien-test-download-aiを衚瀺する。 ナヌザヌは保存した .rb をビュヌアから読み蟌んで詊す。単玔な AI の埓来挙動URL 盎結は維持される。

䞻芁ファむル

scratch-gui

コンポヌネント

  • packages/scratch-gui/src/components/koshien-mock-panel/ — 緎習ゲヌムパネルcanvas 盀面 + ステヌタス + ログ、公匏スプラむト画像を同梱
  • packages/scratch-gui/src/containers/koshien-mock-panel.jsx — パネルの VM 連携KOSHIEN_MOCK_STATE / EXTENSION_ADDED むベント賌読、自動オヌプン
  • packages/scratch-gui/src/components/koshien-settings-modal/ — 緎習蚭定モヌダル
  • packages/scratch-gui/src/components/koshien-test-modal/koshien-test-modal.jsx — テスト甚モヌダル
  • packages/scratch-gui/src/lib/ruby-script-preview.js — コヌド生成。generatePreviewCode線集䞭スプラむトのプレビュヌ甚ず generateProjectCodeプロゞェクト党䜓。「AIを詊す」「AIを保存」が共有

ラむブラリ

  • packages/scratch-gui/src/lib/koshien-mock-config.js — 緎習ゲヌム蚭定localStorageず runtime.getKoshienMockConfig の配線
  • packages/scratch-gui/src/lib/libraries/extensions/koshien/ — 拡匵機胜登録アむコン、descriptions
  • packages/scratch-gui/src/lib/ruby-generator/koshien.js — Koshien ブロック → Ruby 倉換
  • packages/scratch-gui/src/lib/ruby-to-blocks-converter/koshien* — Ruby → Koshien ブロック倉換

Redux

  • packages/scratch-gui/src/reducers/koshien-file.js — Koshien ファむル管理 state
  • packages/scratch-gui/src/reducers/koshien-mock-panel.js — 緎習ゲヌムパネルの衚瀺状態
  • AI 保存ステヌタスrubytee からの自動保存ず連動

スニペット

  • packages/scratch-gui/src/containers/ruby-tab/koshien-snippets.json — Monaco ゚ディタの Koshien コヌド補完

scratch-vm

  • packages/scratch-vm/src/extensions/koshien/index.js — 拡匵機胜本䜓ブロック定矩ず、緎習ゲヌムを操䜜するクラむアント。行動回数の抑止・ログ・状態ブロヌドキャスト
  • packages/scratch-vm/src/extensions/koshien/mock-game.js — 緎習ゲヌム゚ンゞンタヌン解決・採点・劚害キャラ
  • packages/scratch-vm/src/extensions/koshien/mock-rival.js — 内蔵の盞手 AIゎヌル優先/アむテム優先/停止/ランダム
  • packages/scratch-vm/src/extensions/koshien/mock-maps.js — 同梱のオリゞナル緎習マップ
  • packages/scratch-vm/src/extensions/koshien/map-utils.js — マップ文字列・経路蚈算などの共有ナヌティリティ

infra

なしKoshien 競技サヌバは別リポゞトリで管理。

ブロックパレット

ブロックパレット

関連ブロックopcode ず挙動

行動回数のルヌル: 1 タヌンに「行動」は 2 回たで察象 = マップ取埗・移動・ダむナマむト/ばくだん蚭眮。移動はさらに 1 タヌンに 1 回たで。䞊限を超えた呌び出しは実行されず、緎習ゲヌムパネルのログに゚ラヌずしお衚瀺される倱敗した行動も枠を消費する — 本番ず同じ。

opcode Ruby 衚珟 行動 挙動
connectGame koshien.when_connect_game(name:) do ... end (HAT) - ゲヌム開始。緑の旗で起動し、緎習ゲヌム緎習蚭定のマップ・盞手AIが始たる。自分の䜍眮ずゎヌル座暙が分かる
getMapArea koshien.get_map_area(pos) 1 指定座暙の ±25×5 を探玢しお自分のマップに蚘録する端では窓が瞮む。盞手はこの窓に入っおいれば䜍眮が分かる。劚害キャラは垞に䜍眮が分かる
map koshien.map(pos) - 自分のマップの倀を返す。探玢した時点の倀未探玢は -1、アむテムは "a"〜"D" の文字
mapAll koshien.map_all - 自分のマップ党䜓を「行,行,...」の文字列で返す未探玢は -
mapFrom koshien.map_from(pos, mapstr) - 倉数に保存したマップ文字列から倀を読む
moveTo koshien.move_to(pos) 1 東西南北 1 マスの移動予玄。䜍眮が倉わるのは「タヌンを終了する」の実行時。斜め・2 マス・壁は「移動できない座暙です」゚ラヌ移動暩は消費。氎たたりに入るず次の移動 1 回はぬけ出すだけに䜿われる
calcGoalRoute koshien.calc_route(result: リスト) - 自分→ゎヌルの最短経路を蚈算しおリストに保存"x:y" の列。先頭 = 珟圚地。自分のマップで蚈算するため未知のマスは「通れる」ずみなす。到達䞍胜なら芁玠 1 個
calcRoute koshien.calc_route(src:, dst:, except_cells:, result:) - 任意 2 点間の最短経路。except_cells のマスは壁扱い。マスの重み: 空間/アむテム=1、氎=2、未探玢=4、ゎヌル=3、壁は䞍通
setItem koshien.set_dynamite(pos) / koshien.set_bomb(pos) 1 蚭眮予玄タヌン終了時に反映。基点はそのタヌンの移動予玄先なければ珟圚地から 1 マス以内。ダむナマむト: 空間か氎に蚭眮可、タヌン終了時に䞊䞋巊右の壊せる壁を空間にする。ばくだん: 空間のみ、盀面に枛点アむテム D(-40) ずしお眮かれ、螏んだ者自分含むが枛点。各 2 個たで、無効な蚭眮でも 1 個消費
locateObjects koshien.locate_objects(result:, cent:, sq_size:, objects:) - 自分のマップの正方圢範囲から指定の倀䟋 "ABCD"のマスを探しおリストに保存
targetCoordinate koshien.player / koshien.goal / koshien.other_player / koshien.enemy_x/_y 付きも - 座暙を返す。自分ずゎヌルは垞に分かる。盞手は最埌にマップ取埗の窓に入った時点の䜍眮未確認なら空。劚害キャラは最埌にマップ取埗した時点の䜍眮
turnOver koshien.turn_over - タヌンを終了する。移動・蚭眮が確定し、盞手 AI ず劚害キャラが動き、アむテム取埗・採点が行われお次のタヌンぞ。行動回数ず移動暩が回埩する
position / positionOf koshien.position(x, y) / koshien.position_of_x(pos) 等 - "x:y" 文字列ず数倀の盞互倉換ゲヌムには圱響しない
object koshien.object("goal") 等 - 名前→マップ倀の倉換空間=0, 壁=1, 蔵=2, ゎヌル=3, 氎たたり=4, 壊せる壁=5, お茶="a" など
setMessage koshien.set_message(msg) なし メッセヌゞを蚭定する行動回数を消費しない

各ブロックの Ruby 衚珟の詳现は docs/smalruby-language-spec-extensions.ja.md を参照。

緎習ゲヌムのルヌル本番ず同じ

  • 17×17 のマップ。50 タヌン以内にゎヌルに着くずゎヌルボヌナス 100 - ((タヌン-1)/10)*101〜10T=100点、 、41〜50T=60点。50 タヌンで未ゎヌルは -70 点
  • アむテム螏むず自動取埗: a お茶 +10 / b 和菓子 +20 / c 侁銀 +30 / d シロむルカ +40 / e 草薙剣 +60 / A 毒キノコ -10 / B 蛇 -20 / C トラバサミ -30 / D 爆匟 -40。䞡者が同じタヌンに同じマスで取るず埗点は半分ず぀
  • 移動 5 タヌンごずに歩行ボヌナス +3
  • 劚害キャラクタヌ: ゎヌルから出珟。近く呚囲 3 マスのプレむダヌを远いかける2 マス手前で止たる。41 タヌン目からは怒っおマップ党䜓を远跡。接觊するず -10。草薙剣を取ったプレむダヌは接觊で +30撃退。埩掻しない
  • 本番ずの違いは 1 ぀だけ: 1 タヌンの制限時間壁時蚈タむムアりトを再珟しない。考えながら 1 呜什ず぀実行できる

緎習マップ

緎習蚭定モヌダルで遞べる同梱マップすべお Smalruby オリゞナル。競技マップず同圢匏で、壁を壊さなくおもゎヌルに到達できる:

id 名前 player1 開始 player2 開始 ゎヌル 最短歩数 (p1/p2) 特城
meadow そうげん (3,2) (13,2) (8,9) 12 / 12 開けた入門マップ。䞭倮のゎヌルを壊せる壁が囲む
canal すいろ (1,1) (15,15) (8,8) 18 / 14 氎路が走る。氎たたりの挙動ぬけ出しに 1 回を孊べる
vault くら (8,1) (8,15) (7,7) 15 / 17 ゎヌルが壊せる壁の蔵の䞭すき間あり。ダむナマむトで近道できる
maze めいろ (1,15) (15,1) (8,8) 20 / 24 通路が入り組む。経路蚈算ずこためな探玢が必芁

定矩は packages/scratch-vm/src/extensions/koshien/mock-maps.js17 行×17 文字の文字列。0-5 が地圢、a-e/A-D がアむテム。

サンプルAI

「マップを芋る → ゎヌルぞの経路を蚈算 → 1 歩進む → タヌンを終了する」を繰り返す最小の AI。ブロックで組むず次の䞊びになるリスト 最短経路 は「すべおのスプラむトで䜿う」で䜜る:

  1. 【HAT】プレむダヌ名を player1 にしおゲヌムサヌバヌぞ接続する
  2. ずっず繰り返す:
    1. 自分の䜍眮 のたわりのマップを取埗する
    2. ゎヌルたでの最短経路をリスト 最短経路 に保存する
    3. 最短経路 の 2 番目= 次の 1 マスぞ移動する
    4. タヌンを終了する

Rubyv2ではおおよそ次のコヌド$最短経路[1] は 0 始たりで 2 番目 = 次のマス:

koshien.when_connect_game(name: "player1") do
  loop do
    koshien.get_map_area(koshien.player)
    koshien.calc_route(result: $最短経路)
    koshien.move_to($最短経路[1])
    koshien.turn_over
  end
end

緑の旗ステヌゞたたは緎習ゲヌムパネルを抌すず接続 HAT から実行され、パネルの盀面で 1 タヌンず぀動きを確認できる。劚害キャラを避けたい・アむテムを拟いたい堎合は、locate_objects や koshien.enemy を䜿っお経路を工倫しおいく。

蚭定・デヌタ氞続化

  • koshien-file reducer で Koshien プロゞェクトファむルの状態を管理
  • 緎習ゲヌム蚭定は localStorage smalruby:koshienMockConfigマップ / 自分のプレむダヌ / 盞手 AI

テスト

  • VM 単䜓テスト: packages/scratch-vm/test/unit/extension_koshien.jsブロック/クラむアント、koshien_mock_game.jsゲヌム゚ンゞン、koshien_map_utils.jsナヌティリティ、koshien_green_flag_hats.js緑の旗 → 接続HAT起動を実 Runtime で怜蚌
  • GUI 単䜓テスト: packages/scratch-gui/test/unit/lib/koshien-mock-config.test.js、test/unit/components/koshien-settings-modal.test.jsx、test/unit/components/koshien-mock-panel.test.jsx、test/unit/reducers/koshien-mock-panel-reducer.test.js

関連ドキュメント

  • docs/rubytee/ — Koshien プロゞェクトの自動保存連携
  • docs/extension-smalruby-ruby/ — 競技プログラム䜜成時に掻甚される Ruby 拡匵

関連 Issue / PR

䞻芁 PR は履歎を参照feat:.*koshien で grep。