Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2020, 14:08   #1
VeryStupidPerson
Пользователь
 
Аватар для VeryStupidPerson
 
Регистрация: 20.07.2020
Сообщений: 69
По умолчанию Муравей Лэнгтона. Не получается предотвращать выход за пределы поля.

Я пытался написать муравья Лэнгтона, программа работает, но не получилось написать перепрыгивание в противоположный конец поля, при заходе за край поля.
Код:
import pygame

class  kletka:  #класс клетки
    x = None
    y = None
    color = (0, 0, 0)
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def change(self):
        if self.color == (0, 0, 255):
            self.color = (0, 255, 0)
            return True
        else:
            self.color = (0, 0, 255)
            return False
    def draw(self):
        pygame.draw.rect(screen, self.color, (self.x * 8, self.y * 8, 8, 8))
 
class desk: #класс всего поля
    hight = None
    wight = None
    desk1 = []
    def __init__(self, wight, hight):
        self.hight = hight
        self.wight = wight
        schety = 0
        for i in range(hight):
            schetx = 0
            schety += 1
            stroka = []
            for a in range(wight):
                schetx += 1
                stroka.append(kletka(schetx, schety))
            self.desk1.append(stroka)
    def draw(self):
        for i in self.desk1:
            for a in i:
                a.draw()
 
class ant: #сам муравей. Собственно здесь должен быть контроль допустимости перемещения.
    x = None
    y = None
    golova = (1, 0, 0, 0) #(вперед, назад, вправо, влево)
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def hod(self):
        kl = deskmain.desk1[self.x][self.y].change()
        if self.golova == (1, 0, 0, 0): #я просто хотел добавить здесь условия, из разряда, if self.x < 99: self.x += 1...
            if kl:                                #но, почему-то, выход за список всё равно происходит.
                self.golova = (0, 0, 1, 0)
                self.x += 1
            else:
                self.golova = (0, 0, 0, 1)
                self.x -= 1
        elif self.golova == (0, 1, 0, 0):
            if kl:
                self.golova = (0, 0, 0, 1)
                self.x -= 1
            else:
                self.golova = (0, 0, 1, 0)
                self.x += 1
        elif self.golova == (0, 0, 1, 0):
            if kl:
                self.golova = (0, 1, 0, 0)
                self.y -= 1
            else:
                self.golova = (1, 0, 0, 0)
                self.y += 1
        else:
            if kl:
                self.golova = (1, 0, 0, 0)
                self.y += 1
            else:
                self.golova = (0, 1, 0, 0)
                self.y -= 1
 
WIDTH = 1200
HEIGHT = 800
deskmain = desk(150, 100)
bot1 = ant(50, 75)
bot2 = ant(51, 76)
bot3 = ant(49, 74)
bot4 = ant(51, 74)
bot5 = ant(49, 76)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
 
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Тест. Муравей.")
running = True
 
while running:
    bot1.hod()
    bot2.hod()
    bot3.hod()
    bot4.hod()
    bot5.hod()
    deskmain.draw()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    pygame.display.flip()
    screen.fill(BLACK)
pygame.quit()
Объясните, пожалуйста, как убрать выход за пределы списка.
---------------------------------------------------
Нич-чего не понимаю!
Или что-то случилось, или… одно из двух!
VeryStupidPerson вне форума Ответить с цитированием
Старый 08.12.2020, 19:52   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Примерно так:
Код:
if self.golova == (1, 0, 0, 0):
    if kl:
        self.golova = (0, 0, 1, 0)
        self.x = (self.x + 1) % deskmain.wight
    else:
        self.golova = (0, 0, 0, 1)
        self.x = (self.x - 1 + deskmain.wight) % deskmain.wight
Может быть wight с hight перепутал. И по-английски они чуть по-другому пишутся.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.12.2020, 20:19   #3
VeryStupidPerson
Пользователь
 
Аватар для VeryStupidPerson
 
Регистрация: 20.07.2020
Сообщений: 69
По умолчанию

BDA, по идее, всё логично, и Ваш способ должен работать, и с моим всё логично (сброс координаты на противоположную, при выходе за край, с помощью условий), но и там и там возникает ошибка: IndexError: list index out of range. Я догадываюсь, что где-то начудил с переменными, но не понимаю где.
---------------------------------------------------
Нич-чего не понимаю!
Или что-то случилось, или… одно из двух!
VeryStupidPerson вне форума Ответить с цитированием
Старый 08.12.2020, 20:32   #4
VeryStupidPerson
Пользователь
 
Аватар для VeryStupidPerson
 
Регистрация: 20.07.2020
Сообщений: 69
По умолчанию

А, я нашёл, что не работает!
Я каким-то образом перепутал при создании класса доски wight и hight. Не понимаю как, но wight - высота и hight - ширина, в моей программе.
---------------------------------------------------
Нич-чего не понимаю!
Или что-то случилось, или… одно из двух!
VeryStupidPerson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход за пределы массива maverick231 Помощь студентам 3 17.11.2020 15:46
Выход за пределы массива NFXrus Помощь студентам 10 09.12.2011 23:13
выход за пределы массива(с++) Lazy maximka Помощь студентам 2 13.11.2011 16:11
C++ выход за пределы строки (char) Alex11223 Помощь студентам 4 20.04.2011 20:27
C++ - выход за пределы массива kefir Помощь студентам 5 12.06.2010 14:09