Ниже я публикую свою версию трис-игры в 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()