oneshotlm
Compare all models on this prompt →

Mario-style platformer · qwen-2.5-7b-instruct

Using the pre-provided phaser.min.js (global Phaser), build a playable side-scrolling platformer in the classic Mario style: run and jump across scrolling platforms, stomp enemies, collect coins, and reach a goal flag. Use ONLY procedurally generated graphics, no external image or audio assets.

⛨ sandboxed Open in new tab ↗
transcript · 4 messages
user

Using the pre-provided phaser.min.js (global Phaser), build a playable side-scrolling platformer in the classic Mario style: run and jump across scrolling platforms, stomp enemies, collect coins, and reach a goal flag. Use ONLY procedurally generated graphics, no external image or audio assets.

assistant
write /tmp/ws/index.html (6 bytes)
toolResult

Successfully wrote 6 bytes to /tmp/ws/index.html

assistant

פן {"name": "write", "arguments": {"path": "/tmp/ws/index.html", "content": "<html><head><style>body { margin: 0; overflow: hidden; }</style></head><body><script src=\"phaser.min.js\"></script><script>class GameScene extends Phaser.Scene { create() { this.cameras.main.setBackgroundColor('#70c5ce'); this.physics.world.setBoundseree(0, 0, 50000, 50000); this.scale.scaleMode = Phaser.Scale.FIT; this.scale.pageAlignHoriz = true; this.scale.pageAlignVert = true; const playerSprite = this.add.sprite(200, 80, 'player').setScale(2).setCollissionurdy(20).setOffset(8, 20); this.physics.add.existing(playerSprite); this.physics.add.collider(this.cameras.main, playerSprite); playerSprite.body.setGravityY(600).setBounce(1, 0.95).setVelocityY(-300); this.jumpKey = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE); this.add.image(2500, 500, 'background').setScrollFactor(0.5); let platforms; this.load.sceneCountInGame().then(() => { PLATFORMS = []; const upperLimit = this.scale.width + 40000; for (let x = 0; x <= upperLimit; x += Phaser.Math.Between(100, 400)) { const platform = this.add.rectangle(x, 450, Phaser.Math.Between(20, 100), 20, '#33691e').setAlpha(0.5).setOrigin(0, 1); platform.body.setCollissionurdy((platform.width / 2) + (this.scale.x / 2)).setBounce(0.5).setGravityY(300).setVelocityY(-200); PLATFORMS.push(platform.x); this.physics.add.collider(playerSprite, platform); platforms = platform; } }); this.timer = this.time.addEvent({ delay: 1000, loop: true, callback: () => { const platform = this.add.rectangle(PLATFORMS.sort(() => 0.5 - Math.random())[0], 450, Phaser.Math.Between(20, 100), 20, '#33691e').setAlpha(0.5).setOrigin(0, 1); platform.body.setCollissionurdy((platform.width / 2) + (this.scale.x / 2)).setBounce(0.5).setGravityY(300).setVelocityY(-200); PLATFORMS.push(platform.x); this.physics.add.collider(playerSprite, platform); platforms = platform; } }); this.coin = this.add.image(0, 0, 'coin').setScale(2).setOrigin(0.5).setDepth(100); platform.body.setGravityY(300).setVelocityY(-200); this.physics.add.collider(this.coin, playerSprite, () => { this.coin.x = Phaser.Math.Between(0, upperLimit); this.coin.y = 450; }, null, this); enemyPlatforms = []; const upperLimitEnemy = this.scale.width + 20000; for (let x = 0; x <= upperLimitEnemy; x += Phaser.Math.Between(200, 800)) { const enemyPlatform = this.add.rectangle(x, 350, Phaser.Math.Between(50, 200), 10, '#bb0000').setAlpha(0.5).setOrigin(0, 1); enemyPlatform.body.setCollissionurdy((enemyPlatform.width / 2) + (this.scale.x / 2)).setBounce(0.5).setGravityY(500).setVelocityY(-200); enemyPlatforms.push(enemyPlatform.x); this.physics.add.collider(playerSprite, enemyPlatform, () => { this.physics.world랫ociety(enemyPlatform.body).stopAll(); }, null, this); this.physics.add.collider(playerSprite, enemyPlatform); platform.body.setGravityY(300).setVelocityY(-200); } this.goal = this.add.image(47000, 500, 'flag').setScrollFactor(0.5).setScale(2).setDepth(100); this.physics.add.collider(playerSprite, this.goal, () => { this.scene.start('win'); }, null, this); playerSprite.body.setGravityY(600).setBounce(1, 0.95).setVelocityY(-300); this.physics.add.collider(this.coin, enemyPlatform, () => { this.physics.worldARRIER(enemyPlatform.body).stopAll(); }, null, this); this.physics.add.collider(enemyPlatform, playerSprite); this.physics.add.collider(enemyPlatform, playerSprite, () => { this.physics.worldackle(enemyPlatform.body).stopAll(); }, null, this); } update() { if (this.jumpKey.isDown) { playerSprite.body.setVelocityY(-300); } } } let Phaser = window.Phaser; const config = { type: Phaser.AUTO, width: 800, height: 600, scene: [GameScene], }; const game = new Phaser.Game(config); class WinScene extends Phaser.Scene { create() { this.add.image(200,100,'win').setScale(2); this.scene.stop(); } } game.scene.add('win', WinScene);} style { background-color: #70c5ce; } body { margin: 0; overflow: hidden; } canvas { display:block; position:absolute; top:0; left:0; }</style></body></html>"}} </tool_call>

TAKE IT TO CODE

A single self-contained HTML file — copy it and open in any browser, or reuse the prompt with your own pi-agent run.

RUN

modelqwen-2.5-7b-instruct
vendorQwen
harnesspi-agent
generated2026-08-01

EVALUATION

1/5 blank

Entirely blank white page across all frames; no canvas or content rendered, no response to any input.

off-prompt

Vision grade · anthropic/claude-sonnet-5

MEASUREMENTS

Raw readings from the capture, not a verdict — the grade above is the only judgement. Percentages are how much of the screen changed; the measure under-reports sparse motion on a dark background.

idle motion0.0%
on click0.0%
on drag0.0%
on wheel0.0%
on enter + space0.0%
on arrow keys0.0%
on w/a/s/d0.0%
frame spread0 / 255
console errors0
js errors none

METRICS

runtime38.6s
tokens in3.2k
tokens out2.4k
cached0
cost / run$0.0004