[英]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:我修复了这些错误:
TypeErorr
-> TypeError
TypeErorr
-> TypeError
self.sprawdz_power()
self.sprawdz_power()
get_power()
get_power()
instance.power()
to get it. instance.power()
来获取它。@property.setter
, you can set the property by instance.property = value
@property.setter
,您可以通过instance.property = value
设置属性if robots[r_a_nr].power > robots[r_b_nr].power
then elif robots[r_a_nr].power < robots[r_b_nr].power
. if robots[r_a_nr].power > robots[r_b_nr].power
则elif 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.for i in sorted(to_delete, reverse=True)
maybe delete the same robot several times. 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.