Python Трис со стеками, в поисках более элегантной версии - PullRequest
0 голосов
/ 22 января 2020

Ниже я публикую свою версию трис-игры в Python3, составленной из стеков. Я реализую метод отбрасывания блоков из одного кирпича, в моем коде есть цикл for с «разрывом», которого я хотел бы избежать, но я понятия не имею, как это сделать.

class Stacktris:

def __init__(self):
    self._stack = []


def __str__(self): #prints my tris
    if len(self._stack) == 0:
        s = "EMPTY"
    else:
        s = ""
        for row in reversed(self._stack):
            s = s + '|' + "".join((str(x) if x > 0 else ' ' for x in row)) + '|\n'         

    return "Stacktris: \n%s" % s

def __repr__(self):
    return self.__str__()


def is_empty(self):
    return len(self._stack) == 0

def _shorten(self): #this is the method that removes totally filled lines (and returns it)
    for i in reversed(range(len(self._stack))):
        if sum(1 if x > 0 else 0 for x in self._stack[i])==3:
            res=self._stack.pop(i)
            return res
    return []            


def drop1(self, j):       #and here it is the method I'm troubling with
    if not j in range(0,3):
        raise ValueError

    for i in reversed(range(len(self._stack))):
        if self._stack[i][j]==0:
            if i==0:
                self._stack[i][j]==1
                return self._shorten()
            elif self._stack[i-1][j]!=0:
                self._stack[i][j]=1
                return self._shorten()
        else: 
            break #this is the line I'd like to avoid
    row=[0,0,0]
    row[j]=1
    self._stack.append(row)
    return self._shorten()
...