530 lines
24 KiB
Python
530 lines
24 KiB
Python
def rgReplace(field, setV, replaceTo):
|
|
print('[rgReplace function]: started.')
|
|
for r in range(len(field)):
|
|
print('[rgReplace function]: row#%s' % r)
|
|
for c in range(len(field[r])):
|
|
print('[rgReplace function]: cell#%s' % c)
|
|
cell = field[r][c]
|
|
if cell == setV:
|
|
print('[rgReplace function]: replacing...')
|
|
field[r][c] = replaceTo
|
|
return field
|
|
|
|
def vold_regionGen(size, mines):
|
|
import random
|
|
# M - Мина
|
|
# ...:F - Флаг
|
|
# R(0...X) - Регионы
|
|
# E - свободно (core)
|
|
# ..:O - ячейка открыта игроком
|
|
|
|
field = list()
|
|
for x in range(size):
|
|
field.append(list())
|
|
for y in range(size):
|
|
field[x].append('E')
|
|
|
|
while mines > 0:
|
|
for X in range(len(field)):
|
|
for Y in range(len(field[X])):
|
|
if mines > 0 and random.randint(0, 100) >= random.randint(68, 90):
|
|
field[X][Y] = 'M'
|
|
mines -= 1
|
|
|
|
emptyField = True
|
|
filedNum = 0
|
|
while emptyField:
|
|
rgCreated = False
|
|
for Y in range(len(field)):
|
|
for X in range(len(field[Y])):
|
|
if field[Y][X] == 'E':
|
|
print(f"[Generate map] create region#{filedNum}")
|
|
field[Y][X] = f"R{filedNum}"
|
|
rgCoords = {"X": X, "Y": Y}
|
|
rgCreated = True
|
|
break
|
|
if rgCreated:
|
|
break
|
|
if rgCreated:
|
|
# rgSize = random.randint(1, ((size ** 2) - mines) // 6)
|
|
rgSize = 1 # (!) Ради эксперимента поставим 1
|
|
for _ in range(rgSize):
|
|
stop = False
|
|
while True:
|
|
upMove = rgCoords["Y"] != 0
|
|
if upMove:
|
|
upMove &= field[rgCoords["Y"] - 1][rgCoords["X"]] != 'M'
|
|
downMove = rgCoords["Y"] != size - 1
|
|
if downMove:
|
|
downMove &= field[rgCoords["Y"] + 1][rgCoords["X"]] != 'M'
|
|
leftMove = rgCoords["X"] != 0
|
|
if leftMove:
|
|
leftMove &= field[rgCoords["Y"]][rgCoords["X"] - 1] != 'M'
|
|
rightMove = rgCoords["X"] != size - 1
|
|
if rightMove:
|
|
rightMove &= field[rgCoords["Y"]][rgCoords["X"] + 1] != 'M'
|
|
if not(upMove and downMove and leftMove or rightMove):
|
|
stop = True
|
|
break
|
|
|
|
moveID = random.randint(0, 3)
|
|
if upMove and moveID == 0:
|
|
rgCoords["Y"] -= 1
|
|
print(f"[Generate map]: upMove creating in {rgCoords}")
|
|
field[rgCoords["Y"]][rgCoords["X"]] = f"R{filedNum}"
|
|
break
|
|
elif downMove and moveID == 1:
|
|
rgCoords["Y"] += 1
|
|
print(f"[Generate map]: downMove creating in {rgCoords}")
|
|
field[rgCoords["Y"]][rgCoords["X"]] = f"R{filedNum}"
|
|
break
|
|
elif leftMove and moveID == 2:
|
|
rgCoords["X"] -= 1
|
|
print(f"[Generate map]: leftMove creating in {rgCoords}")
|
|
field[rgCoords["Y"]][rgCoords["X"]] = f"R{filedNum}"
|
|
break
|
|
elif rightMove and moveID == 3:
|
|
rgCoords["X"] += 1
|
|
print(f"[Generate map]: rightMove creating in {rgCoords}")
|
|
field[rgCoords["Y"]][rgCoords["X"]] = f"R{filedNum}"
|
|
break
|
|
|
|
if stop:
|
|
break
|
|
|
|
emptyField = False
|
|
for row in field:
|
|
for cell in row:
|
|
if cell == 'E':
|
|
emptyField = True
|
|
filedNum += 1
|
|
break
|
|
# Объединение регионов
|
|
|
|
print('[Generate map]: combine the regions')
|
|
for rowID in range(len(field)):
|
|
print('[Generate map]: cursore in rowID %s' % rowID)
|
|
for cellID in range(len(field[rowID])):
|
|
print('[Generate map]: cursore in cellID %s' % cellID)
|
|
cell = field[rowID][cellID]
|
|
if 'R' in cell:
|
|
print('[Generate map]: combine region %s' % cell)
|
|
sawUp = rowID != 0
|
|
sawDown = rowID != len(field) - 1
|
|
sawLeft = cellID != 0
|
|
sawRight = cellID != len(field) - 1
|
|
print('[Generate map]: debug: %s %s %s %s' % (sawUp, sawDown, sawLeft, sawRight)) # DEBUG
|
|
if sawUp:
|
|
print('sawUp') # DEBUG
|
|
if cell != field[rowID - 1][cellID] and 'R' in field[rowID - 1][cellID]:
|
|
print('yes!') # DEBUG
|
|
if int(cell.split('R')[-1]) > int(field[rowID - 1][cellID].split('R')[-1]):
|
|
print('Poi') # DEBUG
|
|
field = rgReplace(field, cell, field[rowID - 1][cellID])
|
|
rgMax = field[rowID - 1][cellID]
|
|
print('[Generate map]: combine the region to %s' % field[rowID - 1][cellID])
|
|
else:
|
|
print('Poi2') # DEBUG
|
|
field = rgReplace(field, field[rowID - 1][cellID], cell)
|
|
rgMax = cell
|
|
print('[Generate map]: combine the region to %s' % cell)
|
|
if sawDown:
|
|
print('sawDown') # DEBUG
|
|
if cell != field[rowID + 1][cellID] and 'R' in field[rowID + 1][cellID]:
|
|
print('yes!') # DEBUG
|
|
if int(cell.split('R')[-1]) > int(field[rowID + 1][cellID].split('R')[-1]):
|
|
print('Poi') # DEBUG
|
|
field = rgReplace(field, cell, field[rowID + 1][cellID])
|
|
rgMax = field[rowID + 1][cellID]
|
|
print('[Generate map]: combine the region to %s' % field[rowID + 1][cellID])
|
|
else:
|
|
print('Poi2') # DEBUG
|
|
field = rgReplace(field, field[rowID + 1][cellID], cell)
|
|
rgMax = cell
|
|
print('[Generate map]: combine the region to %s' % cell)
|
|
if sawLeft:
|
|
if cell != field[rowID][cellID - 1] and 'R' in field[rowID][cellID - 1]:
|
|
if int(cell.split('R')[-1]) > int(field[rowID][cellID - 1].split('R')[-1]):
|
|
field = rgReplace(field, cell, field[rowID][cellID - 1])
|
|
rgMax = field[rowID][cellID - 1]
|
|
print('[Generate map]: combine the region to %s' % field[rowID][cellID - 1])
|
|
else:
|
|
field = rgReplace(field, field[rowID][cellID - 1], cell)
|
|
rgMax = cell
|
|
print('[Generate map]: combine the region to %s' % cell)
|
|
if sawRight:
|
|
if cell != field[rowID][cellID + 1] and 'R' in field[rowID][cellID + 1]:
|
|
if int(cell.split('R')[-1]) > int(field[rowID][cellID + 1].split('R')[-1]):
|
|
field = rgReplace(field, cell, field[rowID][cellID + 1])
|
|
rgMax = field[rowID][cellID + 1]
|
|
print('[Generate map]: combine the region to %s' % field[rowID][cellID + 1])
|
|
else:
|
|
field = rgReplace(field, field[rowID][cellID + 1], cell)
|
|
rgMax = cell
|
|
print('[Generate map]: combine the region to %s' % cell)
|
|
|
|
ret_values = {"field": field, "regionMax_index": filedNum}
|
|
|
|
return ret_values
|
|
|
|
def old_regionGen(size, mines):
|
|
import random
|
|
# M - Мина
|
|
# ...:F - Флаг
|
|
# R(0...X) - Регионы
|
|
# E - свободно (core)
|
|
# ..:O - ячейка открыта игроком
|
|
|
|
field = list()
|
|
for x in range(size):
|
|
field.append(list())
|
|
for y in range(size):
|
|
field[x].append('E')
|
|
|
|
while mines > 0:
|
|
for X in range(len(field)):
|
|
for Y in range(len(field[X])):
|
|
if mines > 0 and random.randint(0, 100) >= random.randint(68, 90):
|
|
field[X][Y] = 'M'
|
|
mines -= 1
|
|
|
|
# сгенерируем минимальные 6 больших регионов
|
|
EmptyFiled = True
|
|
filedNum = 0
|
|
while EmptyFiled:
|
|
sizeReg = random.randint(1, (size ** 2) // 8)
|
|
# Определим "Точку развития"
|
|
for X in range(len(field)):
|
|
for Y in range(len(field[X])):
|
|
if field[X][Y] != 'M' and random.randint(0, 100) >= random.randint(85, 90):
|
|
field[X][Y] = f"R{filedNum}"
|
|
regionCoords = [X, Y]
|
|
|
|
cursor = regionCoords.copy()
|
|
for _ in range(sizeReg):
|
|
# Определим "Правила расширения региона"
|
|
moveUp = cursor[0] != 0
|
|
moveDown = cursor[0] != size - 1
|
|
moveLeft = cursor[1] != 0
|
|
moveRight = cursor[1] != size - 1
|
|
|
|
while True:
|
|
print('void:', cursor[0], cursor[1])
|
|
randSel = ['R', 'L', 'U', 'D'][random.randint(0, 3)]
|
|
if randSel == 'R' and moveRight:
|
|
cursor[1] += 1
|
|
if field[cursor[0]][cursor[1]] == 'E':
|
|
field[cursor[0]][cursor[1]] = f"R{filedNum}"
|
|
sizeReg -= 1
|
|
break
|
|
elif randSel == 'L' and moveLeft:
|
|
cursor[1] -= 1
|
|
if field[cursor[0]][cursor[1]] == 'E':
|
|
field[cursor[0]][cursor[1]] = f"R{filedNum}"
|
|
sizeReg -= 1
|
|
break
|
|
elif randSel == 'U' and moveUp :
|
|
cursor[0] -= 1
|
|
if field[cursor[0]][cursor[1]] == 'E':
|
|
field[cursor[0]][cursor[1]] = f"R{filedNum}"
|
|
sizeReg -= 1
|
|
break
|
|
elif randSel == 'D' and moveDown:
|
|
cursor[0] += 1
|
|
if field[cursor[0]][cursor[1]] == 'E':
|
|
field[cursor[0]][cursor[1]] = f"R{filedNum}"
|
|
sizeReg -= 1
|
|
break
|
|
|
|
valuesoffield = list()
|
|
for Row in field:
|
|
for item in Row:
|
|
valuesoffield.append(item)
|
|
|
|
EmptyFiled = 'E' in valuesoffield
|
|
if EmptyFiled:
|
|
filedNum += 1
|
|
|
|
return {"field": field, "regionMax_index": filedNum}
|
|
|
|
def regionGen_from_core(size, mines):
|
|
print("[Core]: map creating...")
|
|
import random
|
|
# M - Мина
|
|
# ..:F - Флаг
|
|
# R(0..X) - Регионы
|
|
# E - свободно (core)
|
|
# ..:O - ячейка открыта игроком
|
|
|
|
field = list()
|
|
for x in range(size):
|
|
field.append(list())
|
|
for y in range(size):
|
|
field[x].append('E')
|
|
|
|
while mines > 0:
|
|
for X in range(len(field)):
|
|
for Y in range(len(field[X])):
|
|
if mines > 0 and random.randint(0, 100) >= random.randint(68, 90):
|
|
field[X][Y] = 'M'
|
|
mines -= 1
|
|
|
|
# сгенерируем регионы
|
|
EmptyFiled = True
|
|
filedNum = 0
|
|
while EmptyFiled:
|
|
print(f"[Core]: Create Region#{filedNum}")
|
|
sizeReg = random.randint(1, (size ** 2) // 8)
|
|
# Определим "Точку развития"
|
|
generated = False
|
|
for X in range(len(field)):
|
|
for Y in range(len(field[X])):
|
|
if field[X][Y] != 'M' and random.randint(0, 100) >= random.randint(85, 90):
|
|
field[X][Y] = f"R{filedNum}"
|
|
regionCoords = [X, Y]
|
|
generated = True
|
|
break
|
|
if generated:
|
|
break
|
|
|
|
cursor = regionCoords.copy()
|
|
for _ in range(sizeReg):
|
|
if not(generated):
|
|
break
|
|
# Определим "Правила расширения региона"
|
|
moveUp = cursor[0] != 0
|
|
moveDown = cursor[0] != size - 1
|
|
moveLeft = cursor[1] != 0
|
|
moveRight = cursor[1] != size - 1
|
|
|
|
while True:
|
|
randSel = ['R', 'L', 'U', 'D'][random.randint(0, 3)]
|
|
if randSel == 'R' and moveRight:
|
|
cursor[1] += 1
|
|
if field[cursor[0]][cursor[1]] == 'E':
|
|
field[cursor[0]][cursor[1]] = f"R{filedNum}"
|
|
sizeReg -= 1
|
|
break
|
|
elif randSel == 'L' and moveLeft:
|
|
cursor[1] -= 1
|
|
if field[cursor[0]][cursor[1]] == 'E':
|
|
field[cursor[0]][cursor[1]] = f"R{filedNum}"
|
|
sizeReg -= 1
|
|
break
|
|
elif randSel == 'U' and moveUp:
|
|
cursor[0] -= 1
|
|
if field[cursor[0]][cursor[1]] == 'E':
|
|
field[cursor[0]][cursor[1]] = f"R{filedNum}"
|
|
sizeReg -= 1
|
|
break
|
|
elif randSel == 'D' and moveDown:
|
|
cursor[0] += 1
|
|
if field[cursor[0]][cursor[1]] == 'E':
|
|
field[cursor[0]][cursor[1]] = f"R{filedNum}"
|
|
sizeReg -= 1
|
|
break
|
|
|
|
valuesoffield = list()
|
|
for Row in field:
|
|
for item in Row:
|
|
valuesoffield.append(item)
|
|
|
|
EmptyFiled = 'E' in valuesoffield
|
|
if EmptyFiled and generated:
|
|
filedNum += 1
|
|
|
|
print('[Core]: generating finished')
|
|
return {"field": field, "regionMax_index": filedNum}
|
|
|
|
def regionGen(size, mines):
|
|
import random
|
|
# M - Мина
|
|
# ...:F - Флаг
|
|
# R(0...X) - Регионы
|
|
# E - свободно (core)
|
|
# ..:O - ячейка открыта игроком
|
|
|
|
field = list()
|
|
for x in range(size):
|
|
field.append(list())
|
|
for y in range(size):
|
|
field[x].append('E')
|
|
|
|
while mines > 0:
|
|
for X in range(len(field)):
|
|
for Y in range(len(field[X])):
|
|
if mines > 0 and random.randint(0, 100) >= random.randint(68, 90):
|
|
field[X][Y] = 'M'
|
|
mines -= 1
|
|
|
|
emptyField = True
|
|
filedNum = 0
|
|
while emptyField:
|
|
rgCreated = False
|
|
for Y in range(len(field)):
|
|
for X in range(len(field[Y])):
|
|
if field[Y][X] == 'E':
|
|
print(f"[Generate map] create region#{filedNum}")
|
|
field[Y][X] = f"R{filedNum}"
|
|
rgCoords = {"X": X, "Y": Y}
|
|
rgCreated = True
|
|
break
|
|
if rgCreated:
|
|
break
|
|
if rgCreated:
|
|
# rgSize = random.randint(1, ((size ** 2) - mines) // 6)
|
|
rgSize = 1 # (!) Ради эксперимента поставим 1
|
|
for _ in range(rgSize):
|
|
stop = False
|
|
while True:
|
|
upMove = rgCoords["Y"] != 0
|
|
if upMove:
|
|
upMove &= field[rgCoords["Y"] - 1][rgCoords["X"]] != 'M'
|
|
downMove = rgCoords["Y"] != size - 1
|
|
if downMove:
|
|
downMove &= field[rgCoords["Y"] + 1][rgCoords["X"]] != 'M'
|
|
leftMove = rgCoords["X"] != 0
|
|
if leftMove:
|
|
leftMove &= field[rgCoords["Y"]][rgCoords["X"] - 1] != 'M'
|
|
rightMove = rgCoords["X"] != size - 1
|
|
if rightMove:
|
|
rightMove &= field[rgCoords["Y"]][rgCoords["X"] + 1] != 'M'
|
|
if not(upMove and downMove and leftMove or rightMove):
|
|
stop = True
|
|
break
|
|
|
|
moveID = random.randint(0, 3)
|
|
if upMove and moveID == 0:
|
|
rgCoords["Y"] -= 1
|
|
print(f"[Generate map]: upMove creating in {rgCoords}")
|
|
field[rgCoords["Y"]][rgCoords["X"]] = f"R{filedNum}"
|
|
break
|
|
elif downMove and moveID == 1:
|
|
rgCoords["Y"] += 1
|
|
print(f"[Generate map]: downMove creating in {rgCoords}")
|
|
field[rgCoords["Y"]][rgCoords["X"]] = f"R{filedNum}"
|
|
break
|
|
elif leftMove and moveID == 2:
|
|
rgCoords["X"] -= 1
|
|
print(f"[Generate map]: leftMove creating in {rgCoords}")
|
|
field[rgCoords["Y"]][rgCoords["X"]] = f"R{filedNum}"
|
|
break
|
|
elif rightMove and moveID == 3:
|
|
rgCoords["X"] += 1
|
|
print(f"[Generate map]: rightMove creating in {rgCoords}")
|
|
field[rgCoords["Y"]][rgCoords["X"]] = f"R{filedNum}"
|
|
break
|
|
|
|
if stop:
|
|
break
|
|
|
|
emptyField = False
|
|
for row in field:
|
|
for cell in row:
|
|
if cell == 'E':
|
|
emptyField = True
|
|
filedNum += 1
|
|
break
|
|
# Объединение регионов
|
|
|
|
print('[Generate map]: combine the regions')
|
|
for rowID in range(len(field)):
|
|
print('[Generate map]: cursore in rowID %s' % rowID)
|
|
for cellID in range(len(field[rowID])):
|
|
print('[Generate map]: cursore in cellID %s' % cellID)
|
|
cell = field[rowID][cellID]
|
|
if 'R' in cell:
|
|
print('[Generate map]: combine region %s' % cell)
|
|
sawUp = rowID != 0
|
|
sawDown = rowID != len(field) - 1
|
|
sawLeft = cellID != 0
|
|
sawRight = cellID != len(field) - 1
|
|
if sawUp:
|
|
genAllow = True
|
|
if genAllow and (sawUp and sawLeft):
|
|
genAllow = field[rowID - 1][cellID - 1] != 'M'
|
|
if genAllow and (sawUp and sawRight):
|
|
genAllow = field[rowID - 1][cellID + 1] != 'M'
|
|
if genAllow and (sawDown and sawLeft):
|
|
genAllow = field[rowID + 1][cellID - 1] != 'M'
|
|
if genAllow and (sawDown and sawRight):
|
|
genAllow = field[rowID + 1][cellID + 1] != 'M'
|
|
|
|
if genAllow and cell != field[rowID - 1][cellID] and 'R' in field[rowID - 1][cellID]:
|
|
if int(cell.split('R')[-1]) > int(field[rowID - 1][cellID].split('R')[-1]):
|
|
field = rgReplace(field, cell, field[rowID - 1][cellID])
|
|
rgMax = field[rowID - 1][cellID]
|
|
print('[Generate map]: combine the region to %s' % field[rowID - 1][cellID])
|
|
else:
|
|
field = rgReplace(field, field[rowID - 1][cellID], cell)
|
|
rgMax = cell
|
|
print('[Generate map]: combine the region to %s' % cell)
|
|
if sawDown:
|
|
genAllow = True
|
|
if genAllow and (sawUp and sawLeft):
|
|
genAllow = field[rowID - 1][cellID - 1] != 'M'
|
|
if genAllow and (sawUp and sawRight):
|
|
genAllow = field[rowID - 1][cellID + 1] != 'M'
|
|
if genAllow and (sawDown and sawLeft):
|
|
genAllow = field[rowID + 1][cellID - 1] != 'M'
|
|
if genAllow and (sawDown and sawRight):
|
|
genAllow = field[rowID + 1][cellID + 1] != 'M'
|
|
|
|
if genAllow and cell != field[rowID + 1][cellID] and 'R' in field[rowID + 1][cellID]:
|
|
if int(cell.split('R')[-1]) > int(field[rowID + 1][cellID].split('R')[-1]):
|
|
field = rgReplace(field, cell, field[rowID + 1][cellID])
|
|
rgMax = field[rowID + 1][cellID]
|
|
print('[Generate map]: combine the region to %s' % field[rowID + 1][cellID])
|
|
else:
|
|
field = rgReplace(field, field[rowID + 1][cellID], cell)
|
|
rgMax = cell
|
|
print('[Generate map]: combine the region to %s' % cell)
|
|
if sawLeft:
|
|
genAllow = True
|
|
if genAllow and (sawUp and sawLeft):
|
|
genAllow = field[rowID - 1][cellID - 1] != 'M'
|
|
if genAllow and (sawUp and sawRight):
|
|
genAllow = field[rowID - 1][cellID + 1] != 'M'
|
|
if genAllow and (sawDown and sawLeft):
|
|
genAllow = field[rowID + 1][cellID - 1] != 'M'
|
|
if genAllow and (sawDown and sawRight):
|
|
genAllow = field[rowID + 1][cellID + 1] != 'M'
|
|
|
|
if genAllow and cell != field[rowID][cellID - 1] and 'R' in field[rowID][cellID - 1]:
|
|
if int(cell.split('R')[-1]) > int(field[rowID][cellID - 1].split('R')[-1]):
|
|
field = rgReplace(field, cell, field[rowID][cellID - 1])
|
|
rgMax = field[rowID][cellID - 1]
|
|
print('[Generate map]: combine the region to %s' % field[rowID][cellID - 1])
|
|
else:
|
|
field = rgReplace(field, field[rowID][cellID - 1], cell)
|
|
rgMax = cell
|
|
print('[Generate map]: combine the region to %s' % cell)
|
|
if sawRight:
|
|
genAllow = True
|
|
if genAllow and (sawUp and sawLeft):
|
|
genAllow = field[rowID - 1][cellID - 1] != 'M'
|
|
if genAllow and (sawUp and sawRight):
|
|
genAllow = field[rowID - 1][cellID + 1] != 'M'
|
|
if genAllow and (sawDown and sawLeft):
|
|
genAllow = field[rowID + 1][cellID - 1] != 'M'
|
|
if genAllow and (sawDown and sawRight):
|
|
genAllow = field[rowID + 1][cellID + 1] != 'M'
|
|
|
|
if genAllow and cell != field[rowID][cellID + 1] and 'R' in field[rowID][cellID + 1]:
|
|
if int(cell.split('R')[-1]) > int(field[rowID][cellID + 1].split('R')[-1]):
|
|
field = rgReplace(field, cell, field[rowID][cellID + 1])
|
|
rgMax = field[rowID][cellID + 1]
|
|
print('[Generate map]: combine the region to %s' % field[rowID][cellID + 1])
|
|
else:
|
|
field = rgReplace(field, field[rowID][cellID + 1], cell)
|
|
rgMax = cell
|
|
print('[Generate map]: combine the region to %s' % cell)
|
|
|
|
ret_values = {"field": field, "regionMax_index": filedNum}
|
|
|
|
return ret_values
|
|
|
|
field = regionGen(10, 25)
|
|
for f in field["field"]:
|
|
print('\t'.join(f))
|
|
input() |