Итак, я пытаюсь создать генератор случайных карт, и при написании функция кажется работающей, но первый столбец, где я хочу быть стенами, начинает показывать неопределенные и случайно сгенерированные квадраты, и это также влияет на последний столбец. Есть что-то, что мне не хватает?
var world = [];
var worldDict = {
0: 'wall',
1: 'blank',
2: 'sushi',
3: 'onigiri'
}
function drawWorld(){
output = "";
var worldheight = 15;
var worldwidth = 15;
for(var row = 0; row < worldheight; row++){
world.push([row])
output += "<div class = 'row'>"
for (var x = 0; x < worldwidth; x++){
//first row is all walls
if (row == 0 || row == 14 || x==0 || x==14){
output += "<div class = '" + worldDict[world[row][x]] +"'></div>";
world[row].push(0);
}else{
output += "<div class = '" + worldDict[world[row][x]] +"'></div>";
world[row].push(Math.floor(Math.random()*4));
}
}
output += "</div>"
}
document.getElementById('world').innerHTML = output;
}
drawWorld();
отличный совет, но это для моего задания, поэтому я не могу выбрать свой двигатель :)
Похоже, ваш код идентичен для 4 веток if/else if
— почему бы не объединить их в один оператор if
, разделенный ||
?
Готово, я отредактирую это и при переполнении стека, Сал, спасибо за подсказку!
Я попытался исправить код. Я не уверен, что это тот результат, который вы ищете.
var world = [];
var worldDict = {
0: 'wall',
1: 'blank',
2: 'sushi',
3: 'onigiri'
}
function drawWorld(){
output = "";
var worldheight = 15;
var worldwidth = 15;
for(var row = 0; row < worldheight; row++){
world.push([row])
output += "<div class = 'row'>"
for (var column = 0; column < worldwidth; column++) {
if (row == 0 || column == 0 || row == 14 || column == 14) {
world[row].push(0);
output += "<div class = '" + worldDict[0] +"'></div>";
}
else {
world[row].push(Math.floor(Math.random()*4));
output += "<div class = '" + worldDict[world[row][column]] +"'></div>";
}
}
output += "</div>"
}
document.getElementById('world').innerHTML = output;
}
drawWorld();
.wrapper {
width: 300px;
border: 3px solid purple;
}
.row {
height: 20px;
border: 1px solid black;
display: flex;
flex-direction: row;
}
.wall, .blank, .sushi, .onigiri {
width: 20px;
height: 20px;
background-color: red;
}
.blank {
background-color: black;
}
.sushi, .onigiri {
background-color: green;
}
<div class = "wrapper">
<div id = "world"> </div>
</div>
Немного поигравшись с кодом, вот что у меня получилось:
var world = [];
var worldDict = {
0: 'wall',
1: 'blank',
2: 'sushi',
3: 'onigiri'
}
function drawWorld(){
output = "";
var worldheight = 15;
var worldwidth = 15;
for(var row = 0; row < worldheight; row++){
world.push([])
output += "<div class = 'row'>"
for (var col = 0; col < worldwidth; col++){
//first row is all walls
if (row == 0 || row == 14 || col==0 || col==14){
output += "<div class = '" + worldDict[0] +"'> </div>";
world[row].push(0);
}else{
world[row].push(Math.floor(Math.random()*4));
output += "<div class = '" + worldDict[world[row][col]] +"'></div>";
}
}
output += "</div>"
}
document.getElementById('world').innerHTML = output;
}
drawWorld();
Внесены изменения:
world[row].push(Math.floor(Math.random()*4));
перед добавлением div
в переменную output
row
из world.push([])
внутри первого цикла for
, не имело особого смысла, почему это было там, так как это привело к тому, что ваша матрица была 15x16
вместо 15x15
, потому что вы добавили номер строки в начале (что могло учитываться undefined
вы получали)worldDict[world[row][col]]
на worldDict[0]
для условия if
, так как это всегда стена, поэтому установка значения 0 сделает его более читаемымx
на col
, чтобы было более очевидно, для чего эта переменная используется. Хотя это не влияет на функциональность вашего кода, это делает его более читабельным.Вот jsfiddle с этим реализованным (и слегка измененным, чтобы ясно отображать результаты): https://jsfiddle.net/rknzms3q/73/
Вместо этого я бы использовал холст для создания видеоигр... и использовал
const someVar = document.createElement(tagnameHere)
вместо.innerHTML
, чтобы вы могли назначать события прямо на переменную, прежде чем она будет добавлена в DOM. Просто совет.