saperGame/Gamecore/rgGenTest.py
2021-01-28 20:10:58 +03:00

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()