馃惛馃惛
Debes hacer el programa m谩s corto para encontrar siempre la soluci贸n 贸ptima para un juego Frogger simplificado en una cuadr铆cula de 9x9.
Elementos del curso:
L
- Registro (Longitud: 3-4). Cuando te subes a un tronco, te lleva con 茅l.V
- Veh铆culo (Longitud: 1-2)- Velocidad (1-2): en el lado izquierdo de la fila estar谩 la velocidad que se mueven los elementos en la fila.
- Espacios: siempre habr谩 al menos dos espacios entre los elementos.
- Direcci贸n: en las secciones Veh铆culo y Registro, la direcci贸n del movimiento en cada carril alterna entre izquierda y derecha.
Estructura del curso:
- Si es capital, va bien; si es min煤scula, se va a la izquierda. Todos los elementos en una fila van en la misma direcci贸n. Tan pronto como parte de un elemento salga de la pantalla, aparecer谩 en el lado opuesto de la pantalla.
- La primera fila es una zona segura. La rana comienza en
F
, que siempre es el mismo lugar. - Las siguientes 3 filas son carreteras con veh铆culos.
- La siguiente fila es una zona segura.
- Las siguientes 3 filas son agua (tocar agua == muerte) con registros.
- Una vez que llegas al
W
carril, ganas. - Si la rana muere, vuelve a
F
Controles del jugador:
L
- IzquierdaR
- CorrectoU
- ArribaD
- AbajoW
- Espere
Despu茅s de moverte, pasa otro cuadro. (Tenga en cuenta que el marco pasa despu茅s de su movimiento, no al mismo tiempo que su movimiento). Su programa debe proporcionar la soluci贸n 贸ptima como una secuencia de caracteres como URWUUL
. Si un curso no tiene soluci贸n, su programa deber铆a salir N
.
Ejemplos: (Como hice esto a mano, no s茅 si son soluciones 贸ptimas).
0WWWWWWWWW 1 lll聽聽聽聽 2 LLLL聽聽聽 2 llll聽聽聽 0 0聽聽聽聽聽聽聽聽聽 1 vv vv聽 1 V V聽聽聽 1 vv聽聽聽聽 0 F聽聽聽聽
Soluci贸n: WUWUUURWUULWUU
0WWWWWWWWW 2 lll聽聽聽 1 LLLL聽聽 1 lll聽聽聽 0 0聽聽聽聽聽聽聽聽聽 2 vv聽聽聽聽 1 VV聽聽聽聽聽 2 vv聽聽聽聽 0 F聽聽聽聽
Soluci贸n: WUWUWUUWUUWWUU
0WWWWWWWWW 2 llll聽聽 2 LLL聽聽聽 1 llll聽聽 0 0聽聽聽聽聽聽聽聽聽 2 v vv聽 1 VV VV聽 1 v v聽聽聽 0 F聽聽聽聽
Soluci贸n: WWUUUURURRWWUUU
0WWWWWWWWW 2 llll 2 LLL 1 lll 0 0 1 vv v 2 VVV 2 vvv 0 F
Soluci贸n: N
(No hay forma de pasar la primera fila).
Pruebe estos en el fragmento pegando el curso en el cuadro de texto y presionando "Cargar curso". Luego pegue la soluci贸n en "Entrada" y presione enviar.
Fragmento: es dif铆cil hacer casos de prueba, as铆 que hice este fragmento que le permite ver si su programa puede resolver cursos generados aleatoriamente. Para fines de prueba, todo lo que necesita hacer es ingresar la soluci贸n de su programa (por ejemplo LRUWL...
) en la secci贸n "Entrada" y presionar enviar. Para restablecer el curso a su estado original, presione "Restablecer". Av铆same si encuentras alg煤n error.
var timer;
var f_x, f_y;
var replaced;
var copy;
document.body.onkeyup = function(e) {
var a = document.activeElement;
if (a !== controls && a !== data) hop(e.keyCode);
};
function setup() {
stop();
var rows = game.children;
rows[0].innerHTML = "0WWWWWWWWW";
load(logs, "L");
rows[2].innerHTML = "0 ";
load(cars, "V");
rows[4].innerHTML = "0 F ";
copy = game.innerHTML;
save();
f_x = 5;
f_y = 9;
replaced = " ";
}
function save() {
data.value = "";
for (var i = 1; i <= 9; i++) {
data.value += getRow(i).textContent;
if (i < 9) data.value += "\n";
}
}
function extLoad() {
stop();
var rows = data.value.split("\n");
replaced = " ";
for (var i = 0; i < rows.length; i++) {
var r = getRow(i + 1);
r.innerHTML = rows[i].replace(/ /g, " ");
if (rows[i].indexOf("V") !== -1 || rows[i].indexOf("L") !== -1) r.className = "right";
else if (rows[i].indexOf("v") !== -1 || rows[i].indexOf("l") !== -1) r.className = "left";
var f = rows[i].indexOf("F");
if (f !== -1) {
f_y = i + 1;
f_x = f;
}
}
copy = game.innerHTML;
}
function reset() {
stop();
game.innerHTML = copy;
f_x = 5;
f_y = 9;
replaced = " ";
}
function play() {
if (!timer) {
timer = setInterval(next, 1500);
}
}
function stop() {
if (timer) {
clearInterval(timer);
timer = null;
}
}
function input(i) {
var s = controls.value;
if (i === 0) {
stop();
sub.disabled = true;
}
if (s[i] === "L") hop(65);
else if (s[i] === "U") hop(87);
else if (s[i] === "R") hop(68);
else if (s[i] === "D") hop(83);
next();
if (i < s.length - 1) setTimeout(function() {
input(i + 1);
}, 750);
else sub.disabled = false;
}
function load(part, code) {
for (var r = 0; r < 3; r++) {
var row = part.children[r];
var s = "";
var dir = r % 2;
row.className = dir === 1 ? "right" : "left";
s += Math.floor(Math.random() * 2) + 1;
var end = 0;
for (var c = 0; c < 9-end;) {
var spaces = Math.min(9 - end - c , Math.floor(Math.random() * 2) + 2);
if(c === 0 && end===0) {
spaces = Math.floor(Math.random()*4);
end = Math.max(0,2-spaces);
}
s += " ".repeat(spaces);
c += spaces;
var type = "";
var len = 0;
var rand = Math.floor(Math.random() * 2);
if (code === "L") {
type = dir === 1 ? "L" : "l";
len = rand + 3;
} else {
type = dir === 1 ? "V" : "v";
len = rand + 1;
}
if (c + len > 9-end) continue;
s += type.repeat(len);
c += len;
}
row.innerHTML = s + " ".repeat(end);
}
}
function next() {
move(logs);
move(cars);
}
function move(part) {
var rows = part.children;
for (var i = 0; i < rows.length; i++) {
var s = rows[i].textContent;
var f = s.indexOf("F") !== -1;
if (f) {
replace(f_y, f_x, false);
s = rows[i].textContent;
}
var speed = s[0];
var stuff = s.substring(1);
var v = vel(speed, rows[i].className);
rows[i].textContent = s[0] + shift(stuff, speed, rows[i].className);
if (f) {
if (part === logs) {
f_x += v;
if (f_x < 1 || f_x > 9) {
go(5 - f_x, f_y - 9);
return;
}
}
replace(f_y, f_x, true);
s = rows[i].textContent.substring(1);
var c = f_x + v;
var t = "";
if (c > 9) t = s.substring(f_x) + s.substring(0, c - 9);
else if (c < 0) t = s.substring(0, f_x) + s.substring(9 + c);
else t = v > 0 ? s.substring(f_x, c) : s.substring(c, f_x);
if (t.indexOf("V") !== -1 || t.indexOf("v") !== -1) {
go(5 - f_x, f_y - 9);
}
}
}
}
function vel(mag, dir) {
var d = dir === "right" ? 1 : -1;
var m = parseInt(mag);
return d * m;
}
function shift(s, n, d) {
n = parseInt(n);
for (var i = 0; i < n; i++) {
if (d === "left") {
s = s.substring(1) + s.substring(0, 1);
} else {
s = s.substring(s.length - 1) + s.substring(0, s.length - 1);
}
}
return s;
}
function hop(k) {
if (k === 65) go(-1, 0);
else if (k === 87) go(0, 1);
else if (k === 68) go(1, 0);
else if (k === 83) go(0, -1);
}
function go(x, y) {
replace(f_y, f_x, false);
f_y -= y;
f_x += x;
replace(f_y, f_x, true);
if (f_x < 1 || f_x > 9 || f_y > 9) {
go(5 - f_x, f_y - 9);
return;
}
if (f_y == 1) {
alert("win!");
go(5 - f_x, f_y - 9);
}
}
function replace(y, x, f) {
var row = getRow(y);
if (!row) return false;
var s = row.textContent;
if (x < 1 || x >= s.length) return false;
if (f) {
replaced = s[x];
if (replaced === "V" || replaced === "v" || (replaced.charCodeAt(0) === 160 && y < 5)) {
go(5 - f_x, f_y - 9);
} else {
row.textContent = s.substring(0, x) + "F" + s.substring(x + 1);
}
} else {
row.textContent = s.substring(0, x) + replaced + s.substring(x + 1);
}
}
function getRow(y) {
if (y < 1 || y > 9) return false;
if (y === 1) return game.firstChild;
if (y === 9) return game.lastChild;
if (y > 5) return cars.children[y - 6];
if (y < 5) return logs.children[y - 2];
return game.children[2];
}
<body onload="setup()"><code id="game"><div></div><div id="logs"><div></div><div></div><div></div></div><div></div><div id="cars"><div></div><div></div><div></div></div><div></div></code>
<input type="button" value="Step" onclick="next()" />
<input type="button" value="Pause" onclick="stop()" />
<input type="button" value="Play" onclick="play()" />
<input type="button" value="Reset" onclick="reset()" />
<input type="button" value="New Course" onclick="setup()" />
<div>Controls: WASD</div>
<div>Input:
<input type="text" id="controls" />
<input type="submit" onclick="input(0)" id="sub" />
</div>
<div>
<textarea id="data" rows=9 cols=12></textarea>
<input type="button" onclick="extLoad()" value="Load Course" />
<input type="button" onclick="save()" value="Save Course" />
</div>
</body>
Donde empezar:
Relacionado:
Ver tambi茅n:
fuente
WWUUUURURRWWUUU
-> Chewie jugando frogger.Respuestas:
Javascript, 854 bytes
Sin golf
Solo estoy probando Up, Wait y Right en el ejemplo para acelerar las cosas:
JSFiddle
fuente