🐸🐸
Sie müssen das kürzeste Programm erstellen, um immer die optimale Lösung für ein vereinfachtes Frogger-Spiel auf einem 9x9-Raster zu finden.
Kurselemente:
L
- Protokoll (Länge: 3-4). Wenn Sie auf einen Baumstamm springen, trägt er Sie mit sich.V
- Fahrzeug (Länge: 1-2)- Geschwindigkeit (1-2): Auf der linken Seite der Reihe wird die Geschwindigkeit angegeben, mit der sich die Elemente in der Reihe bewegen.
- Leerzeichen: Es werden immer mindestens zwei Leerzeichen zwischen Elementen sein.
- Richtung: Sowohl im Fahrzeug- als auch im Protokollabschnitt wechselt die Bewegungsrichtung in jeder Spur zwischen links und rechts.
Kursstruktur:
- Wenn es Kapital ist, geht es richtig; Wenn es sich um Kleinbuchstaben handelt, geht es nach links. Alle Elemente in einer Reihe gehen in die gleiche Richtung. Sobald ein Teil eines Elements den Bildschirm verlässt, wird es auf der gegenüberliegenden Seite des Bildschirms angezeigt.
- Die erste Reihe ist eine sichere Zone. Der Frosch beginnt an
F
der gleichen Stelle. - Die nächsten 3 Reihen sind Straßen mit Fahrzeugen.
- Die nächste Reihe ist eine sichere Zone.
- Die nächsten 3 Reihen sind Wasser (berührendes Wasser = Tod) mit Protokollen.
- Sobald Sie die
W
Fahrspur erreicht haben, gewinnen Sie. - Wenn der Frosch stirbt, geht er zurück zu
F
Player-Steuerelemente:
L
- LinksR
- RichtigU
- AufD
- NiederW
- Warten
Nachdem Sie sich bewegt haben, wird ein weiterer Frame übergeben. (Beachten Sie, dass der Rahmen nach Ihrem Zug vergeht und nicht gleichzeitig mit Ihrem Zug.) Ihr Programm muss die optimale Lösung als Folge von Zeichen wie z URWUUL
. Wenn ein Kurs keine Lösung hat, sollte Ihr Programm ausgebenN
.
Beispiele: (Da ich diese von Hand gemacht habe, weiß ich nicht, ob es sich um optimale Lösungen handelt.)
0WWWWWWWWW 1 lll 2 LLLL 2 III 0 1 vv vv 1 V V 1 vv 0 F
Lösung: WUWUUURWUULWUU
0WWWWWWWWW 2 lll 1 LLLL 1 lll 0 2 vv 1 VV 2 vv 0 F
Lösung: WUWUWUUWUUWWUU
0WWWWWWWWW 2 III 2 LLL 1 llll 0 2 v vv 1 VV VV 1 v v 0 F
Lösung: WWUUUURURRWWUUU
0WWWWWWWWW 2 III 2 LLL 1 lll 0 1 vv v 2 VVV 2 vvv 0 F
Lösung: N
(Keine Möglichkeit, an der ersten Reihe vorbei zu kommen.)
Testen Sie diese im Snippet, indem Sie den Kurs in das Textfeld einfügen und auf "Kurs laden" klicken. Fügen Sie dann die Lösung in "Input" ein und drücken Sie "Submit".
Snippet: Es ist schwierig, Testfälle zu erstellen. Deshalb habe ich dieses Snippet erstellt, mit dem Sie sehen können, ob Ihr Programm zufällig generierte Kurse lösen kann. Zu Testzwecken müssen Sie lediglich die Lösung Ihres Programms (z. B. LRUWL...
) in den Abschnitt "Eingabe" eingeben und auf "Senden" klicken. Um den Kurs wieder in den ursprünglichen Zustand zu versetzen, klicken Sie auf "Zurücksetzen". Lassen Sie mich wissen, wenn Sie Fehler finden.
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>
Wo soll man anfangen:
Verbunden:
Siehe auch:
WWUUUURURRWWUUU
-> Chewie spielt Frogger.