Подсчет и сравнение объектов в списках в одной позиции - PullRequest
0 голосов
/ 11 июля 2020

У меня проблема, надеюсь, вы мне поможете. В моем проекте у меня есть виртуальное время, которое запускается при запуске скрипта (24 виртуальных секунды за 1 реальную секунду). Это время записывается в список и передается нужным классам из основного. Список состоит из пяти элементов [0, 0, 0, 0, 0]: первый - это минуты, второй - часы, третий - дни, четвертый - месяцы, а пятый - годы.

self.gTime = self.__engine.time
self.vTime = copy.deepcopy(self.gTime)

gTime - общее виртуальное время, а vTime - переменное время в соответствии с событиями.

__grow = {
        "0": [10, 0, 0, 0, 0],
        "1": [10, 0, 0, 0, 0],
        "2": [10, 0, 0, 0, 0],
        "3": [10, 0, 0, 0, 0],
        "4": [10, 0, 0, 0, 0],
    }

Это мини-словарь, в котором должно произойти пять событий. Эти события (числа внутри в настоящее время предназначены для тестирования) простыми словами представляют, сколько времени должно пройти, чтобы это событие произошло. Каждый раз, когда происходит это событие, vTime обновляется значением gTime, и цикл продолжается для следующей фазы.

Итак, я создал эту функцию:

def update_age(self):
    if self.__age <= len(self.__grow) - 1:
        for i, n in enumerate(self.gTime):
            if abs(self.gTime[i] - self.vTime[i]) == self.__grow[str(self.__age)][i]:
                self.vTime = copy.deepcopy(self.gTime)
                self.__age += 1
    else:
        pass

Где age определяет, какое событие должно произойти.

Теперь, если я запускаю сценарий, я получаю эту ошибку:

if abs(self.gTime[i] - self.vTime[i]) == self.__grow[str(self.__age)][i]:
KeyError: '5'

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

Если вместо этого я заменю self.__grow[str (self.__age)][i] на, например, 10, сценарий будет работать правильно.

Как мне изменить, чтобы он работал правильно? Спасибо за вашу помощь.

EDIT:

Прокрутка времени в основном классе создается следующим образом:

self.__time = [0, 0, 0, 0, 0, 0, 0]
self.time = [0, 0, 0, 0, 0]

def __time_update(self):
    time = datetime.now()
    if int(time.strftime("%S")) != self.__time[0]:
        self.__time[0] = copy.deepcopy(int(time.strftime("%S")))
        if self.__time[1] >= 60:
            self.__time[1] = self.__time[1] - 60
            self.__time[2] += 1
        if self.__time[2] >= 60:
            self.__time[2] = 0
            self.__time[3] += 1
        if self.__time[3] >= 24:
            self.__time[3] = 0
            self.__time[4] += 1
        if self.__time[4] >= 30:
            self.__time[4] = 0
            self.__time[5] += 1
        if self.__time[5] >= 4:
            self.__time[5] = 0
            self.__time[6] += 1

        self.__time[1] += 24

        if self.__time[2] % 10 == 0:
            self.time[0] = copy.deepcopy(self.__time[2])
        self.time[1] = copy.deepcopy(self.__time[3])
        self.time[2] = copy.deepcopy(self.__time[4])
        self.time[3] = copy.deepcopy(self.__time[5])
        self.time[4] = copy.deepcopy(self.__time[6])

__time каждый раз, когда вы выходите из скрипта сохраняется извне и перезагружается при повторном запуске скрипта.

Первая часть, например, должна имитировать рост дерева (состоящий из пяти фаз), который должен начинаться, как только объект будет сгенерирован. Всякий раз, когда age изменяется (и, следовательно, имеет место фаза), спрайт изменяется на новый.

EDIT 2:

К сожалению, предлагаемое решение при устранении сгенерированной ошибки, из другого типа проблемы: Щелкните, чтобы увидеть изображение В первой части это то, как вы видите, как он выполняет предлагаемые изменения. Вторая часть в теории - это то, как должно быть (при тестировании изменение до последней фазы должно происходить каждые 10 минут), что я получил, заменив self.__grow[str (self.__age)][i], например, 10. Последняя часть - ошибка.

Либо я изменяю способ работы виртуальных часов, либо я не знаю, как искренне их решить ...

РЕДАКТИРОВАТЬ 3:

В конце концов, мне удалось решить создание внешнего модуля:

from datetime import datetime
from copy import deepcopy

gTime = [0, 0, 0, 0, 0]
name_day = 0

__dt = 0
__s = 0
__m = 0
__h = 0
__dy = 0
__st = 0
__mh = 0
__y = 0

__local = "it"

__nDay = {
    "en": {
        "0": "Monday",
        "1": "Tuesday",
        "2": "Wednesday",
        "3": "Thursday",
        "4": "Friday",
        "5": "Saturday",
        "6": "Sunday"
    },
    "it": {
        "0": "Lunedì",
        "1": "Martedì",
        "2": "Mercoledì",
        "3": "Giovedì",
        "4": "Venerdì",
        "5": "Sabato",
        "6": "Domenica"
    },
}


def time_update():
    global __dt, __s, __m, __h, __dy, __st, __mh, __y, gTime, name_day

    vTime = datetime.now()
    if int(vTime.strftime("%S")) != __dt:
        __dt = deepcopy(int(vTime.strftime("%S")))
        if __s >= 60:
            __s = __s - 60
            __m += 1
        if __m >= 60:
            __m = 0
            __h += 1
        if __h >= 24:
            __h = 0
            __dy += 1
            __st += 1
        if __st >= 7:
            __st = 0
        if __dy >= 30:
            __dy = 0
            __mh += 1
        if __mh >= 4:
            __mh = 0
            __y += 1

        __s += 24

        if __m % 10 == 0:
            gTime[0] = deepcopy(__m)
        gTime[1] = deepcopy(__h)
        gTime[2] = deepcopy(__dy)
        gTime[3] = deepcopy(__mh)
        gTime[4] = deepcopy(__y)

        name_day = __nDay[__local][str(__st)]

def calculation_time(vList, cList):
    m = vList[0] + cList[0]
    h = vList[1] + cList[1]
    d = vList[2] + cList[2]
    ms = vList[3] + cList[3]
    y = vList[4] + cList[4]

    if m >= 60:
        h += 1
        m = 0
    if h >= 24:
        d += 1
        h = 0
    if d >= 30:
        ms += 1
        d = 0
    if ms >= 4:
        y += 1
        ms = 0

    if gTime[0] >= m:
        if gTime[1] >= h:
            if gTime[2] >= d:
                if gTime[3] >= ms:
                    if gTime[4] >= y:
                        return True

time_update() он вызывается основным классом каждый раз, когда он обновляется, а calculation_time() он вызывается отдельными классами сущностей, которым необходимо знать время, чтобы вызвать другое поведение.

Спасибо всем, кто ответил, и я надеюсь, что это кому-то поможет в будущем.

1 Ответ

1 голос
/ 11 июля 2020

Если я вас правильно понимаю:

def update_age(self):
    if self.__age <= len(self.__grow) - 1:
        c=0
        for i, n in enumerate(self.gTime):
            if abs(self.gTime[i] - self.vTime[i]) >= self.__grow[str(self.__age)][i]:
                self.vTime = copy.deepcopy(self.gTime)
                c += 1
        if(c==i+1):
            self.__age += 1
    else:
        pass

Из того, что вы говорите - я бы также отбросил abs(), но это не имеет отношения к общей обработке, просто упрощение ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...