/* @title: guide_the_sheep @description: A simple game where you guide a sheep to the shepherd while ovoiding wolves @author: chainlinc @tags: ['maze', 'puzzle', 'sheep', 'shepherd', 'wolf'] @addedOn: 2026-10-17 */ const player = "p" const fence = "f" const goal = "g" const enemy = "e" const enemypath_ur = "4" const enemypath_ud = "2" const enemypath_du = "3" const enemypath_ul = "7" const enemypath_dr = "5" const enemypath_dl = "6" const enemypath_lr = "0" const enemypath_rl = "1" const bg = "b" setLegend( [bg, bitmap` 4444444444444444 444D444444444444 4D4D4D444444D444 4D4D4D4444D4D4D4 4444444444D4D4D4 4444444444444444 4444444444444444 44444444D4444444 44444444D4444444 4444444444444444 44D4444444444444 D4D4D4444D444444 D4D4D4444D4D4444 444444444D4D4444 4444444444444444 4444444444444444`], [player, bitmap` ................ ................ ....000222222... ...00000222222.. .00000000022222. 0000202000022222 0..0000022022222 ...0000022222222 ...0000022222222 ...0000022222222 ....00022222222. .....222222222.. .....022222222.. .....0.0..0.0... .......0....0... ................` ], [fence, bitmap` ................ ...CC......CC... ...CC......CC... CCCFCCCCCCCCFCCC CCCCCCCCCCCCCCCC ...CC.....CCC... ...CC....CCCC... ...CC...CC.CC... ...CC..CC..CC... ...CC.CC...CC... ...CCCC....CC... CCCCCCCCCCCCCCCC CCCFCCCCCCCCFCCC ...CC......CC... ...CC......CC... ...CC......CC...`], [goal, bitmap` ................ ...CC....111.... ..CCCC..16661... ..C..C..16661... .....C..11611... .....60001110... .....C0000100... .....C.0000000.. .....C..000000.. .....C..CCCC00.. .....C..0C006... .....C..00000... .....C..00000... .....C..00000... .....C..00000... .....C..00000...` ], [enemy, bitmap` ................ ................ L...L........... LL.LL.11111111.. LLLLL1111111111. LLLLL11111111111 L3L3L11111111111 LLLLL11111111111 LLLLL11111111111 LLLLL11111111111 LLLLL11111111111 .LLL.11111111111 .....L11111111L. .....L..L..L..L. .....L.LL..L.LL. ....LL....LL....`], [enemypath_dr, bitmap` ................ ................ ................ ................ ................ ......1111...... .....11221123323 .....12222132332 .....12222132332 .....11221123323 ......1111...... ......2332...... ......3333...... ......3223...... ......2332...... ......3333......`], [enemypath_dl, bitmap` ................ ................ ................ ................ ................ ......1111...... 32332112211..... 33233122221..... 33233122221..... 32332112211..... ......1111...... ......2332...... ......3223...... ......3333...... ......2332...... ......3223......`], [enemypath_lr, bitmap` ................ ................ ................ ................ ................ ......1111...... 3233211221123323 3323312222132332 3323312222132332 3233211221123323 ......1111...... ................ ................ ................ ................ ................`], [enemypath_du, bitmap` ......3223...... ......2332...... ......3333...... ......3223...... ......2332...... ......1111...... .....112211..... .....122221..... .....122221..... .....112211..... ......1111...... ......2332...... ......3333...... ......3223...... ......2332...... ......3333......`], [enemypath_ud, bitmap` ......3333...... ......2332...... ......3223...... ......3333...... ......2332...... ......1111...... .....112211..... .....122221..... .....122221..... .....112211..... ......1111...... ......2332...... ......3223...... ......3333...... ......2332...... ......3223......`], [enemypath_ur, bitmap` ......3223...... ......2332...... ......3333...... ......3223...... ......2332...... ......1111...... .....11221123323 .....12222133233 .....12222133233 .....11221123323 ......1111...... ................ ................ ................ ................ ................`], [enemypath_ul, bitmap` ......3333...... ......2332...... ......3223...... ......3333...... ......2332...... ......1111...... 32332112211..... 23323122221..... 23323122221..... 32332112211..... ......1111...... ................ ................ ................ ................ ................`], [enemypath_rl, bitmap` ................ ................ ................ ................ ................ ......1111...... 3233211221123323 2332312222133233 2332312222133233 3233211221123323 ......1111...... ................ ................ ................ ................ ................`], ) let level = 0 const levels = [ map` ffffff fp..gf ffffff`, map` fffffffff fp......f fffffff.f f....gf.f f.fffff.f f.......f fffffffff`, map` .fff. ffpff f506f f3f2f f417f ffgff`, map` ..fffff.. ..f506f.. ..f3f2f.. ..f3f2f.. fff3f2fff fp.417.gf fffffffff`, map` .fffffffff. .f506f506f. ff3f2f3f2ff fp3f2f3f2.g ff3f2.417ff .f417fffff. .fffff.....` ] const levels_wolf = [0, 0, [[1, 3]], [[3, 1], [5, 5]], [[2, 2], [2, 5], [4, 1], [4, 4], [6, 1], [6, 4], [8, 1], [8, 3]]] setBackground(bg) setSolids([player, fence]) let playing = true; let win = false; let wolf = 0; let last_position = [0, 0]; function player_position() { return [getFirst(player).x, getFirst(player).y] } function load_level(l) { clearText(); setMap(levels[l]); playing = true; if (levels_wolf[l]) { for (const item of levels_wolf[l]) { addSprite(item[0], item[1], enemy); } } last_position = player_position(); } onInput("w", () => { if (playing) { getFirst(player).y -= 1; } }) onInput("s", () => { if (playing) { getFirst(player).y += 1; } }) onInput("a", () => { if (playing) { getFirst(player).x -= 1; } }) onInput("d", () => { if (playing) { getFirst(player).x += 1; } }) onInput("j", () => { if (!win) { load_level(level); } }) onInput("k", () => { //level += 1 //load_level(level); }) load_level(level); afterInput(() => { const this_position = player_position(); if (last_position[0] === this_position[0] && last_position[1] === this_position[1]) { console.log("no move"); return } last_position = this_position; const eaten_count_before_update = tilesWith(player, enemy); if (eaten_count_before_update.length) { playing = false; addText("You Walked Into Wolf", {y:1, color: color`2`}); addText("And Have Been Eaten", {y:2, color: color`2`}); addText("By Wolf", {y:3, color: color`2`}); addText("Press J To Restart", {y:14, color: color`2`}); return } for (const item of getAll(enemy)) { const tile = getTile(item.x, item.y).at(-1).type switch (tile) { case "5": case "0": item.x += 1; break; // right case "7": case "1": item.x -= 1; break; // left case "6": case "2": item.y += 1; break; // down case "4": case "3": item.y -= 1; break; // up } } const eaten_count_after_update = tilesWith(player, enemy); if (eaten_count_after_update.length) { playing = false; addText("Wolf Walked Into You", {y:1, color: color`2`}); addText("And You Are Eaten", {y:2, color: color`2`}); addText("By Wolf", {y:3, color: color`2`}); addText("Press J To Restart", {y:14, color: color`2`}); } else { const win_count = tilesWith(player, goal); if (win_count.length) { level = level + 1; if (level < levels.length) { load_level(level); } else { addText("You Win!", {y:1, color: color`2`}); addText("Thanks For Playing!", {y:14, color: color`2`}); playing = false; win = true; } } } });