我正在尝试使用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
答案 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()