Ejemplo n.º 1
0
    def __init__(self):
        self.update_state = PlayerState()
        self.update_state.food = 0
        self.update_state.ammo = 0
        self.update_state.kills = 0
        self.update_state.party = 0

        self.player_state = PlayerState()

        self._time_left = LENGTH_OF_DAY
        self.street_factory = StreetFactory()
        self.game_state = None
Ejemplo n.º 2
0
Archivo: game.py Proyecto: KB9/Zombaez
    def __init__(self):
        self.update_state = PlayerState()
        self.update_state.food = 0
        self.update_state.ammo = 0
        self.update_state.kills = 0
        self.update_state.party = 1

        self.player_state = PlayerState()
        self._time_left = LENGTH_OF_DAY
        self.street_factory = StreetFactory()
        self.game_state = None
Ejemplo n.º 3
0
class Game(object):

    def __init__(self):
        self.update_state = PlayerState()
        self.update_state.food = 0
        self.update_state.ammo = 0
        self.update_state.kills = 0
        self.update_state.party = 0

        self.player_state = PlayerState()

        self._time_left = LENGTH_OF_DAY
        self.street_factory = StreetFactory()
        self.game_state = None

    @property
    def time_left(self):
        return self._time_left


    def update_time_left(self, time_spent):
        self._time_left -= time_spent

    def turn_options(self):
        return ACTIONS[self.game_state]


    def take_turn(self, action, value=None):

        def diff_state(state_a, state_b):
            state = PlayerState()
            state.party = state_a.party - state_b.party
            state.food = state_a.food - state_b.food
            state.ammo = state_a.ammo - state_b.ammo
            state.kills = state_a.kills - state_b.kills
            state.days = state_a.days - state_b.days
            return state

        turn_actions ={
            'MOVE': self.__action_move,
            'ENTER': self.__action_enter,
            'WAIT': self.__action_wait,
            'SEARCH': self.__action_search,
            'EXIT': self.__action_exit,
            'FIGHT': self.__action_fight,
            'RUN': self.__action_run,
        }

        # save current player state
        player_last_state = deepcopy(self.player_state)

        if action in self.turn_options():
            turn_actions[action](value)
        else:
            pass

        state_change = diff_state(self.player_state,player_last_state)
        self.update_state = state_change




    def start_new_day(self):
        self.player_state.days += 1
        self._time_left = LENGTH_OF_DAY
        self.street = self.street_factory.make_street(self.player_state)
        self.game_state = 'STREET'



    def end_day(self):
        # update the amount of food left.
        food = self.player_state.food
        people = self.player_state.party
        leavers = 0

        self.update_state.days = 1
        # if there is not enough food some people leave.
        if people > food:
            leavers = random.randint(1, people - food)
            self.player_state.party = people - leavers
            self.player_state.food = 0
        else:
            self.player_state.food = food - people



    def is_day_over(self):

        if self.time_left <= 0:
            return True
        else:
            return False

    def is_game_over(self):
        """
        :return: True if the game is over, i.e. if the party_size is zero
        """
        if self.player_state.party <= 0:
            return True
        else:
            return False


    def __action_move(self, value=None):

        # Update where the Player is. i.e. which house are they infront of
        moved = False
        if value is None:
            moved = self.street.move_to_next_house()
        else:
            moved = self.street.move_to_house(value)
        if moved:

            self.update_time_left(self.player_state.move_time)
            self.game_state = 'STREET'


    def __action_enter(self, value=None):

        # player enters the current house.

        self.update_time_left(ENTER_TIME)
        self.game_state = 'HOUSE'


    def __action_wait(self, value=None):

        self.update_time_left(WAIT_TIME)


    def __action_search(self, value=None):

        # need to select which room to search
        selected = False
        if value is None:
            selected = self.street.get_current_house().move_to_room(0)
        else:
            selected = self.street.get_current_house().move_to_room(value)

        if selected:
            current_room = self.street.get_current_house().get_current_room()
            #print current_room
            if current_room.zombies > 0:
                self.game_state = 'ZOMBIE'
            else:
                self.__player_clears_room(current_room)
                self.game_state = 'HOUSE'


    def __action_exit(self, value=None):

        self.update_time_left(EXIT_TIME)
        self.game_state = 'STREET'
        self.current_room = None


    def __action_fight(self, value=None):

        self.update_time_left(FIGHT_TIME)

        current_room = self.street.get_current_house().get_current_room()
        zombies = current_room.zombies
        ammo = current_room.ammo
        self.__player_attacks_with_ammo(current_room)

        p_loss = 0.15+(zombies*0.02)-(ammo*0.01)
        self.__player_attacked_by_zombie(p_loss)

        if current_room.zombies > 0:
            p_win= 0.3 + max(0.01 * self.player_state.party, 0.15)
            self.__player_attacks_without_ammo(current_room, p_win)

        if current_room.zombies <= 0:
            self.__player_clears_room(current_room)
            self.game_state = 'HOUSE'

        else:
            self.game_state = 'ZOMBIE'


    def __action_run(self, value=None):

        self.update_time_left(RUN_TIME)
        self.__player_attacked_by_zombie(0.4)
        self.game_state = 'STREET'


    def __action_none(self, value=None):

        self.update_time_left(NONE_TIME)



    def __player_clears_room(self, current_room):

        self.player_state.food += current_room.food
        self.player_state.party += current_room.people
        self.player_state.ammo += current_room.ammo
        current_room.cleared()
        self.update_time_left(self.player_state.search_time)


    def __player_attacked_by_zombie(self, p_loss = 0.2):
        p = random.uniform(0,1)
        if p < p_loss:
            self.player_state.party -= random.randint(1,max(3,self.player_state.party))


    def __player_attacks_without_ammo(self, current_room, p_win=0.3):

        zombies = current_room.zombies
        p = random.uniform(0,1)
        if p < p_win:
            kills = current_room.zombies
            current_room.zombies = zombies - kills
            self.player_state.kills += kills

    def __player_attacks_with_ammo(self, current_room, p_win=1.0):

        zombies = current_room.zombies
        ammo = self.player_state.ammo
        kills = min(ammo, zombies)
        current_room.zombies = zombies - kills
        self.player_state.ammo -= kills
        self.player_state.kills += kills