2015-01-11 3 views
1

Я создаю игру - сетку цветов, которую игрок может перемещать вверх, вниз, влево или вправо. Если направление говорит «идти на красный квадрат», игрок должен это сделать. Путь игрок должен следовать, определяется случайным образом пути алгоритм генерации, который следует этим правилам:Убедитесь, что соседние узлы не имеют одинакового значения

правило игры:

  • Это лабиринт игры, чтобы помочь людям практиковать иностранный язык
  • В игроку задается сетка цветов, по которой они проходят случайный сгенерированный путь слева направо, следующий за следующим заданным цветом (если следующий цвет на случайно сгенерированном пути красный, им будет предложено перейти на красный квадрат) - очевидно, позже приглашения будут на иностранном языке
  • Например, «Rojo» подходит, они должны идти на красный квадрат
  • Будет ли установлено время ... если вы останетесь на одной плитке слишком долго, вы получите урон
  • Если вы наступаете на неправильный цвет, вы получаете урон
  • Поскольку лабиринт генерируется слева направо (см алгоритм информацию ниже), у них есть варианты, чтобы двигаться на север, восток или юго-узел

правил логики:

  • слева направо, что означает, что случайная строка - это выбор в столбце 0
  • путь должен соединяться из столбца 0 в последний столбец
  • Путь ветренный, но он не может пройти назад, то есть он может перемещаться вверх, вниз и право
  • узлы соседних друг с другом не могут совместно использовать тот же самый цвет
  • узлов на север, восток, юг текущего узла (например, серый узел) не может разделить тот же самый цвет
  • Цвет подсказки (следующую ячейку для поездки в) генерируются заранее, когда генерируется случайный путь ... каждый цвет присваивается ячейке при создании сетки ... и случайно созданный путь сохраняет порядок/путь, который эти цвета включены ... поэтому я могу передать следующий цвет игроку, чтобы они могли наступить.

Path информация алгоритм генерации: Random path generation algorithm

Я генерация сетки рандомизированных цветов. Конечно, это означает, что он не может быть абсолютно случайным, потому что я должен гарантировать, что у игрока не может быть больше одного цвета, чем сосед на выбор.

Это изображение описывает это: серая ячейка является местом начала игры ... север, восток и южные соседи имеют одинаковый цвет ... это плохо.

enter image description here

В игре

enter image description here

Решетка представляет собой сетку из цветов мозаичных изображений. Поэтому плитки «цвета» не должны меняться после создания сетки.Во время создания сетки, каждая новая ячейка, я создаю случайный индекс и устанавливаю цвет ячейки, равный 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), там, кажется, не быть цветами рядом с ним:

enter image description here

Вы можете видеть это говорит «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; 
     } 
+0

Вы хотите избегать плиток, которые соседствуют друг с другом, одного цвета или плитки, которые соседствуют с одной и той же плитой одного цвета? – KSFT

+0

@KSFT Узлы, которые соседние узлы на случайном пути не могут использовать один и тот же цвет. Но для простоты можно сказать, что узлы, соседние друг с другом, не могут иметь один и тот же цвет. – Growler

+0

Я не уверен, что все то же самое. В приведенном ниже примере изображения нет двух соседних узлов одного цвета, но вы говорите «это плохо». – KSFT

ответ

0

Это работает? Я не уверен, полностью ли я понял этот вопрос, но я думаю, что это правильно. Я создаю массив с именем grid и заполняя его случайными цветами, проверяя каждый раз, когда он не совпадает с близлежащим цветом.

Редактировать: Нет, это еще не сработало. Я постараюсь это исправить. Хорошо, я думаю, я исправил это.

grid = []; 
for(var i=0;i<=totalRows;row++) 
{ 
    grid[i]=[] 
    for(var j=0;j<=totalCols;j++) 
    { 
     do 
     { 
      var colorIndex = Math.floor(Math.random() * (Object.keys(this.colors).length - 0) + 0); 
      var keyName = Object.keys(this.colors)[colorIndex]; 
      grid[i][j]=keyName; 
      var nearSameColor=false; 
      for(var k=i-2;k<=i+2;k++) 
      { 
       if(k<0||k>totalRows) 
        continue; 
       for(var l=j-2;l<=l+2;l++) 
       { 
        if(l<0||l>totalCols||(k==i&&l==j)) 
         continue; 
        nearSameColor=nearSameColor||grid[i+k][j+l]==grid[i][i]; 
       } 
      } 
     }while(nearSameColor) 
    } 
} 
for (var row = 0; row <= totalRows; row++) { 
    this.containerOfGrids[i][row] = []; 
    for (var col = 0; col <= totalCols; col++) { 
     image = grid[row][col]; 

     //other code 
+2

вы должны объяснить сделанные вами изменения и почему вы считаете, что они могут быть полезными. –

+1

@KSFT, пожалуйста, добавьте свои аргументы, как сказал Roko – Growler

+0

@ Growler Я попытался это объяснить. Есть ли какая-то конкретная деталь, которую вы хотите, чтобы я объяснил больше? – KSFT

0

Если я правильно Вас понял, вы не только озабочены не размещая тот же цвет рядом с собой, но все 2 шага во всех направлениях.

Вместо того, чтобы удалять цвет с объекта, вы можете сделать правило, когда вы окрашиваете плитку (a, b). Если этот цвет еще не разрешен, если a-2 < x> a + 2 AND y-2 < y < b + 2. (в пределах 2 квадратов выше и ниже, и 2 квадрата слева направо).

После этого вам необходимо будет проверить правила для каждого цвета, как вы хотите его разместить (одновременно может быть несколько активных правил для каждого цвета, fx, если 0,0 и 3,0 оба красного цвета, вы необходимо, чтобы первое правило продолжалось, когда вы переходите к следующей строке).

Не зная, как вы реализовали цвета и сетку, вам сложно идти более подробно.

РЕДАКТИРОВАТЬ Читайте его снова и заметил, что я написал у-2 у < < б-2, второй - должно быть а + с исправлением выше.

Смежные вопросы