diff --git a/game-cloud/game-module-aigc/game-module-aigc-server/src/main/java/com/wanxiang/huijing/game/module/aigc/saa/SaaPrompts.java b/game-cloud/game-module-aigc/game-module-aigc-server/src/main/java/com/wanxiang/huijing/game/module/aigc/saa/SaaPrompts.java index b1574b6a..85a69ef6 100644 --- a/game-cloud/game-module-aigc/game-module-aigc-server/src/main/java/com/wanxiang/huijing/game/module/aigc/saa/SaaPrompts.java +++ b/game-cloud/game-module-aigc/game-module-aigc-server/src/main/java/com/wanxiang/huijing/game/module/aigc/saa/SaaPrompts.java @@ -199,14 +199,14 @@ final class SaaPrompts { - **会输 + 胜负演出**: 游戏要真能输(掉命/超时/资源耗尽任一),胜/负时画面有明确变化或文案(别只停住);无天然失败态的(打地鼠/三消/接物)加限时/限回合终态(见硬约束 3)。 - HUD/进展可见: 分数/剩余看得到; 前 30 秒能上手、有正反馈、看得到分数增长。 - 【★保真铁律(最高优先级,违反=失败)★】下面三个【参照】**仅示范 gameDefinition 的结构与 rt 面的正确用法,不是玩法清单**。 + 【★保真铁律(最高优先级,违反=失败)★】下面四个【参照】**仅示范 gameDefinition 的结构与 rt 面的正确用法,不是玩法清单**。 - 你**必须按题面产出对应的实体/行为/规则**,不得用参照里的玩法替换题面玩法。例: · 打砖块=挡板+球+砖墙+反弹消砖,清完砖判胜、球落底判负; · 贪吃蛇=蛇身实体数组(挂状态实体)+食物+吃到变长(计入 rt.addScore)+撞墙/自碰判负; · 射击=飞机+发射子弹+敌机+击中清场,清完判胜、被撞判负; · 跑酷=持续向前+躲障碍/跳跃+距离/分数累积。 - - **严禁因为参照1是躲避、参照2是打地鼠、参照3是打砖块,就把题面要求的玩法坍缩成躲避/打地鼠/打砖块**。参照只借结构,玩法一律照题面来。 - - 三个参照覆盖三种异构形态(实时连续+spawn / 离散点击声明式 / 实时反弹+消除);题面若都不贴近,按本约定的结构与 rt 面自行组织对应玩法,别硬套最像的那个。 + - **严禁因为参照1是躲避、参照2是打地鼠、参照3是打砖块、参照4是贪吃蛇,就把题面要求的玩法坍缩成躲避/打地鼠/打砖块/贪吃蛇**。参照只借结构,玩法一律照题面来。 + - 四个参照覆盖四种异构形态(实时连续+spawn / 离散点击声明式 / 实时反弹+消除 / 网格定时步进);题面若都不贴近,按本约定的结构与 rt 面自行组织对应玩法,别硬套最像的那个。 【参照1(严格按此结构产 JSON, 但实现成题目要求的那款游戏; 这是个躲避类示例)】 { @@ -270,6 +270,27 @@ final class SaaPrompts { "scenes":[{"id":"main","entityRefs":["world","paddle","ball"]}], "rules":[{"id":"clear","condition":"rt.query('brick').length === 0","outcome":"win"}] } + + 【参照4(网格步进类:贪吃蛇——蛇身=挂状态实体的有序格子数组(头在前);定时步进:新头入、无食去尾;吃食身体变长+rt.addScore+食物换位;撞墙或撞自身判负。每步按 body 重绘 seg 实体,免逐段维护索引)】 + { + "components":[ + {"id":"bg","kind":"render","shape":"fill","color":"#0b130b"}, + {"id":"rseg","kind":"render","shape":"rect","color":"#5dd35d","w":22,"h":22}, + {"id":"rfood","kind":"render","shape":"rect","color":"#ff5252","w":22,"h":22} + ], + "entities":[ + {"id":"world","transform":{"position":{"x":0,"y":0}},"components":["bg"]}, + {"id":"gamestate","transform":{"position":{"x":0,"y":0}},"components":[]}, + {"id":"food","transform":{"position":{"x":278,"y":468}},"components":["rfood"]} + ], + "behaviors":[ + {"id":"init","trigger":"init","code":"const G=rt.getEntity('gamestate'); G.cell=26; G.cols=15; G.rows=26; G.ox=18; G.oy=130; G.dir={x:1,y:0}; G.body=[{x:7,y:13},{x:6,y:13},{x:5,y:13}]; G.food={x:10,y:13}; G.step=0;"}, + {"id":"turn","trigger":"update","code":"const G=rt.getEntity('gamestate'); const d=G.dir; let n=null; if(rt.input.isDown('ArrowLeft')&&d.x===0) n={x:-1,y:0}; else if(rt.input.isDown('ArrowRight')&&d.x===0) n={x:1,y:0}; else if(rt.input.isDown('ArrowUp')&&d.y===0) n={x:0,y:-1}; else if(rt.input.isDown('ArrowDown')&&d.y===0) n={x:0,y:1}; if(n) G.dir=n;"}, + {"id":"tick","trigger":"update","code":"const G=rt.getEntity('gamestate'); G.step+=dt; if(G.step<0.16) return; G.step=0; const h=G.body[0], nh={x:h.x+G.dir.x,y:h.y+G.dir.y}; if(nh.x<0||nh.x>=G.cols||nh.y<0||nh.y>=G.rows||G.body.some(s=>s.x===nh.x&&s.y===nh.y)){ rt.fx.beep('lose'); rt.lose(); return; } G.body.unshift(nh); if(nh.x===G.food.x&&nh.y===G.food.y){ rt.addScore(1); rt.fx.burst(G.ox+nh.x*G.cell,G.oy+nh.y*G.cell,'#ffeb3b'); rt.fx.beep('brick'); let f; do{ f={x:rt.randInt(0,G.cols-1),y:rt.randInt(0,G.rows-1)}; }while(G.body.some(s=>s.x===f.x&&s.y===f.y)); G.food=f; } else { G.body.pop(); } for(const e of rt.query('seg')) rt.destroy(e); for(const s of G.body) rt.spawn({x:G.ox+s.x*G.cell,y:G.oy+s.y*G.cell,tags:['seg'],components:['rseg']}); const fo=rt.getEntity('food'); if(fo){ fo.x=G.ox+G.food.x*G.cell; fo.y=G.oy+G.food.y*G.cell; }"} + ], + "scenes":[{"id":"main","entityRefs":["world","gamestate","food"]}], + "rules":[{"id":"win","condition":"rt.score >= 15","outcome":"win"}] + } """; // ============================================================================