Python中的机器人类OOP

Python中的机器人类OOP,python,python-3.x,oop,Python,Python 3.x,Oop,事情是这样的。所以我想创建机器人类,让机器人战斗。但我要知道,我在为奇怪的输出而挣扎,因为我所拥有的只是 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

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

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)

从键入导入列表、元组
职业机器人:
def(self,name:str,place:List[int],start:Tuple[int,int]=(0,0),power:int=100):
self.\u name=name
自我。_地点=地点
self.\u start=start
自功率=功率
#进一步的任务
@财产
def名称(自我):
返回self.\u name
@姓名设定器
def名称(自身、值):
如果isinstance(值,str):
self.\u name=value
其他:
raise TypeError(“必须是字符串”)
@财产
def位置(自我):
返回自己的位置
@定位符
定义位置(自身、值):
如果isinstance(值,列表):
self.\u start=值
其他:
raise TYPERORR(“必须是列表”)
@财产
def启动(自):
返回自我。\u开始
@启动设定器
def启动(自身、值):
如果isinstance(值、元组):
self.\u start=值
其他:
raise TYPERORR(“必须是元组”)
@财产
def电源(自):
恢复自我动力
@功率设定器
def功率(自身、数值):
如果isinstance(值,int):
self.\u start=值
其他:
raise TYPERORR(“必须是整型”)
@财产
def检查_电源(自):
如果是自功率7:
self.place[1]=self.place[1]+值-8
其他:
self.place[1]=self.place[1]+值
如果self.place[1]==5:
自功率+=2
#定义权限(自我、价值):
#def down(自身,值):
定义(自我):
返回“{}{}{}”。格式(self.\u名称、self.\u位置、self.\u电源)
机器人=[
机器人(name=“A”,位置=[3,4],启动=(0,0),功率=100),
机器人(name=“B”,位置=[1,2],启动=(0,0),功率=100),
机器人(name=“C”,位置=[1,2],启动=(0,0),功率=100),
机器人(name=“D”,位置=[1,2],启动=(0,0),功率=100),
机器人(name=“E”,位置=[1,2],启动=(0,0),功率=100),
]
def检查位置()
删除=[]
对于范围内的r_a_nr(透镜(机器人)):
对于范围内的r_b_nr(r_a_nr,len(机器人)):
如果机器人[r\u a\u nr].place()==机器人[r\u b\u nr].place():
如果机器人[r\u a\u nr].power()>机器人[r\u b\u nr].power():
机器人[r\u a\u nr].power(机器人[r\u a\u nr].get\u power()+机器人[r\u b\u nr].power())
to_delete.append(r_b_nr)
print(f'Robot{robots[r_b_nr].get_name()}已被{robots[r_a_nr].name()杀死)
elif robots[r_a_nr].power()
我将如何改进它?有什么想法吗?现在它似乎并不像我预期的那样有效。 逻辑是:

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

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

或者实施一场完全随机的战斗

我修复了这些错误:

  • 打字错误
    typerorr
    ->
    TypeError
  • 未定义的函数
    self.sprawdz\u power()
  • 未定义的方法
    get\u power()
  • 电源是一个属性,不需要
    instance.power()
    来获取它
  • 使用
    @property.setter
    ,您可以通过
    instance.property=value
  • 检查位置中的错误,
    如果机器人[r\u a\u nr]。电源>机器人[r\u b\u nr]。电源
    然后
    如果机器人[r\u a\u nr]。电源。当robots[r\u a\u nr].power==robots[r\u b\u nr].power时,切勿输入任何代码块
  • 检查位置中的错误,
    对于排序中的i(to\u delete,reverse=True)
    可能会多次删除同一个机器人
python版本:3.7.7

代码:


@Daro1234451,如果我的回答有帮助,请接受。
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