Pickle не сохраняет состояние объекта, использует только значения инициализации - PullRequest
0 голосов
/ 16 апреля 2020

Я делаю многопользовательскую игру TicTacToe, чтобы попрактиковаться в навыках и войти в модель клиент-сервер. Теперь у меня возникают проблемы при отправке объектов с использованием pickle, потому что, когда они не выбраны, не вносятся никакие изменения в атрибуты объекта. Я получаю только значения инициализации. И клиент, и сервер получают и отправляют данные правильно, потому что, когда я пытаюсь отправить встроенные типы, все работает, насколько я тестировал. Я понятия не имею, как решить эту проблему. Любые предложения и помощь будут оценены. Спасибо!

Код разбит на 5 файлов, и я выложу только код проблемного класса c. Если вам нужна дополнительная информация, я предоставлю ее.

import pygame as pg

class Field(pg.Rect):

    def __init__(self, left, top, width, height, field_id):
        super().__init__(left, top, width, height)
        self.field_id = field_id
        self.empty_flag = True
        self.sign = None

    def __reduce__(self):
        return (self.__class__, (self.left, self.top, self.width, self.height, self.field_id))

    def __str__(self):
        return str(self.field_id)

    def set_sign(self, sign=None):
        self.sign = sign

    def draw_field(self, window):
        pg.draw.rect(window, pg.Color("red"), self)

    def field_pressed(self, mouse_pos, sign):
        if self.collidepoint(mouse_pos[0], mouse_pos[1]) and self.empty_flag:
            self.play_field(sign)
            return True
        else:
            return False

    def play_field(self, sign):
        self.empty_flag = False
        self.set_sign(sign)

    def get_id(self):
        return self.field_id

    def get_sign(self):
        return self.sign

    def get_empty_flag(self):
        return self.empty_flag

Итак, во время игры self.sign изменяется на одно из значений «x» или «o» и на основе этого изображения врезаются в экран. Когда Player1 делает ход, например, self.sign = "x", после отправки он становится self.sign = None.

...