Grand Prix AI League Topic

nevermind, I just had to use

for (let d of dodge[direction]) {
    let [dx, dy] = off[d];
// instead of
for (const d of dodge[direction]) {
    const [dx, dy] = off[d];

because both were called already earlier in the code

1 Like

ye dx dy useful but my code is little difrent

1 Like

does anybody know how to improve this code, I’m stuck:

function inBattleZone() {
    return hero.x > 10 && hero.x < 71 && hero.y > 10 && hero.y < 68;
}

function getDirectionToEnemy() {
    let enemy = hero.opponent;
    if (enemy.x > hero.x) {
        return "right";
    } else if (enemy.x < hero.x) {
        return "left";
    } else if (enemy.y > hero.y) {
        return "up";
    } else {
        return "down";
    }
}

function avoidWaterball() {
    var dirs = ["left", "right", "up", "down"];
    for (var i = 0; i < dirs.length; i++) {
        hero.turn(dirs[i]);
        var dx = dirs[i] === "left" ? -2 : dirs[i] === "right" ? 2 : 0;
        var dy = dirs[i] === "up" ? 2 : dirs[i] === "down" ? -2 : 0;
        if (!hero.waterAtXY(hero.x + dx, hero.y + dy)) {
            hero.jump();
            break;
        }
    }
}

function castWaterball() {
    var dir = getDirectionToEnemy();
    if (dir !== "none") {
        hero.turn(dir);
        hero.waterball();
        avoidWaterball();
    }
}

function findHealBattery() {
    var items = hero.findItems();
    for (var i = 0; i < items.length; i++) {
        if (items[i].type === "heal-battery") return items[i];
    }
    return null;
}

function safeMove(dx, dy) {
    var x = hero.x + dx;
    var y = hero.y + dy;
    return !hero.waterAtXY(x, y) && !hero.opponent.waterAtXY(x, y);
}

function moveTo(item) {
    var dx = item.x - hero.x;
    var dy = item.y - hero.y;
    if (dx > 2 && safeMove(2, 0)) hero.moveRight(1);
    else if (dx < -2 && safeMove(-2, 0)) hero.moveLeft(1);
    else if (dy > 2 && safeMove(0, 2)) hero.moveUp(1);
    else if (dy < -2 && safeMove(0, -2)) hero.moveDown(1);
    else if (safeMove(0, 2)) hero.moveUp(1);
    else {
        hero.turn("up");
        hero.jump();
    }
}

function dashClear() {
    var zones = [
        {dir: "right", x: 12, y: 0},
        {dir: "left", x: -12, y: 0},
        {dir: "up", x: 0, y: 12},
        {dir: "down", x: 0, y: -12}
    ];
    for (var i = 0; i < zones.length; i++) {
        var x = hero.x + zones[i].x;
        var y = hero.y + zones[i].y;
        if (!hero.waterAtXY(x, y) && !hero.opponent.waterAtXY(x, y)) {
            hero.turn(zones[i].dir);
            hero.dash();
            break;
        }
    }
}

function clearPath(xStep, yStep, range) {
    var enemy = hero.opponent;
    for (var i = 1; i <= range; i += 2) {
        var x = hero.x + xStep * i;
        var y = hero.y + yStep * i;
        if (hero.waterAtXY(x, y) || enemy.waterAtXY(x, y)) return false;
    }
    return true;
}

while (true) {
    var zone = inBattleZone();
    var direction = getDirectionToEnemy();
    var enemy = hero.opponent;
    var battery = findHealBattery();
    var item = hero.findNearestItem();

    if (battery && hero.health < hero.maxHealth * 0.5 && zone) {
        moveTo(battery);
        continue;
    }

    if (hero.isReady("waterball") && zone && direction !== "none") {
        castWaterball();

        var escapeDirs = ["left", "right", "up", "down"];
        for (var i = 0; i < escapeDirs.length; i++) {
            var dx = escapeDirs[i] === "left" ? -2 : escapeDirs[i] === "right" ? 2 : 0;
            var dy = escapeDirs[i] === "up" ? 2 : escapeDirs[i] === "down" ? -2 : 0;
            var x = hero.x + dx;
            var y = hero.y + dy;
            if (!hero.waterAtXY(x, y) && zone) {
                hero.turn(escapeDirs[i]);
                hero.jump();
                break;
            }
        }
        continue;
    }

    if (item && zone) {
        var dx = item.x - hero.x;
        var dy = item.y - hero.y;

        if (dx > 2 && clearPath(1, 0, 4)) hero.moveRight(1);
        else if (dx < -2 && clearPath(-1, 0, 4)) hero.moveLeft(1);
        else if (dy > 2 && clearPath(0, 1, 4)) hero.moveUp(1);
        else if (dy < -2 && clearPath(0, -1, 4)) hero.moveDown(1);
        else if (clearPath(0, 1, 4)) hero.moveUp(1);
        else {
            hero.turn("up");
            hero.jump();
        }
        continue;
    }

    if (hero.isReady("dash") && zone) {
        dashClear();
        continue;
    }

    var fallback = [
        {dir: "right", dx: 2, dy: 0},
        {dir: "left", dx: -2, dy: 0},
        {dir: "up", dx: 0, dy: 2},
        {dir: "down", dx: 0, dy: -2}
    ];
    var moved = false;
    for (var i = 0; i < fallback.length; i++) {
        var x = hero.x + fallback[i].dx;
        var y = hero.y + fallback[i].dy;
        if (!hero.waterAtXY(x, y) && !enemy.waterAtXY(x, y)) {
            hero["move" + fallback[i].dir.charAt(0).toUpperCase() + fallback[i].dir.slice(1)](1);
            moved = true;
            break;
        } else {
            hero.dash();
        }
    }

    if (!moved && zone) {
        var jumpDirs = [
            {dir: "right", dx: 2, dy: 0},
            {dir: "left", dx: -2, dy: 0},
            {dir: "up", dx: 0, dy: 2},
            {dir: "down", dx: 0, dy: -2}
        ];

        for (var i = 0; i < jumpDirs.length; i++) {
            var x = hero.x + jumpDirs[i].dx;
            var y = hero.y + jumpDirs[i].dy;
            if (!hero.waterAtXY(x, y) && !hero.opponent.waterAtXY(x, y)) {
                hero.turn(jumpDirs[i].dir);
                hero.jump();
                break;
            }
        }
    }
}

he starts beaitng me

1 Like

İ will look my code and tell you

1 Like
dx, dy = enemy.x - hero.x, enemy.y - hero.y
adx, ady = abs(dx), abs(dy)

direction = None
tx = ty = None

# Aynı sütun (yaklaşık ±3 kare ≈ 12 birim) → dikey atış
if adx <= 16:
    if dy > 0:
        direction, tx, ty = "up",   hero.x,     hero.y + 4
    elif dy < 0:
        direction, tx, ty = "down", hero.x,     hero.y - 4 this is the main idea
1 Like

nice, do you have any suggestions for my code

1 Like

if you use this that would be pretty good i think

1 Like

bro 94 w,ns 1 loses(to budycc 3 times AI leuge champ) and i am fall behind 18

1 Like

How many hours a day do you devote to codecombat??? (me 10 min for discoruse and looking for my rank)

1 Like

somethin like 4 hrs, and would I use that for waterballing or something

1 Like

İf u talking about my code that code is the main idea so if u just use my code its very bad about waterball but u can use if you want .

image Guys this is my new accouunt and my birtday tommorow my code is the sam with my main account but i lost to mrwweeks and the others that i beat in my main account

When willl grand prix end pls tell

Today is the last day (I think)

1 Like

Screen Shot 2025-07-31 at 11.14.25

Bruh (Nvm)

1 Like

since there are no final simulations, perhaps it makes no sense to submit near the end of league.
how will the winner be determined in the first place?

2 Likes

How can you see like that

İ wish today is the last day

Wait i think iknow you from somewhre