2016-08-31 6 views
2

現在、2次元配列内にランダム化された世界を作成できます。しかし、私はそれがあまりにもランダムであると感じます。ここで私が現在働いているクラスは、次のとおりです。テキストベースのRPG用に、より一貫してランダムに生成されたワールド空間を作成する

from random import randint, choice, randrange

class WorldSpace(object): 
    def __init__(self, row, col, world_array): 
     self.row = row # Number of lists to be created. 
     self.col = col # Number of indexes inside of each row. 
     self.world_array = world_array 

世界を作成しますWorldSpace方法:世界を変更

@classmethod 
def generate(cls, autogen): 
    print 'Starting world generation...' 
    print 
    if autogen is True: 
     row_amt = 75 
     col_amt = 75 

    else: 
     row_amt = input('Please specify row length of world array.: ') 
     col_amt = input('Please specify column length of world array.: ') 
     if (row_amt or col_amt) == 0: 
      print 'Invalid world values!' 
      cls.generateWorld(False) 

    world_array = [[' ']*col_amt for _ in xrange(row_amt)] 
    print 'Created world...' 

    return cls(row_amt, col_amt, world_array) 

方法は - 現在だけforestsを作成しますコードの私の完全なセグメントでは、一連の海と山も形成されています。

def modify_world(self, autogen): 
    if autogen is True: 
     # Forests: 
     count = randint(6, 10) 
     while count > 0: 
      a = randint(1, (self.row/randint(2, 6))) 
      b = randint(1, (self.col/randint(2, 6))) 
      row_val = randint(5, self.row) 
      count_val = randint(5, 15) 
      self.genLine_WObj(a, b, row_val, 't', count_val) 
      count -=1 

    print('\n'.join([''.join(['{:1}'.format(item) for item in row]) 
     for row in self.world_array])) 
    inp = input('') 
    if inp != '': 
     return 

そして実際にforestタイル作成方法:それは時々、時間の〜20から30パーセント作品ながら、しかし

world = WorldSpace.generate(True) 
world.modify_world(True) 

:実際にプログラムを実行するために、今すぐ

def genLine_WObj(self, a, b, row_val, char, count): 
    # 'genLine_WObj' - Generate Line(like) world object. 
    # Used to place lines of certain characters with psuedo-randomized 
    # width and length onto the world array. 
    while count != 0: 
     row_col_dict = {row_val: (a, b)} 
     for row in row_col_dict.keys(): 
      startPos, endPos = row_col_dict[row] 

      for i in range(startPos, endPos): 
       self.world_array[row][i] = char 

     b += choice([0, 1]) 
     a += choice([0, 0, 0, 0, 1]) 

     row_val -= 1 
     count -= 1 

を地図の周りのすべての森林を作成する必要がある場合、小さい森林、またはt文字の小さなペアを生成します。ランダム化された世代をより一貫性のあるものにするためにコードを改善するにはどうすればよいですか?固定

+1

あなたは目標を説明していません。何かが無作為化と一貫性の両方を持つことはできません - それは矛盾しています。 「小さなペア」とはどういう意味ですか?また、あなたのコードには問題があります:たとえば、genLineのwhileループの最初の3行を見てください.1要素の辞書を作成し、その上で "繰り返し"(ループは1回だけ実行されます)し、その変数に明示的に代入した値と、* that *を2つの新しい変数に代入します。そのコードは実際に何もしません。私はあなたのコードをCodeReviewに投稿し、それをきれいにする助けを得ることを提案する。 –

答えて

0

  1. を時々あなたのaはあなたのbよりも大きいと森林が生成されません。
  2. あなたのすべての森林は地図の左側にある傾向があります。

変更された行にインラインコメントが追加されます。

def modify_world(self, autogen): 
    if autogen is True: 
     # Forests: 
     count = randint(6, 10) 
     while count > 0: 
      a = randrange(self.col)   # begin of forest 
      width = self.col/randint(2, 6) # initial width of forest 
      b = int(a + width)    # end of forest 
      row_val = randint(5, self.row) 
      count_val = randint(5, 15) 
      self.genLine_WObj(a, b, row_val, 't', count_val) 
      count -=1 

    print('\n'.join([''.join(['{:1}'.format(item) for item in row]) 
     for row in self.world_array])) 
    inp = input('') 
    if inp != '': 
     return 


def genLine_WObj(self, a, b, row_val, char, count): 
    # 'genLine_WObj' - Generate Line(like) world object. 
    # Used to place lines of certain characters with psuedo-randomized 
    # width and length onto the world array. 
    while count != 0: 
     row_col_dict = {row_val: (a, b)} 
     for row in row_col_dict.keys(): 
      startPos, endPos = row_col_dict[row] 

      for i in range(startPos, min(self.col, endPos)): # added min 
       self.world_array[row][i] = char 

     b += choice([0, 1]) 
     a += choice([0, 0, 0, 0, 1]) 

     row_val -= 1 
     count -= 1 

そして私はmapsizeに依存しない何かに森のwidthを変更します。 E. g .:

width = randint(2, 15) 

しかし、これは目標によって異なります。

関連する問題