🐸🐸
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:
WWUUUURURRWWUUU
-> Chewie jugando frogger.