Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 11

Как сэкономить время на разработку!? Python

07.05.2020, 07:11. Показов 1031. Ответов 10

Студворк — интернет-сервис помощи студентам
Здравствуйте как сэкономить время, может кто нибудь знает какие нибудь лайфхаки по разработке?
Вот например:

Василий считает ООП великолепным подходом к программированию различных систем.
Сегодня он хочет, чтобы вы начали разрабатывать основу для pyRPG (Python role-playing game).
Представьте себе мир, в котором у игрока (Player) есть три основных характеристики: сила (strength), ловкость (agility) и интеллект (intelligence). По умолчанию у каждого героя игры все характеристики равны нулю.
Для увеличения (или уменьшения) характеристики в игре используются зелья (Potion), которые накладывают определённый эффект на игрока и действуют определённое количество ходов.
Перед вами стоит задача создать два класса Player и Potion, описывающие данную механику.
Класс Potion описывает эффект от зелья.
Конструктор класса Potion должен иметь вид: Potion(duration, strength, agility, intelligence). Параметр duration описывает длительность эффекта в «шагах» и является позиционным. Параметры strength, agility, intelligence описывают силу, ловкость и интеллект, получаемые от зелья, и являются необязательными.
Класс Potion должен иметь методы:

duration() — возвращает длительность эффекта зелья;
strength() — возвращает силу, получаемую от зелья;
agility() — возвращает ловкость, получаемую от зелья;
intelligence() — возвращает интеллект, получаемую от зелья;
copy() — возвращает копию объекта.
Над объектами класса Potion должна быть возможность производить следующие операции:

potion1 == potion2 — возвращает True, если все параметры зелий равны, иначе False;
next(potion) — снижает продолжительность эффекта на 1 и возвращает None, если продолжительность снизилась до 0, иначе возвращает принимаемый объект;
potion1 + potion2 — странным образом смешивает два зелья: параметры зелий складываются, а продолжительность эффекта нового зелья равна минимальной из переданных;
potion1 - potion2 — странным образом смешивает два зелья: параметры зелий вычитаются, а продолжительность эффекта нового зелья равна максимальной из переданных;
potion * number — странным образом модифицирует зелье: параметры зелья умножаются на number, а продолжительность эффекта нового зелья остаётся такой же;
str(potion) — возвращает строку, описывающую зелье в формате Potion(duration=D, strength=S, agility=A, intelligence=Intel).
Класс Player описывает состояние пользователя.
У конструктора класса Player не должно быть позиционных параметров.
Класс Player должен иметь методы:

strength() — возвращает суммарную силу героя;
agility() — возвращает суммарную ловкость героя;
intelligence() — возвращает суммарный интеллект героя;
append(potion) — накладывает эффект (копию зелья potion) на героя.
Над объектом класса Player должна быть возможность производить следующие операции:

player += potion — накладывает эффект (копию зелья potion) на героя;
next(player) — имитирует ход, снижает длительность всех наложенных на героя зелий на 1;
str(player) — возвращает строковое представление героя в виде:
Player {
strength: S
agility: A
intelligence: Intel
}

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
class Potion:
    def __init__(self, duration, strength=0, agility=0, intelligence=0):
        self.duration = duration
        self.strength = strength
        self.agility = agility
        self.intelligence = intelligence
        self.krot = 0
        
    def duration(self):# — возвращает длительность эффекта зелья
        return self.duritation
    
    def strength(self):# — возвращает силу, получаемую от зелья
        return self.duritation
    
    def agility(self):# — возвращает ловкость, получаемую от зелья
        return self.agility
    
    def intelligence(self):# — возвращает интеллект, получаемую от зелья
        return  self.agility
    
    def copy(self):# — возвращает копию объекта. 
        new = self
        return new
    
    def __add__(self, other):
        a = self.duration + other.duration
        b = self.strength + other.strength
        c = self.agility + other.agility
        d = self.intelligence + other.intelligence
        q = Potion(a, b, c, d)
        return q
 
    def __eq__(self, other):
        a = self.duration == other.duration
        b = self.strength == other.strength
        c = self.agility == other.agility
        d = self.intelligence == other.intelligence
        if self.duration == other.duration \
           and self.strength == other.strength \
           and self.agility == other.agility \
           and self.intelligence == other.intelligence:
            return True
        else:
            return False
 
    def __sub__(self, other):
        a = self.duration - other.duration
        b = self.strength - other.strength
        c = self.agility - other.agility
        d = self.intelligence - other.intelligence
        q = Potion(a, b, c, d)
        return q
 
    def __mul__(self, other):
        a = self.duration * other
        b = self.strength * other
        c = self.agility * other
        d = self.intelligence * other
        q = Potion(a, b, c, d)
        return q
 
    def __str__(self):
        return 'Potion(duration={0}, strength={1}, agility={2}, intelligence={3})' \
               .format(self.duration, self.strength, self.agility, self.intelligence)
 
 
class Player:
    def __init__(self):
        self.strength = 0
        self.agility = 0
        self.intelligence = 0
        self.duration = 0
        self.new = []
        
    def strength(self):# — возвращает силу, получаемую от зелья
        return self.duritation
    
    def agility(self):# — возвращает ловкость, получаемую от зелья
        return self.agility
    
    def intelligence(self):# — возвращает интеллект, получаемую от зелья
        return  self.agility
 
    def append(self, potion):
        item = potion.copy()
        nora = []
        nora.append(item.duration)
        nora.append(item.strength)
        nora.append(item.agility)
        nora.append(item.intelligence)
        self.duration += potion.duration
        self.strength += potion.strength
        self.agility += potion.agility
        self.intelligence = potion.intelligence
        return self.new.append(nora)
 
    def __iadd__(self, other):
        item = other.copy()
        nora = []
        nora.append(item.duration)
        nora.append(item.strength)
        nora.append(item.agility)
        nora.append(item.intelligence)
        self.new.append(nora)
        self.duration += other.duration
        self.strength += other.strength
        self.agility += other.agility
        self.intelligence += other.intelligence
        return self
 
    def __next__(self):
        for i in range(len(self.new)):
            self.new[i][0] -= 1
            #print('after', self.new)
        #print('before', self.new)
        w = len(self.new)
        for i in range(len(self.new)):
            if self.new[i][0] == 0:
                self.strength -= self.new[i][1]
                self.agility -= self.new[i][2]
                self.intelligence -= self.new[i][3]
        d = []
        for i in range(len(self.new)):
            if self.new[i][0] == 0:
                d.append(i)
        if len(d) != 0:
            for h in d:
                del self.new[h]
        return self
        
 
    def __str__(self):
        return 'Player {0} \n strength:{1} \n agility:{2} \n intelligence:{3} \n {4}' \
               .format('{', self.strength, self.agility, self.intelligence, '}')


Эту программу я делал 3 часа, но на его разработку давалось менее 1 часа.
Она полностью рабочая, но ГДЕ И КАК Я МОГ СЭКОНОМИТЬ ВРЕМЯ НА РАЗРАБОТКУ? Надеюсь на ваши советы.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2020, 07:11
Ответы с готовыми решениями:

Как сэкономить время?
Грустная история стандартного человека: Утро. Встать. Не то что бы лежать покуда охота. Далее выход в люди: Причесаться, смыть с себя...

Как сэкономить время при session_start и mysql_connect?
Приветствую всех! Задача стоит такая: нужно выводить данные из БД ajax-ом каждую минуту. Решаю так: из индексного файла посылаю...

Как сэкономить время и ресурсы при выполнении кода VBA
Доброго всем времени суток. Проблема такая: есть лист, в котором есть огромная таблица - много строк и столбцов. В каждой ячейке матрицы...

10
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.05.2020, 07:58
NikiforovDV, странный вопрос, тут трата времени идет из за вашей сообразительности. Быстрее понимаешь, быстрее делаешь, подобные задачи занимают меньше времени с опытом. В этом коде куча ошибок, таких как: название методов совпадает с названием атрибутов, функции возвращают не существующие атрибуты, копипаст.
1
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
07.05.2020, 08:17
Цитата Сообщение от NikiforovDV Посмотреть сообщение
какие нибудь лайфхаки
Есть супер-лайфхак, трудолюбие называется

Кстати метод copy реализован неверно, он возвращает не копию, а сам объект

Python
1
2
3
4
5
6
7
8
9
10
p = Potion(5)
z = p.copy()
 
print(p)
print(z)
 
p.strength = 5
 
print(p)
print(z)
Вывод

Potion(duration=5, strength=0, agility=0, intelligence=0)
Potion(duration=5, strength=0, agility=0, intelligence=0)
Potion(duration=5, strength=5, agility=0, intelligence=0)
Potion(duration=5, strength=5, agility=0, intelligence=0)
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.05.2020, 08:29
NikiforovDV, 25 мин, при этом одна рука занята кофе и вафельками:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# -*- coding: utf-8 -*-
 
 
from __future__ import annotations
from typing import List, Tuple
 
 
class Characteristics:
 
    def __init__(self, strength: int = 0, agility: int = 0, intelligence: int = 0):
        self._strength, self._agility, self._intelligence = strength, agility, intelligence
 
    def getStrength(self) -> int:
        return self._strength
 
    def setStrength(self, strength: int):
        self._strength = strength
 
    strength = property(getStrength, setStrength)
 
    def getAgility(self) -> int:
        return self._agility
 
    def setAgility(self, agility: int):
        self._agility = agility
 
    agility = property(getAgility, setAgility)
 
    def getIntelligence(self) -> int:
        return self._intelligence
 
    def setIntelligence(self, intelligence: int):
        self._intelligence = intelligence
 
    intelligence = property(getIntelligence, setIntelligence)
 
 
class Potiton(Characteristics):
 
    def __init__(self, duration: int, strength: int = 0, agility: int = 0, intelligence: int = 0):
        Characteristics.__init__(self, strength, agility, intelligence)
        self._duration = duration
 
    def getDuration(self) -> int:
        return self._duration
 
    def setDuration(self, duration: int):
        self._duration = duration
 
    duration = property(getDuration, setDuration)
 
    def copy(self) -> Potiton:
        return Potiton(self._duration, self._strength, self._agility, self._intelligence)
 
    def __eq__(self, other: Potiton) -> bool:
        return (self._strength, self._agility, self._intelligence) == \
               (other.strength, other.agility, other.intelligence)
 
    def __str__(self) -> str:
        return f"Potion(duration={self._duration}, strength={self._strength}, "\
               f"agility={self._agility}, intelligence={self._intelligence})."
 
    def __next__(self):
        self._duration -= 1
 
 
class Player(Characteristics):
   
 
    def __init__(self, name: str, strength: int = 0, agility: int = 0, intelligence: int = 0):
        Characteristics.__init__(self, strength, agility, intelligence)
        self._name = name
        self._potitons = []
 
    def getName(self) -> str:
        return self._name
 
    def setName(self, name: str):
        self._name = name
 
    name = property(getName, setName)
 
    def getPotitons(self) -> Tuple[Potiton]:
        return tuple(self._potitons)
 
    potitons = property(getPotitons)
 
    def append(self, potiton: Potiton):
        self._potitons.append(potiton)
        self._strength += potiton.strength
        self._agility += potiton.agility
        self._intelligence += potiton.intelligence
 
    def remove(self, potiton: Potiton):
        self._potitons.remove(potiton)
        self._strength -= potiton.strength
        self._agility -= potiton.agility
        self._intelligence -= potiton.intelligence
 
    def __str__(self) -> str:
        return f"Player(strength: {self._strength}, agility: {self._agility}, " \
               f"intelligence: {self._intelligence})"
 
    def __next__(self):
        for potiton in self._potitons:
            next(potiton)
            if potiton.duration == 0:
                self.remove(potiton)
 
 
potiton = Potiton(1, 10, 5, -2)
player = Player("Vasya")
player.append(potiton.copy())
print(player) # Player(strength: 10, agility: 5, intelligence: -2)
next(player) 
print(player) # Player(strength: 0, agility: 0, intelligence: 0)
0
0 / 0 / 0
Регистрация: 04.05.2020
Сообщений: 11
07.05.2020, 08:55  [ТС]
Вопрос!
Является ли критической ошибкой совпадения имен методов и атрибутов в коде?
Вроде как бы работает.
Они не должны совпадать из-за какого-то негласного правила?

p.s. Спасибо что указали про ошибку метода копирования, я уже исправил его после вашего замечания.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.05.2020, 08:59
NikiforovDV,

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyClass:
    agility = 10
 
    def agility(self):
        return self.agility
 
 
my_class = MyClass()
 
print(my_class.agility)
# <bound method MyClass.agility of <__main__.MyClass object at 0x00561CF0>>
 
my_class.agility = 10
print(my_class.agility)
# 10
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
07.05.2020, 09:08
Цитата Сообщение от NikiforovDV Посмотреть сообщение
Является ли критической ошибкой совпадения имен методов и атрибутов в коде?
да, является

Цитата Сообщение от NikiforovDV Посмотреть сообщение
Вроде как бы работает.
нет, не работает и не может работать
предлагаю провести вот такой эксперимент
Python
1
2
3
4
>>> p=Player()
>>> p.agility
0
>>> p.agility()
и вообще "вроде работает" это довольно жалкое оправдание (особенно если не работает)
1
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.05.2020, 09:50
Welemir1, можешь ответить, оптимальный ли способ использую я при создание свойств объекта в примере выше? (По хорошему во всех методах проверку на тип поставить но опустим.)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
07.05.2020, 10:47
DmFat, нет, если взять твой пример то после 13 строки у тебя больше нет метода аджилити) ты его перезаписал интом. Ну нельзя называть атрибуты и методы одинаково, потому что метод это тоже атрибут, просто он вызываемый (коллабл).
Плюс возможное (при определенных ситуациях) но не самое верное решение сделать аджилити атрибутом самого класса, а не объектов. Изменив его мы получим изменение во всех объектах, а это не всегда ожидаемо.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> class MyClass:
...     agility = 10
...
>>> c=MyClass()
>>> c.agility
10
>>> c1=MyClass()
>>> c1.agility
10
>>> MyClass.agility = 1000
>>> c1.agility
1000
>>> c.agility
1000
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
07.05.2020, 10:54
Welemir1, да я не про то, про вариант выше, с классами: Characteristic и т.д.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
07.05.2020, 11:02
Цитата Сообщение от DmFat Посмотреть сообщение
про вариант выше, с классами: Characteristic и т.д.
не надо создавать проперти там, где нет логики, зачем? тут вообще подойдет датакласс или неймдтапл для Характеристик
не верная абстракция для Питья (если я верно понял), оно может дать какие то характеристики но само не обладает ими, то есть у Зелья не может быть силы или ловкости. Оно не должно быть наследником характеристик

Игрок получается -набор зелий? раз его можно итерировать некстом по зельям? Это скорее можно сказать про пояс героя, на котором зелья висят, но сам то герой точно не набор зелий.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.05.2020, 11:02
Помогаю со студенческими работами здесь

Сколько требуется время на разработку?
Профессионалы посоветуйте сколько примерно требуется времени на разработку( в основном программирование ), а то требуют как можно скорее? ...

C# или как сэкономить
Вот вопрос по C# если допустим к примеру я обьявляю 2 константы (ну так теоретически!!!) String x1 = &quot;Текст1&quot;; String...

Как сэкономить память?
#define PORTS 260 #define MAX_NUMBER_OF_ENTRIES 255 Есть у нас такой интересный указатель: STRUCT_T (*location); Под него...

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

i7 4770-4770k Как сэкономить?
Если я не буду разгонять проц и возьму 4770 в место 4770к,сколько я смогу сэкономить на сборке компа????? Просто разница в цене 4770 и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru