anonymous@RULINUX.NET~# Last login: 2024-12-25 22:59:10
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

Адресация игровой доски

Привет.

Решил подкачать скилл в программировании и пишу небольшую игру. В игре есть квадратная доска, как в шахматах, размерами SIZExSIZE. Пишу функцию, которая возвращает все смежные (не по диагоналям) клетки. ЯП - Питон. Имею вот что:

python
def get_neighbours(i, j):
    if i==0 and j==0:
        return [(0, 1), (1,0)]
    elif i==SIZE-1 and j==SIZE-1:
        return [(SIZE-1, SIZE-2), (SIZE-2, SIZE-1)]
    elif i==SIZE-1 and j==0:
        return [(SIZE-1, 1), (SIZE-2, 0)]
    elif i==0 and j==SIZE-1:
        return [(0, SIZE-2), (1, SIZE-1)]
    elif i==0:
        return [(0, j-1), (1, j), (0, j+1)]
    elif j==0:
        return [(i-1, j), (i, 1), (i+1, j)]
    elif i==SIZE-1:
        return [(SIZE-1, j-1), (SIZE-2, j), (SIZE-1, j+1)]
    elif j==SIZE-1:
        return [(i-1, SIZE-1), (i, SIZE-2), (i+1, SIZE-1)]
    else:
        return [(i-1, j), (i+1, j), (i, j-1), (i, j+1)]
 


ЯП в общем, не суть, но сильно подозреваю, что существуют более элегантные решения. Кто-нибудь может подсказать?

svarwik(*) (2012-06-03 18:19:24)
Отредактировано svarwik по причине "не указана"
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: Адресация игровой доски от svarwik 2012-06-03 18:19:24
avatar
Скрыть

Re:Адресация игровой доски

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

bugmaker(*)(2012-06-03 21:46:36)

Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:12.0) Gecko/20100101 Firefox/12.0
[#] [Добавить метку] [Редактировать] Ответ на: Адресация игровой доски от svarwik 2012-06-03 18:19:24
avatar
Скрыть

Re:Адресация игровой доски

python
def get_neighbours(i, j):
    result = []
    for pos in ((i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)):
        if 0 <= pos[0] < SIZE and 0 <= pos[1] < SIZE:
            result.append(pos)
    return result
 


P.S. Данный вариант работает и для таких "виртуальных" полей как (0, -1) и так далее, ведь у них соседи в пределах доски тоже есть. Но, если тут действительно шахматная доска, то стоит добавить ещё одну проверку для входных данных. Твой вариант, кстати, тоже не обижается на выход за границы доски.

Можно заменить добавление в список на yield и получить generator function.

//SystemV

anonymous(*)(2012-06-04 01:23:55)
Отредактировано anonymous по причине "не указана"
Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) QupZilla/1.2.0 Safari/534.34
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!