Я пишу код, который пытается воспроизвести игру 0hn0 Мартина Кола.
В последнем разделе задачи мне нужно создать функцию «autosolve (архив)», которая решает саму плату 0hn0.
Вот оригинальная игра: https://0hn0.com/ (как играть)
Я пытался использовать ту же структуру, что и часть "isCompleted (self)", дифференцируя каждую точку со значением и добавляя синие точки в смежные квадраты; как только их значение станет равным счетчику, прекратите помещать синие точки, и если рядом с синими точками есть какие-то серые точки, включите их в красный цвет.
Проблема возникает, когда синие точки начинают взаимодействовать с разными ценными точками.
class Dot: #__init__, __str__
def __init__(self, color, updatable = True, value = None):
if not(color in ["Blue", "Grey", "Red"]) :
raise Exception("Wrong color")
self.color = color
self.updatable = updatable
self.value = value
def __str__(self): #dots as str
if self.color == "Grey" :
return "[ ]"
if self.color == "Red" :
return "[R]"
if self.color == "Blue" :
if self.value != None :
return "[{0}]".format(self.value)
else :
return "[B]"
class Board: #__init__, __str__, fromFile, addDot, isCompleted
def __init__(self, archive):
self.board = Board.fromFile(archive)
@staticmethod
def fromFile(archive):
fileBoard = [] #we'll get a square matrix shaped board
file = open(archive, 'r')
for line in file :
row = []
chain = line.strip().split(",") #converts every str line in list
for character in chain :
if character == "" :
row.append(Dot("Grey", True, None))
elif character == "." :
row.append(Dot("Red", False, None))
elif character == "*" :
row.append(Dot("Blue", False, None))
elif character.isdigit() :
row.append(Dot("Blue", False, int(character)))
else :
raise Exception("Wrong file")
fileBoard.append(row) #creates the rows of the base matrix
return fileBoard
def __str__(self) : #gives the board as a str
chain = "\n"
for row in self.board :
for dot in row :
chain += str(dot)
chain += "\n"
return chain
def addDot(self, x, y, color): #add dot in row x+1 & col y+1, color
if self.board[x][y].updatable == True : #updatable dot
self.board[x][y].color = color
else :
print("You can't move this dot")
def isCompleted(self): #board cheker
completed = True
counter = 0
for x in range(len(self.board)) : #Check if there are dots left to put
for y in range(len(self.board)) :
if self.board[x][y].color == "Grey" :
completed = False
print("There are still free positions")
return completed
else :
continue
for x in range(len(self.board)) : #Check if the values are correct
for y in range(len(self.board)) :
if self.board[x][y].value != None : #chek all directions
for i in range(1, len(self.board) - x) :
if self.board[x+i][y].color == "Blue" :
counter += 1
else:
break
for i in range(1, len(self.board) - y) :
if self.board[x][y+i].color == "Blue" :
counter += 1
else:
break
for i in range(0, x) :
i += 1
if self.board[x-i][y].color == "Blue" :
counter += 1
else :
break
for i in range(0, y) :
i += 1
if self.board[x][y-i].color == "Blue" :
counter += 1
else :
break
if counter == self.board[x][y].value : #all correct
counter = 0
else : #board dots must be changed
counter = 0
completed = False
print(self.board[x][y], "in {0}x{1}".format(x+1, y+1),\
"sees wrong")
else :
continue
return completed
Таким образом, в игру можно играть в консоли с помощью функции «run0hn0 (архив)». (будучи архивом .txt файл с ej. 4 строки и 4 комы в каждой строке.
def run0hn0(archive): #archive is a .txt
myBoard = Board(archive)
while myBoard.isCompleted() == False :
print(myBoard)
x = input("Row number: ")
y = input("Col number: ")
color = input("Dot color: ")
myBoard.addDot(int(x)-1, int(y)-1, str(color))
if myBoard.isCompleted() == True:
print("Congratulations", myBoard)
return None
Функция, которую я должен написать, кто автоматически решает данную доску: def autosolve(board)
Нам рекомендуется использовать рекурсию, чтобы найти все возможные решения, а между ними выбрать правильное, но больше ничего мне не приходит в голову.
Спасибо