Tweakers dev challenge writeup - 12

Door Boudewijn op donderdag 1 oktober 2015 00:12 - Reacties (0)
Categorie: Tweakers dev challenge, Views: 754

Deze opgave volgthetzelfde stramien als de romeinse cijfers opgave die we hier zagen:
  • Neem een staat
  • Voer acties uit en muteer de staat
  • Evalueer en herhaal indien nodig
Een Warrior, Mage en Rogue trekken een kerker in om deze vrij te waren van monsters. De aanval op ieder nieuw monster begint hetzelfde: de Warrior leidt de aanval en brengt de eerste slag toe. De Mage start net voor de eerste aanval van de Warrior met de casting tijd en als laatste begint de Roque met aanvallen. Omdat de heren avonturiers zo op elkaar afgestemd zijn gebeurt dit alles in een fractie van een seconde.

Warrior: Elke 4s 35 punten schade
Mage: 2s casting tijd en daarna elke 8s 80 punten schade
Rogue: Elke 4s 30 punten schade vanuit het primaire wapen en elke 3s 20 punten schade vanuit het secundaire wapen
Wanneer twee of meer avonturiers in dezelfde seconde aanvallen wordt de schade die door de Warrior gedaan wordt altijd eerst berekend, gevolgd door de schade van de Mage terwijl de Rogue binnen die seconde pas als laatste zijn schade toedient.
In de kerker komen de heren avonturiers de volgende monsters tegen

Monster 1 met 300 hitpoints
Monster 2 met 600 hitpoints
Monster 3 met 850 hitpoints
Monster 4 met 900 hitpoints
Monster 5 met 1100 hitpoints
Bossman met 3500 hitpoints


Wat is de totale hoeveelheid overkill die de Warrior toebrengt aan de monsters waarbij hij de doodslag toedient? De overkill is de hoeveelheid 'overbodige' schade omdat het monster voor het toedienen daarvan al verslagen is.
Als je redelijk leest en de gameplay-regels goed implementeert is het erg straightforward.

Wat het overzichtelijk maakt is een lijstje maken met de game-logica (ja nu wat overkill...) en daarbij noteren welke bondgenoot vanaf welk moment welke schade toebrengt.
Hierna maak je een functie waar je je hitpoints opgeeft, die vanaf tijdstip 0 tot tijdstip X gaat lopen en telkens deze regels toepast. Is het aantal hitpoints 0? Dan stop je. Is het aantal hitpoints kleiner dan 0... dan heb je overkill en geef je dat terug.
Aangezien alle bondgenoten tegelijk de schade toebrengen moet je eerst alle schade die seconde bij elkaar optellen, en daarna pas van de hitpoints aftrekken.

En zo geschiedde:
https://github.com/boudew.../tweakers-challenge/12.py

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# retourneert overgebleven hitpoints. Van belang is je te realiseren dat OF de warrior iemand killt en dan is de overkill relevant, of iemand anders doet het en dan telt de overkill niet
def voerStrijd(vijand_hp):
    seconden=0
    while (vijand_hp > 0 ):
        #print ("Staat na seconden: "+str(seconden)+" @HP :"+str(vijand_hp))
        schade_deze_seconde=0
        # de warrior
        if (seconden %4 == 0):
            schade_deze_seconde += 35
            if vijand_hp-schade_deze_seconde<=0:
                return (abs(vijand_hp-schade_deze_seconde))
        # de mage
        if (seconden %8 == 2 ):
            schade_deze_seconde += 80
        # de rogue , primair
        if (seconden %4 == 0 ):
            schade_deze_seconde +=30
        # de rogue, secundair
        if ( seconden %3 ==0 ):
            schade_deze_seconde+=20
    
        seconden +=1
        vijand_hp-=schade_deze_seconde
        
    # de warrior heeft de vijand niet gedood dus score is niet relevant
    return 0    
        
warrior_overkill = voerStrijd(300)
warrior_overkill += voerStrijd(600)
warrior_overkill += voerStrijd(850)
warrior_overkill += voerStrijd(900)
warrior_overkill += voerStrijd(1100)
warrior_overkill += voerStrijd(3500)

print ("Warrior overkill: "+str(warrior_overkill))




Op naar de volgende dungeon, op:
Boudewijns blog

Volgende: Tweakers dev challenge writeup - 13 10-'15 Tweakers dev challenge writeup - 13
Volgende: Tweakers dev challenge writeup - 11 10-'15 Tweakers dev challenge writeup - 11

Reacties

Er zijn nog geen reacties op deze post


Reactie formulier
(verplicht)
(verplicht, maar wordt niet getoond)
(optioneel)

Voer de code van onderstaand anti-spam plaatje in: