Выход за границы области экрана
>>> self.pos[0] = (self.pos[0] + self.vel[0]) % WIDTH
>>> self.pos[1] = (self.pos[1] + self.vel[1]) % HEIGHT
pos — координаты центра движущейся фигуры Читать
Архив рубрики: Python
Python преобразовать список из [1, [2, 3], 4] в [1, 2, 3, 4]
Задача: преобразовать список из такого типа [1, [2, 3], 4] в [1, 2, 3, 4]
check_lst = [[[2]], [4, [5, 6, [6], 6, 6, 6]]]
def check(lst):
check_bool = True
out_lst = []
copy_lst = list(lst)
while check_bool:
check_bool = False
for i in copy_lst:
if isinstance(i, list):
check_bool = True
out_lst.extend(i)
else:
out_lst.append(i)
if check_bool:
copy_lst = list(out_lst)
out_lst = []
return out_lst
print check(check_lst)
[2, 4, 5, 6, 6, 6, 6, 6]
Лучшее решение
def check(lst):
'convert all elements in lst in one row'
return sum(map(lambda a: check(a) if isinstance(a,(list)) else [a],lst),[])
Автор: Viktor
Python использование set с классом
Задача: создадим класс, создадим пустой set. Заполним set экземплярами созданного класса. Для примера пусть экземпляры будут случайным целым числом из диапазона 0-9. Теперь мы хотим удалить из set-а все экземпляры класса значения которых совпадают с «9» и «8»
Где это можно применить на практике? В gamedeveloping игра «Астероид», в set добавляем все летающие по экрану камни, пробегаемся по set-у и сверяем дистанцию между кораблем и камнями:
для этого вычисляем дистанцию между координатами центров фигур
>>> def dist(p, q):
>>> return math.sqrt((p[0] — q[0]) ** 2 + (p[1] — q[1]) ** 2)
и вычитаем радиус корабля и радиус камня, если получившееся значение <= 0 значит столкновение, то добавляем экземпляр класса камень во временный set. После окончания обхода set-а с камнями - удаляем из этого set-а временный set (один или более камней при столкновении) и уменьшаем счетчик жизней кораблю.
>>> import random
>>> class A:
>>> def __init__(self, a):
>>> self.a = a
>>> def __str__(self):
>>> return («%s») % self.a
>>> st = set()
>>> for i in range(10):
>>> st.add(A(random.randrange(0, 10)))
>>> print [str(x) for x in st]
['6', '5', '3', '8', '4', '9', '2', '9', '9', '8']
>>> temp = set()
>>> for x in st:
>>> if str(x) == '9' or str(x) == '8':
>>> temp.add(x)
>>> print [str(x) for x in temp]
['8', '9', '9', '9', '8']
>>> st.difference_update(temp)
>>> print [str(x) for x in st]
['6', '5', '3', '4', '2']
Автор: Viktor
Подчеркнутая защищенность
Инкапсуляция — одна из основ ООП. Мы договариваемся использовать только часть функциональности класса, а взамен получаем возможность работать с самыми разными типами, даже с теми, которые будут написаны после окончания работы над текущим кодом.
Компилируемые языки реализуют инкапсуляцию методом принуждения. Программист отмечает методы и поля как личные или защищенные, а компилятор играет в большого брата и проверяет что все используется в корректном контексте. На моей памяти война за способ использования private/protected минимум пару раз принимала нешуточный оборот. Читать
Инвайт для сайта по изучению языка Python
Инвайт для сайта по изучению языка Python в игровой форме с левелами и медальками. Мини — задачки представленные на этом сайте взяты оттуда. После решения задачки, можно посмотреть лучшие решения.
Автор: Viktor
Python tic-tac-toe крестики-нолики 3Х3
Классические крестики нолики 3Х3. Функция должна возвращать в случае выигрыша символ победителя «Х» или «О». Если ничья (draw) — «D». На вход функции подается подобный 2-мерный массив список. Если клетка не заполнена, то символ «.»
game_result = [
u»OOX»,
u»XXO»,
u»OXX»]
# Column and row checking
>>> for i in range(3):
>>> if game_result[i][0] ==
>>> if game_result[0][i] ==
# Diagonal checking
>>> if game_result[0][0] ==
>>> if game_result[2][0] ==
>>> return «D»
Автор: Viktor