如何随机生成ASCII艺术土地?

时间:2018-04-20 17:28:59

标签: python random procedural-generation

我正在尝试使用Python随机生成由ASCII艺术代表的陆块。我有以下代码,主要产生水或大部分土地。我怎么能实现我的最终目标呢?

from random import *

water = "."
land = "#"

waterChance = 40
landChance = 100 - waterChance

width = 40
height = 20

prevTile = water

level = []

for i in range(height):
    level += [[]]
    for j in range(width):

        # change to ternary 
        if prevTile == water:
            waterChance += 10
        elif prevTile == land:
            waterChance -= 10

        if(waterChance == 50):
            waterChance += 5

        tile = randrange(1,101)

        if tile > waterChance:
            print(land, end='')
            prevTile = land
        elif tile <= waterChance:
            print(water, end='')
            prevTile = water
    print()

我正在寻找类似的东西(将X替换为#s并用连字符替换空格。抱歉,我必须使用ASCIIFlow快速执行此操作)

    XXX
    XXXXX
   XXXXXXX
   XXXXXXXX         X
    XXXXXXX      XXXX
        XX       XXXXXX
                 XXXXXXX
                  XXXXXXX
               XXXXXXXXXX
  XXXXXX       XXXXXXX
 XXXXXXX
XXXXXXXX
XXXXXXXXXXX
 XXXXXXXXXXXXXX
  XX XXXXXXXXXXXX
  XXXXXXXXXXXXXXX
   XXXXXXXXXXXXXXX
   XXXXXXXXXXXXXXXXXX
   XXXXXXXXXXXXXXXX
    XXXXXXXXXXXX

1 个答案:

答案 0 :(得分:1)

这是连接性的loss function

将总损失作为土地与水的比率+连续性的一些常数。现在,您有一个地图“良好”的指标。地图生成器中的所有硬编码值都是参数。对这些参数执行grid search以获得高“良好”值。

这减少了调整一个值的问题,即损失函数中的常数。这是可取的,因为现在用户可以权衡连通性和土地和水的比率。

修改 这是第一个链接的连通性功能。

用布尔2D矩阵计算岛屿的程序

class Graph:
  def __init__(self, row, col, g):
    self.ROW = row
    self.COL = col
    self.graph = g

  # A function to check if a given cell 
  # (row, col) can be included in DFS
  def isSafe(self, i, j, visited):
    # row number is in range, column number
    # is in range and value is 1 
    # and not yet visited
    return (i >= 0 and i < self.ROW and
            j >= 0 and j < self.COL and
            not visited[i][j] and self.graph[i][j])


  # A utility function to do DFS for a 2D 
  # boolean matrix. It only considers
  # the 8 neighbours as adjacent vertices
  def DFS(self, i, j, visited):

    # These arrays are used to get row and 
    # column numbers of 8 neighbours 
    # of a given cell
    rowNbr = [-1, -1, -1,  0, 0,  1, 1, 1];
        colNbr = [-1,  0,  1, -1, 1, -1, 0, 1];

    # Mark this cell as visited
    visited[i][j] = True

    # Recur for all connected neighbours
    for k in range(8):
        if self.isSafe(i + rowNbr[k], j + colNbr[k], visited):
            self.DFS(i + rowNbr[k], j + colNbr[k], visited)


  # The main function that returns
  # count of islands in a given boolean
  # 2D matrix
  def countIslands(self):
    # Make a bool array to mark visited cells.
    # Initially all cells are unvisited
    visited = [[False for j in range(self.COL)]for i in range(self.ROW)]

    # Initialize count as 0 and travese 
    # through the all cells of
    # given matrix
    count = 0
    for i in range(self.ROW):
        for j in range(self.COL):
            # If a cell with value 1 is not visited yet, 
            # then new island found
            if visited[i][j] == False and self.graph[i][j] ==1:
                # Visit all cells in this island 
                # and increment island count
                self.DFS(i, j, visited)
                count += 1

    return count

 graph = [[1, 1, 0, 0, 0],
    [0, 1, 0, 0, 1],
    [1, 0, 0, 1, 1],
    [0, 0, 0, 0, 0],
    [1, 0, 1, 0, 1]]


row = len(graph)
col = len(graph[0])

g= Graph(row, col, graph)

print "Number of islands is :"
print g.countIslands()