Я создаю игру - сетку цветов, которую игрок может перемещать вверх, вниз, влево или вправо. Если направление говорит «идти на красный квадрат», игрок должен это сделать. Путь игрок должен следовать, определяется случайным образом пути алгоритм генерации, который следует этим правилам:Убедитесь, что соседние узлы не имеют одинакового значения
правило игры:
- Это лабиринт игры, чтобы помочь людям практиковать иностранный язык
- В игроку задается сетка цветов, по которой они проходят случайный сгенерированный путь слева направо, следующий за следующим заданным цветом (если следующий цвет на случайно сгенерированном пути красный, им будет предложено перейти на красный квадрат) - очевидно, позже приглашения будут на иностранном языке
- Например, «Rojo» подходит, они должны идти на красный квадрат
- Будет ли установлено время ... если вы останетесь на одной плитке слишком долго, вы получите урон
- Если вы наступаете на неправильный цвет, вы получаете урон
- Поскольку лабиринт генерируется слева направо (см алгоритм информацию ниже), у них есть варианты, чтобы двигаться на север, восток или юго-узел
правил логики:
- слева направо, что означает, что случайная строка - это выбор в столбце 0
- путь должен соединяться из столбца 0 в последний столбец
- Путь ветренный, но он не может пройти назад, то есть он может перемещаться вверх, вниз и право
- узлы соседних друг с другом не могут совместно использовать тот же самый цвет
- узлов на север, восток, юг текущего узла (например, серый узел) не может разделить тот же самый цвет
- Цвет подсказки (следующую ячейку для поездки в) генерируются заранее, когда генерируется случайный путь ... каждый цвет присваивается ячейке при создании сетки ... и случайно созданный путь сохраняет порядок/путь, который эти цвета включены ... поэтому я могу передать следующий цвет игроку, чтобы они могли наступить.
Path информация алгоритм генерации: Random path generation algorithm
Я генерация сетки рандомизированных цветов. Конечно, это означает, что он не может быть абсолютно случайным, потому что я должен гарантировать, что у игрока не может быть больше одного цвета, чем сосед на выбор.
Это изображение описывает это: серая ячейка является местом начала игры ... север, восток и южные соседи имеют одинаковый цвет ... это плохо.
В игре
Решетка представляет собой сетку из цветов мозаичных изображений. Поэтому плитки «цвета» не должны меняться после создания сетки.Во время создания сетки, каждая новая ячейка, я создаю случайный индекс и устанавливаю цвет ячейки, равный colorsObject [randomIndex], чтобы обеспечить случайный цвет.
Чтобы попытаться решить эту проблему, я пытаюсь сохранить последний использованный цвет ... и на следующей итерации создания ячеек я удаляю тот, который сохранил последний использованный цвет из объекта colors (нужен объект по моим собственным причинам, в противном случае будет использовать массив), установите случайный выбор из сокращенного списка цветов и использование это цвет. Затем добавить, что lastUsedColor обратно к объекту:
var lastUsedColor = "";
for (var row = 0; row <= bridgeSegment.settings.rows-1; row++) {
this.grid[row] = [];
for (var col = 0; col <= bridgeSegment.settings.cols-1; col++) {
if (lastUsedColor != "") delete this.colors[lastUsedColor];
var colorIndex = Math.floor(Math.random() * (Object.keys(this.colors).length - 0) + 0);
var keyName = Object.keys(this.colors)[colorIndex];
image = (this.maze == 1) ? image : keyName;
if (lastUsedColor != "") this.colors[lastUsedColor] = lastUsedColor;
lastUsedColor = keyName;
var myCell = me.pool.pull("mazetile", x, y, {
name : "mazetile",
type : "mazetile",
image : image,
row : row,
col : col,
width: 64,
height : 64,
spritewidth : 64
});
me.game.world.addChild(myCell);
this.grids[row][col] = myCell;
}
Это работает на строка за строкой основе (означающего 2 соседних столбцов не будут иметь одинаковый цвет), но на следующей строке, может быть соседняя узлы с одинаковыми цветами.
Моя следующая мысль заключалась в том, чтобы сначала сгенерировать все изображения в виде плитки с цветами ... затем повторить снова, чтобы проверить соседние цвета ... если есть, замените новое изображение. Но я хотел, чтобы это было сделано для создания набора фрагментов без необходимости делать еще один вложенный цикл.
Я попробовал метод Роко предложил, а «лабиринт» теперь работает отлично, но когда игрок переходит к следующей части моста (где я сгенерировал второй набор плиток в сетки, увидеть это изображение для того, что я имею в виду: http://i.imgur.com/Hlerxm3.png), там, кажется, не быть цветами рядом с ним:
Вы можете видеть это говорит «Yellow», но нет желтых вариант вокруг него ,
Код: (Опуская код на самом деле петлю через и генерировать сетку, так что это не проблема)
run : function (maze) {
this.maze= maze;
this.list = [];
this.containerOfGrids = [];
this.myDirectionsText = new game.HUD.ScreenText(630, 10, 10, 10, {font: "32x32_font", text: "1"})
game.data.gameHUD.addChild(this.myDirectionsText);
for (var i = 0; i <= game.data.bridgeSegments.length-1; i++) {
this.containerOfGrids[i] = [];
this.createGrid(game.data.bridgeSegments[i], i);
}
//call to set initial color cell
this.firstCell();
},
Вызывается сначала выбрать первую ячейку .. Если это верхний сегмент моста (мост форма 1), мне нужно, чтобы начать из случайного ряда в первом столбце ... если это другие сетки, как путь ветра вниз, мне нужен случайный столбец, выбранный ...
firstCell : function() {
//choose intitial random starting cell
if (game.data.bridgeSegments[this.bridgeIndex].settings.realname == "bridge_shape_1") {
var row = Math.floor(Math.random() * (this.containerOfGrids[this.bridgeIndex].length - 0) + 0);
var col = 0;
this.gridLen = this.containerOfGrids[this.bridgeIndex][row].length;
}
else {
var row = 0;
var col = Math.floor(Math.random() * (this.containerOfGrids[this.bridgeIndex][row].length - 0) + 0);
this.gridLen = this.containerOfGrids[this.bridgeIndex].length;
}
this.containerOfGrids[this.bridgeIndex][row][col].firstCell = true;
this.currColor = this.containerOfGrids[this.bridgeIndex][row][col].color;
this.containerOfGrids[this.bridgeIndex][row][col].renderable.alpha = 1;
this.myDirectionsText.settings.text = this.containerOfGrids[this.bridgeIndex][row][col].color;
},
//passing in collided cell, cell row and col from the Tile Class
nextCell : function (cell, row, col) {
if (cell.col < this.gridLen) {
this.checkValidCells(row, col);
this.checkValidMove(cell, this.currColor);
var randomNumber = Math.floor(Math.random() * (this.list.length));
this.currColor = (this.list.length > 0) ? this.list[randomNumber].color : "RED";
this.myDirectionsText.settings.text = this.currColor;
}
},
checkValidMove : function (cell, color) {
if (cell.color == color) {
cell.renderable.image = (game.data.bridgeSegments[this.bridgeIndex].settings.view == "topdown") ? me.loader.getImage("MyFlatTile3") : me.loader.getImage("Tile128Green");
}
else {
game.data.health -=10;
cell.renderable.image = (game.data.bridgeSegments[this.bridgeIndex].settings.view == "topdown") ? me.loader.getImage("MyFlatTile3") : me.loader.getImage("Tile128Red");
}
cell.renderable.alpha = 1;
},
checkValidCells : function (row, col) {
this.list = [];
if (row - 1 >= 0) {
if (!this.containerOfGrids[this.bridgeIndex][row-1][col].explored) {
this.list.push(this.containerOfGrids[this.bridgeIndex][row-1][col]);
}
}
if (col - 1 >= 0) {
if (!this.containerOfGrids[this.bridgeIndex][row][col-1].explored) {
this.list.push(this.containerOfGrids[this.bridgeIndex][row][col-1]);
}
}
if (col + 1 < this.containerOfGrids[this.bridgeIndex][row].length && this.containerOfGrids[this.bridgeIndex][row][col + 1] != "undefined") {
if (!this.containerOfGrids[this.bridgeIndex][row][col+1].explored) {
this.list.push(this.containerOfGrids[this.bridgeIndex][row][col+1]);
}
}
if (row + 1 < this.containerOfGrids[this.bridgeIndex].length && this.containerOfGrids[this.bridgeIndex][row+1][col] != "undefined") {
if (!this.containerOfGrids[this.bridgeIndex][row+1][col].explored) {
this.list.push(this.containerOfGrids[this.bridgeIndex][row+1][col]);
}
}
}
в моем классе плитки, я начинаю следующая ячейка при столкновении с текущей ячейкой:
if (!this.explored) {
nextCell(this, this.row, this.col);
this.explored=true;
}
Вы хотите избегать плиток, которые соседствуют друг с другом, одного цвета или плитки, которые соседствуют с одной и той же плитой одного цвета? – KSFT
@KSFT Узлы, которые соседние узлы на случайном пути не могут использовать один и тот же цвет. Но для простоты можно сказать, что узлы, соседние друг с другом, не могут иметь один и тот же цвет. – Growler
Я не уверен, что все то же самое. В приведенном ниже примере изображения нет двух соседних узлов одного цвета, но вы говорите «это плохо». – KSFT