【问题标题】:Robot Class OOP in PythonPython中的机器人类OOP
【发布时间】:2021-05-18 06:00:02
【问题描述】:

事情就是这样。所以我想创建机器人类并制作机器人战斗。但是我知道我正在为奇怪的输出而苦苦挣扎,因为我所拥有的只是

Robot E lost all the power
Robot D lost all the power
Robot C lost all the power
Robot B lost all the power
Robot A lost all the power

这是我的代码:


from typing import List, Tuple

class Robot:
    def __init__(self, name: str, place : List[int], start: Tuple[int, int] = (0,0), power: int = 100):
        self._name = name
        self._place = place
        self._start = start
        self._power = power
        
        # further assignments

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        if isinstance(value, str):
            self._name = value
        else:
            raise TypeError("must be a string")
    @property
    def place(self):
        return self._place

    @place.setter
    def place(self, value):
        if isinstance(value, list):
            self._start = value
        else:
            raise TypeErorr("must be a list")
        
    @property
    def start(self):
        return self._start

    @start.setter
    def start(self, value):
        if isinstance(value, tuple):
            self._start = value
        else:
            raise TypeErorr("must be a tuple")

    @property
    def power(self):
        return self._power

    @power.setter
    def power(self, value):
        if isinstance(value, int):
            self._start = value
        else:
            raise TypeErorr("must be a int")

    @property
    def check_power(self):
        if self._power <= 0:
            raise ValueError("No power")

    
    

    def left(self, value):
        self.sprawdz_power()
        
        self.power -= value

        if self.place[0] - value < 0:
            self.place[0] = self.place[0] - value + 8

        else:
            self.place[0] = self.place[0] - value
            
    def up(self, value):
        self.sprawdz_power()
        
        self.power -= value

        if self.place[1] + value > 7:
            self.place[1] = self.place[1] + value - 8

        else:
            self.place[1] = self.place[1] + value

        if self.place[1] == 5:
            self.power += 2
    #def right(self, value):
    #def down(self, value):

    def __str__(self):
        return "{} {} {}".format(self._name, self._place, self._power)


robots = [
    Robot(name = "A", place = [3,4], start = (0,0), power = 100),
    Robot(name = "B", place = [1,2], start = (0,0), power = 100),
    Robot(name = "C", place = [1,2], start = (0,0), power = 100),
    Robot(name = "D", place = [1,2], start = (0,0), power = 100),
    Robot(name = "E", place = [1,2], start = (0,0), power = 100),
]


def check_position():
    
    to_delete = []
    
    for r_a_nr in range(len(robots)):
        for r_b_nr in range(r_a_nr,len(robots)):
            
            if robots[r_a_nr].place() == robots[r_b_nr].place():
                
                if robots[r_a_nr].power() > robots[r_b_nr].power():
                    robots[r_a_nr].power(robots[r_a_nr].get_power() + robots[r_b_nr].power())
                    to_delete.append(r_b_nr)
                    print(f'Robot {robots[r_b_nr].get_name()} has been slain by {robots[r_a_nr].name()}')

                elif robots[r_a_nr].power() < robots[r_b_nr].power():
                    robots[r_b_nr].power(robots[r_b_nr].power() + robots[r_a_nr].power())
                    to_delete.append(r_a_nr)
                    print(f'Robot {robots[r_a_nr].name()} has been slain by {robots[r_b_nr].name()}')
    
    for i in sorted(to_delete, reverse=True):
        del robots[i]


def game(number):
    for i in range(0, number):
        from random import randint

        if len(robots) == 1:
            print(robots[0].name, "is vicotrius")
            break

        to_delete = []
        for r_nr in range(len(robots)):
            strona_rand = randint(0,1)
            ruch_value = randint(0,4)


            if strona_rand == 0:
                try:
                    robots[r_nr].up(ruch_value)
                except:
                    to_delete.append(r_nr)

            elif strona_rand == 1:
                try:
                    robots[r_nr].left(ruch_value)
                except:
                    to_delete.append(r_nr)

        for r_nr in sorted(to_delete, reverse=True):
            print(f'Robot {robots[r_nr].name} lost all the power')
            del robots[r_nr]

        check_position()

game(100)

我将如何改进它?有任何想法吗?现在它似乎并没有像我预期的那样工作。 逻辑:

使用机器人类 - 实现机器人战斗。

每个玩家有 5 个机器人。人们交替移动机器人,如果机器人在一个领域相遇,则一个会占用另一个(或全部)的能量。当机器人电量耗尽时,会自动出现第二个机器人。

或实施完全随机的战斗

【问题讨论】:

    标签: python python-3.x oop


    【解决方案1】:

    我修复了这些错误:

    • 一个错字TypeErorr -> TypeError
    • 未定义函数self.sprawdz_power()
    • 未定义方法get_power()
    • 权力是一种属性,不需要instance.power()来获取它。
    • @property.setter可以通过instance.property = value设置属性
    • check_position 中的一个错误,if robots[r_a_nr].power &gt; robots[r_b_nr].power 然后是elif robots[r_a_nr].power &lt; robots[r_b_nr].power。当 robots[r_a_nr].power == robots[r_b_nr].power 时,切勿输入任何代码块。
    • check_position 中的一个错误,for i in sorted(to_delete, reverse=True) 可能会多次删除同一个机器人。

    python版本:3.7.7

    代码:

    from typing import List, Tuple
    from random import randint
    
    class Robot:
        def __init__(self, name: str, place : List[int], start: Tuple[int, int] = (0,0), power: int = 100):
            self._name = name
            self._place = place
            self._start = start
            self._power = power
    
        @property
        def name(self):
            return self._name
    
        @name.setter
        def name(self, value):
            if isinstance(value, str):
                self._name = value
            else:
                raise TypeError("must be a string")
        @property
        def place(self):
            return self._place
    
        @place.setter
        def place(self, value):
            if isinstance(value, list):
                self._start = value
            else:
                raise TypeError("must be a list")
            
        @property
        def start(self):
            return self._start
    
        @start.setter
        def start(self, value):
            if isinstance(value, tuple):
                self._start = value
            else:
                raise TypeError("must be a tuple")
    
        @property
        def power(self):
            return self._power
    
        @power.setter
        def power(self, value):
            if isinstance(value, int):
                self._start = value
            else:
                raise TypeError("must be a int")
    
        @property
        def check_power(self):
            if self._power <= 0:
                raise ValueError("No power")
    
        def left(self, value):
            # self.sprawdz_power()
            self.power -= value
    
            if self.place[0] - value < 0:
                self.place[0] = self.place[0] - value + 8
    
            else:
                self.place[0] = self.place[0] - value
                
        def up(self, value):
            # self.sprawdz_power()
            self.power -= value
    
            if self.place[1] + value > 7:
                self.place[1] = self.place[1] + value - 8
    
            else:
                self.place[1] = self.place[1] + value
    
            if self.place[1] == 5:
                self.power += 2
    
        def __str__(self):
            return "{} {} {}".format(self._name, self._place, self._power)
    
    def check_position():
        
        to_delete = []
        
        for r_a_nr in range(len(robots)):
            for r_b_nr in range(r_a_nr+1,len(robots)):
                
                if robots[r_a_nr].place == robots[r_b_nr].place:
                    
                    if robots[r_a_nr].power >= robots[r_b_nr].power:
                        robots[r_a_nr].power = robots[r_a_nr].power + robots[r_b_nr].power
                        to_delete.append(r_b_nr)
                        print(f'Robot {robots[r_b_nr].name} has been slain by {robots[r_a_nr].name}')
    
                    elif robots[r_a_nr].power < robots[r_b_nr].power:
                        robots[r_b_nr].power = robots[r_b_nr].power + robots[r_a_nr].power
                        to_delete.append(r_a_nr)
                        print(f'Robot {robots[r_a_nr].name} has been slain by {robots[r_b_nr].name}')
        
        for i in sorted(list(set(to_delete)), reverse=True):
            del robots[i]
    
    
    def game(number):
        for _ in range(number):
    
            if len(robots) == 1:
                print(robots[0].name, "is vicotrius")
                break
    
            to_delete = []
            for r_nr in range(len(robots)):
                strona_rand = randint(0,1)
                ruch_value = randint(0,4)
    
    
                if strona_rand == 0:
                    try:
                        robots[r_nr].up(ruch_value)
                    except:
                        to_delete.append(r_nr)
    
                elif strona_rand == 1:
                    try:
                        robots[r_nr].left(ruch_value)
                    except:
                        to_delete.append(r_nr)
    
            for r_nr in sorted(to_delete, reverse=True):
                print(f'Robot {robots[r_nr].name} lost all the power')
                del robots[r_nr]
    
            check_position()
    
    robots = [
        Robot(name = "A", place = [3,4], start = (0,0), power = 100),
        Robot(name = "B", place = [1,2], start = (0,0), power = 100),
        Robot(name = "C", place = [1,2], start = (0,0), power = 100),
        Robot(name = "D", place = [1,2], start = (0,0), power = 100),
        Robot(name = "E", place = [1,2], start = (0,0), power = 100),
    ]
    
    game(100)
    

    结果:

    Robot E has been slain by C
    Robot D has been slain by A
    Robot C has been slain by B
    Robot B has been slain by A
    A is vicotrius
    

    【讨论】:

    • @Daro1234451,如果我的回答有帮助,请采纳。
    猜你喜欢
    • 2011-08-02
    • 2018-02-27
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多