# Worms #

### inleiding

    e-mail groepsindeling (OK)
    first part: single class
    second part: associations between classes
    third part: inheritance and generics
    TA voor vragen (ogp-project@cs.kuleuven.be)
    Engels!
    Git gebruiken (GitHub)
    attention: documentation, accurate specifications, re-usability and adaptability

### Assignment

    2D wereld
    goal: kill worms of other teams and have the last surviving Worms
    based on original artillery strategy (1995 by Team17 Digital)
    eventuele helper classes: classes marked @Value
    All aspects schould be specified formally and informally

### Properties of Worms

    name
    location
    orientation
    radius
    mass
    points


### location
    (x,y) coordinaten
    in meter
    defensief

### orientation
    orientation hoek theta (radialen)
    rechts: th0 boven: pi/2
    nominaal
    0..2pi

### shape
    cirkel
    min 0.25m straal (final) (in toekomst veranderen maar niet tijdens leven van worm)
    kan veranderen tijdens uitvoering
    defensief

### massa - DONE?
    afh. van radius
    in kg
    p = 1062 kg/m3
    m = p · (4/3 · πσ^3)

### 'action' points = stamina
    points = massa
    uitgedrukt in int (afgerond tot dichtsbijzijnde)
    massa veranderd -> max punten ook
    0 <= punten <= max
    total


### naam - DONE
    min 2 letters
    1e letter uppercase
    alleen letters quotes en spaties
    defensief
    later mogelijk meer tekens

### Opmerkingen

    type niet gezegd -> double (radius, coordinaat)
    Double.NEGATIVE_INFINITY && Double.POSITIVE_INFINITY toegestaan

##Turning and Moving

### method move
    change location worm (location, orientation, number of steps)
    occurs in steps
    distance one step = radius worm
    given number of steps >= 0
    defensief

### method turn
    change orientation of worm
    adding given angle to current orientation
    nominaal
    resulting angle in specified range for orientation of worm

### move and turn costs action points
    orientation change by 2pi => decrease current action points by 60
    orientation change by 2pi/f => decrease current action point by 60/f
    movement: horizontal stap => 1 action points ; vertical => 4
    total cost step: abs(cos theta) + abs(4sin theta)
    action point: int (round to next int)

## Jumping

### method jump
    change location (respect orientation and action points)
    defensief
    given: remaining action points and mass
    force jump: F = (5*APs) + (m*g)       (g = 5.0m/s^2)
    duration: 0.5s
    initial velocity: v0 = (F/m) * 0.5s   (formula may change)
    velocity: nonnegative and finite

### method jumpStep
    computes in-flight locations (xDeltaT, yDeltaT) of a jumping worm any deltaT
    hom compute: page 5
    distance: d = (v0^2 * sin(2 theta))/g
    t = d/(v0 * cos theta)  (seconds)

### method jumpTime
    returns t above
    orientation: pi < theta < 2pi => worm shall not move
    jumping: consumes all remaining action points
    jumpTime and jumpStep must not change attributes of a worm

## Opmerkingen

    future: involve further trajectory parameters or geographical features

### Storing and Manipulating Real Numbers as Floating-Point Numbers

    double: store/return arbitrary real numbers
    double: subset of real numbers (Double.POSITIVE_INFINITY to Double.NEGATIVE_INFINITY)
    arithmetic operations on double, whose result is double => rounding correct number to   obtain a value of type Double
    idealised JAVA: double same meaning as in regular math
    correct solution: interpreting your code and formal docu. as statements and expressions of idealised JAVA
    reasoning: ignore rounding issues
    testing program: not ignore => result within acceptable distance from correct result
    acceptable: abs(r-e)/abs(e) < 0.01%   (r = observed result, e = expected result)
    use JUnit's assertEquals(double, double, double) method to test acceptable distance

### Testing

    write JUnit test suite for move, turn and jump
    include test suite in your submission

### User Interface

    GUI to visualise effects of various operations on worms
    included in assignment as JAR file
    import JAR into Eclipse as existing project
    src-provided contains source code of user interface and helper classes
    no modification form your side
    developed classes must be placed in src and tests
    connect implementation to GUI: write class Facade in worms.facade

### method Facade
    implements provided interface IFacade from package worms.facade
    IFacade.java contains additional instructuons on implementation required methods

### start program
    run main method in class worms.Worms
    press keys to modify state of program (see page 7)
    GUI displays part of space: worms may leave and return to visible area
    we will test your implementation by running JUnit tests against your implementation of IFacade
    IFacade shall only throw ModelException
    incomplete test class is included to show what our tests look like

### Submitting

    solution: submit jar file (individually by all team members)
    before 11/03 at 11:59 PM
    include all source files (including tests) and generated class files
    include name, course of studies and link to your code repository in comments of solution

### Feedback

    TA will give feedback
    feetback sessions between 19/03 en 30/03 (Toledo) 
