02312 Indledende programmering og Udviklingsmetoder til IT- Systemer
|
|
|
- Lene Villadsen
- 10 år siden
- Visninger:
Transkript
1 Projektopgave efterår 2009 jan Indledende programmering og Udviklingsmetoder til IT- Systemer Projekt navn: CDIO tre ugers projekt Gruppe nr.: 52 Afleveringsfrist: Mandag d Studie nr. Efternavn Fornavn Underskrift s Ehrari Humira Kontakt person (Projektleder) s093468, Yildirim Ahmet s080529, Søby Michael s093479, Petersen Paw 1/33
2 Timeregnskab Dato Navn design impl. test dok Paw Humira Ahmet Michael Paw Humira Ahmet Michael Paw Humira Ahmet Michael Paw Humira Ahmet Michael Paw Humira Ahmet Michael Paw Humira Ahmet Michael Paw Humira Ahmet Michael Paw Humira Ahmet Michael Paw Humira Ahmet Michael Paw Humira /33
3 Ahmet Michael Paw Humira Ahmet Michael Paw Humira Ahmet Michael Paw Humira Ahmet Michael Paw Humira Ahmet Michael 3/33
4 Indledning (Humira) Dette projekt er lavet i forbindelse med tre ugers perioden i faget indledende programmering (02312). I dette projektet har vi udviklet et program til simulering af et Matador spil, hvor vi bygger videre og samler sammen på alt det vi har beskæftiget os med i de stillede opgaver i 13 ugers. Opgaven går ud på at lave en et matadorspil som består af en spilleplade forskellige type felter, et sæt af terninger samt 2-6 antal spillere. Opgaven løses ved benyttelse af forskellige metoder såsom: setnavn() der sætter navn på pågældende spiller, SetFarve() der Sætter navn på pågældende spiller, getsaldo(), der returnerer saldoen på kontoobjektet til den pågældende spiller, withdraw(), der trækker beløb penge fra konto, deposite() Indsætter beløb på konto osv. For at kunne løse opgaven har vi udarbejdet en række diagrammer over de overordnede datastrukturer og klasser, der repræsenterer matador spillet. På baggrund af denne opgave har udarbejdet en rapport der indeholder en beskrivelse af vores diagrammer og programkoder. 4/33
5 Indhold Indledning (Humira)... 4 Kravspecificering... 7 Matador... 7 Udviklingsstrategi (Humira og Paw)... 8 Design (Humira)... 8 Diagrammer (før programmering) (Humira)... 8 Sekvensdiagram (Humira) Klasse diagram (Humira) Implementering MatadorRaflebaeger (Paw) Player (Paw) Konto (Paw) PlayerController (Paw) PlayerBoundary (Ahmet) Field (Paw) Refuge (Paw) Taxes (Paw) Ownable (Paw) Street (Paw) Shipping (Paw) Brewery (Paw) Prison (Paw) LuckyCards (Ahmet) GameBoard (Paw) GameBoardController (Paw) GameBoardBoundary (Ahmet) BCE (Paw) Design efter programmering (Humira) Use case Designklassediagram (Humira) /33
6 Sekvens for at købe grunde (Humira) Konstruktion og test (Humira) Test (Michael) Om testene Test-klassen Manuel test Konklusion (Ahmet) Bilag /33
7 Kravspecificering Matador Der ønskes udarbejdet et program til simulering af et Matador spil. Delopgave 1: Datastruktur Et matadorspil består af en spilleplade, et sæt af terninger samt 2-6 antal spillere. Endvidere består en spilleplade af en sekvens af felter af forskellig type. Design de overordnede datastrukturer og klasser, der repræsenterer en spilleplade, et felt, en spiller og et sæt terninger. Det et krav, at I tegner i et UML diagram (det er meget ofte at det er dette vi tager udgangspunkt ved start af eksamen), som beskriver de forskellige klassers interaktion, og at I benytter jer af nedarving. Alt dette har vi beskæftiget os med i de stillede opgaver i 13 ugers. I skal nu samle det til et projekt. Delopgave 2: Valg af funktionalitet Det er tanken at så mange af spillets funktioner som muligt skal implementeres. Dog kan det være hensigtsmæssigt (evt. pga. kompleksitet) at fjerne nogle af spillets funktionaliteter eller sætte begrænsninger på dem, f.eks. bytning af grunde på kryds og tværs. Delopgave 3: Design tilstandsmaskine Når det bliver en spillers tur, står han/hende overfor en række valg, muligheder og begrænsninger - f.eks. kan en spiller der lander på en grund, som ikke ejes af andre spillere, købe grunden, pantsætte egne grunde og så købe grunden, eller lade være. Design den tilstandsmaskine, som håndterer disse valg, muligheder og begrænsninger. Overvej om denne tilstandsmaskine skal placeres indeni spiller klassen eller udenfor i en separat klasse. Delopgave 4: Test Det forventes at I laver en grundig og dybdegående test at programmet. Gennemtænk hvordan alle dele af programmet, alle dele af koden, testes med relevante testdata. Overvej hvordan I kan automatisere testen og hvordan I kan gemme resultaterne af Jeres test som dokumentation. 7/33
8 Udviklingsstrategi (Humira og Paw) Vi vil først finde ud af hvilke funktionaliteter der er de vigtigste, herefter vil vi få programmeret dem. Vi vil så inkludere dem i vores tilstandsmaskine og teste den. Hver gang vi har lavet en ny funktion i vores tilstandsmaskine vil vi dokumentere den. Hvis vi har mere tid, vil vi prøve at implementere mindre vigtige funktioner. Vi starter altså først med at få lavet de vigtigste og mest risikofyldte funktionaliteter, og går herefter videre til de mindre vigtige, hvis der er tid. Ved at gøre det på denne måde, sikrer vi os at vi ikke ender op med en masse funktionaliteter, som ikke fungerer og dermed følger vi UP-metoden. Vi arbejder altså ud fra princippet i UP som siger at processen skal være risk-driven. Desuden følger vi spiralmodellen og får hver funktionalitet op at køre, en ad gangen, i stedet for at følge vandfaldsmodellen og ende op med en hel masse ufuldstændige funktioner, der eksempelvis ikke er testet eller dokumenteret ordentligt. Spiralmodellen, har flere fordele idet de forskellige iterationer sikre at risikoen for fejl bliver tjekket i hver iteration, derved mindskes hele projektets risici, jo længere inde i projektet man er. Vi mener dette er det model der passer bedst til projektet. Efter at vi et færdig med at implementer vores system, så vil vi dele det således op, så den overholder kravet om BCE- modellen. Design (Humira) Det kan være en god måde at beskrive udviklingen i et system vha. diagrammer. På den måde får man overblik over, hvad systemet gør i forskellige situationer, og dette er med til at skabe overblik således, at koden bliver pæn. På baggrund af dette har vi i designfasen udviklet nogle diagrammer både før programmering og efter programmering der giver overblik over hvordan systemet skal stykkes sammen (før programmering) og hvordan ser system ud (efter programmering). Vi har valgt at benytte klassediagram, use case model og sekvens- og BCE-diagram til at diagrammere udvalgte scenarier af vores system. Diagrammer (før programmering) (Humira) For at kunne danne sig et overblik over funktionelle krav i systemet, har vi lavet neden stående Use-case diagram da det er en beskrivelse af brugeren af et system. Dette er en metode til at holde problemstillingerne simple og forståelige på. Vi valgte at lokaliserer de vigtige processer i spillet. Hvor systemet bliver nedbrudt i små dele (cases), og spilleren i aktør, der anvender forskellige del af system. 8/33
9 Som de ses til højre i diagrammet har vi en ekstern aktør der i dette tilfælde er et spiller, der benytter forskellige del af systemet. Blandt dele af systemet er der landet eller passeret, når der bliver kastet med terninger så skal spillerne kunne rykke antal felter frem eller tilbage. På de felter som de lander, skal man kunne købe eller sælge grunde, eller skal der betales leje, dvs. systemet skal kunne håndtere at der er spiller der lejer eller udlejer, køber og sælger grunde dermed skal de kunne bygge huse og hoteller. Systemet skal kunne håndtere passere eller landet start feltet, prøve lykken, pantsætte, parkere og gå i fængsel. 9/33
10 Sekvensdiagram (Humira) For at kunne danne sig overblik over matador spillets centrale dele og de centrale funktioner der indgår i spillet, har vi udarbejdet neden stående sekvensdiagram, der viser kommunikation mellem de forskellige klasser. Som det ses i sekvensdiagrammet klassen spiller bruger klassen raflebæger, for at få information om terningerne, dernæst bruger den klassen bræt for at rykke, dette er fordi terningernes sum påvirker spillerne position på brættet. Så er der en pil fra bræt til felt der bruger metoden landet på felt, til sidst sker der transaktioner. 10/33
11 Klasse diagram (Humira) Eftersom vi i dette projektet skulle bygge videre og samle sammen på alt det vi har beskæftiget os med i de tidligere stillede opgaver i 13 ugers perioden, har vi udarbejdet neden stående klassediagram for at danne sig overblik over de dele der mangler i spillet og det krav der er blevet stillet til opgaven. Klassediagrammet er ikke særlig detaljeret da vi bruger det til at få inspirationer til at bygge videre. Klassen Field er den klasse, hvor de øvrige felter nedarver fra. Vi har valgt at tilføje klasserne Spiller, Raflebæger, Konto og GameBoard i klassediagrammet. Dette fordi en spiller skal kunne lande på et felt, hvorefter han 11/33
12 skal betale eller modtage penge. Raflebægeret er med til at bestemme lejen i Brewery-felterne. Klassen Gameboard indeholder array med felterne. Klassen Taxes overfører et beløb til spilleren, der lander på feltet. Dette gøres ved at lade spilleren bruge feltets landonfield(). Street, Shipping og Brewery er de tre felter der kan ejes af spillere, alle klasserne nedarver fra Ownable, og har dermed en pris og en leje for at lande på grunden. Når en spiller lander på et rederi, skal der overføres penge fra spilleren til ejeren af grunden. Dette gøres ved at tilsidesætte den nedarvede landonfield()-metode med en, der overfører beløbet. 12/33
13 Implementering MatadorRaflebaeger (Paw) Vi har først oprettet konstanterne T1SIDER og T2SIDER, som er antallet af sider på henholdsvis terning 1 og 2. Konstanterne er sat til public, da vi gerne vil kunne hente antallet af sider til vores test-klasse. Desuden har vi variablerne terning1, terning2, sum som alle er int. Derudover har vi boolean-variablen ens. kast(): Vores kastefunktion genererer tilfældige tal for terning1 og terning2 ved hjælp af nextint()- kommandoen fra java.util.random, som vi har importeret i starten af klassen. Ved at bruge T1SIDER og T2SIDER som argument i nextint()-kommandoerne bliver der genereret et tal mellem 0 og 5, dette tal lægger vi så 1 til, for at få et tal mellem 1 og 6. Vores kaste-funktion ligger desuden i konstruktøren, således at terningerne i forvejen er kastet, når objektet oprettes i test-klassen. getøjne1() og getøjne2() returnerer variablerne terning1 og terning2, som indeholder antallet af øjne på hver terning. printøjne(): Denne ekstra-funktion returnerer en 2-linjet streng, der fortæller værdierne af terning1 og terning2. Funktionen er strengt taget ikke nødvendig, alligevel har vi valgt at beholde den. getsum() lægger terning1 og terning2 sammen, hvorefter den returnerer summen, sum. getens(): Hvis terning1 er lig med terning2 ændres boolean-variablen ens til true, ellers ændres den til false. Til sidst returnerer den ens. Player (Paw) Vores Player-klasse har variablerne navn og farve som henholdsvis String og int. Klassen har desuden et konto-objekt kaldet k. Da alle disse er sat til private, har vi nogle funktioner som bruger dem: Funktionerne setnavn(), setfarve(), getnavn() og getfarve() bruges til at sætte eller få returneret navn og farve. Desuden har vi en printfarve()-funktion der udskriver navn og farve. Vi har desuden en tostring()-funktion, som returnerer en streng med navn og k (her køres Konto-klassens tostring()-funktion). For at forbinde klassen til vores GameBoard, har vi oprettet en variabel kaldet position, som er af typen int. Desuden har vi en boolesk variabel, jail, som angiver om spilleren er i fængsel eller ej. Til disse værdier har vi både get- og set-funktioner. Funktionen move(int antalfelter) ændrer spillerens position til at være summen af hans nuværende position og antalfelter. Desuden bliver der trukket 40 fra position, hvis værdien for position overstiger dette tal, hvorefter der bliver kørt funktionen passeretstart() på hans konto. Desuden har vi oprettet henvisninger til de funktioner som vi har i Konto-klassen, så vi eksempelvis kan indsætte penge på en spillers konto ved at bruge player.deposite(double amount). 13/33
14 Konto (Paw) Klassen har en double-variabel, saldo, som er playerens saldo. Desuden har vi to arrays, transtid[] og beløb[], som håndterer punkt 9 i opgavebeskrivelsen (transaktioner skal gemmes med oplysninger om transaktionstid og beløb). Længden af de to arrays bliver sat til maxtrans (maksimum transaktioner), som er sat til Dette er en lille svaghed ved vores program da vi gemmer transaktionerne i arrays, bliver vi nødt til på forhånd at definere det maksimale antal mulige transaktioner. Hvis alle pladserne i de to arrays bliver udfyldt, opstår der altså et problem. Dog regner vi ikke med at der bliver lavet 1000 transaktioner så vi regner ikke med at der opstår problemer med mindre man med vilje fremprovokerer unaturligt mange transaktioner i et spil. Alternativt kunne vi have brugt arraylists. Vi har så en række funktioner. Funktionen getdatetime() returnerer tidspunktet som en streng på formen timer:minutter:sekunder og bruges kun internt i klassen til at gemme tidspunkter i arrayet transtid[]. getsaldo() returnerer spillerens saldo. withdraw(double amount) og deposite(double amount) bruges til at hæve og indsætte penge i spillerens saldo. withdraw(double amount) tjekker desuden om spilleren prøver at hæve flere penge end han har på sin saldo, på den måde undgår vi at hans saldo kan gå i minus. Hver gang withdraw(double amount) eller deposite(double amount) bliver kørt, gemmes tidspunkt og beløb på de næste tomme pladser i transtid[] (ved hjælp af getdatetime()-funktionen) og beløb[] (beløbenes fortegn afgør om pengene er blevet indsat eller hævet). Funktionen printoversigt() kan så bruges til at udskrive en oversigt over transaktionernes tidspunkt og beløb - lige som de oversigter man får fra banken i virkeligheden. Funktionen passeretstart() laver en deposite(double amount) med værdien for variablen passerstart på 4000, som argument. beløbtjek(double amount) returnerer sandt eller falsk, afhængig af om spilleren har det beløbet amount, fra funktionens argument, på sin saldo. Konto-klassens tostring()-funktion returnerer saldoen. PlayerController (Paw) Vi har først oprettet nogle variable: antalspillere og spillernummer. Herefter har vi oprettet 3 arrays: spillere[], farvearray[] og color[]. spillere[] er af typen Player, dens længde bliver defineret senere. farvearray[] er af typen String, og indeholder alle de farver som spillerne kan vælge imellem. På første plads i arrayet har vi ingen farve, som hver spiller starter med at have, når han bliver oprettet. color[] er af typen int, og har samme længde som farvearray[]. Arrayet color[] bliver brugt til at sikre at hver farve kun kan vælges én gang hvis en farve er i brug, sættes pladsen til 1. Er farven ikke i brug, har den værdien 0. Vi har så en række funktioner som returnerer og sætter de forskellige variabler. Derudover har vi getactiveplayers(), som gennemgår arrayet spillere[] og tjekker hvor mange af pladserne i arrayet, som ikke er tomme (dvs. der er en aktiv spiller), ved hjælp af en løkke. Antallet af aktive spillere returneres så. 14/33
15 getwinner()-funktionen tjekker først om der kun er én spiller tilbage i spillet, hvorefter spiller-arrayet bliver gennemgået og sætter variablen winner til at være lige spilleren. Variablen winner returneres så. navnoptaget(string navn) tjekker ved hjælp af en while-løkke om et navn allerede er taget, der skelnes ikke mellem store og små bogstaver, idet vi bruger equalsignorecase(string anotherstring). Funktionerne setnavn(player spiller, String navn) og setfarve(player spiller, int farvevalg) opretter navn og farve i henholdsvis spillere[] og farve i Player-klassen. Desuden bliver color[] i setfarve(player spiller, int farvevalg) opdateret, således at der er styr på hvilke farver er taget. PlayerBoundary (Ahmet) Starter med at lave en public static void, hvor spilleren skal indtaste sit navn og får tildelt et spillernummer. Derefter starter en while løkke som tjekker om navnet er optaget eller ej. Hvis navnet er optaget så gentages løkken. Hvis navnet ikke er optaget så tildeles spilleren et navn og et spillernummer. Derefter køres en public static void, hvor spiller skal vælge farve, som vælges ved at indtaste et tal mellem 1 og 6. Og hvis farven allerede er i brug skal spilleren vælge en ny farve som ikke er optager. Når man uoptaget farve vælges bliver man tildelt denne farve og så kan andre spillere ikke vælge denne farve. Derefter køres en public static void opret() metode som opretter spillere. Som starter med at spørge om hvor mange spillere der skal spille. En while løkke startes og betingelsen for denne er at antallet af spillere skal være mellem 2-6. Hvis ikke dette opfyldes så skal man indtaste antallet af spillere forfra. Hvis betingelsen opfyldes så kaldes playercontrolleren som sætter spillerne ind i spillet. Derefter kører en for løkke som scanner navnene og farverne på spillerne. Field (Paw) Klassen har variablerne number og name, som henholdsvis int og String. Disse er feltets nummer og navn, som er sat til protected, således at klasserne som nedarver fra klassen kan tilgå disse. Klassens konstruktør tager disse variable som argumenter. Vi har så defineret metoden landonfield(player player) som abstract, da alle de nedarvende klasser skal have denne metode. Metoden tager, som det ses, en spiller som argument. Denne metode har vi sat til at returnere en String med information om hvad der er sket med spilleren efter han er landet på feltet. Klassens tostring()-metode returnerer en streng med oplysninger om feltnavn og feltnummer. Refuge (Paw) Denne klasse nedarver direkte fra Field-klassen, og har udover argumenterne i Field-klassens konstruktør en bonus som int. Klassens tostring()-metode er den samme som Field-klassens. Synlighedsniveauet for variablen bonus er sat til private. Metoden landonfield(player player) tjekker først om bonus er større end nul, hvis den er det, indsættes bonus på spillerens konto, samt at den streng, som sendes tilbage, ændres. Ved at kunne sætte bonus til fx nul, når objektet oprettes, kan vi også bruge denne klasse til start-feltet og fængsels-besøgs-feltet. 15/33
16 Taxes (Paw) Også denne klasse arver fra Field. Da der i opgavebeskrivelsen står at der er to af disse skattefelter, har vi valgt at lade denne klasses konstruktør definere variablen tax, som er den skat man skal betale (int), når man lander på feltet. Klassens konstruktør tager både number, name og tax som argumenter, her har vi brugt super()-funktionen til at tilgå variablerne fra Field-klassen. Når en spiller lander på feltet, funktionen landonfield(player player), har vi først en løkke, som kører funktionen menu(player player) i GameBoardControlleren så længe han ikke har penge nok til at betale skatten. I menu(player player)-funktionen har spilleren mulighed for at sælge huse for at kunne komme videre i spillet. Kan han ikke skaffe nok penge, må han bruge Giv op -funktionen i menuen. Hvis spilleren har penge nok til at betale skatten (beløbtjek()-funktionen returnerer sandt), køres withdraw()-fuktionen på player-objektet, hvorpå skatten, tax, trækkes fra spillerens konto. Herefter returneres en streng der fortæller hvor meget han har betalt i skat. tostring()-metoden returnerer det samme som Field-klassen, inklusiv information om skatten, tax. Ownable (Paw) Denne klasse arver fra Field og har samme konstruktør som denne, dog med et ekstra argument, pris (int). Som klassens navn indikerer, nedarver alle de felter, der kan ejes af spillere, fra denne klasse. Vi har så lavet funktionen rent(player Lejer, Player Udlejer), der klarer overførslen af lejen. Vi har også en ejer-variabel, owner, som er af typen Player. Funktionen owned() returnerer en boolean der angiver om feltet er ejet eller ej. Vi har også metoderne getowner() og setowner(player player), som henholdsvis returnerer ejerens navn og sætter ejeren. Funktionen buylot(player Køber) køber grunden ved at trække penge fra kontoen og sætte ejeren, hvis køberen har penge nok. tostring()-metoden for denne klasse kører Field-klassens tostring()-metode ved hjælp af super() og tilføjer oplysninger om ejeren inden den returnerer strengen. Her bruger vi desuden vores owned()-funktion til at tjekke om grunden er ejet. Street (Paw) Street-klassen nedarver fra Ownable og har desuden leje, hus1, huse2, huse3, huse4, hotel og huspris, som tages som ekstraargumenter i konstruktøren. Funktionen getaktuelleje() returnerer den aktuelle leje ved at lave en switch på antalhuse, som er en tæller der holder styr på antallet af huse på grunden. Lejen returneres ved at matche antalhuse med de forskellige leje-værdier som er defineret i konstruktøren. buyhouse(player player)-funktionen kører først en løkke der kalder GameBoardControllerens menu(player player) så længe han ikke har penge nok til at købe huset. Herefter bliver husprisen trukket fra spillerens konto samt at antalhuse sættes én op, hvis antalhuse er mindre end 5. Ellers køres menu(player player). 16/33
17 sellhouse(player player) tjekker først om der overhovedet er nogle huse på grunden som kan sælges, hvorefter halvdelen af husets pris sættes ind på hans konto og antalhuse sættes én ned. Funktionen getantalhuse() returnerer antalhuse. Vi har så defineret rent(player Lejer, Player Udlejer)-funktionen til først at tjekke om grunden er ejet (super.owned() er sand eller falsk), hvorefter vi kører en løkke der kalder menu(player player) så længe spilleren ikke har penge nok til at betale den aktuelle leje. Herefter køres funktionen transfer(udlejer, leje) på Lejer-objektet hvis feltet altså er ejet. Ejer man selv feltet vil pengene først blive trukket fra ens konto, og derefter indsat igen - dette er en mindre fejl. landonfield(player player)-funktionen opretter først strengen result, som skal returneres til sidst. Herefter tjekkes om grunden er ejet, hvorefter rent(player Lejer, Player Udlejer)-funktionen køres med player og owner som henholdsvis første og andet argument, result opdateres med information om dette. Har grunden derimod ingen ejer (super.owned() evalueres til falsk), tjekkes der først om spilleren har råd til at købe grunden. Hvis han har pengene, spørges han om han ønsker at købe grunden (buyoption() på GameBoardBoundary køres). Svarer spilleren ja (buyoption() er sand), køres Ownable-klassens buylot(player Køber)-metode med player som argument, desuden opdateres result. Hvis grunden derimod ikke er ejet, køres der først et beløbtjek på spilleren med prisen som argument. Er beløb-tjekket sandt, bliver grunden købt og result opdateres. Hvis beløb-tjekket ikke evalueres til sandt, opdateres result med oplysninger om at han ikke har penge til at købe grunden. result bliver til sidst returneret. tostring()-metoden returnerer resultatet fra Ownable-klassens tostring(). Shipping (Paw) Klassen nedarver fra Ownable-klassen og har en leje som private int. Konstruktøren sætter feltets nummer, navn og pris. rent(player Lejer, Player Udlejer)-funktionen kører en switch på antallet af ejerens rederier, som den henter ved at kalde getantalrederier(udlejer) på GameBoard. Lejen bliver så bestemt af antallet af rederier. Nu bliver menu(player player) på Lejer kørt så længe spilleren ikke har penge nok. Herefter bliver lejen overført fra Lejer til Udlejer ved hjælp af Player-klassens transfer(player p, double amount)-funktion. landonfield(player player)-funktionen opretter først strengen result, som skal returneres til sidst. Herefter tjekkes om grunden er ejet, hvorefter rent(player Lejer, Player Udlejer)-funktionen køres med player og owner som henholdsvis første og andet argument, result opdateres med information om dette. Har grunden derimod ingen ejer (super.owned() evalueres til falsk), tjekkes der først om spilleren har råd til at købe grunden. Hvis han har pengene, spørges han om han ønsker at købe grunden (buyoption() på GameBoardBoundary køres). Svarer spilleren ja (buyoption() er sand), køres Ownable-klassens buylot(player Køber)-metode med player som argument, desuden opdateres result. Hvis grunden derimod ikke er ejet, køres der først et beløbtjek på spilleren med prisen som argument. Er beløb-tjekket sandt, bliver grunden købt og result opdateres. Hvis beløb-tjekket ikke evalueres til sandt, opdateres result med oplysninger om at han ikke har penge til at købe grunden. result bliver til sidst returneret. 17/33
18 tostring()-metoden henviser til tostring()-metoden fra Ownable. Brewery (Paw) Denne klasse nedarver fra Ownable og har desuden leje, som er en private int. Konstruktøren er den samme som konstruktøren fra Ownable-klassen. Da lejen i dette felt også bestemmes af et terninge-kast, opretter vi i denne klasse et MatadorRafleBaegerobjekt, som vi vil bruge til at kaste terningerne. rent(player Lejer, Player Udlejer) kaster først terningerne, ved hjælp af kast(), hvorefter lejen bliver sat til summen, getsum(), gange 100 gange antallet af ejerens bryggerier (funktionen getantalbryggerier(udlejer) fra GameBoard). Til sidst overføres lejen fra Lejer til Udlejer. landonfield(player player)-funktionen opretter først strengen result, som skal returneres til sidst. Herefter tjekkes om grunden er ejet, hvorefter rent(player Lejer, Player Udlejer)-funktionen køres med player og owner som henholdsvis første og andet argument, result opdateres med information om dette. Har grunden derimod ingen ejer (super.owned() evalueres til falsk), tjekkes der først om spilleren har råd til at købe grunden. Hvis han har pengene, spørges han om han ønsker at købe grunden (buyoption() på GameBoardBoundary køres). Svarer spilleren ja (buyoption() er sand), køres Ownable-klassens buylot(player Køber)-metode med player som argument, desuden opdateres result. Hvis grunden derimod ikke er ejet, køres der først et beløbtjek på spilleren med prisen som argument. Er beløb-tjekket sandt, bliver grunden købt og result opdateres. Hvis beløb-tjekket ikke evalueres til sandt, opdateres result med oplysninger om at han ikke har penge til at købe grunden. result bliver til sidst returneret. tostring()-metoden henviser igen til tostring()-metoden fra Ownable. Prison (Paw) Klassen nedarver fra Field og har samme konstruktør som denne klasse. landonfield(player player): Først fængsles spilleren ved at bruge spillerens setjail(boolean værdi) til at sætte jail til at være sand. Herefter køres menuen escapeprison() på GameBoardBoundary, hvor brugeren vælger hvordan han vil prøve at komme ud af fængslet (1: betal 1000, 2: slå to ens med max 3 kast). Der bliver oprettet en streng, status, som angiver at spilleren er i fængsel. Vi opretter herefter en boolesk variabel, bingo, som er falsk til at starte med, denne variabel angiver om spilleren har slået to ens med terningerne. Vi laver så en switch på brugerens valg. I case 1 kører vi først menu(player player), indtil han har penge nok, hvorefter der bliver trukket de 1000, som det koster at købe sig ud. Herefter sættes hans position til fængsels-besøgs-feltet, felt nummer 11, hvorefter der køres en landonfield(player player) på det nye felt. Til sidst opdateres status og spillerens jail-variabel sættes til false. I case 2 køres der en løkke så længe i, som starter på nul, er mindre end 3 og så længe bingo er falsk. I løkken kastes terningerne (funktionen kast() i MatadorRafleBaeger), hvorefter de udskrives. Hvis terningerne er ens, sættes bingo til at være sand, status ændres, hvorefter spillerens position ændres til det felt som spilleren skal rykke hen på (fængsels-besøg plus summen af terningerne). Herefter køres en landonfield på det nye felt, og spillerens jail-variabel sættes til false. Til sidst i landonfield(player player) returneres status. 18/33
19 LuckyCards (Ahmet) Klassen LuckyCards nedarver fra Field, som nedarver samme konstruktør som Field klassen. Vi har valgt at oprette en række af arrays. Det første array cardcategory har vi brugt til at kategorisere kortene fra 1-9. Det andet array cardmoney er et array over kategori 1, som omhandler transaktioner, mellem spilleren og banken, selvom der ikke findes en bank i programmet. Det 3. array cardtext er et array hvor alle kortenes tekst er nedskrevet som strings. Det 4. array cardmovenm er et array hvor spilleren rykker frem til et felt uden at modtage penge når spilleren passerer start. Det 5. array cardmovewm er et array hvor spilleren rykker frem til et felt og spilleren modtager kun penge hvis start feltet passeres. Det 6. array cardmovet er et array hvor spilleren skal rykke 3 felter tilbage. Det 7. array cardmoves er et array hvor spilleren skal rykke frem til nærmeste redderi. Det 8. array cardmoneys er et array hvor spilleren modtager 200 kr. fra hver medspiller. Det 9. array cardprison er ikke implementeret, men det var meningen at det skulle bruges til som et kort spilleren kunne benytte sig af for at komme ud af fængslet. Det 10. array cardhouse er et array hvor spilleren skal betale 800 kr. pr hus spilleren ejer. Det 11. array cardhotel er et array hvor spilleren skal betale 2300 kr. pr hotel spilleren ejer. Det starter med at vi definerer et tilfældig int nr. mellem 1-33 og en int cardcat som afgør hvilket kort som skal vælges. Dette gøres ved at det tilfældige tal udvælges fra arrayet cardcategory. Derefter har vi oprettet en switch på cardcat. Case1 beskriver transaktioner mellem spilleren og banken. Dette Case køres kun hvis cardmoney[nr] er større end nul og derefter udføres en deposite funktionen som vælger beløbet som skal indbetales til spilleren udfra pladsen i arrayet. Ellers hvis cardmoney[nr] er mindre end nul så udføres en withdraw funktion som vælger det beløb som skal trækkes fra spilleren udfra pladsen i arrayet. Case 2 beskriver den måde vi flytter spilleren til et andet felt. Her bruger vi setposition(cardmovenm[nr]) igen bestemmes feltet spilleren skal flyttes over på udfra plasen i arrayet. Herefter køres en funktion landonfield som gør at spilleren lander på feltet og kan købe grunden. Case 3 beskriver hvor man skal betale 800 kr. pr. hus og 2300 kr. pr. hotel. Dette gør vi ved at definere en int totalskat som er pladsen i arrayet cardhouse gange antal huse adderet med pladsen i arrayet cardhotel gange antal hoteller. Og til sidst udføres en withdraw funktion som trækker beløbet fra spilleren. Case 4 beskriver hvor man skal rykke frem til det nærmeste rederi. Dette har vi gjort ved at opdele feltets 4 rederier i 4 intervaller over feltets 40 felter. Vi starter med at definere en int PositionP som giver spillerens aktuelle posion. Derefter tjekker vi om spillerens position ligger i intervallet ]36-6[. Hvis spilleren gør dette så kalder vi funktionen player.setposition(6) som placerer spilleren på felt nummer 6 og efterfølgende en landonfield funktion så spilleren kan købe grunden. Hvis spilleren ikke ligger i dette interval så tjekker vi om spillerens position ligger i intervallet ]6-16[. Hvis spilleren gør dette så kalder vi funktionen player.setposition(16) som placerer spilleren på felt nummer 16 og efterfølgende en landonfield funktion så spilleren kan købe grunden. Hvis heller ikke dette opfyldes, så tjekker vi om spillerens position ligger i intervallet ]16-26[. Hvis spilleren gør dette så kalder vi funktionen player.setposition(26) som placerer spilleren på felt nummer2 6 og efterfølgende en landonfield funktion så spilleren kan købe grunden. Derefter tjekker vi om spillerens position ligger i intervallet ]26-36[. Hvis spilleren gør dette så kalder vi funktionen player.setposition(36) som placerer spilleren på felt nummer 36 og efterfølgende en landonfield funktion så spilleren kan købe grunden. 19/33
20 Case 5 beskriver hvor man skal rykke frem til et felt og hvis start passeres så indkasserer man Vi starter med at finde alle pladser i arrayet cardmovewm som er forskellige fra 0. Derefter tjekker vi om spillerens aktuelle position er større end den plads han ønskes rykket over til, som har en plads i arrayet. Hvis spillerens position er større så kaldes funktionen deposite og spilleren indkasserer 4000 kr. Derefter kaldes funktionerne setposition og landonfield, som placerer spilleren på feltet. Case 6 skulle være over fængselskortet, men dette er ikke implementeret. Case 7 beskriver hvor spilleren skal rykke 3 felter tilbage. Igen tjekker vi om cardmovet[nr] er forskellig fra nul. Vi sikrer os først at denne funktion virker ved felterne 1, 2 og 3, fordi der ellers vil opstå problemer når spilleren skal rykke 3 felter tilbage. Først defineres en int position over spillerens aktuelle positon. Så tjekker vi om spillerens position-3 er mindre 1, hvis ja så sættes position til at være position Hvis spilleren ikke er på felterne 1, 2 og 3 så er det en smule nemmere at få spilleren til at rykke 3 felter tilbage, dette gøres blot ved at benytte funktionen setpostion(position-3) og derefter landonfield. Case 8 skulle være over kortet MatadorLegatet, men dette er ikke implementeret. Case 9 beskriver hvor spilleren modtager 200 kr. fra hver medspiller. Vi starter med at definere en int i som sættes til nul. Så starter en while løkke, som kører så længe i er mindre end længden af spiller arrayet. Derefter indbetaler alle spillere 200 kr. til den pågældende spiller. I alle disse cases kører selvfølgelig også beløbtjek funktionen som tjekker om den pågældende spiller har penge nok til at betale bøder/afgifter osv. Efter Casene er kørt returner vi med en udskrift cardtext. GameBoard (Paw) GameBoard-klassen indeholder vores felter i arrayet felter[], som er af typen Field. Konstruktøren tager ingen argumenter. Desuden har vi metoderne getantalbryggerier(player player) og getantalrederier(player player) der ved hjælp af en while-løkke kører alle felterne i felter[] igennem. Hvis feltet ikke er tomt, tjekker om klassenavnet er lig den klasse man tjekker for (Brewery/Shipping). Hvis feltet er af den pågældende type, tjekker funktionen ved hjælp af feltets owned()-funktion om feltet er ejet af en spiller. Her bliver vi nødt til at typecaste feltet til at være Ownable for at kunne bruge de funktioner der relaterer til ejer. Hvis feltet er ejet, sammenlignes navnet på ejeren med den person som man tjekker for. Er disse navne ens, tælles variablen antalbryggerier/antalrederier én op. Til sidst returneres antallet. gettotalhouses(player player) og gettotalhotels(player player) optæller det antal huse og hoteller en spiller har. Funktionerne fungerer på nogenlunde samme måde som getantalbryggerier(player player) og getantalrederier(player player). En løkke kører altså alle felterne igennem. Løkken tjekker først hvert felt om det er tomt, så om klassen er af typen Street. Hvis den er ejet, tjekker den om ejeren er den samme som argumentets navn (player.getnavn()). Hvis de to navne er ens, sættes variablen feltetshuse til det antal huse der er på grunden. Hvis dette tal er større end 4 bliver tallet sat til nul (da der i dette tilfælde så vil være hotel på grunden). gettotalhouses(player player) returnerer så totalhouses. Den anden funktion 20/33
21 fungerer næsten på samme måde, men sætter variablen feltetshoteller til 1, hvis feltetshuse bliver nulstillet. gettotalhotels(player player) returnerer så til sidst totalhotels i stedet. propertylist(player player): Igen er samme fremgangsmåde brugt til at generere en streng med en oversigt over alle de felter, hvor funktionerne getowner() og player.getnavn() er lig hinanden. Klassen har så en tostring()-metode, som kører en while-løkke, der laver en streng, strengarray, som indeholder informationer om alle felterne. Herefter returneres strengen. Funktionen print() printer klassens tostring(). GameBoardController (Paw) Denne klasse styrer vores spil. Vi har en boolesk variabel, vundet, som angiver om spillet er vundet eller ej. Denne er fra starten af sat til falsk. Desuden har vi en instans af GameBoardet, kaldet Board. Klassen har 4 funktioner: menu(player player), turn(int spillernummer), start() og slut(): menu(player player) Først har vi lavet variablen valg, der er en int, som vi starter med at sætte til 99. Så længe valg er forskellig fra 0 og 1, køres en løkke: GameBoardBoundary ets menuboundary(player player)-funktion kaldes, hvorefter der bliver lavet en switch på valget: Hvis brugeren svarer 1 (Giv turen videre), sker der ikke noget, udover at den springer ud af switch en (kommandoen break). I case 2 bliver der sendt en streng med oplysninger om spillerens saldo til GameBoardBoundary ets printfunktion. case 3 kalder buysellhouse() på GameBoardBoundary, hvorefter vi laver en switch mere på brugerens nye valg (om han vil købe eller sælge huse). Svarer han her ja, bliver der udskrevet en oversigt over hans grunde, hvorefter han med tal skal vælge den grund han vil bygge på. Nu køres der så et par tjek, for at tjekke at han rent faktisk kan købe huse på grunden, hvorefter feltets buyhouse(player player)-funktion kaldes. Hvis han vil sælge huse, sker det samme, bortset fra at buyhouse(player player) erstattes af sellhouse(player player). I case 4 bruges print(string string) til at udskrive en oversigt over grunde ved at tage propertylist(player player) fra GameBoard som argument. case 0 er når spilleren giver op, her sker følgende: Først kaldes givopmenu(string playername) på GameBoardBoundary, hvor spilleren skal bekræfte sit valg. Herefter køres en switch på valget, hvor spillerens plads i arrayet spillere sættes til null, hvis han bekræfter sit valg (hvis han svarer 1). Herefter kaldes funktionen RIP(String playernavn) på GameBoardBoundary. 21/33
22 turn(int spillernummer) Denne funktion giver en spiller en tur. Først køres funktionen presstoroll(string spillernavn) på GameBoardBoundary. Herefter MatadorRafleBaegerets kast() og printøjne()-funktioner som kaster terningerne og udskriver en streng med information om terningernes øjne. Herefter bliver der udskrevet nogle ting med GameBoardBoundary ets print(string string)-funktion: Først det felt som spilleren er landet på, så feltets landonfield(player player)-metode og til sidst feltet en gang mere. Til sidst køres menu(player player). start() Først køres funktionen printascii_matador1() på GameBoardBoundary, som printer vores opstarts-asciilogo. Herefter køres opret()-funktionen på PlayerBoundary, hvor der bliver oprettet spillere. Nu køres spillet som en stor løkke. Løkken kører så længe vundet er lig falsk. I løkken sker følgende: i sættes til 0, hvorefter en ny løkke starter. i bruges her som spillerens nummer i vores spillerarray, spillere, som ligger i PlayerControlleren. Denne løkke kører så længe i er mindre er mindre end antallet af spillere og spillet ikke er vundet. I denne løkke sker følgende: Først tjekkes der om pladsen i arrayet indeholder en spiller (at pladsen ikke er lig med null). Dette fordi at pladsen i arrayet, spillere, sættes til null, når en spiller giver op. Hvis pladsen indeholder en spiller, tjekkes der om spilleren er i fængsel (om getjail() evalueres til sand). Er spilleren i fængsel, køres en landonfield(player player) med spiller nummer i som argument. Herefter udskrives det felt som spilleren er landet på, hvorefter menu(player player) bliver kaldt, igen med spiller nummer i i spillere som argument. Hvis spilleren derimod ikke er i fængsel (getjail() evalueres ikke til sand), køres funktionen turn() og spilleren får mulighed for at kaste osv. Derefter køres en løkke, som giver spilleren en tur mere, turn(), så længe han slår to ens. Inden den inderste løkken afsluttes, tjekker vi om de aktive spillere er mindre end 2, hvis dette er tilfældet, sættes vundet til sand. Til sidst forhøjer vi værdien af i med én. På denne måde kører den inderste løkke altså en runde med hver spiller så længe der ikke er fundet en vinder, mens den ydre løkke bliver ved med at køre runder indtil spillet er vundet. slut() Denne funktion kalder printslut(string vindernavn) på GameBoardBoundary et, med vinderens navn som argument (PlayerController.getWinner().getNavn()). GameBoardBoundary (Ahmet) Klassen GameBoardBoundary har til formål at kommunikere til brugeren, dvs. som en brugergrænseflade. Vi har startet ud med at lave en print funktion, der printer argumentet ud som er String string. Dernæst har vi oprettet en boundary menu, så spilleren kan købe og sælge huse. Dette har vi gjort ved at lave en public static int buysellhouse, hvorefter en string printes ud til spilleren, som bagefter skal returneres som en int 1 eller 2. Den næste metode buyhousemenu() giver spilleren en menu hvor spilleren kan vælg hvilken 22/33
23 grund der skal bygges på hvorefter valget returneres. Der er også blevet implementeret en menu hvor spilleren kan vælge at sælge huse på en bestemt grund, sellhousemenu(). Den næste menu vi har implementeret er en menu til fængsel, og funktionen hedder escapeprison(). Hvor der bliver spurgt hvorvidt spilleren ønsker at komme ud af fængslet. Spilleren får 2 valgmuligheder, hvorefter valget returneres til den klasse der kalder den. Den næste funktion er buyoption(), hvor spilleren bliver spurgt om grunden vil købes, hvorefter en boolean returneres. Dernæst har vi implementeret en menu, så spilleren kan have en række muligheder, såsom at give turen videre, vise saldoen, køb ehuse/hoteller, vise grunde og give op. Her kan man foretage sig en række af ting. Derefter har vi lavet en givopmenu(), som spørger spilleren om personen er helt sikker på at give op. Spilleren afgiver sit svar og valget returneres. Vi har også lavet en funktion printslut(string vindernavn) som udskriver vinderen af spillet og en funktion RIP(String playernavn) som fortæller den pågældende at han/hun er ude af spillet. BCE (Paw) Vi har overholdt BCE-modellen nogenlunde mellem GameBoardBoundary og GameBoardController, men resten af vores system er lidt rodet i forhold til BCE. Vores PlayerController og PlayerBoundary er lidt forkert delt op, og en del af vores entities har adgang direkte til GameBoardBoundary. Vi er klar over at det er dårligt design på denne måde at have forbindelser mellem boundary- og entityobjekter, men det er den måde vi i første omgang lavede det på, og har nu ikke tid til at lave det om. Skulle vi programmere det hele igen, ville vi helt sikkert ikke gøre det på samme måde, da vores kode flere steder kan være lidt svær at overskue, i forhold til de steder hvor det er opdelt efter BCE-modellen. 23/33
24 Design efter programmering (Humira) Use case I vores usecase før programmering havde vi lokaliseret alle de processer som vi forventede at vores system skal indeholde. Men på grund af manglende tid har Vi prioriteret nogle funktioner højere end andre og de funktionere som vi mente var mindst vigtige har vi ikke fået implementeret. De funktioner som vi har implementeret ses i diagrammet ovenover 24/33
25 Designklassediagram (Humira) 25/33
26 Diagrammet ovenover er designklassediagram over hele systemet, der viser interaktion mellem forskellige klasser vha. dependencies, nedarvning og de almindelige associations piller. Udover pillerne får man også overblik over hvilke metoder og attributter indgår i enkelte klasse. Sekvens for at købe grunde (Humira) 1. Gameboardcontrolleren bruger metoden kast() til at kaste terningerne som er i raflebægerklassen. Raflebæger klassen returnerer sum af terninger. 2. Gameboardcontrolleren bruger metoden move() og sum som argument for at rykke på felterne. Gameboardboundary kommunikere med player klassen fordi metoden movi() er lavet i player klassen. 26/33
27 3. Når spiller er rykket de antal felter som terningernes sum viser, så lander de på et af felterne. Gameboardboundary bruger metoden getposition() i player klassen for at få positionen. 4. Gameboardcontroller kør metoden landonfield() og argumentet player typen af Player på det felt som man lander på. 5. Street klassen bruger metoden owned() for at tjekke om der er en ejer af den pågældende felt. 6. Hvis grunden ikke har nogen ejer, så får brugeren mulighed for at købe grunden. Dette sker ved at Street klassen bruger metoden buyoption() som er i Gameboardboundary klassen. 7. Efter at buyoption metoden er kørt, så bruger street klassen buylot metoden for at køre transaktionen. Konstruktion og test (Humira) Vi har valgt at begynde konstruktionen af systemet på baggrund af de udarbejdede diagrammer og overvejelser som vi har gjort i designfasen. Vi blev enige om at vi vil undervejs i udviklingen benytte forskellige teststrategier for at sikre både at kvaliteten af systemet. Hermed sikre brugergrænsefladen og at input svarer overens med det forventede output i systemets dele. Vi tog udgangspunktet i V-modellens strategier. Hvor vi startede med analyse systemets krave, designede systemet vha. nogle diagrammer, implementerede og testede. V-modellens strategi går ud på, at man deler systemet op i fase og efter hver udviklingsfase, planlægger test, der berører den netop afsluttede fase. Man fortsætter derfor ikke til næste fase, før testen er planlagt. På den måde kan vi lave konklusioner efter hver afsluttet fase, og på denne måde mindsker man risikoen for, at senere hen i udviklingsforløbet må tilbage og rette fejl. Som vi har skrevet i afsnit Udviklingsstrategi havde vi tænkt os at implementerer således så den overholder kravet om BCE - modellen. Hvor vi deler systemet op i boundary, controller og entity klasser. Men på grund af manglende tid vi har desværre ikke nået det. Grunden til vi ønskede at overholde BCE i vores system, er at man holder brugergrænseflader(boundary) for sig, de arbejdende klasser(control) for sig, og de databærende klasser (Entity) for sig. På den måde skabes et godt overblik for dem, som ønsker at udvikle videre på systemet og man kan nemt klistre nye entitetsklasser på systemet, uden at ændre resten af systemet. Boundary objekter viser interaktion mellem aktør og systemet. Disse objekter rolle er at adskille systemet fra omgivelser. Controller har dobbelt rolle i systemet: Systemets skraldspand: udfører funktioner som ikke naturligt kan placeres på andre objekter. 27/33
28 Systemets leder: fordeler ansvar på systemets andre objekter og fastlægger sekvensen i udførelse af handlinger. Derudover styrer den use case realisering. Den gør selv ikke noget, men den giver ordre videre til andre objekter om at gør noget. Entity objekter er data lage og er baseret på logik om at sikre korrekte input. Disse objekter rolle er at adskille systemet fra omgivelserne, knytter sig typisk til en aktørs anvendelse af en uses case. når et system skal bygges ud fra BCE kravet, så laver man modeller for udvalgte Use Cases. Dette gør det nemt og overskueligt, og man ser tydeligt hvilke klasser, de enkelte scenarier berører. Vi valgt at prioriterer nogle funktioner højere end andre og de funktionere som vi mente var mindst vigtige har vi ikke fået implementeret. 28/33
29 Test (Michael) Om testene At foretage test af vores system har været kompliceret, især af to forskellige årsager: 1. På grund af den store mængde statiske funktioner der er, hvilket der også er blevet advaret imod 2. Det overordnede design af systemet, mangler at overholde nogen af de grundprincipper fra GRASP, især det om BCE modeller. Vi har lært at enkelte klasser ikke må kende til andre klasser, og i vores tilfælde er klasserne forgrenet på kryds og tværs. Dette har besværliggjort testen af systemet, for du kan ikke isolere metoder og teste dem hver for sig. Og på grund af den høje mængde statiske funktioner kan du ikke debugge dig frem til specifikke scenarier og teste af den vej. Eksempler på nogen af de problemer vi er stødt ind på mht. Test: I en normal test, ville det være hensigtsmæssigt at opstille et skema af en art, hvor du redegør for alle metoder, et input, et forventet resultat(output) og det reelle resultat. Dette meget omfattende stykke arbejde, at teste alle metoder, er som sagt besværliggjort på grund af den høje binding i vores system. Tingene er simpelthen ikke godt nok adskilt, i vores klasser, hvilket pejer på et dårligt design: Et tilfældigt eksempel kunne være vores buyhouse funktion: public void buyhouse(player player) { while(player.beløbtjek(huspris)==false){ GameBoardController.menu(player); } Som man ser allerede i 4 linie, så kalder den en menu fra vores GameBoardController, som gør at vi ikke kan kalde metoden i en eventuel testklasse for at teste at den fungerer som den skal. En evt. Løsning kunne have været at lave en mock GameBoardController lavet til det formål at teste metoderne, men igen er vores system designet på en sådan måde at det ikke er muligt. Test-klassen Vi har fundet en metode, Refuge, der ikke er statisk som vi kan teste i en dertil indrettet testklasse. Testen har 3 faser: Setup, Kørsel af testen og Analyse af resultatet I setup fasen, sætter vi systemet op, det er her objekter der skal bruges oprettes og variablerne sættes, eller sagt på en anden måde bestemmer vi input her. //setup 29/33
30 int expectedsaldo = ; Refuge testrefuge = new Refuge(1, "ko", 200); Player p1 = new Player(); Så køres testen og i sidste del sammenligner vi resultatet med det resultat vi forventer. //check result if (expectedsaldo == p1.getsaldo()) System.out.println("Succes"); else System.out.println("fail"); System.out.println("expected Saldo = " + expectedsaldo + " aktuel saldo = " + p1.getsaldo() ); Kopieret fra konsollen efter at have kørt programmet: Succes expected Saldo = aktuel saldo = Altså kan vi se at denne konkrete klasse virker som de skal Manuel test Af denne grund er størstedelen af testen af systemet foregået med personlig betjening. Dette kan gøres på to måder. Den ene måde er at starte et spil matador og bare køre spillet indtil du tilfældigvis rammer det scenarie du ønsker skal udspilles, og så være undersøge om metoden har kørt korrekt(passer saldoen på kontoen, betaler man den rette husleje afhængig af byggede huse på grunden osv.) Denne måde er langt fra optimal, men størstedelen af programmet er dog blevet testet på denne måde. Den anden måde er at køre programmet i debug og så skridt for skridt se hvordan systemet reagerer ved at køre det igennem. Til denne type test er det igen en hindring at vi har så mange statiske metoder, fordi så kan vi ikke tilgå variablerne manuelt og sætte dem til det vi selv ønsker, men til gengæld kan du se hvad der foregår inde i systemet. Vi har testet hvad vi føler er nogen af de essentielle funktioner for at vise princippet i denne type af test også: Test af prisonklassen: Her har vi foretaget en test af prisonklassen for at kontrollere den virker ordentligt. Vi har sat en spiller til at gå i fængsel, og vil betale os ud af fængslet. Vi kontrollerer så om den trækker penge, rykker spillerens position korrekt, printer de rigtige meddelelser osv. 30/33
31 Screenshot under debug af Prøv Lykken kortene 31/33
32 Konklusion (Ahmet) Vi har nu fået udarbejdet et matadorspil men med de væsentligste funktioner. Undervejs i forløbet har vi oplevet en række problemer med hensyn til testning og implementering. Med hensyn til testning har vi ikke kunnet foretage en række automatiserede testninger af vores implementerede kode, fordi opbygningen af koden har været anderledes end den burde være. Undervejs i projektet fandt vi ud af, at Opbygning af koden skulle følge den såkaldte BCE-model, som står for Boundary, Controller og Entity. Med andre ord betyder det at Klasserne skulle laves ud fra denne model struktur. Dette har bevirket at Matadorspillet er blevet mindre overskueligt og rodet. Ved at benytte denne opdeling kunne man sikre sig en mere struktureret og overskuelig kode. Da vi i slut fasen af projektet opdagede dette problem fandt vi det uhensigtsmæssigt at omstrukturere projektet efter BCE-modellen, og dette har medført at vi i senere projekter vil være meget mere opmærksom på dette ikke gentager sig. En fordel ved BCE-modellen er også at når man skal lave en grafisk brugergrænseflade, så kan man bedst gøre dette ved at opdele efter denne model. En brugergrænseflade kunne for eksempel dannes ud fra et Boundary objekt hvor der var en menu funktion. I testfasen har også haft en række problemer, såsom at vi ikke kunne bruge automatiseret testning af koden pga. det samme problem. Da det kræver at alle klasser ikke har nogen associationer med alle andre. Med hensyn til designet har vi fået dannet diagrammer med en masse dependency pile, som igen ikke er særlig godt. Alt i alt har vi udviklet et fuldt funktionsdygtigt program, med de væsentligste funktioner. 32/33
33 Bilag Vi har nu valgt at sætte vores kildekode ind som bilag. På de efterfølgende sider har vi følgende klasser, hvor navnet i parentesen angiver hvem der har lavet hvad: MatadorRaflebaeger (Hele gruppen) Player (Paw) Konto (Paw) PlayerController (Paw) PlayerBoundary (Paw) Field (Hele gruppen) Refuge (Hele gruppen) Taxes (Hele gruppen) Ownable (Paw) Street (Paw og Michael) Shipping (Paw) Brewery (Paw) Prison (Ahmet og Paw) LuckyCards (Ahmet) GameBoard (Paw, Ahmet, Humira) GameBoardController (Paw) GameBoardBoundary (Paw) testklasse (Michael) 33/33
34 MatadorRafleBaeger.java 1 package Terninger; 2 3 import java.util.random; 4 5 public class MatadorRafleBaeger { 6 7 public final static int T1SIDER = 6; //antallet af sider på terning 1 8 public final static int T2SIDER = 6; //antallet af sider på terning 2 9 private static int terning1; 10 private static int terning2; 11 private static int sum; 12 private static boolean ens; //variablen er en boolean, fordi terningerne enten er ens (true) eller forskellige (false) 13 private static Random generator = new Random(); //Konstruktøren laver to nye terninger som hver defineres til et tilfældigt tal mellem 1 og antal sider (6) 17 public MatadorRafleBaeger(){ terning1 = generator.nextint(t1sider)+1; 20 terning2 = generator.nextint(t2sider)+1; 21 } //Kaste-funktionen genererer, lige som konstruktøren, nye tal for terningerne 25 public static void kast(){ terning1 = generator.nextint(t1sider)+1; 28 terning2 = generator.nextint(t2sider)+1; } //getøjne-funktionerne returnerer terning 1 og 2 34 public static int getøjne1(){ 35 return terning1; 36 } public static int getøjne2(){ 39 return terning2; 40 } //printøjne returnerer en tekst-streng, der giver øjnene fra terning1 og 2 44 public static void printøjne(){ 45 System.out.println("Terning 1 er: "+ terning1+"\nterning 2 er: "+ terning2); 46 } //getsum definerer først sum-variablen til at være summen af terning1 og 2, hvorefter den returnerer summen 50 public static int getsum(){ 51 sum = terning1 + terning2; 52 return sum; 53 } //getens tjekker om terning1 er lig terning2, hvis dette er tilfældet defineres boolean-variablen ens til true, hvorimod den defineres til false, hvis terningerne ikke er ens. Til sidst returneres ens 57 public static boolean getens(){ Page 1
35 58 if(terning1 == terning2){ 59 ens = true; 60 }else 61 { 62 ens = false; 63 } return ens; } } 72 MatadorRafleBaeger.java Page 2
36 Player.java 1 package Player; 2 public class Player { 3 4 private String navn; 5 private int farve; 6 private Konto k = new Konto(); 7 private int position = 1; 8 private boolean jail = false; 9 10 // funktion som viser om spilleren er fængslet 11 public boolean getjail(){ 12 return jail; 13 } // funktion som kan ændre om spilleren er fængslet 16 public void setjail(boolean værdi){ 17 jail = værdi; 18 } public int getposition() { 21 return position; 22 } public void setposition(int felt) { 25 position = felt; 26 } public void move(int antalfelter){ 29 position = position + antalfelter; 30 if(position > 40){ 31 position = position-40; 32 k.passeretstart(); 33 } 34 } public void setnavn(string navn){ 37 this.navn = navn; 38 } public void setfarve(int farve){ 41 this.farve = farve; 42 } public String getnavn(){ 45 return navn; 46 } public int getfarve(){ 49 return farve; 50 } public void printfarve(){ 53 if(farve!= 0){ 54 System.out.println(navn+" har farve nr. "+farve); 55 }else 56 { 57 System.out.println(navn+" har ingen farve"); 58 } 59 } public double getsaldo(){ 62 return k.getsaldo(); Page 1
37 Player.java 63 } public void withdraw(double amount){ 67 k.withdraw(amount); 68 } public boolean beløbtjek(double amount){ 71 return k.beløbtjek(amount); 72 } public void deposite(double amount){ 75 k.deposite(amount); 76 } public void transfer(player p, double amount){ 79 k.transfer(p, amount); 80 } public void printoversigt(){ 83 System.out.println("Oversigt for "+navn+":"); 84 k.printoversigt(); 85 } public String tostring() { 89 return "Navn: "+navn+"\n"+k; 90 } 91 } 92 Page 2
38 Konto.java 1 package Player; 2 import java.util.date; 7 8 public class Konto { private double saldo = 30000; private int maxtrans = 1000; 14 private String[] transtid = new String[maxTrans]; 15 private double[] beløb = new double[maxtrans]; private int i = 0; 18 private boolean afslut = false; private int passerstart = 4000; public void passeretstart(){ 23 deposite(passerstart); 24 } private static String getdatetime() { 27 DateFormat dateformat = new SimpleDateFormat("HH:mm:ss"); 28 Date date = new Date(); 29 return dateformat.format(date); 30 } public double getsaldo(){ 33 return saldo; 34 } public boolean beløbtjek(double amount){ 37 if(saldo >= amount){ 38 return true; 39 }else 40 { 41 return false; 42 } 43 } public void withdraw(double amount){ if(beløbtjek(amount)==false){ }else{ 51 saldo = saldo - amount; afslut=false; 54 i=0; 55 while(i<maxtrans && afslut == false){ if(transtid[i] == null){ 58 transtid[i] = getdatetime(); 59 beløb[i] = -amount; 60 afslut = true; } 63 i++; 64 } } Page 1
39 Konto.java } public void deposite(double amount){ 73 saldo = saldo + amount; afslut=false; 76 i=0; 77 while(i<maxtrans && afslut == false){ if(transtid[i] == null){ transtid[i] = getdatetime(); 82 beløb[i] = amount; 83 afslut = true; } 86 i++; 87 } 88 } public void transfer(player p, double amount){ 91 if(amount>saldo){ 92 System.out.println("Du har ikke nok penge. Overførsel blev ikke udført!"); 93 }else{ 94 withdraw(amount); 95 p.deposite(amount); 96 } 97 } public void printoversigt(){ afslut=false; 102 i=0; 103 while(i<maxtrans && afslut == false){ if(transtid[i]!=null){ 106 System.out.println(transTid[i]+"\t"+beløb[i]); 107 }else 108 { 109 afslut=true; 110 } 111 i++; 112 } 113 } public String tostring() { 116 return "Saldo: "+saldo; 117 } } 120 Page 2
40 PlayerController.java 1 package Player; 2 3 public class PlayerController { private static int antalspillere; 7 public static int getantalspillere() { 8 return antalspillere; 9 } public static Player[] spillere; 14 private static String[] farvearray = {"Ingen Farve", "Rød", "Grøn", "Blå", "Sort", "Gul", "Pink"}; 15 private static int[] color = new int[farvearray.length]; public String getfarver(){ 19 int i = 1; 20 String farver = i+ " - " + farvearray[i]+"\n"; 21 i++; 22 while(i < farvearray.length){ 23 farver = farver+i+ " - " + farvearray[i]+"\n"; 24 i++; 25 } 26 return farver; 27 } // retunerer spillerens nummer i arrrayet 30 public static int getspillernummer(player player){ 31 int i = 0; 32 int nummer = 99; 33 while(i<antalspillere){ 34 if(player == spillere[i]){ 35 nummer = i; 36 } 37 i++; 38 } 39 return nummer; 40 } // retunerer antallet af aktive spillere (spillere der ikke har givet op) 43 public static int getactiveplayers() 44 { 45 int i = 0; 46 int ActivePlayers = 0; 47 while(i < antalspillere) 48 { 49 if(spillere[i]!=null) 50 { 51 ActivePlayers++; 52 } 53 i++; 54 } 55 return ActivePlayers; 56 } // Tjekker først om der kun er én aktiv spiller, hvorefter den finder spilleren i arrayet og retunerer denne 59 public static Player getwinner() 60 { Page 1
41 PlayerController.java 61 Player winner = null; 62 if(getactiveplayers()==1){ 63 int i = 0; 64 while(i<antalspillere) 65 { 66 if(spillere[i]!=null) 67 { 68 winner = spillere[i]; 69 } 70 i++; 71 } 72 } 73 return winner; 74 } // tjekker om navnet er optaget (om det findes i spillere[]) 78 public boolean navnoptaget(string navn){ 79 int i=0; 80 boolean optaget = false; 81 while(i<antalspillere){ 82 if(navn.equalsignorecase(spillere[i].getnavn())){ 83 optaget = true; 84 } 85 i++; 86 } 87 return optaget; 88 } public static boolean farveoptaget(int farvenummer){ 92 if(color[farvenummer]==0){ 93 return false; 94 }else{ 95 return true; 96 } 97 } public boolean farvegyldig(int farvenummer){ 101 if(farvenummer>0 && farvenummer <= getantalfarver() && farveoptaget(farvenummer) == false){ 102 return true; 103 }else{ 104 return false; 105 } 106 } public int getantalfarver(){ 110 return farvearray.length-1; 111 } public void setantalspillere(int antal){ 115 antalspillere = antal; 116 spillere = new Player[antalSpillere]; int i = 0; 119 while(i < antal){ 120 spillere[i] = new Player(); 121 i++; Page 2
42 PlayerController.java 122 } 123 } public Player getspiller(int nummer){ 128 return spillere[nummer]; 129 } protected void setnavn(player spiller, String navn){ 132 { 133 spiller.setnavn(navn); /* herefter køres en while-løkke, der gennemgår spillere[], 136 * indtil der findes en tom plads, som navnet indsættes på 137 * På den måde bliver navnet gemt, således at næste bruger ikke kan indtaste 138 * det samme navn*/ 139 int i = 0; 140 boolean oprettet = false; 141 while(i<antalspillere && oprettet == false){ 142 if(spillere[i]==null){ 143 spillere[i].setnavn(navn); 144 oprettet = true; 145 } 146 i++; 147 } 148 } } protected void setfarve(player spiller, int farvevalg){ color[farvevalg]=1; 159 spiller.setfarve(farvevalg); } public String getfarveoversigt(){ 168 int i=0; 169 String oversigt = spillere[i].getnavn()+" har farve "+farvearray[spillere[i].getfarve()]+"\n"; 170 i++; 171 while(i<antalspillere){ 172 oversigt = oversigt+spillere[i].getnavn()+" har farve "+farvearray[spillere[i].getfarve()]+"\n"; 173 i++; 174 } 175 return oversigt; 176 } Page 3
43 PlayerController.java 181 } Page 4
44 PlayerBoundary.java 1 package Player; 2 import java.util.scanner; 3 4 public class PlayerBoundary { 5 6 static PlayerController PlayerController = new PlayerController(); 7 private static Scanner in = new Scanner(System.in); 8 9 private static int spillernummer = 1 ; public static void scannavn(player spiller){ 14 System.out.print("Indtast navn for spiller "+spillernummer+": "); 15 String navn = in.next(); 16 while(playercontroller.navnoptaget(navn) == true){ 17 System.out.print("Navnet eksisterer allerede, prøv et nyt navn:"); 18 navn = in.next(); 19 } 20 if(playercontroller.navnoptaget(navn) == false) 21 { 22 PlayerController.setNavn(spiller,navn); 23 spillernummer = spillernummer + 1; 24 } 25 } public static void scanfarve(player spiller){ System.out.print(PlayerController.getFarver()); 33 System.out.println("Vælg farve: "); 34 int farvevalg = in.nextint(); while(playercontroller.farvegyldig(farvevalg)==false){ 37 System.out.println("FEJL! Tallet er ikke mellem 1 og "+PlayerController.getAntalFarver()+", eller allerede i brug. Prøv igen:"); 38 farvevalg = in.nextint(); 39 } 40 PlayerController.setFarve(spiller, farvevalg); 41 } // Opretter spillere 45 public static void opret(){ 46 System.out.print("Antal Spillere: "); 47 int antalspillere = in.nextint(); while(antalspillere < 2 antalspillere > PlayerController.getAntalFarver()){ 50 System.out.println("Fejl, du skal vælge et tal mellem 2 og "+PlayerController.getAntalFarver()+"\nPrøv igen: "); 51 antalspillere = in.nextint(); 52 } if(antalspillere > 2 antalspillere < PlayerController.getAntalFarver()){ PlayerController.setAntalspillere(antalSpillere); for(int j = 0; j < antalspillere; j++){ Page 1
45 PlayerBoundary.java 60 scannavn(playercontroller.getspiller(j)); 61 scanfarve(playercontroller.getspiller(j)); 62 } } } public static void printfarveoversigt(){ 71 System.out.print(PlayerController.getFarveOversigt()); 72 } } Page 2
46 Field.java 1 package Bræt; 2 3 import Player.Player; public abstract class Field { 8 9 protected int number; 10 protected String name; public Field(int number, String name){ 13 this.number = number; 14 this.name = name; 15 } public abstract String landonfield(player player); public String tostring() 21 { 22 return "Grundnavn: " + name + "\tfeltnummer: " + number; 23 } 24 } 25 Page 1
47 Refuge.java 1 package Bræt; 2 3 import Player.Player; public class Refuge extends Field{ 7 8 private int bonus; 9 10 public Refuge(int number, String name, int bonus) { 11 super(number, name); 12 this.bonus = bonus; 13 } public String landonfield(player player) { 19 String message = ""; 20 if(bonus > 0){ 21 player.deposite(bonus); 22 message = player.getnavn()+" har lige modtaget "+bonus; 23 } 24 return message; 25 } 26 public String tostring() { 27 return super.tostring(); 28 } } 31 Page 1
48 Taxes.java 1 package Bræt; 2 3 import Player.Player; public class Taxes extends Field{ 7 int tax; 8 public Taxes(int number, String name, int tax){ 9 super(number, name); 10 this.tax = tax; 11 } 13 public String landonfield(player player) { 14 while(player.beløbtjek(tax)==false){ 15 GameBoardController.menu(player); 16 } 17 player.withdraw(tax); 18 return player.getnavn()+" har nu betalt "+tax+" i skat"; 19 } public String tostring() { 22 return super.tostring()+"\tskatten er: "+tax; 23 } } 28 Page 1
49 Ownable.java 1 package Bræt; 2 3 import Player.Player; public abstract class Ownable extends Field{ public Ownable(int number, String name, int pris) { 12 super(number, name); 13 this.pris = pris; 14 } int pris; 19 public abstract void rent(player Lejer, Player Udlejer); protected Player owner; // Denne funktion returnerer en boolean om grunden er ejet eller ej 26 public boolean owned(){ 27 if(owner == null){ 28 return false; 29 }else{ 30 return true; 31 } 32 } // Funktionen returnerer en streng med ejerens navn, er der ingen ejer, returneres "Ingen ejer" 35 public String getowner() { 36 String resultat = "Ingen ejer"; 37 if(owned()==true){ 38 resultat = owner.getnavn(); 39 } 40 return resultat; } // Denne funktion sætter ejeren og modtager en spiller af typen Player 46 public void setowner(player player) { 47 this.owner = player; 48 } // Denne funktion køber grunden ved at trække penge fra kontoen og sætte ejeren, hvis køberen har penge nok 51 public void buylot(player Køber){ 52 if(køber.beløbtjek(pris)==true){ 53 Køber.withdraw(pris); 54 setowner(køber); 55 } 56 } public String tostring() { 59 String result = super.tostring()+"\tpris: "+pris; 60 if(owned()==true){ Page 1
50 Ownable.java 61 result = result+"\tejeren er: " + owner.getnavn(); 62 }else{ 63 result = result+"\tgrunden har ingen ejer"; 64 } 65 return result; 66 } } 69 Page 2
51 Street.java 1 package Bræt; 2 import Player.Player; 3 4 public class Street extends Ownable{ 5 6 private int pris = super.pris; 7 private int grundleje, hus1, huse2, huse3, huse4, hotel, huspris; 8 9 public Street(int number, String name, int pris, int leje, int hus1, int huse2, int huse3, int huse4, int hotel, int huspris) { 10 super(number, name, pris); 11 this.grundleje=leje; 12 this.hus1=hus1; 13 this.huse2=huse2; 14 this.huse3=huse3; 15 this.huse4=huse4; 16 this.hotel=hotel; 17 this.huspris=huspris; 18 } //getaktuelleje, der ud fra antalhuse finder den aktuelle leje private int getaktuelleje() 24 { 25 switch (antalhuse) { 26 case 0: return grundleje; 27 case 1: return hus1; 28 case 2: return huse2; 29 case 3: return huse3; 30 case 4: return huse4; 31 case 5: return hotel; default: 34 return grundleje; 35 } 36 } //En tæller der holder styr på det antal huse der er på den pågældende grund 39 private int antalhuse = 0; // En funktion der køber et hus til grunden 44 public void buyhouse(player player) 45 { 46 while(player.beløbtjek(huspris)==false){ 47 GameBoardController.menu(player); 48 } 49 if(antalhuse<5) 50 { 51 player.withdraw(huspris); 52 antalhuse++; 53 } 54 else 55 { 56 GameBoardController.menu(player); 57 } } public void sellhouse(player player){ Page 1
52 Street.java 62 if (antalhuse > 0) 63 { 64 player.deposite(huspris/2); 65 antalhuse--; 66 } } public int getantalhuse() 71 { 72 return antalhuse; 73 } public void rent(player Lejer, Player Udlejer){ 77 if(super.owned() == true){ 78 while(lejer.beløbtjek(getaktuelleje())==false){ 79 GameBoardController.menu(Lejer); 80 } 81 Lejer.transfer(Udlejer,getAktuelLeje()); 82 } 83 } public String landonfield(player player) { 88 String result = ""; 89 if(super.owned() == true){ 90 rent(player, owner); 91 result = owner.getnavn()+" har lige modtaget +"+getaktuelleje()+" af "+player.getnavn(); 92 }else if(super.owned() == false){ 93 if(player.beløbtjek(pris)==true){ 94 if(bræt.gameboardboundary.buyoption()==true){ 95 super.buylot(player); 96 result = player.getnavn()+" har nu købt "+name; 97 } 98 }else{ 99 result = "Du har ikke penge nok til at købe grunden"; 100 } 101 } 102 return result; 103 } public String tostring() { 107 return super.tostring(); 108 } } 111 Page 2
53 Shipping.java 1 package Bræt; 2 3 import Player.Player; 4 5 public class Shipping extends Ownable{ 6 7 private int leje; 8 private int pris = super.pris; public Shipping(int number, String name, int pris) { 12 super(number, name, pris); 13 } public void rent(player Lejer, Player Udlejer){ 17 switch(gameboard.getantalrederier(udlejer)){ 18 case 1: leje = 500; break; 19 case 2: leje = 1000; break; 20 case 3: leje = 2000; break; 21 case 4: leje = 4000; break; 22 } 23 while(lejer.beløbtjek(leje)==false){ 24 GameBoardController.menu(Lejer); 25 } 26 Lejer.transfer(Udlejer,leje); 27 } public String landonfield(player player) { 31 String result = ""; 32 if(super.owned() == true){ 33 rent(player, owner); 34 result = owner.getnavn()+" har lige modtaget +"+leje+" af "+player.getnavn(); 35 }else if(super.owned() == false){ 36 if(player.beløbtjek(pris)==true){ 37 if(bræt.gameboardboundary.buyoption()==true){ 38 super.buylot(player); 39 result = player.getnavn()+" har nu købt "+name; 40 } 41 }else{ 42 result = "Du har ikke penge nok til at købe grunden"; 43 } 44 } 45 return result; 46 } public String tostring() { 52 return super.tostring(); 53 } 54 } 55 Page 1
54 Brewery.java 1 package Bræt; 2 3 import Player.Player; 5 6 public class Brewery extends Ownable{ public Brewery(int number, String name, int pris) { 10 super(number, name, pris); 11 } private int pris = super.pris; 14 private int leje; public void rent(player Lejer, Player Udlejer){ 18 MatadorRafleBaeger.kast(); this.leje = MatadorRafleBaeger.getSum() *100*GameBoard.getAntalBryggerier(Udlejer); System.out.println("--leje: "+leje); 23 System.out.println("--lejer: "+Lejer.getNavn()); 24 System.out.println("--udlejer: "+Udlejer.getNavn()); 25 while(lejer.beløbtjek(leje)==false){ 26 GameBoardController.menu(Lejer); 27 } 28 Lejer.transfer(Udlejer,leje); 29 } public String landonfield(player player) { 35 String result = ""; 36 if(super.owned() == true){ 37 rent(player, owner); 38 result = owner.getnavn()+" har lige modtaget +"+leje+" af "+player.getnavn(); 39 }else if(super.owned() == false){ 40 if(player.beløbtjek(pris)==true){ 41 if(bræt.gameboardboundary.buyoption()==true){ 42 super.buylot(player); 43 result = player.getnavn()+" har nu købt "+name; 44 } 45 }else{ 46 result = "Du har ikke penge nok til at købe grunden"; 47 } 48 } 49 return result; 50 } public String tostring() { 56 return super.tostring(); 57 } } Page 1
55 Prison.java 1 package Bræt; 2 3 import Player.Player; 5 6 public class Prison extends Field 7{ 8 public Prison(int number, String name) { 9 super(number, name); } 13 public String landonfield(player player) { 14 player.setjail(true); 15 int valg = GameBoardBoundary.escapePrison(); 16 int i = 0; 17 String status = player.getnavn()+" er i fængsel"; 18 boolean bingo = false; 19 switch (valg) 20 { 21 case 1: 22 while(player.beløbtjek(1000)==false){ 23 GameBoardController.menu(player); 24 } 25 player.withdraw(1000); 26 player.setposition(11); 27 GameBoard.felter[11-1].landOnField(player); 28 status = player.getnavn()+" kom ud af fængslet"; 29 player.setjail(false); 30 break; 31 case 2: while (i<3 && bingo == false) 32 { 33 MatadorRafleBaeger.kast(); 34 MatadorRafleBaeger.printØjne(); 35 if (MatadorRafleBaeger.getEns()==true) 36 { 37 bingo = true; 38 status = player.getnavn()+" kom ud af fængslet"; 39 player.setposition(11+matadorraflebaeger.getsum()); 40 GameBoard.felter[11 + MatadorRafleBaeger.getSum()- 1].landOnField(player); 41 player.setjail(false); 42 } 43 i++; 44 } } 47 return status; 48 } 49 public String tostring() { 50 return super.tostring(); } 53 } Page 1
56 LuckyCards.java 1000, 0, 200, -1000, 0, 0, 0, 0, 0, 0, 0, +1000, 0, +500, 0, 0, 0, -3000, -3000, 0, 1 package Bræt; 2 import Player.*; 6 public class LuckyCards extends Field{ 7 8 public LuckyCards(int number, String name) { 9 super(number, name); 10 } 11 private static int[] cardcategory = {1, 2, 2, 2, 1, 1, 1, 1, 1, 9, 1, 1, 3, 5, 4, 4, 5, 6, 6, 1, 5, 1, 2, 7, 3, 1, 1, 8, 1, 1, 1, 1, 1}; 12 private static int[] cardmoney = {+1000, 0, 0, 0, -200, -2000, +1000, 1000, +3000, +1000, +1000, -1000, -200}; 13 private static String[] cardtext = { 14 "De modtager Deres aktieudbytte. Modtag 1000 kr. af banken", 15 "Ryk frem til start", 16 "Gå i fængsel. Ryk direkte til fængslet. Selv om De passerer Start indkasserer de ikke 4000 kr.", 17 "Gå i fængsel. Ryk direkte til fængslet. Selv om De passerer Start indkasserer de ikke 4000 kr.", 18 "De har været en tur i udlandet og haft for mange cigaretter med hjem. Betal told 200 kr.", 19 "De har modtaget Deres tandlægeregning. Betal kr ", 20 "De havde en række med elleve rigtige i tipning. Modtag kr ", 21 "Deres præmieobligation er kommet ud. De modtager 1000 kr. af banken", 22 "Deres præmieobligation er kommet ud. De modtager 1000 kr. af banken", 23 "Det er Deres fødselsdag. Modtag af hver medspiller kr. 200 ", 24 "Værdien af egen avl fra nyttehaven udgør kr. 200, som De modtager af banken. ", 25 "Betal Deres bilforsikring kr ", 26 "Ejendomsskatterne er steget, ekstraudgifterne er: kr 800 pr. hus, kr 2300 pr. hotel.", 27 "Ryk frem til Grønningen. Hvis De passerer Start inkassér da kr. 4000", 28 "Ryk brikken frem til det nærmeste rederi og betal ejeren to gange den leje, han ellers er berettiget til. Hvis selskabet ikke ejes af nogen kan De købe det af banken.", 29 "Ryk brikken frem til det nærmeste rederi og betal ejeren to gange den leje, han ellers er berettiget til. Hvis selskabet ikke ejes af nogen kan De købe det af banken.", 30 "Tag med LB-færgerne --- flyt brikken frem, og hvis De passerer Start inkassér da kr ", 31 "I anledning af kongens fødselsdag benådes De herved for fængsel. Dette kort kan opbevares, indtil De får brug for det, eller De kan sælge det. ", 32 "I anledning af kongens fødselsdag benådes De herved for fængsel. Dette kort kan opbevares, indtil De får brug for det, eller De kan sælge det. ", 33 "Grundet dyrtiden har De fået gageforhøjelse. Modtag kr ", 34 "Ryk frem til Frederiksberg Allé. Hvis De passerer Start inkassér kr ", 35 "De har vundet i Klasselotteriet. Modtag kr. 500 ", 36 "Tag ind på Rådhuspladsen. ", 37 "Ryk tre felter tilbage. ", 38 "Oliepriserne er steget, og De skal betale: kr. 500 pr. hus, kr pr. hotel.", 39 "Betal kr for reparation af Deres vogn. ", 40 "Betal kr for reparation af Deres vogn. ", 41 "De modtager Matador-legatet for værdigt trængende, stort kr Ved værdigt trængende forstås, at Deres formue,d.v.s. Deres kontante penge + skøder + bygninger ikke overstiger kr ", 42 "Kommunen har eftergivet et kvartals skat. Hæv i banken kr ", 43 "Modtag udbytte af Deres aktier kr ", 44 "Modtag udbytte af Deres aktier kr ", 45 "De har kørt frem for Fuld Stop. Betal kr i bøde. ", 46 "De har måttet vedtage en parkeringsbøde. Betal kr. 200 i bøde. "}; Page 1
57 LuckyCards.java 47 private static int[] cardmovenm = {0, 1, 31, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 48 private static int[] cardmovewm = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 6, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 49 private static int[] cardmovet = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 50 private static int[] cardmoves = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 51 private static int[] cardmoneys = {0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 52 private static int[] cardprison = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 53 private static int[] cardhouse = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 54 private static int[] cardhotel = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 56 public String landonfield(player player) { 57 int nr =generator.nextint(32)+1; 58 int cardcat = cardcategory[nr]; 59 switch(cardcat){ 60 case 1: // Pengeoverførsel 61 if(cardmoney[nr]>0) 62 { 63 player.deposite(cardmoney[nr]); 64 } 65 else if(cardmoney[nr]<0) 66 { 67 while(player.beløbtjek(math.abs(cardmoney[nr]))==false){ 68 GameBoardController.menu(player); 69 } 70 player.withdraw(math.abs(cardmoney[nr])); 71 } 72 break; 73 case 2: // Flyt spilleren (uden penge hvis han passerer start) 74 if(cardmovenm[nr]!=0) 75 { 76 player.setposition(cardmovenm[nr]); 77 GameBoard.felter[(cardMoveNM[nr])-1].landOnField(player); } 80 break; 81 case 3: // Ejendomsskatterne er 800kr per hus og 2300kr. pr. hotel 82 int totalskat = cardhouse[nr]*gameboard.gettotalhouses(player) + cardhotel[nr]*gameboard.gettotalhotels(player); while(player.beløbtjek(totalskat)==false){ 85 GameBoardController.menu(player); 86 } 87 player.withdraw(totalskat); break; 90 case 4: // Brikken rykkes frem til det nærmeste redderi og ejeren betales 2 gange den leje. Hvis den ikke er ejet kan den købes. 91 int PositionP = player.getposition(); if(cardmoves[nr]!=0) 94 { 95 if (PositionP<6 PositionP>36) 96 player.setposition(6); 97 GameBoard.felter[5].landOnField(player); 98 } Page 2
58 LuckyCards.java 99 else if(6<positionp PositionP<16) 100 { 101 player.setposition(16); 102 GameBoard.felter[15].landOnField(player); 103 } 104 else if(16<positionp PositionP<26) 105 { 106 player.setposition(26); 107 GameBoard.felter[25].landOnField(player); 108 } 109 else if(26<positionp PositionP<36) 110 player.setposition(36); 111 GameBoard.felter[35].landOnField(player); 112 break; 113 case 5: // Ryk frem til en position og hvis start passeres, så indkasseres der if(cardmovewm[nr]!=0) 115 { 116 if(player.getposition()>cardmovewm[nr]) 117 { 118 player.deposite(4000); 119 } 120 player.setposition(cardmovewm[nr]); 121 GameBoard.felter[(cardMoveWM[nr])-1].landOnField(player); 122 } 123 break; 124 case 6: // Fængselkort 125 if(cardprison[nr]!=0) break; 129 case 7:// Ryk tre felter tilbage 130 if(cardmovet[nr]!=0) 131 { 132 int position = player.getposition(); 133 if(position-3 < 1){ 134 position = 40+position; 135 } 136 player.setposition(position-3); 137 GameBoard.felter[position-4].landOnField(player); 138 } 139 break; 140 case 8: break; 141 case 9: // Modtag 200 kr. for hver spiller 142 if(cardmoneys[nr]!=0) 143 { 144 int i = 0; 145 while (i<playercontroller.spillere.length){ 146 while(playercontroller.spillere[i].beløbtjek(200)==false){ 147 GameBoardController.menu(PlayerController.spillere[i]); 148 } 149 PlayerController.spillere[i].transfer(player, 200); 150 i++; 151 } 152 } 153 break; 154 } 155 return cardtext[nr]; } Page 3
59 LuckyCards.java 160 private static Random generator = new Random(); public static int nytkort(){ 163 int cardnumber = generator.nextint(32)+1; 164 return cardnumber; 165 } } 171 Page 4
60 GameBoard.java 1 package Bræt; 2 3 import Player.Player; 4 5 public class GameBoard { 6 7 public static Field[] felter; 8 9 public GameBoard(){ 10 felter = new Field[40]; /* Nedenfor opretter vi felterne 13 * I stedet for at skrive tallene i arrayet og feltets nummer, således: 14 * 15 * felter[index] = new Street(++index, "Rødovrevej", 500); 16 felter[index] = new Brewery(++index, "Bryggeri 1"); Så har vi lavet en variabel kaldet index, som holder styr på pladserne i arrayet 19 samt feltets nummer. 20 Hvis vi nu vil have et nyt felt ind midt i det hele, skal vi ikke ændre de nedenstående 21 felters numre. 22 * */ 25 int index = 0; 26 felter[index] = new Refuge(++index, "Start", 0); 27 felter[index] = new Street(++index, "Rødovrevej", 1200, 50, 250, 750, 2250, 4000, 6000, 1000); 28 felter[index] = new LuckyCards(++index, "Prøv Lykken"); 29 felter[index] = new Street(++index, "Hvidovrevej", 1200, 50, 250, 750, 2250, 4000, 6000, 1000); 30 felter[index] = new Taxes(++index, "Skattefelt 1",4000); 31 felter[index] = new Shipping(++index, "Scandlines: H.H.", 4000); 32 felter[index] = new Street(++index, "Roskildevej",2000, 100, 600, 1800, 5400, 8000, 11000, 1000); 33 felter[index] = new LuckyCards(++index, "Prøv Lykken"); 34 felter[index] = new Street(++index, "Valby Langgade",2000, 100, 600, 1800, 5400, 8000, 11000, 1000); 35 felter[index] = new Street(++index, "Allégade",2400, 150, 800, 2000, 6000, 9000, 12000, 1000); 36 felter[index] = new Refuge(++index, "Fængsel-besøg",0); 37 felter[index] = new Street(++index, "Frederiksberg Allé",2800, 200, 1000, 3000, 9000, 12500, 15000, 2000); 38 felter[index] = new Brewery(++index, "Squash", 3000); 39 felter[index] = new Street(++index, "Bülowsvej", 2800, 200, 1000, 3000, 9000, 12500, 15000, 2000); 40 felter[index] = new Street(++index, "Gl. Kongevej",3200, 250, 1250, 3750, 10000, 14000, 18000, 2000); 41 felter[index] = new Shipping(++index, "Molslinien", 4000); 42 felter[index] = new Street(++index, "Bernstorffsvej",3600, 300, 1400, 4000, 11000, 15000, 19000, 2000); 43 felter[index] = new LuckyCards(++index, "Prøv Lykken"); 44 felter[index] = new Street(++index, "Hellerupvej",3600, 300, 1400, 4000, 11000, 15000, 19000, 2000); 45 felter[index] = new Street(++index, "Strandvejen",4000, 350, 1600, 4400, 12000, 16000, 20000, 2000); 46 felter[index] = new Refuge(++index, "Parkering",5000); 47 felter[index] = new Street(++index, "Trianglen",4400,350, 1800, 5000, 1400, 17500, 21000, 3000); Page 1
61 GameBoard.java 48 felter[index] = new LuckyCards(++index, "Prøv Lykken"); 49 felter[index] = new Street(++index, "Østerbrogade",4400, 350, 1800, 5000, 1400, 17500, 21000, 3000); 50 felter[index] = new Street(++index, "Grønningen",4800, 400, 2000, 6000, 15000, 18500, 22000, 3000); 51 felter[index] = new Shipping(++index, "Scandlines: G.R.", 4000); 52 felter[index] = new Street(++index, "Bredgade",5200, 450, 2200, 6600, 16000, 19500, 23000, 3000); 53 felter[index] = new Street(++index, "Kgs. Nytorv",5200, 450, 2200, 6600, 16000, 19500, 23000, 3000); 54 felter[index] = new Brewery(++index, "Coca Cola", 3000); 55 felter[index] = new Street(++index, "Østergade",5600, 500, 2400, 7200, 17000, 20500, 24000, 3000); 56 felter[index] = new Prison(++index, "Fængsel"); //MANGLER FÆNGSELS-FELT! 57 felter[index] = new Street(++index, "Amagertorv",6000, 550, 2600, 7800, 18000, 22000, 25000, 4000); 58 felter[index] = new Street(++index, "Vimmelskaftet",6000, 550, 2600, 7800, 18000, 22000, 25000, 4000); 59 felter[index] = new LuckyCards(++index, "Prøv Lykken"); 60 felter[index] = new Street(++index, "Nygade",6400, 600, 3000, 9000, 20000, 24000, 28000, 4000); 61 felter[index] = new Shipping(++index, "Scandlines: Rødby", 4000); 62 felter[index] = new LuckyCards(++index, "Prøv Lykken"); 63 felter[index] = new Street(++index, "Frederiksbergade",7000, 700, 3500, 10000, 22000, 26000, 30000, 4000); 64 felter[index] = new Taxes(++index, "Skattefelt 2",2000); 65 felter[index] = new Street(++index, "Rådhuspladsen",8000, 1000, 4000, 12000, 28000, 34000, 40000, 4000); 66 } // Funktionen returnerer det antal bryggerier som en spiller ejer 69 public static int getantalbryggerier(player player){ 70 int i = 0; 71 int antalbryggerier = 0; 72 while(i < felter.length){ 73 if(felter[i]!= null){ 74 if(felter[i].getclass().getname() == "Bræt.Brewery"){ 75 if(((ownable)felter[i]).owned() == true){ 76 if(((ownable)felter[i]).getowner() == player.getnavn()){ 77 antalbryggerier++; 78 } 79 } 80 } } 83 i++; 84 } 85 return antalbryggerier; 86 } // Funktion som returnerer det antal rederier som en spiller ejer 89 public static int getantalrederier(player player){ 90 int i = 0; 91 int antalrederier = 0; 92 while(i < felter.length){ 93 if(felter[i]!= null){ 94 if(felter[i].getclass().getname() == "Bræt.Shipping"){ 95 if(((ownable)felter[i]).owned() == true){ 96 if(((ownable)felter[i]).getowner() == player.getnavn()){ 97 antalrederier++; 98 } 99 } Page 2
62 GameBoard.java 100 } } 103 i++; 104 } 105 return antalrederier; 106 } // Denne funktion optæller det totale antal huse som en spiller har og returnerer som int 109 // (grunde med hoteller tælles ikke med) 110 public static int gettotalhouses (Player player) 111 { 112 int i = 0; 113 int totalhouses = 0; 114 while (i < felter.length){ 115 if(felter[i]!= null){ 116 if(felter[i].getclass().getname() == "Bræt.Street"){ 117 if (((Ownable)felter[i]).owned() == true){ 118 if(((ownable)felter[i]).getowner() == player.getnavn()){ 119 int feltetshuse = ((Street)felter[i]).getAntalHuse(); 120 if(feltetshuse > 4){ 121 feltetshuse = 0; 122 } 123 totalhouses = totalhouses + feltetshuse; 124 } 125 } 126 } 127 } 128 i++; 129 } 130 return totalhouses; 131 } // Funktion som returnerer det totale antal hoteller som en spiller har 134 public static int gettotalhotels (Player player) 135 { 136 int i = 0; 137 int totalhotels = 0; 138 while (i < felter.length){ 139 if(felter[i]!= null){ 140 if(felter[i].getclass().getname() == "Bræt.Street"){ 141 if (((Ownable)felter[i]).owned() == true){ 142 if(((ownable)felter[i]).getowner() == player.getnavn()){ 143 int FeltetsHuse = ((Street)felter[i]).getAntalHuse(); 144 int FeltetsHoteller = 0; 145 if(feltetshuse > 4){ 146 FeltetsHuse = 0; 147 FeltetsHoteller = 1; 148 } 149 totalhotels = totalhotels + FeltetsHoteller; } 152 } 153 } 154 } 155 i++; 156 } 157 return totalhotels; 158 } // Denne funktion returnerer en streng med en oversigt over de grunde en spiller Page 3
63 GameBoard.java ejer 161 // (kun Street-objekter - bruges primært når en spiller ønsker at købe/sælge huse) 162 public static String propertylist(player player){ 163 int i= 0; 164 String oversigt = ""; 165 while(i < felter.length){ 166 if(felter[i]!= null){ 167 if(felter[i].getclass().getname() == "Bræt.Street"){ 168 if(((street)felter[i]).getowner()==player.getnavn()){ 169 oversigt=oversigt+i+" - "+felter[i].name+ " Antal Huse: " + ((Street)felter[i]).getAntalHuse() +"\n"; 170 } 171 } 172 } 173 i++; 174 } 175 return oversigt; 176 } public String tostring() { 180 String strengarray = felter[0]+"\n"; 181 int i = 1; while(i < felter.length){ 184 strengarray = strengarray + felter[i]+"\n"; 185 i++; 186 } return strengarray; 189 } } Page 4
64 GameBoardController.java 1 package Bræt; 2 import Bræt.GameBoard; public class GameBoardController { private boolean vundet = false; 16 GameBoard Board = new GameBoard(); public static void main(string[] args) 19 { 20 GameBoardController gbc = new GameBoardController(); 21 gbc.start(); 22 gbc.slut(); } public void start() 27 { 28 // printer ASCII-art (logoet) 29 GameBoardBoundary.printASCII_Matador1(); // Opretter spillere 32 PlayerBoundary.opret(); // En løkke der kører spillet 35 while(vundet == false) 36 { 37 int i = 0; 38 while(i < PlayerController.getAntalSpillere() && vundet == false) 39 { 40 if(playercontroller.spillere[i]!=null){ 41 // Hvis spilleren er fængslet, køres fængsels-feltets landonfield() igen 42 if (PlayerController.spillere[i].getJail()==true) 43 { 44 GameBoardBoundary.print(GameBoard.felter[31-1].landOnField(PlayerController.spillere[i])); 45 GameBoardBoundary.print(GameBoard.felter[PlayerController.s pillere[i].getposition()-1].tostring()); 46 menu(playercontroller.spillere[i]); 47 } 48 // Hvis spilleren ikke er fængslet, får han mulighed for at kaste 49 else 50 { 51 turn(i); 52 // Slår en spiller to ens, får han en tur mere 53 while(matadorraflebaeger.getens()==true && PlayerController.spillere[i]!=null) 54 { 55 turn(i); 56 } 57 } } 60 // Hvis antallet af aktive spillere er mindre end to, må der være en vinder 61 if(playercontroller.getactiveplayers()<2) Page 1
65 GameBoardController.java 62 { 63 vundet = true; } 66 i++; 67 } 68 } 69 } public void turn(int spillernummer) 72 { 73 GameBoardBoundary.pressToRoll(PlayerController.spillere[spillernummer].getN avn()); 74 MatadorRafleBaeger.kast(); 75 MatadorRafleBaeger.printØjne(); 76 GameBoardBoundary.pressToMove(MatadorRafleBaeger.getSum()); 77 PlayerController.spillere[spillernummer].move(MatadorRafleBaeger.getSum()); 78 GameBoardBoundary.print((GameBoard.felter[PlayerController.spillere[spiller nummer].getposition()-1]).tostring()); 79 GameBoardBoundary.print(GameBoard.felter[PlayerController.spillere[spillern ummer].getposition()-1].landonfield(playercontroller.spillere[spillernummer])); 80 GameBoardBoundary.print((GameBoard.felter[PlayerController.spillere[spiller nummer].getposition()-1]).tostring()); 81 menu(playercontroller.spillere[spillernummer]); 82 } public void slut() 85 { 86 GameBoardBoundary.printSlut(PlayerController.getWinner().getNavn()); 87 } public static void menu(player player) 90 { 91 int valg = 99; 92 while(valg!= 0 && valg!= 1) 93 { 94 valg = GameBoardBoundary.menuBoundary(player.getNavn()); 95 switch(valg) 96 { 97 case 1: break; 98 case 2: GameBoardBoundary.print(player.getNavn()+" har " + player.getsaldo()); break; 99 case 3: int valg1 = GameBoardBoundary.buySellHouse(); 100 switch (valg1){ 101 case 1: GameBoardBoundary.print(GameBoard.propertyList(player)); 102 int feltnr = GameBoardBoundary.buyHouseMenu(); 103 if(gameboard.felter[feltnr]!= null) 104 { 105 if(gameboard.felter[feltnr].getclass().getname() == "Bræt.Street") 106 { 107 if(((street)gameboard.felter[feltnr]).getowner() ==player.getnavn()) 108 { 109 ((Street)GameBoard.felter[feltnr]).buyHouse(player); 110 } 111 } 112 } break; 115 case 2: GameBoardBoundary.print(GameBoard.propertyList(player)); 116 int feltnr2 = GameBoardBoundary.sellHouseMenu(); 117 if(gameboard.felter[feltnr2]!= null) Page 2
66 GameBoardController.java 118 { 119 if(gameboard.felter[feltnr2].getclass().getname() == "Bræt.Street") 120 { 121 if(((street)gameboard.felter[feltnr2]).getowner() ==player.getnavn()) 122 { 123 ((Street)GameBoard.felter[feltnr2]).sellHouse(player); 124 } 125 } 126 } 127 break; 128 } 129 case 4: GameBoardBoundary.print(GameBoard.propertyList(player)); break; case 0: 132 int valg2 = GameBoardBoundary.givOpMenu(player.getNavn()); 133 if(valg2 == 1) 134 { 135 PlayerController.spillere[PlayerController.getSpillernummer(pla yer)] = null; 136 GameBoardBoundary.RIP(player.getNavn()); 137 } 138 break; 139 } 140 } 141 } 142 } Page 3
67 GameBoardBoundary.java 1 package Bræt; 2 import java.util.scanner; public class GameBoardBoundary 7{ 8 9 static Scanner scan = new Scanner(System.in); // Udskriver Matador-logo1 12 public static void printascii_matador1(){ 13 System.out.println(". =.... \n _vusssxxxxxxxxsxxxqqwwwwwwuwaaaii_si=> \n.<oss2222o2nnn1*11**s*!y22nsssxxs2xxxxzz##zzxoa, \n _%vnosxssosnn}` ^^^~~~~\"!*XXc. \n _vilno2xxss2oo> _wqqqqmw,..awwac. -{Ss. \n `._. GRUPPE 52 PRÆSENTERER.. _vv {nsxzxxx2os. dqwqqqqqqm, jwwwwqqw, {Xc. \n _n1 +++vsszzzxx2o= 3QWQWQWQQQQ; ]QWWWWWWmc no> \n.._=<_s,, _vv +++ <X2Z#UXXXoo,-$WQWQQWQWQE. -VWWWWWWWm,+Xo; \n... =i%vawwwo2xmmmhi..u1><umg= IXXZ#ZZXSoc -?QWQWWQWWE` -?WmmBBWW= <Sa. \n.=saaovvvvnnombw#asxm##2><s..u1 =nqwqp> nxz##zxxon; -?VWWWBT\' -?V$WV(.I2c. \n.<um###xnnvvvnxxsnoxxmmz1~ <s.v1 ++dqwqqc=vxz###zxsos -:., -no> \n.=vivs1sqqmmxvnvvnnomm##s>`.wa:vsvv +==mqqwwe=<3xz##zxxoo; _ymwwmw%. <m#mmqa, <nn; \n._iviliin###xsoqownoxm#ux1+ ) WWc=o1 ===+dqqqqe++ixx##zuxxos. =mqwwmwm#q>.3xxzz##mc <os. \n _vuooonivvvnnmmww#&oxm#zs}` =QQk:n>+====3WQWQc++ 3XX##ZZXoo> ) WWmBmm##ZZs {S2XXXZZ#c Io> \n _iom###xnvvvvnxzuxs2xm#mz1+ 3U()i=======3QQE=+++)XX###ZXSnn. 4QmW###ZXXX> -{o22xxzzh.:vn; \n.ivnxxsxnnnnno22ssssxxxxxs}~.<c..i}====;=;;=!!==+++ nxx##zxxoni - VW###ZXXS2( +1o2SXXZ` +vs. \n =o2oooooo22s2ss2s li+: <QWz <l====;;;;;=;=====+=<xxz##zxsnv;.!v#zzxxoe` -~\"**!` {vc \n :nxooooooonnv11viviiiii =:;: ]QQm. < ==;;;;;:;;;;====++=nxx#uzxxons. -\"!! \"~,.. {n; \n InIlii ++++~~~-----==+:.:: +QWE ++=;;;:;:;::;;;====++<XXZ##XXSnv; i, <v2xxzo=.:vv, \n.:l>--.==.-:: \"!`.+==;;::::vwc:;;====++ixxz#zzsons..umxs22vs,.ivnn2xx#a.=vs \n.= : -=;.-:. ==;;:;::)QWQc:;;===++ XSZ##ZX2ov; )#XSoonvvl. <vnnoxxx#c {n> \n +. ==:.-:..=;;::::3QWQm;=;====+={SXZ#ZXXonv; )mzxs2onvll> -{nn2sxx#m;.in; \n <. =;..:- =;;::::3QQQQc:;;===++ nxz##zxsnvi.-x#xxsoonvvl; -<nssxz#z` =nn. \n.<=.ummwa, -+;..:..yw, -;;:::.]QQQW(:;;====+=ISXZ#ZZS2nv= +X#XXS2nnvv; -!YSX?` =vns. \n - ; :3#WWWp, :+:..: jqqz =:::::=QWQW (:;;=;==++ nxx##zxsnvs, -!SZXXS2o>.. <vvn2c \n :<; -3XW#Z= ==...- ]QQC :=::::.)WWE::;;;====+=<XXZ##XX2ovi; ~\"!!\"`.._=== ilivvvvnn2o. \n = : -^^- +;..-.-VV`..::;::-:-- +:::;;;====++ vsx##zxxonvvi._. ;== += illivvvnnnoo2sx: \n.=. :+:... :. :::::: -:;::;:;;=;==+=+ioxz##zxsonvvvilliiiiiiiliiiiiiiillivivvvnnnnnoo2x2` \n -=. ==....: ;:-.--:::::;;;;====++ vsx#zzxxs2onv~ vviiiliiiiivivvvvnnnnnoo22x2~ \n a_a_a,. =.. _a_a_a... :=; :::::;;=;===++ inxz#xxxs2so1 ]yyga.vvvvvvvvvvvvvnvnnooo2ssxse\"` \n.qqqqqqc +: =QQQQQQ; :===::-:-.. 3QQQf =;::::::-----==+ivsxxxx1!!!\"* ]QQQk.nvnvI}+ \"!\"**1o2o2nn11}\"` \n.qqqqqqq,..mqqqqqq; - _saaa,,. dqqwf _aaaa,,.-{ox!` _as,. ]QQQk.2o\"-._aaa,, -3E-..sa,. \n.qqqqvqwk. jqqvqqqq; yqqqwwwqqqw. ]QQQQQQQQQD _mqqqwwwqqma <~ <mqwwqqwjqqqk.}`.ayqqqqwqqma. ` $QQQLwQWW#. \n.qqqq;4qql jqqd`wwqq; UY!\"!\"?9QQWk ) TQWQQ@TVTC =HY!\"!\"?$QQQc jwqqw?!!9wqqqk `.ywqqd?\"?9qqqm, mqqqqd!\"?! \n Page 1
68 GameBoardBoundary.java.QQQW:-QQQaQWW\':WWQQ;._awwwwyQQQW: 3QQQ[ _. awwwwyqqqk.mwqw(., 3QQQk.]QQQE _. 3QQQL dqqqe \n.qqqq: )WWQQW(.WWQQ; jmqqwtt?9wqqw: dqqqf :QQQW: ]C ]QQQk jqqqf.>` ]QQQk mqqq[ \n.qqqw: ]QQQF.WWQQ; :WQQW\' =QQQW: dqqqf -~- )QQQD jqqqe -WWQQ; -` dqqqk ]QQQk jqqqc dqqq[ \n.qqqq: -??!`.WQQQ; -QWQQa,_aQQQQW: 3QQQg,, )QWQQa wwwqqe ]WQQma mqqq[ \n.qqqq:.qwqq; -$WQQQQQD?WWWWQQD{QQQE,?$WQWQQE4WQQk?WWQQQQQWW?` dqqq[ \n \"!\"\"` \"\"\"! \"\"\"\"\" \"\"\"\"` \"\"\"!\"\"\" -\"\"\"\"^ -\"!\"\".C, \"\"\"\"~ -\"\"!^ ~\"\"!\"\"^ \"\"!\"\' \n. =i, =.... \n ~<III}*++~--. \n \n"); 14 } // Udskriver Matador-logo2 17 public static void printascii_matador2() 18 { 19 System.out.println("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQ\nQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ\n QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ -QQQQQQQQf ]QQQQQQQQQQQQQQQQQQQQQQQP????4QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ 4QQQQQQQ\' ]QQQQQQQQQQQQQQQQQQQQQQQf ]QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ )WQQQQQP ]QQQQQQQQQQQQQQQQQQQQQQQf ]QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ $WQQQQ( ]QQQQQQQQQQQQQQQQQQQQQQQf ]QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ ]WQQQ@ ]QQQQQBVT????9$QQQQQQQQQf ]QQQQQQQWHTT???T9QQQQQQQQQQQQV??9QQQ QQQQQQQQWV???T$QQQQQQQQQQQQQQQQWT?TQQQQQQQQQQ\nQQQQQQQQQQQQQ. QWQQ[. ]QQQQf -4QQQQQ ]QQ \"WQQQQQQQ@\'?Q QQQQQQ@\" -4QQQQQQQ QF QQQQQQQQQQ\nQQQQQQQQQQQQQ [ ]QQW.[ ]QQQQf ]QQQQ ]QQ -$QQQQQ@` ] QQQQQD` )QQQQQQ P QQQQQQQQQQ\nQQQQQQQQQQQQQ Q -QQf ]f ]QQQQf aaa, $QQQ ]QQ _aaa,. )QQQQQ\' QQQQ@ ]QQQQQ ` QQQQQQQQQQ\nQQQQQQQQQQQQQ Qc 4Q` mf ]QQQQgmQQQQWQc ]QQQaa/ _aaaajqqwqqqwwqq, WWQQE jqqa QQQQ( _yqmc $QQQQ _mqqwqqqqqqqqqq\nqqqqqqqqqqqqq Qm +F <Qf ]QQQQQQQQQQQQQ :QQQQQf ]QQQQQQQQQQQQQQQ[ 3QQQ[ ]WWWQc QQQW mqqqq/ ]QQQQ _QQQQWQQQQQQQQQQ\nQQQQQQQQQQQQQ QQ; \' jqf ]QQQQQQWVT???? QQQQQf ]QQQQQQQQQBT????\' ]QQQ\' dqqqqk QQQk =QQQQQk :QQQQ jqqqqqqqqqqqqqqq\nqqqqqqqqqqqqq QQk _QQf ]QQQQ@\" QQQQQf ]QQQQQQQP` ]QQQ QQQQQQ QQQf ]QQQQQQ QQQQ QQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ QQQ, jqqf ]QQQ@` QQQQQf ]QQQQQQf ]QQQ QQQQQQ QQQf ]QQQQQQ QQQQ QQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ QQQL.QQQf ]QQQ[ _aaa QQQQQf ]QQQQQ@ _aaa/ ]QQQ. QQQQQW QQQf ]QQQQQW.QQQQ QQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ QQQQ ]QQQf ]QQQ` jqqqw QQQQQf ]QQQQQf _QQWW[ ]QQQ; $WQQQE QQQk )WQQQQE :QQQQ QQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ QQQQc mqqqf ]QQQ QQQQE QQQQQf ]QQQQQf ]QQQQ\' ]QQQ[ ]WQQQ[ QQQQ $WQQQ( ]QQQQ QQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ QQQQQQQQQQQQf ]QQQ. 4QQW\' QQQQQk \"???QL )WQQF ]QQQk?WW! QQQQc -9Q@! mqqqq QQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ QQQQQQQQQQQQf ]QQQc -?!` QQQQQQ Qm \"?\" ]QQQQ, QQQQm. ]QQQQQ QQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ QQQQQQQQQQQQf ]QQQm ] QQQQQQc QQc.c ]QQQQm. ] QQQQQg. <QQQQQQ Page 2
69 GameBoardBoundary.java QQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQ QQQQQQQQQQQQf ]QQQQg, jw QQQQQQQw,, QQQc _mf ]QQQQQm, jq QQQQQQmc _wwqqqqqq QQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQwaaaQWQQQQQQQQQQQQQQQQQ QQQQQQQQmwaayQQQQQQQQQQQQQQQgaawmQQQQQQQQQQQQQQQQwaaawyQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQ\nQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQWWQQQ QQQQQQQQQQQQQQQWWWQQQQQQQQQQQQQQQQQWQWWWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ\nQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ\nQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ\n"); 20 } // En udskriv-funktion 23 public static void print(string string) 24 { 25 System.out.println(string); 26 } // Tryk for at kaste 29 public static void presstoroll(string spillernavn){ 30 System.out.println(spillernavn+", tryk for at kaste:"); 31 scan.nextline(); 32 } // Tryk for at rykke 35 public static void presstomove(int antalfelter){ 36 System.out.println("Du kan nu rykke "+antalfelter+" felter, tryk for at rykke:"); 37 scan.nextline(); 38 } // En boundary-menu til at købe/sælge huse 42 public static int buysellhouse() 43 { 44 System.out.println("" + 45 "Vil du købe et hus? Tast 1\n" + 46 "Vil du sælge et hus? Tast 2" ); 47 int valg = scan.nextint(); 48 return valg; 49 } //en menu til at købe huse 52 public static int buyhousemenu() 53 { 54 System.out.println("Vælg den grund du vil bygge på"); 55 int valg = scan.nextint(); 56 return valg; 57 } 58 //en menu til at sælge huse 59 public static int sellhousemenu() 60 { 61 System.out.println("Vælg den grund du vil sælge huse fra"); 62 int valg = scan.nextint(); 63 return valg; 64 } 65 // en menu til fængsel 66 public static int escapeprison() 67 { 68 System.out.println("Hvordan vil du komme ud af fængslet?\n" + 69 "1 - Betal 1000 kr.\n" + 70 "2 - Slå to ens ud af tre kast\n"); Page 3
70 GameBoardBoundary.java 71 int valg = scan.nextint(); 72 return valg; 73 } // Spørger spilleren om han vil købe grunden, og returnerer true eller false 76 public static boolean buyoption() 77 { 78 System.out.println("" + 79 "Vil du købe grunden?\n" + 80 "1 - Ja\n" + 81 "2 - Nej"); 82 int valg = scan.nextint(); switch(valg){ 85 case 1: return true; 86 case 2: return false; 87 default: return false; 88 } 89 } // En menu som giver brugeren mulighed for at gøre forskellige ting, inden han giver turen videre. Returnerer valget som int 92 public static int menuboundary(string playername){ 93 System.out.println(playername+", hvad vil du?\n" + 94 "1 - Giv turen videre\n" + 95 "2 - Vis saldo\n" + 96 "3 - Køb huse/hoteller\n" + 97 "4 - Vis grunde\n" + 98 "0 - Giv op"); 99 int valg = scan.nextint(); 100 return valg; 101 } // Er du sikker på at du vil give op? 104 public static int givopmenu(string playername){ 105 System.out.println(playername+", er du sikker på at du vil give op?\n" "1 - Ja, jeg giver op!\n" "2 - Nej, jeg giver ikke op"); 108 int valg = scan.nextint(); 109 return valg; 110 } // Skriver vinderen 113 public static void printslut(string vindernavn) 114 { 115 System.out.println("Spillet er slut!\nvinderen blev: "+vindernavn); 116 } // Skriver at en spiller er ude af spillet 119 public static void RIP(String playernavn){ 120 System.out.println(playernavn+" er ude af spillet!"); 121 } } 124 Page 4
71 testklasse.java 1 package Bræt; 2 3 import Player.Player; 4 5 public class testklasse 6{ 7 8 GameBoard testgb = new GameBoard(); public static void main(string[] args) 12 { 13 //Test af Refuge 14 //setup 15 int expectedsaldo = ; 16 Refuge testrefuge = new Refuge(1, "ko", 200); 17 Player p1 = new Player(); //run test 20 testrefuge.landonfield(p1); //check result 23 if (expectedsaldo == p1.getsaldo()) 24 System.out.println("Succes"); 25 else 26 System.out.println("fail"); 27 System.out.println("expected Saldo = " + expectedsaldo + " aktuel saldo = " + p1.getsaldo() ); //Test af buylot 31 ///setup 32 double forventetsaldo = p1.getsaldo() - 100; 33 Street teststreet = new Street(2, "ko", 100, 100,200,300,400,500,6000,100); 34 p1.setnavn("johhhhny med mange h'er"); 35 // run test teststreet.buylot(p1); //check result if (forventetsaldo == p1.getsaldo() ) 42 System.out.println("Succes"); 43 else 44 System.out.println("Fail"); 45 System.out.println("forventet saldo = " + forventetsaldo + " aktuel Saldo = " + p1.getsaldo() + " Ejeren er " + teststreet.getowner()); } } 50 Page 1
DANMARKS TEKNISKE UNIVERSITET
DANMARKS TEKNISKE UNIVERSITET Skriftlig prøve, 14. december 2018, 4 timer Side 1 af 18 Kursus navn: 02101 Indledende Programmering Kursus : 02101 Tilladte hjælpemidler: Ikke-digitale skriftlige hjælpemidler
Matador. Hvert hus koster: 2000 Et hotel koster: 2000 + 4 huse Pantsætningsværdien er 2000 kr.
Matador Problembeskrivelse Matador består af en spilleplade med 40 felter, biler (som udgør spillebrikker), to terninger, huse, hoteller, lykkekort, pengesedler og skødekort. Hvert felt har et nummer og
Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java
Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger
//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!
Denne guide er oprindeligt udgivet på Eksperten.dk Brugerinput i Java Denne her artikel gennemgår diverse ting ved brug af brugerinput i Java. Den starter med det simple og fortæller derefter skridt for
SPIL HURTIGERE MONOPOLY PÅ TID
SPIL HURTIGERE BRAND Hvis du kender MONOPOLY og vil spille lidt hurtigere: 1. Start med, at bankøren blander ejendomskortene og giver 2 til hver spiller. Spillerne betaler med det samme prisen for ejendommene,
DRONNINGER (QUEENS) Opgave 1
DRONNINGER (QUEENS) I denne opgave vil vi beskæftige os med det såkaldte 8-dronningeproblem, hvor man skal placerede 8 dronninger på et 8 x 8 skakbræt, således at ingen af dronningerne kan slå hinanden.
Lavet af Danni jensen og David Olsen
Projekt Delfin Lavet af Danni jensen og David Olsen 19/5-2008 Indholdsfortegnelse. Side 1: Indholdsfortegnelse og forord. Side 2: Kravsliste. Side 3: Use Case Model. Side 4: Formandens aktørbeskrivelse
www.hasbro.dk www.monopoly.co.uk
THE SIMPSONS & 2007 Twentieth Century Fox Film Corporation. All rights reserved. Distribueret i Norden af Hasbro Nordic, Ejby Industrivej 40, 2600 Glostrup. Made in Ireland www.hasbro.dk www.monopoly.co.uk
Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.
Indledning...2 Variabler...13 Eksempel: 1...13 Eksempel 2:...13 Eksempel 3:...15 Eksempel 4:...16 Metoder...17 Metode (intet ind og intet ud)...17 Metode (tekst ind)...18 Metode (tekst ind og tekst ud)...19
Hvad er Objekter - Programmering
Denne guide er oprindeligt udgivet på Eksperten.dk Hvad er Objekter - Programmering En rigtig god gennemgang af hvad objekter er! Hvordan de oprettes og anvendes! Det er helt klart til nybegyndere, som
2-6 SPILLERE. FORMÅL MED SPILLET At blive sidste spiller tilbage, efter at alle andre er gået bankerot.
Hvis du kender Monopoly og vil spille lidt hurtigere: 1. Start med, at bankøren blander ejendomskortene og giver to til hver spiller. Spillerne betaler med det samme prisen for grundene, de modtager, til
Det sande Matador ( af Jonas Jensen, Gode Penge)
Det sande Matador ( af Jonas Jensen, Gode Penge) Regler: 3-4 spillere, 4 spillere er optimalt. Spilles kun 3 spillere fjernes rollen Den fornuftige Spilles på et matadorbræt med regler som i matador, hvis
Ugeseddel 4 1. marts - 8. marts
Ugeseddel 4 1. marts - 8. marts Læs følgende sider i kapitel 6 i lærebogen: s. 233 258 og s. 291 317 (afsnit 6.3 overspringes). Begynd at overveje, hvad afleveringsopgaven skal omhandle. Læs vejledningen,
DM507 Algoritmer og datastrukturer
DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 13. marts, 2018 Dette projekt udleveres i tre dele. Hver del har sin deadline, således
Opgaven fortsat. Opfølgning på Opgave 2 og Use Cases. Opgaven. Trin 1: Væsentlige begreber. Resultatliste: 100 bryst, herrer
Opfølgning på Opgave 2 og Use Cases originally by Michael R. Hansen modified/extended by Anne E. Haxthausen Informatics and Mathematical Modelling Technical University of Denmark Opgaven fortsat Efter
Programmering for begyndere Lektion 2. Opsamling mm
Lektion 2 Opsamling mm God tone Der er indlagt spørge sessioner Lektion 2 - Agenda Programmering for Lidt ændringer til teknikken, herunder hvordan du genser en lektion Lidt generelle tilbagemeldinger
Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version
Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Finn Nordbjerg 1/9 Indledning I det følgende introduceres et par abstrakte
SWC eksamens-spørgsmål. Oversigt
SWC eksamens-spørgsmål Oversigt #1 Typer og variable #2 Aritmetik og logik #3 Klasser (definition, objekter) #4 Klasser (metoder) #5 Klasser (nedarvning, polymorfi) #6 Conditional statements #7 Repetition
DM507 Algoritmer og datastrukturer
DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 20. marts, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således
Klasse 1.4 Michael Jokil 03-05-2010
HTX I ROSKILDE Afsluttende opgave Kommunikation og IT Klasse 1.4 Michael Jokil 03-05-2010 Indholdsfortegnelse Indledning... 3 Formål... 3 Planlægning... 4 Kommunikationsplan... 4 Kanylemodellen... 4 Teknisk
Kapitel 4 Løkker i C#
Kapitel 4 Løkker i C# Løkker en vigtig del af alle programmeringssprog, og C# er ikke andeles. En løkke er en måde at udføre en del af koden gentagne gange. Ideen er at du fortsætter med at udføre en opgave
Software Dokumentation
Software Dokumentation Jan Boddum Larsen Teknologi B og A på HTX Dokumentation af software i Teknologi I samfundet sker der en bevægelse mod mere digitale løsninger i teknologi. Det betyder at software
Eksempel: et ordresystem note 5 Lagdeling s. 1
Eksempel: et ordresystem note 5 Lagdeling s. 1 Eksempel: et ordre-system NiceHair er et firma, som sælger udstyr, inventar og frisørartikler til frisørsaloner over hele landet. Det er ejet af et ægtepar
Abstrakte datatyper C#-version
Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Abstrakte datatyper C#-version Finn Nordbjerg 1/9 Abstrakte Datatyper Denne note introducerer kort begrebet abstrakt datatype
Kapitel 3 Betinget logik i C#
Kapitel 3 i C# er udelukkende et spørgsmål om ordet IF. Det er faktisk umuligt at programmere effektivt uden at gøre brug af IF. Du kan skrive små simple programmer. Men når det bliver mere kompliceret
SPIL HURTIGERE MONOPOLY PÅ TID
SPIL HURTIGERE Hvis du kender MONOPOLY og vil spille lidt hurtigere: Start med, at bankøren blander ejendomskortene og giver 2 til hver spiller Spillerne betaler med det samme prisen for de ejendomme,
Løsning af møntproblemet
Løsning af møntproblemet Keld Helsgaun RUC, oktober 1999 Antag at tilstandene i problemet (stillingerne) er repræsenteret ved objekter af klassen State. Vi kan da finde en kortest mulig løsning af problemet
University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2
DM502 Forelæsning 2 Repetition Kompilere og køre Java program javac HelloWorld.java java HeloWorld.java Debugge Java program javac -g HelloWorld.java jswat Det basale Java program public class HelloWorld
Kursusarbejde 3 Grundlæggende Programmering
Kursusarbejde 3 Grundlæggende Programmering Arne Jørgensen, 300473-2919 klasse dm032-1a 21. november 2003 Indhold 1. Kode 2 1.1. forestillinger.h............................................. 2 1.2. forestillinger.cc.............................................
5. OPSÆTNING DOKUMENTSKABELONER 5.1 TRIN
5. OPSÆTNING DOKUMENTSKABELONER Under fanen Dok. skabeloner kan du arbejde med de skabeloner som du har i systemet, eller du kan oprette nye. I denne vejledning kigger vi på hvordan du kan tilrette selve
Indholdsfortegnelse for kapitel 2
Indholdsfortegnelse for kapitel 2 Kapitel 2. Analyse.......................................................... 2 Analyse af 2.1...................................................... 2 Analysen af Database.................................................
Fable Kom godt i gang
Fable Kom godt i gang Vers. 1.3.1 Opdateret: 29-08-2018 Indholdsfortegnelse 1. Installer programmet 3 2. Pak robotten ud 5 3. I gang med at programmere 6 4. Programmér Fable til at køre fra 90 til -90
OPBEVARING. INDHOLD: 1 spillebræt, 1 spilenhed, 6 MONOPOLY-bankkort, 6 brikker, 30 ejendomskort, 32 huse, 12 hoteller og 2 terninger.
ALDER 8+ OPBEVARING 2-6 SPILLERE. Læg de 6 brikker i de særlige åbninger i bankørens bakke, så de ikke bliver ridset. 2. Vent på, at spilenheden slukker automatisk (den går i dvale, når den ikke har været
DM507 Algoritmer og datastrukturer
DM507 Algoritmer og datastrukturer Forår 2016 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 29. februar, 2016 Dette projekt udleveres i tre dele. Hver del har sin deadline, således
Miniguide Wellnessbox Medarbejderversion 2.0
Miniguide Wellnessbox Medarbejderversion 2.0 Indholdsfortegnelse 1. Wellnessbox HOVEDMENU 2. Wellnessbox hjælpepunkter og hovedmenu 3. KASSE: Åbn kassen 4. KASSE: Luk kassen 5. KASSE: Sælg vare 6. KASSE:
DM507 Algoritmer og datastrukturer
DM507 Algoritmer og datastrukturer Forår 2019 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 27. februar, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således
Dokumentation af programmering i Python 2.75
Dokumentation af programmering i Python 2.75 Af: Alexander Bergendorff Jeg vil i dette dokument, dokumentere det arbejde jeg har lavet i løbet opstarts forløbet i Programmering C. Jeg vil forsøge, så vidt
Spilstrategier. 1 Vindermængde og tabermængde
Spilstrategier De spiltyper vi skal se på her, er primært spil af følgende type: Spil der spilles af to spillere A og B som skiftes til at trække, A starter, og hvis man ikke kan trække har man tabt. Der
AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007
AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 Opgavebesvarelsen skal afleveres som enten en printerudskrift eller som et passende dokument sendt via email til [email protected]. Besvarelsen skal
Dm071 / Dm072 - Obligatorisk projekt 3: Design af model
Dm071 / Dm072 - Obligatorisk projekt 3: Design af model Fag: Projektet omhandler emner fra fagene Software Design og Software Konstruktion. Formål: Formålet med projektet er at give dig mulighed for sammen
Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:
Denne guide er oprindeligt udgivet på Eksperten.dk SQL og ASP En artikel omkring simpel SQL og hvordan disse opbygges, udformes og udføres, sådan at man kan få et brugbart resultat i ASP. Dette ligefra
Skriftlig eksamen i Datalogi
Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2
Fable Kom godt i gang
Fable Kom godt i gang Opdateret: 26-03-2018 Indholdsfortegnelse 1. Først skal du installere programmet på din computer 3 2. Når programmet er installeret er du klar til at pakke robotten ud 4 3. Nu er
Noter til C# Programmering Iteration
Noter til C# Programmering Iteration Programflow Programmer udfører det meste af deres arbejde vha. forgrening og løkker. Løkker Mange programmeringsproblemer kan løses ved at gentage en handling på de
Hassansalem.dk/delpin User: admin Pass: admin BACKEND
Hassansalem.dk/delpin User: admin Pass: admin BACKEND 1/10 Indledning Dette projekt er den afsluttende del af web udvikling studiet på Erhvervs Lillebælt 1. semester. Projektet er udarbejdet med Del-pin
Ide med Diff. Mål. Tidsplan. 1.uge: 2.uge:
Side 1 af 5 Ide med Diff. Min ide med differenertierings modulet er at lave et program som kan vise 3d objekter, og få lavede en konverter som kan konventer 3ds filer over til noget som flash kan bruge.
Indhold. Side 2 af 26
Tema Design Design, Programmering og test af Adressebog Fra d. 17 april til 20 april 2012 Vejledere: Gunhild Marie Andersen Kis Boisen Hansen Gruppe B Deltagere Side 1 af 26 Indhold Indledning.... 3 Kodestandard...
En liste, hvor der kun kan angives et svar. En dropdown menu, hvori kun et svar kan vælges
Huskeseddel til uv-evaluering 1. Sådan oprettes en undersøgelse Klik på ikonet Surveys og dernæst det grønne plus Ny undersøgelse. Navngiv din undersøgelse og vælg under Basic options, om der skal være
Roskilde Amatør Matador klub Regler for sæsonen
Roskilde Amatør Matador klub Regler for sæsonen 2017-2018 1 Om disse regler 1.1 Reglerne er en præcisering og et tillæg til de gængse matadorregler. Såfremt en af nedenstående paragraffer i modstrid med
2-6 SPILLERE. Superheltespillet, hvor du handler med ejendomme. www.hasbro.dk
Superheltespillet, hvor du handler med ejendomme Spider-Man og alle relaterede figurer: TM & 2007 Marvel Characters, Inc. Spider-Man-filmelementer: 2002-2007 Columbia Pictures Industries, Inc. Alle rettigheder
PHP Snippets. De små korte. Skrevet af Daniel Pedersen
PHP Snippets De små korte Skrevet af Daniel Pedersen Indhold PHP Snippets De små korte er en samling af små og praktiske kode eksempler med kort forklaring, som med formål at kunne benyttes til opsalgsværk
Introduktion til funktioner, moduler og scopes i Python
Denne guide er oprindeligt udgivet på Eksperten.dk Introduktion til funktioner, moduler og scopes i Python Denne artikel er fortsættelsen af "I gang med Python", som blevet publiceret her på sitet for
Programmering C RTG - 3.3 09-02-2015
Indholdsfortegnelse Formål... 2 Opgave formulering... 2 Krav til dokumentation af programmer... 3 ASCII tabel... 4 Værktøjer... 5 Versioner af ASCII tabel... 6 v1.9... 6 Problemer og mangler... 6 v2.1...
Michael Jokil 11-05-2012
HTX, RTG Det skrå kast Informationsteknologi B Michael Jokil 11-05-2012 Indholdsfortegnelse Indledning... 3 Teori... 3 Kravspecifikationer... 4 Design... 4 Funktionalitet... 4 Brugerflade... 4 Implementering...
Projekt - Visual Basic for Applications N på stribe
Projekt - Visual Basic for Applications N på stribe Mikkel Kaas og Troels Henriksen - 03x 3. november 2005 1 Introduktion Spillet tager udgangspunkt i det gamle kendte 4 på stribe, dog med den ændring,
Vejledning til. DUI-LEG og VIRKEs
Vejledning til DUI-LEG og VIRKEs Medlemssystem version 1.0 Opdateret 1. november 2009 Indholdsfortegnelse Sådan får du en kode til systemet...3 Sådan logger du ind på systemet...3 Forsiden og ændring af
Vejledning til Kilometer Registrering
Vejledning til Kilometer Registrering iphone Appen som holder styr på dit firma og privat kørsel. Udviklet af Trisect Development 2011. www.trisect.dk For iphone version 4.2 og nyere. Med Kilometer Registrering
Skak, backgammon & dam
Skak, backgammon & dam da Spillevejledning Varenummer: 349 582 Made exclusively for: Tchibo GmbH, Überseering 18, 22297 Hamburg, Germany www.tchibo.dk Tchibo GmbH D-22290 Hamburg 92630AB6X6VII 2017-07
ViKoSys. Virksomheds Kontakt System
ViKoSys Virksomheds Kontakt System 1 Hvad er det? Virksomheds Kontakt System er udviklet som et hjælpeværkstøj til iværksættere og andre virksomheder som gerne vil have et værktøj hvor de kan finde og
Python 3 kursus lektion 1:
Python 3 kursus lektion 1: Her laves et nyt program Her køre programmet! Her skrives koden: Gem (CTRL-s) Tryk F5 (for at køre) www.madsmatik.dk d.14-01-2016 1/5 At skrive til skærmen: Hello World Man kan
Regnetest B: Praktisk regning. Træn og Test. Niveau: 9. klasse. Med brug af lommeregner
Regnetest B: Praktisk regning Træn og Test Niveau: 9. klasse Med brug af lommeregner 1 INFA-Matematik: Informatik i matematikundervisningen Et delprojekt under INFA: Informatik i skolens fag Et forskningsprogram
Roskilde Amatør Matador klub Regler for sæsonen 2014-2015
1 Om disse regler Roskilde Amatør Matador klub Regler for sæsonen 2014-2015 1.1 Reglerne er en præcisering og et tillæg til de gængse matadorregler. Såfremt en af nedenstående paragraffer i modstrid med
Bemærk! Et PHP script har kun brug for at forbinde én gang til databaseserveren. Det kan så sagtens udføre flere kommandoer vha. denne forbindelse.
Mysqli Webintegrator Når vi arbejder med server-side scripting ( i vort tilfælde PHP), har vi ofte behov for at kunne tilgå data, som vi opbevarer i en database. Det kan f.eks. dreje sig om nyhederne i
Specialiseringen Rapport Lavede Af Rasmus R. Sørensen Side 1 af 6
Side 1 af 6 Indholdsfortegnelse INDHOLDSFORTEGNELSE 1 INTRO 3 STARTEN AF SPECIALISERINGEN 3 ANKOMST TIL SKOTLAND 4 DATABASER 5 NETVÆRK 5 INTERAKTION 5 AFSLUTNING AF SPECIALISERINGEN 5 KONKLUSION 6 Side
Python programmering. Per Tøfting. MacFest
Python programmering MacFest 2005 Per Tøfting http://pertoefting.dk/macfest/ Indhold Måder at afvikle Python program på Variabler Data typer Tal Sekvenser Strenge Tupler Lister Dictionaries Kontrolstrukturer
Spil Master Mind. Indledning.
side 1 af 16 Indledning. Spillet som denne rapport beskriver, indgår i et større program, der er lavet som projekt i valgfaget programmering C på HTX i perioden 9/11-98 til 12/1-99. Spillet skal give de
Forelæsning Uge 2 Mandag
Forelæsning Uge 2 Mandag Sætninger Simple sætninger (assignment, interne og eksterne metodekald) Sammensatte sætninger (blok, selektion, gentagelse) Udtryk og operatorer Java syntax og style guide Afleveringsopgave:
01.03.2013. ectrl Fritekstfaktura
01.03.2013 ectrl Fritekstfaktura Indholdsfortegnelse 1. Oprettelse af fritekstfaktura 3 2. Standardtekster 4 3. Udvidet fritekstfaktura 6 Udvidede funktioner på fakturahovedet 6 Linjeskabelon (udvidet
Løsningsforslag til Camp Let. Case Beskrivelse: Camp Let
Løsningsforslag til Camp Let Case Beskrivelse: Camp Let Firmaet Camp Let har til formål at udleje forskellige typer transportable ferieboliger. Det drejer sig i øjeblikket om campingbusser, campingvogne,
DMX styring med USB-interface
DMX styring med USB-interface Introduktion...2 DMX bibliotek...3 Programmering af kanaler...7 Sådan skabes et show/en lyssekvens...11 Introduktion DMX LightPlayer er en avanceret men meget brugervenlig
DANSK SKOLEDATA APS. Tlf. 86 44 80 99 E-mail [email protected] DSA-Ventelisten
Indholdsfortegnelse Overordnet beskrivelse af programmets funktioner... 2 Log på... 2 Manuel oprettelse af elev.... 3 Optagelse af elever... 3 1 Gruppering og sortering af elever... 3 2 Udvælg aspiranter...
