Как реализовать функцию автоматического решения в игре 0hn0 - PullRequest
0 голосов
/ 22 мая 2019

Я пишу код, который пытается воспроизвести игру 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)

Нам рекомендуется использовать рекурсию, чтобы найти все возможные решения, а между ними выбрать правильное, но больше ничего мне не приходит в голову. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...