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