This game has 4 people moving randomly, one unit in one of the four directions (up, down, left, right), with a fifth person as a designated tagger. If this fifth person tags someone, the person is out. Game ends when there is one survivor left.
import random
class Player:
def __init__(self, name, status, speed, health, position):
self.name = name
self.status = status
self.speed = speed
self.health = health
self.position = position
def move(self, arena_limits, player_pos):
change = {"left": -1, "right": 1, "up": 1, "down": -1}
direction = random.choice(list(change.keys()))
if not self.is_stuck(arena_limits, player_pos):
if direction in ("left", "right"):
in_limits = 0 <= self.position[0] + (change[direction] * self.speed) <= arena_limits[0]
if in_limits and [self.position[0] + (change[direction] * self.speed), self.position[1]] not in player_pos:
self.position[0] += change[direction] * self.speed
else:
self.move(arena_limits, player_pos)
if direction in ("up", "down"):
in_limits = 0 <= self.position[1] + (change[direction] * self.speed) <= arena_limits[0]
if in_limits and [self.position[0], self.position[1] + (change[direction] * self.speed)] not in player_pos:
self.position[1] += change[direction] * self.speed
else:
self.move(arena_limits, player_pos)
else:
pass
def is_stuck(self, arena_limits, player_pos):
can_go_left = ([self.position[0] + (-1 * self.speed), self.position[1]] not in player_pos) and \
0 <= self.position[0] + (-1 * self.speed) <= arena_limits[0]
can_go_right = ([self.position[0] + (1 * self.speed), self.position[1]] not in player_pos) and \
0 <= self.position[0] + (1 * self.speed) <= arena_limits[0]
can_go_up = ([self.position[0], self.position[1] + (1 * self.speed)] not in player_pos) and \
0 <= self.position[1] + (1 * self.speed) <= arena_limits[1]
can_go_down = ([self.position[0], self.position[1] + (-1 * self.speed)] not in player_pos) and \
0 <= self.position[1] + (-1 * self.speed) <= arena_limits[1]
if not (can_go_up or can_go_down or can_go_left or can_go_right):
return True
else:
return False
def tag(self, player_list):
if self.status == "IT":
done = False
turns = 0
while not done:
turns += 1
player_pos = [user.position for user in player_list] + [self.position]
for player in player_list:
player.move([8, 8], player_pos)
above_or_under = player.position[0] in (self.position[0] + 1, self.position[0] - 1)
left_or_right = player.position[1] in (self.position[1] + 1, self.position[1] - 1)
if above_or_under or left_or_right:
del player_list[player_list.index(player)]
print(player.name + " has been eliminated after " + str(turns) + " turn(s)!")
if len(player_list) == 1:
print(player_list[0].name + " is the winner!")
print("-" * 20)
done = True
self.move([8, 8], player_pos)
tagger = Player("TAGGER", "IT", 1, 0, [8, 8])
for b in range(10000):
victims = []
for i in range(4):
victims.append(Player("Player" + str(i), "", 1, 0, [random.randint(0, 6), random.randint(0, 6)]))
tagger.tag(victims)
Some quick comments about the code:
- Comments will be added to my code soon
self.health
is currently not used but is planned on being used- The field is
8x8
and each person can move once in one of the four directions. If they are stuckis_stuck()
, they will simply not move - A player is out if they are directly above, next to, or below the tagger. Diagonally does not count
Main question here, can I shorten the code and can I make it more Pythonic?
health
is reserved for future improvements, but there is no real point in havingspeed
either. Do you plan to use different values in the future too? \$\endgroup\$ – 301_Moved_Permanently Aug 3 '18 at 7:05speed
is used in themove
andis_stuck
functions \$\endgroup\$ – Anthony Pham Aug 3 '18 at 15:30