02.09.2013 Views

Sidste dSoftArk aflevering

Sidste dSoftArk aflevering

Sidste dSoftArk aflevering

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

1<br />

<strong>Sidste</strong> <strong>dSoftArk</strong> <strong>aflevering</strong><br />

Gruppe 14<br />

December 19, 2007<br />

Til validering af standard træk (dvs. der ikke er en checker i bar, for den respektive<br />

spiller, og han ikke vil flytte den til bear off).<br />

Vi betragter vores validering som en boolsk funktion med følgende parametre<br />

v( move, player, board-state, die-value), hvilket betyder at det er det vi har<br />

tilgængeligt at regne p˚a.<br />

Vi startede med at definere en funktion dist(f,t) (from og to henholdsvis)<br />

der beregner afstanden mellem 2 felter.<br />

Som vores første slice i partitioneringen ligger de to tilfælde:<br />

dist(f, t) = dice − value - Valid<br />

dist(f, t) = dice − value - Invalid<br />

f og t er afledt af move parametren.<br />

dist(f, t) = dice − value ↑<br />

dist(f, t) = dice − value<br />

Som en lille note s˚a er en valid partitioner markeret med ↑<br />

Som det næste definerede vi en color(c) funktion der giver farven p˚a et felt,<br />

vi kan s˚a opdele vores partitionering yderligere Med hensyn til color, s˚a vil vi<br />

ogs˚a gerne skelne mellem farven p˚a spilleren, p˚a den m˚ade om han er none eller<br />

ej. vores første farve inddeling bliver derfor<br />

player = none som er invalid. Den næste m˚ade som vi vil skelne mellem farver<br />

p˚a, er om felt farven p˚a from feltet er det samme som spilleren eller ej. det giver<br />

os 2 yderligere:<br />

color(f) = player ∧ player = none - Invalid<br />

color(f) = player ∧ player = none - Valid<br />

1


color(f) = player∧player = NONE<br />

color(f) = player ∧ player = NONE<br />

player = NONE<br />

dist(f, t) = dice − value ↑<br />

dist(f, t) = dice − value<br />

Det sidste vi skal have checket er om et felt er blocked (om der st˚ar 2 af<br />

fjendens brikker der eller mere). I vores partitionering har vi nu lige præcis<br />

en partition der er valid, den vil vi arbejde videre med, og efterlade de andre<br />

som de er (I dette eksempel bliver de restende 5 partitioner ikke valid af at vi<br />

finindeler dem). Vi definerer en ny funktion isBlocked(f, p) der afgør om et felt<br />

er blocked ud fra et felt og en player, lidt mere detaljeret kunne den beskrives<br />

s˚aledes:<br />

isBlocked(f, p) = count(f) >= 2 ∧ color(f) = p<br />

læg mærke til at vi brugte funktionen count, den tæller antallet af brikker p˚a et<br />

felt. vi opdeler nu den valide partition i 2 nye, defineret ud fra: isblocked(f, player)<br />

- Invalid<br />

¬isblocked(f, player) - Valid<br />

dist(f, t) = dice − value<br />

color(f) = player ∧ player = NONE<br />

color(f) = player ∧ player = NONE<br />

↑ ¬isBlocked(t, player)<br />

Udfra denne partionering er vi nu endt op med en masse ækvivalensklasser.<br />

De er intuitivt disjunkte da enhver slice vi har lavet har været mere eller mindre<br />

binær, og begge tilfælde er dækket, alle tilfælde er dækket og der er ingen<br />

ækvivalensklasser der overlapper hinanden.<br />

Udfra ækvivalensklasserne skal vi have følgende tests:<br />

2<br />

player = NONE


en Hvor terningen ikke matcher distancen brikken flyttes, men derudover er alle<br />

regler overholdt, dette tester klassen . Vi kan s˚a argumentere for at vi ikke<br />

behøver en test i og da de alligevel vil fejle.<br />

I samtlige af de næste tests lader vi terninge værdien matche distancen.<br />

I denne test lader vi player være none, og udfører derefter et ellers helt legalt<br />

træk, den skulle gerne fejle, vi har s˚aledes testet klassen . I den næste test<br />

prøver vi at flytte p˚a modstanderens brik, det svarer til at teste klassen ,<br />

der skal naturligvis ogs˚a melde false.<br />

I næste test vil vi prøve at flytte en brik hen p˚a et felt hvor den st˚ar 2 af<br />

modstanderens brikker. Denne test giver klassen , og er invalid.<br />

i den sidste test prøver vi at udføre et fuldstændig legalt træk, der er valid,<br />

og s˚a burde vi jo ogs˚a f˚a en true p˚a den. Dette tester<br />

Det er diskutabelt om der burde have været en finere inddeling, f.eks. med<br />

blocked tilfældet, kunne man har haft mere end 2 brikker p˚a feltet, netop 2<br />

brikker p˚a feltet og mindre en 2 brikker p˚a feltet<br />

2<br />

Her skal vi lave en analyse af situatinen n˚ar en spiller har en brik p˚a bar feltet.<br />

Det jo ˚abentlyst at vi ikke behøver at starte forfra men kan egentlig blot forfine<br />

vore nuværende partitionering, da regelsættet her blot er en stramning af det<br />

foreg˚aende. Vi vil derfor kun kigge p˚a den valide partion fra det foreg˚aende, og<br />

s˚a m˚a man tænke sig til at den kan copy pastes oven p˚a det tilsvarende felt fra<br />

opgave 1.<br />

Her kan vi igen bruge count funktionen, denne benytter vi til at tælle antallet<br />

af brikker i bar (vi har valgt ikke at skelne, det er nødagtig det samme<br />

hvadenten du er rød eller sort.<br />

vi har s˚aledes 2 tilfælde:<br />

count(bar) = 0 og count(bar) > 0 Hvis vi er i det første tilfælde s˚a er det<br />

egentlig blot reglerne fra opgave 1 der gælder (partitionen er alts˚a lovlig) det<br />

andet tilfælde skal dog subinddeles lidt. Reglerne siger at hvis der ligger en brik<br />

p˚a bar s˚a skal den flyttes inden en anden m˚a flyttes.<br />

Det giver jo anledning til 2 partionener:<br />

from = bar - Valid<br />

from = bar - Invalid<br />

Vi ender s˚aledes op med denne partition:<br />

↑ count(bar) > 0 ∧ from = bar count(bar) > 0 ∧ from = bar ↑ count(bar) = 0<br />

3


Denne repartitionering giver kun anledning til 2 ekstra test: Et normalt valid<br />

move, hvor der dog ligger en brik i bar. Denne skal give false, og den tester .<br />

I den sidste test ligger der en brik p˚a bar, og den flyttes helt legalt, Dette tester<br />

3<br />

.<br />

behøver vi ikke teste da den allerede er testet i opgave 1.<br />

De ekstra tests som i følge vores systematiske test-forløb skal tilføjes til vores<br />

system er følgende:<br />

• playerIsNONEbutValidMove<br />

• rightDistColorNotPlayer1of2<br />

• rightDistColorNotPlayer2of2<br />

• MoveFromColorNONE<br />

• MoveTooFar<br />

• MoveTooShort<br />

En kort analyse heraf følger nu.<br />

• playerIsNONEbutValidMove<br />

Her vælger.... flaf<br />

• rightDistColorNotPlayer1of2<br />

Nummer 2<br />

• rightDistColorNotPlayer2of2<br />

Nummer 3<br />

• MoveFromColorNONE<br />

Nummer 4<br />

• MoveTooFar<br />

Nummer 5<br />

• MoveTooShort<br />

Nummer 6<br />

4

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!