简体   繁体   English

机器人 Class OOP 在 Python

[英]Robot Class OOP in Python

Here is the thing.事情就是这样。 So I wanted to create Robot class and make the Robot fights.所以我想创建机器人 class 并让机器人打架。 But know im struggling with weird output because all i've got is just但是我知道我正在为奇怪的 output 苦苦挣扎,因为我所拥有的只是

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

That's my code:那是我的代码:


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)

How would I improve it?我将如何改进它? Any ideas?有任何想法吗? Now it doesn't really seem to work as I expect.现在它似乎并没有像我预期的那样工作。 The logic:逻辑:

Using the robot class - implement robot battles.使用机器人 class - 实施机器人对战。

Each player has 5 robots.每个玩家有 5 个机器人。 People move the robots alternately, if the robots meet in one field, one takes part of the energy of the other (or all).人们交替移动机器人,如果机器人在一个领域相遇,一个会占用另一个(或全部)的能量。 When the robot's power runs out, a second robot automatically appears.当机器人的电力耗尽时,会自动出现第二个机器人。

or implement a fully random battle或实施完全随机的战斗

I fix these bugs:我修复了这些错误:

  • a typo TypeErorr -> TypeError一个错字TypeErorr -> TypeError
  • undefined function self.sprawdz_power()未定义 function self.sprawdz_power()
  • undefined method get_power()未定义的方法get_power()
  • power is a property,dont need instance.power() to get it. power 是一个属性,不需要instance.power()来获取它。
  • with @property.setter , you can set the property by instance.property = value使用@property.setter ,您可以通过instance.property = value设置属性
  • a bug in check_position, if robots[r_a_nr].power > robots[r_b_nr].power then elif robots[r_a_nr].power < robots[r_b_nr].power . check_position 中的错误, if robots[r_a_nr].power > robots[r_b_nr].powerelif robots[r_a_nr].power < robots[r_b_nr].power When robots[r_a_nr].power == robots[r_b_nr].power, never enter any code block.当 robots[r_a_nr].power == robots[r_b_nr].power 时,切勿输入任何代码块。
  • a bug in check_position, for i in sorted(to_delete, reverse=True) maybe delete the same robot several times. check_position 中的一个错误, for i in sorted(to_delete, reverse=True)可能会多次删除同一个机器人。

python version:3.7.7 python版本:3.7.7

code:代码:

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)

result:结果:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM