2015-12-11 2 views
0

Я работаю над простой игрой JS/canvas. В этой игре я хочу, чтобы пользователи могли перемещаться по миру, который создается клиентом в соответствии с одним и тем же семенем каждый раз. Поэтому, когда мир случайный, каждый пользователь получает то же самое.Предварительно генерирующая псевдослучайная местность в JS

Так что я искал способ сделать следующее:

var some_seed = "abcdefg" // For instance 
function get_world_rect(ab, cd) { ... } 

get_world_rect([0,0], [9,9]) 
// Yields the following: 
[[0, 0, 0, 0, 0, 0, "some_feature", 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, "rock", 0, 0, "bush", 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, "bush", 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, "bush", 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, "rare_flower", 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] 

Два важного бита здесь является то, что я хочу, чтобы иметь возможность генерировать те же «карту» каждый раз, когда на каждом клиенте и контролировать «редкость» определенных функций. Поэтому я могу сказать, что у карты есть вероятность появления нереста «куст» и вероятность появления нереста «редкий_цвет».

+0

Я не уверен, с чего начать, к сожалению. – cwj

+0

Существует множество учебных пособий, если у вас есть доступ к «Интернету» –

+0

http://stackoverflow.com/questions/33713487/js-canvas-populate-map/33714651#33714651 – markE

ответ

0

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

Не уверен, что это лучшее, что я могу сделать, но он работает.

Ниже показан сниппет.

generate_map = function(chunk_x, chunk_y) { 
    // The MersenneTwister object is from code this link: https://gist.github.com/banksean/300494 
    // this.base seed is some int. 
    // a "map chunk" is a square of tile containing this.map_chunk_size tiles. 
    // chunk_x and chunk_y are that chunk's X and Y. 
    g = new MersenneTwister(this.base_seed + chunk_x*1000000 + chunk_y) 
    tiles = [] 
    for(var x = 0; x < this.map_chunk_size; x++) { 
     for(var y = 0; y < this.map_chunk_size; y++) { 
      var k = g.random() 
      /* 
      Objects: 
      0 - empty 
      1 - something 1 
      2 - something 2 
      */ 
      var obj = 0 
      if (k < 0.001) { 
       // Something rare 
       obj = 2 
      } else if (k < 0.1) { 
       obj = 1 
      } 
      tiles.push(obj) 
     } 
    } 
    return tiles 
} 

Таким образом, это предсказуемо в разных браузерах и операционных системах (насколько я могу сказать, до сих пор), и я не должен генерировать на сервере и держать много данных.

Влияние на производительность минимально от того, что я могу сказать.

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