ð Smalruby ç¬èª â upstream ã«ååšããªããSmalruby ã®ããã«æ°èŠè¿œå ãããæ¡åŒµæ©èœ
- Smalruby ã©ã³ã¿ã€ã 察å¿: âïŒãã©ãŠã¶å°çšïŒ
- ããã©ã«ã衚瀺: â ïŒæ¡åŒµæ©èœã©ã€ãã©ãªã«ããã©ã«ãã§è¡šç€ºãããïŒ
ã¹ã¢ãŠã«ããŒç²ååïŒSmalruby KoshienïŒç«¶æçšã®æ¡åŒµæ©èœããã¬ã€ã€ãŒïŒåå è ã® AI ããã°ã©ã ïŒããããäžãç§»åããã¢ã€ãã ãéããªãããŽãŒã«ãç®æãã¿ãŒã³å¶ã®ç«¶æãæ¬æ¡åŒµã¯ç«¶æãšåãã«ãŒã«ã§åã**å èµã®ç·Žç¿ã²ãŒã ïŒã¢ãã¯ïŒ**ãæã¡ããããæ å ±ååŸãç§»åã³ãã³ããã«ãŒãèšç®ãªã©ã®ãããã¯ã 1 ã€ãã€å®è¡ããªãã AI ããããã°ã§ããã
å èµç·Žç¿ã²ãŒã ã®ç¹åŸŽ:
- æ¬çªãšåãã«ãŒã«: 1 ã¿ãŒã³ã«è¡å 2 åãŸã§ã»ç§»å㯠1 åã»ç§»åã¯ã¿ãŒã³çµäºæã«ç¢ºå®ïŒäºçŽå¶ïŒã»æ°ŽããŸã/ãã€ããã€ã/ã°ãã ã/劚害ãã£ã©/æ©è¡ããŒãã¹/ãŽãŒã«ããŒãã¹/50 ã¿ãŒã³å¶éãã«ãŒã«éåã¯æ¬çªãšåããšã©ãŒã¡ãã»ãŒãžã§å ±åããã
- 壿èšã¿ã€ã ã¢ãŠããªã: æ¬çªã® 1 ã¿ãŒã³å¶éæéã¯åçŸããªããèããªãã 1 åœä»€ãã€è©Šãã
- çžæ AI ãéžã¹ã: ãŽãŒã«åªå / ã¢ã€ãã åªå / 忢 / ã©ã³ãã ïŒç·Žç¿èšå®ã¢ãŒãã«ïŒ
- ãªãªãžãã«ç·Žç¿ãããã忢±: ç«¶æããããšåã圢åŒïŒ17Ã17ã»å€åšå£ã»ãŽãŒã« 1 ã€ã»ãã€ããã€ããªãã§å°éå¯èœïŒã® Smalruby å°çšããã
- ç«¶æåå è ã®å°åŠçã»äžåŠçãšããŠãèªåã® AI ããã°ã©ã (Smalruby ã¹ã¯ãªãã) ãç«¶æãµãŒãã«æ¥ç¶ããŠåãããã
- æåž«ãšããŠãçåŸãã¡ãããŒã ã§ã¢ã«ãŽãªãºã ãèããŠç«¶ãåã顿ãšããŠäœ¿ããã
- 倧äŒéå¶ãšããŠãç«¶æçšã®ãµãŒããšå ±éã® API ã§ããåãã§ããæ¡åŒµæ©èœãæäŸããã
- ããã°ã©ãã³ã°åŠç¿è ãšããŠãã¿ãŒã³å¶ã²ãŒã ãéããŠçµè·¯æ¢çŽ¢ãªã©ã®ã¢ã«ãŽãªãºã ãåŠã³ãã
- ãããã¯ãã¬ããã®ãæ¡åŒµæ©èœã远å ããã Smalruby Koshien ãéžã¶ïŒãã®ãšãç·Žç¿ã²ãŒã ããã«ãéãïŒ
- ãããã¯ãã¬ããã« Koshien å°çšãããã¯ã衚瀺ããã
connectGameãããã¯ã§ç·Žç¿ã²ãŒã ãéå§ïŒããã«ãå衚瀺ãããïŒ- ã¿ãŒã³ããšã«
getMapAreaã§ãããæ å ±ãååŸããmoveToãªã©ã§ç§»åãäºçŽ turnOverã§ã¿ãŒã³ãçµäºãããšãç§»åã»èšçœ®ã確å®ããçžæ AI ãšåŠšå®³ãã£ã©ãåã- ããã«ã®ç€é¢ã»ã¹ã³ã¢ã»ãã°ã§çµæã確èªããªãã 4ã5 ãç¹°ãè¿ã㊠AI ãè²ãŠã
ç§»åã»æå°åã»éãããã§ããåžžé§ããã«ãç€é¢å šäœïŒå°åœ¢ã»ã¢ã€ãã ã»äž¡ãã¬ã€ã€ãŒã»åŠšå®³ãã£ã©ãèªåã® 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ïŒã衚瀺ãããã®ã§ãããã°ã©ã ããèŠããŠããå€ãçŽæ¥ç¢ºèªã§ããã
ã¡ãã¥ãŒããŒã®ãã¹ã¢ãŠã«ããŒç²åå > ç·Žç¿èšå®ãããéããç·Žç¿ãããã»èªåã®ãã¬ã€ã€ãŒïŒplayer1/player2ïŒã»çžæ AIïŒãŽãŒã«åªå
/ã¢ã€ãã åªå
/忢/ã©ã³ãã ïŒãéžã¶ãèšå®ã¯ localStorageïŒsmalruby:koshienMockConfigïŒã«ä¿åãããæ¬¡ã« connectGame ãå®è¡ãããšããã䜿ãããã
éçºã»ãããã°çšã® 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 çŽçµïŒã¯ç¶æãããã
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 ãããã¯å€æ
packages/scratch-gui/src/reducers/koshien-file.jsâ Koshien ãã¡ã€ã«ç®¡ç statepackages/scratch-gui/src/reducers/koshien-mock-panel.jsâ ç·Žç¿ã²ãŒã ããã«ã®è¡šç€ºç¶æ - AI ä¿åã¹ããŒã¿ã¹ïŒrubytee ããã®èªåä¿åãšé£åïŒ
packages/scratch-gui/src/containers/ruby-tab/koshien-snippets.jsonâ Monaco ãšãã£ã¿ã® Koshien ã³ãŒãè£å®
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â ãããæååã»çµè·¯èšç®ãªã©ã®å ±æãŠãŒãã£ãªãã£
ãªãïŒKoshien ç«¶æãµãŒãã¯å¥ãªããžããªã§ç®¡çïŒã
è¡ååæ°ã®ã«ãŒã«: 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 ãã¢ã€ãã ïŒã
ãããããèŠã â ãŽãŒã«ãžã®çµè·¯ãèšç® â 1 æ©é²ã â ã¿ãŒã³ãçµäºããããç¹°ãè¿ãæå°ã® AIããããã¯ã§çµããšæ¬¡ã®äžŠã³ã«ãªãïŒãªã¹ã æççµè·¯ ã¯ããã¹ãŠã®ã¹ãã©ã€ãã§äœ¿ããã§äœãïŒ:
- ãHATããã¬ã€ã€ãŒåã
player1ã«ããŠã²ãŒã ãµãŒããŒãžæ¥ç¶ãã - ãã£ãšç¹°ãè¿ã:
- èªåã®äœçœ® ã®ãŸããã®ããããååŸãã
- ãŽãŒã«ãŸã§ã®æççµè·¯ããªã¹ã
æççµè·¯ã«ä¿åãã æççµè·¯ã® 2 çªç®ïŒ= 次㮠1 ãã¹ïŒãžç§»åãã- ã¿ãŒã³ãçµäºãã
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-filereducer ã§ 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 æ¡åŒµ
äž»èŠ PR ã¯å±¥æŽãåç
§ïŒfeat:.*koshien ã§ grepïŒã





