inital commit
This commit is contained in:
commit
29ce0882b8
284
solver.html
Normal file
284
solver.html
Normal file
@ -0,0 +1,284 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Baba Is You Solver</title>
|
||||
<style>
|
||||
#body {
|
||||
border: 1px solid black;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
#body td {
|
||||
border: 1px solid black;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
color: white;
|
||||
text-align: center;
|
||||
font-family: "Ubuntu", sans-serif;
|
||||
}
|
||||
td.mark::before {
|
||||
content: "*";
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<table id="body"></table>
|
||||
<script>
|
||||
var CellTypes = {
|
||||
"empty": {
|
||||
"color": "black",
|
||||
"props": [],
|
||||
"has": ""
|
||||
},
|
||||
"text": {
|
||||
"color": "black",
|
||||
"props": ["push"],
|
||||
"has": ""
|
||||
},
|
||||
"hedge": {
|
||||
"color": "darkgreen",
|
||||
"props": ["stop"],
|
||||
"has": ""
|
||||
},
|
||||
"bug": {
|
||||
"color": "brown",
|
||||
"props": ["defeat"],
|
||||
"has": ""
|
||||
},
|
||||
"keke": {
|
||||
"color": "orange",
|
||||
"props": ["you"],
|
||||
"has": ""
|
||||
},
|
||||
"fungus": {
|
||||
"color": "gold",
|
||||
"props": ["melt"],
|
||||
"has": "flag"
|
||||
},
|
||||
"tree": {
|
||||
"color": "lightgreen",
|
||||
"props": ["pull"],
|
||||
"has": ""
|
||||
},
|
||||
"beld": {
|
||||
"color": "grey",
|
||||
"props": ["shift"],
|
||||
"has": ""
|
||||
}
|
||||
}
|
||||
|
||||
function cellType(name)
|
||||
{
|
||||
cell = {
|
||||
type: name.split("_")[0],
|
||||
content: "",
|
||||
mark: false,
|
||||
facing: (name.split("_").length == 2) ? name.split("_")[1] : "n"
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
|
||||
function cellText(name)
|
||||
{
|
||||
cell = {
|
||||
type: "text",
|
||||
text: name.replace(/-/, ""),
|
||||
content: name.replace(/-/, "<br/>"),
|
||||
mark: false,
|
||||
props: []
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
|
||||
var LEVEL = [
|
||||
[cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellText("fun-gus"), cellText("has"), cellText("fl-ag"), cellType("hedge"), cellText("bug"), cellText("is"), cellText("def-eat"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("empty"), cellText("fun-gus"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
[cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("empty"), cellText("is"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
[cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("empty"), cellType("empty"), cellText("be-lt"), cellText("is"), cellText("sh-ift"), cellType("hedge"), cellType("empty"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("empty"), cellText("me-lt"), cellType("empty"), cellType("fungus"), cellType("empty"), cellType("empty"), ],
|
||||
[cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("bug"), cellType("bug"), cellType("bug"), cellType("bug"), cellType("bug"), cellType("hedge"), cellType("empty"), cellType("hedge"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
[cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("hedge"), cellType("empty"), cellType("hedge"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
[cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("hedge"), cellType("empty"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("empty"), cellType("hedge"), ],
|
||||
[cellType("hedge"), cellType("hedge"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("keke"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("beld_e"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("hedge"), ],
|
||||
[cellType("hedge"), cellType("hedge"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), ],
|
||||
[cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
[cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
[cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellText("tr-ee"), cellText("is"), cellText("pu-ll"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
[cellType("hedge"), cellType("hedge"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
[cellType("hedge"), cellType("hedge"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("tree"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
[cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("hedge"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
[cellText("ke-ke"), cellText("is"), cellText("you"), cellType("hedge"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), cellType("empty"), ],
|
||||
]
|
||||
|
||||
function drowTable(level){
|
||||
var body = document.getElementById("body");
|
||||
|
||||
for (let y = 0; y < level.length; y++) {
|
||||
let row = document.createElement("tr");
|
||||
for (let x = 0; x < level[y].length; x++) {
|
||||
let cell = document.createElement("td");
|
||||
cell.id = `cell${x}x${y}`;
|
||||
cell.classList.add("type-" + level[y][x].type);
|
||||
cell.innerHTML = level[y][x].content;
|
||||
cell.style.backgroundColor = CellTypes[level[y][x].type].color;
|
||||
if (level[y][x].type == "text")
|
||||
{
|
||||
cell.classList.add("text-" + level[y][x].text);
|
||||
}
|
||||
if (level[y][x].mark)
|
||||
{
|
||||
cell.classList.add("mark");
|
||||
}
|
||||
row.appendChild(cell);
|
||||
}
|
||||
body.appendChild(row);
|
||||
}
|
||||
}
|
||||
|
||||
function solveMoveStep(level, x, y)
|
||||
{
|
||||
function checkMove(level, x, y, dir)
|
||||
{
|
||||
for (let i = 0; i < CellTypes[level[y][x].type].props.length; i++) {
|
||||
const prop = CellTypes[level[y][x].type].props[i];
|
||||
switch (prop)
|
||||
{
|
||||
case 'stop':
|
||||
case 'defeat':
|
||||
return false;
|
||||
|
||||
case 'shift':
|
||||
if (
|
||||
((dir == 'n') && (level[y][x].facing == 's'))
|
||||
|| ((dir == 'e') && (level[y][x].facing == 'w'))
|
||||
|| ((dir == 's') && (level[y][x].facing == 'n'))
|
||||
|| ((dir == 'w') && (level[y][x].facing == 'e'))
|
||||
)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'push':
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
solution = {
|
||||
n: ((y > 0) && checkMove(level, x, y-1, "n")),
|
||||
e: ((x < level[y].length-1) && checkMove(level, x+1, y, "e")),
|
||||
s: ((y < level.length-1) && checkMove(level, x, y+1, "s")),
|
||||
w: ((x > 0) && checkMove(level, x-1, y, "w"))
|
||||
}
|
||||
// console.log(`solution for (${x}, ${y}) is `, solution);
|
||||
return solution;
|
||||
}
|
||||
|
||||
function getCellCords(level, x, y, dir)
|
||||
{
|
||||
switch (dir)
|
||||
{
|
||||
case 'n':
|
||||
if (y > 0)
|
||||
return [x, y-1];
|
||||
else
|
||||
return NaN;
|
||||
case 'e':
|
||||
if (x < level[x].length-1)
|
||||
return [x+1, y];
|
||||
else
|
||||
return NaN;
|
||||
case 's':
|
||||
if (y < level[y].length-1)
|
||||
return [x, y-1];
|
||||
else
|
||||
return NaN;
|
||||
case 'w':
|
||||
if (x > 0)
|
||||
return [x-1, y];
|
||||
else
|
||||
return NaN;
|
||||
}
|
||||
}
|
||||
|
||||
function move(level, x, y, dir)
|
||||
{
|
||||
newX, newY = getCellCords(level, x, y, dir);
|
||||
for (let i = 0; i < CellTypes[level[newY][newX].type].props.length; i++) {
|
||||
const prop = CellTypes[level[newY][newX].type].props[i];
|
||||
switch (prop)
|
||||
{
|
||||
case 'stop':
|
||||
return false;
|
||||
|
||||
case 'defeat':
|
||||
if (level[newY][newX].type != "text")
|
||||
{
|
||||
level[newY][newX].content = "/";
|
||||
}
|
||||
return false;
|
||||
|
||||
case 'shift':
|
||||
dirs = "nesw";
|
||||
dirNum = indexOf(dirs, dir);
|
||||
shiftDirNum = indexOf(level[newY][newX].facing, dir);
|
||||
if (((dirNum + 2) % 4) == shiftDirNum)
|
||||
{ // is facing into eachother
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
let shift = move(level, newX, newY, level[newY][newX].facing);
|
||||
if (shift !== false)
|
||||
{
|
||||
return shift;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'push':
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return [newX, newY];
|
||||
}
|
||||
|
||||
function solveStep(level, x, y, solveFn)
|
||||
{
|
||||
var solution = solveFn(level, x, y);
|
||||
if (solution.n && !level[y-1][x].mark)
|
||||
{
|
||||
level[y-1][x].mark = true;
|
||||
solveStep(level, x, y-1, solveFn);
|
||||
}
|
||||
|
||||
if (solution.e && !level[y][x+1].mark)
|
||||
{
|
||||
level[y][x+1].mark = true;
|
||||
solveStep(level, x+1, y, solveFn);
|
||||
}
|
||||
|
||||
if (solution.s && !level[y+1][x].mark)
|
||||
{
|
||||
level[y+1][x].mark = true;
|
||||
solveStep(level, x, y+1, solveFn);
|
||||
}
|
||||
|
||||
if (solution.w && !level[y][x-1].mark)
|
||||
{
|
||||
level[y][x-1].mark = true;
|
||||
solveStep(level, x-1, y, solveFn);
|
||||
}
|
||||
}
|
||||
|
||||
function solve(level, x, y, solveFn)
|
||||
{
|
||||
solveStep(level, x, y, solveFn);
|
||||
drowTable(level)
|
||||
}
|
||||
|
||||
solve(LEVEL, 8, 6, solveMoveStep);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user