26.07.2013 Views

Rapport Objektorienteret Pacman - Portfolio - Tommy Andersen

Rapport Objektorienteret Pacman - Portfolio - Tommy Andersen

Rapport Objektorienteret Pacman - Portfolio - Tommy Andersen

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Rapport</strong><br />

<strong>Objektorienteret</strong> <strong>Pacman</strong><br />

<strong>Tommy</strong> Kobberø <strong>Andersen</strong> Christian Monrad Larsen<br />

_______________________ ________________________


Indholdsfortegnelse<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

1. 4<br />

PRODUKTINDLEDNING 4<br />

1.1. GENEREL BESKRIVELSE 5<br />

1.2. GRUPPEN 5<br />

2. 6<br />

PROJEKTOVERVEJELSER 6<br />

2.1. ARBEJDSFORM 7<br />

2.3. ARBEJDSOPDELING 7<br />

2.4. SWOT 8<br />

2.5. PROBLEMSTILLING 8<br />

KODESTIL 9<br />

2.5.1. SCOPE VARIABLER 9<br />

2.5.2. VARIABEL TYPER 9<br />

2.5.3. OPBYGNING AF IF/FOR/WHILE/DO SÆTNINGER 9<br />

2.5.4. OPBYGNING AF LYKKER 9<br />

2.5.5. FUNKTION / METODE OPBYGNING 9<br />

2.5.6. CLASS OPBYGNING 10<br />

2.6. TEKNOLOGIER 11<br />

2.6.1. CSS / XHTML 11<br />

2.6.2. PHP 11<br />

2.6.3. TEMPLATES 11<br />

2.6.4. APACHE 11<br />

2.6.5. MYSQL 11<br />

2.6.6. C++ 12<br />

2.6.7. FLASH 12<br />

2.6.8. GDI 12<br />

2.6.9. FMOD 12<br />

3. 13<br />

ANALYSE 13<br />

3.1. USE CASE 14<br />

3.1.1. HJEMMESIDE - FORSIDE 14<br />

3.1.2. SPILLETS HOVEDMENU 14<br />

3.1.3. INDTAST NAVN 15<br />

3.1.4. INDE I SPILLET 15<br />

3.1.5. GAME OVER 16<br />

3.2. BESKRIVELSE AF USE CASES 17<br />

4. 18<br />

DESIGN 18<br />

Side 2 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

4.1. FLOWCHART 19<br />

4.2. SWIMLANE 21<br />

4.3. DETALJERET FORKLARING AF SPILLETS FEATURES 25<br />

4.4. GRAFIK BUFFER 25<br />

4.5. KUNSTIG INTELLIGENS 26<br />

4.6. TIMER 27<br />

4.7. BILLEDER 27<br />

5. 29<br />

ENDELIGT 29<br />

PROGRAMDESIGN 29<br />

5.1. FLOWCHART 30<br />

5.2. DATABASE 33<br />

5.3. KLASSEDIAGRAM 34<br />

5.3.2. HJEMMESIDE 37<br />

5.4. SEKVENSDIAGRAM 39<br />

5.5. IPO 41<br />

5.6. CLIENT / SERVER / SIKKERHED 43<br />

5.7. GULDKORN 44<br />

6. 48<br />

KONKLUSION 48<br />

6.1. LITTERATURLISTE 50<br />

6.2. BILAG 50<br />

Side 3 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

1.<br />

Produktindledning<br />

Side 4 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

1.1. Generel beskrivelse<br />

Projektet er et <strong>Pacman</strong> spil. <strong>Pacman</strong> er en lille osteligende figur der skal bevæge sig rundt på en<br />

bane mens han spiser nogle små stykker mad der er fordelt ud over det meste af banen. Mission er<br />

at tømme banen for mad. Banen er formet som en labyrint. Til at forhindre <strong>Pacman</strong> i at opnå hans<br />

mission er der 4 spøgelser på banen som alle sammen jagter <strong>Pacman</strong> på hver deres metode via deres<br />

kunstige intelligens. Hvis pacman bliver ramt af spøgelserne dør han og mister et af sine liv.<br />

<strong>Pacman</strong> starter med 2 ekstra liv.<br />

Banerne skal klares inden tiden løber ud. <strong>Pacman</strong> starter med 5 minutter på bane 1.<br />

Hvis <strong>Pacman</strong> får spist al maden på banen bliver <strong>Pacman</strong> overført til næste bane. Næste bane vil altid<br />

være svære end den forrige fordi spøgelserne bliver hurtigere og hurtigere for hver bane. Der<br />

trækkes også 15 sekunder af tiden pr bane.<br />

På alle baner vil der være nogle store stykker mad som <strong>Pacman</strong> kan spise. Når <strong>Pacman</strong> spiser et<br />

stort stykke mad bliver alle spøgelserne blå og flygter fra <strong>Pacman</strong> i stedet for at jagte ham. Mens<br />

spøgelserne er blå kan <strong>Pacman</strong> spise dem og få point. Jo flere spøgelser pacman kan nå at spise<br />

inden de bliver normale jo flere point giver det. <strong>Pacman</strong> får point for alt han spiser. Der kommer<br />

også frugter frem en gang i mellem, frugterne giver point al efter hvilken bane man er kommet til.<br />

Man får et ekstra liv hver gang man får 10.000 point.<br />

Vi har valgt at gøre det muligt for brugeren at få uploadet sin score til en hjemmeside så han kan<br />

sammenligne sine færdigheder med andre spillere. Spillet fører også en lokal highscore liste.<br />

1.2. Gruppen<br />

Vores projektgruppe består af Christian M Larsen og <strong>Tommy</strong> Kobberø <strong>Andersen</strong>.<br />

1.3. Læsevejledning<br />

<strong>Rapport</strong>en henvender sig til en læser med teknisk forståelse.<br />

Vi gør brug af referencer mellem punkter og dokumenter.<br />

Referencer skal læses såldes her:<br />

Eksempel: (Ref: Kildekode, Bilag 7, 1.2.34)<br />

(Ref: navn, dokument, punkt)<br />

Det kan også bare stå som 7,1.2.34 eller bare 1.2.34 hvis der ikke er plads i diagrammet.<br />

Sidste tal i referencen kan også være en figurs nr.<br />

1.4. Struktur<br />

<strong>Rapport</strong>en er opbygget i faser som leder læseren gennem de skridt vi har været igennem. Det<br />

starter med analyse og ender i kildekode.<br />

Vores rapport har følgende hovedemner:<br />

• Projektovervejelser<br />

• Analyse<br />

• Design<br />

• Programdesign<br />

• Konklusion<br />

Side 5 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

2.<br />

Projektovervejelser<br />

Side 6 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

2.1. Arbejdsform<br />

Vi har mødtes de fleste dage kl. 10 til omkring kl 18. Der har været lidt brug for at vi har arbejdet<br />

ude for denne tidsramme så det har vi gjort ved at arbejde om aftenen eller på fridage.<br />

Vi har gjort meget for at vi begge to er med hele tiden så man kender til de ting der foregår.<br />

Under udviklingen af programmet har vi praktiseret XP (eXtreme Programming) programmering.<br />

2.2. Procesmetoder<br />

Udvikling af idéen<br />

Udarbejdelse af<br />

kravspecifikation<br />

Analyse og<br />

design<br />

Side 7 af 50<br />

Programmering<br />

af spillet og<br />

hjemmesiden<br />

Som det kan ses på diagrammet kan vi kun gå et skridt tilbage i processen.<br />

Denne model kaldes en vandfaldsmodel.<br />

Dokumentation<br />

og test<br />

2.3. Arbejdsopdeling<br />

Vi har delt arbejdet stort set lige op i mellem os. <strong>Tommy</strong> har erfaring med spilprogrammering i C++<br />

så det har gjort os i stand til at indføre nogle avancerede elementer i programmet så han har brugt<br />

lidt ekstra tid på at sætte kernen i programmet flot op.<br />

Vi har gjort meget for at arbejde på de samme tidspunkter, enten sammen eller hjemmefra. Hele<br />

kodedelen har vi udarbejdet sammen, mens dokumentationsskrivningen delvist er skrevet hver for<br />

sig. Den eneste undtagelse var da <strong>Tommy</strong> programmerede kernen, da Christian arbejde på<br />

dokumentationen.


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

2.4. SWOT<br />

En SWOT analyse skal vise projektets Styrker, Svagheder, muligheder og trusler. Vi har lavet en<br />

SWOT analyse over vores og projekt. Den ser således ud.<br />

STYRKER (Strengths) SVAGHEDER (Weaknesses)<br />

Vi har begge stor erfaring med programmering. Vi er afhængige af Internettet til at anskaffe<br />

oplysninger.<br />

Vi har rutine i fejlhåndtering.<br />

Projektet kræver visual studio, før man kan<br />

Vi har et godt samarbejde.<br />

arbejde og compile det.<br />

Vilje til at arbejde den ekstra tid projektet måtte Det er et stort projekt og kræver fornuftig<br />

kræve.<br />

opbygning.<br />

MULIGHEDER (Opportunities) TRUSLER (Threats)<br />

Der er mange mulige teknologier som kan<br />

bruges til projektet (Gfx: Torque, Opengl, Gdi,<br />

Programmet kan ikke køre på skolens maskiner.<br />

Direct3D Snd: Fmod, Directsound)<br />

C++ Bugs (thread Deadlock, Leaks, overflow)<br />

Projektet er godt skalerbart og vi kan nemt<br />

tilføje flere ting.<br />

Side 8 af 50<br />

Sygdom i gruppen.<br />

2.5. Problemstilling<br />

Vi har analyseret vores projekt. Og fundet frem til følgende problemstillinger.<br />

PS-1 Levetid<br />

Beskrivelse Da vores spil er ret simpelt i forhold til mange andre spil på markedet bliver<br />

det svært at opretholde brugerens lyst til at spille spillet. Vi skal derfor gøre<br />

hvad der er muligt for at skabe en god stemning som kan holde fast i<br />

brugeren.<br />

PS-2 Grafik<br />

Beskrivelse Spillet er lavet med ”gammeldags” grafik dvs 2D. Mange forventer i dag 3d<br />

spil. Derfor er det vigtigt at grafikken bliver rar at se på så folk kan ”holde<br />

ud” at se på et 2d spil.


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Kodestil<br />

Til dette projekt følger vi nogle bestemte koderegler, så vi nemt kan læse hinandens kode.<br />

Kodereglerne vil gøre det nemmere at undgå ændringer i kodestilen. På denne måde vil de<br />

forskellige udvikleres kode få en glidende overgang, hvilket gør det meget nemmere at læse og<br />

forstå koden. Reglerne vil også hjælpe mod sjusket kode og giver koden en længere levetid, da man<br />

lettere kan genanvende koden. I sidste ende skulle det give koden et mere ensartet og professionelt<br />

udseende.<br />

2.5.1. Scope variabler<br />

Når vi opretter variabler har vi et navnesystem til dem så det er nemmere at se hvor de stammer fra.<br />

Hvis det er en variabel som er medlem i en klasse (attribut) så får den ”m_” foran som indikator.<br />

m_xxxxx (Attribut. Variabel i en klasse)<br />

g_xxxxx (global variabel)<br />

xxxxx (lokal variabel)<br />

2.5.2. Variabel typer<br />

Når vi laver variabler så sørger vi for at det er muligt at læse hvilken type data variablen indeholder<br />

ved at sætte et bogstav foran navnet. Dette bogstav repræsenterer datatype som det kan ses i<br />

tabellen.<br />

bXxxxx (bool)<br />

iXxxxxx (int / heltal)<br />

fXxxxxx (float / kommatal)<br />

strXxxxx (String / Tekst)<br />

oXxxxxx (Object)<br />

cXxxxxx (class / instance)<br />

2.5.3. Opbygning af if/for/while/do sætninger<br />

Ved en sætning som skal udføre noget kode, starter man med ”{” på næste linje foran kommandoen.<br />

Koden skal derefter tabuleres 1 gang ud. Afslutningen ”}” sker på samme linje som kommandoen.<br />

if()<br />

{<br />

....<br />

....<br />

}<br />

2.5.4. Opbygning af lykker<br />

while()<br />

{<br />

....<br />

....<br />

}<br />

for()<br />

{<br />

....<br />

....<br />

}<br />

do()<br />

{<br />

....<br />

....<br />

} while (condition);<br />

2.5.5. Funktion / metode opbygning<br />

Ved opbygningen af en funktion indrammer vi det i kommentar linjer. Dette gøres for at forbedre<br />

læsevenligheden så det er nemmere at lokalisere hvor en funktion starter.<br />

Side 9 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Selve startsignalet til ny kode er en ”{” som bliver placeret under selve funktionen på samme<br />

afstand. Hermed kommer koden på en ny linje hvor den bliver tabuleret 1 gang ud. Slutsignalet ”}”<br />

står under koden på samme afstand som startsignalet.<br />

//---------------------------------<br />

function a()<br />

//---------------------------------<br />

{<br />

...<br />

}<br />

2.5.6. Class opbygning<br />

”Public” kommer først i oprettelse af klasser, derefter ”protected” og ”private”. De 2 første metoder<br />

i klassen er altid ”constructor” og ”deconstructor”. Herefter er det metoder og attributter hele vejen<br />

ned med ”public”, ”protected” og ”private” som rækkefølge.<br />

class CName<br />

{<br />

//----------------------------<br />

function CName()<br />

//----------------------------<br />

{<br />

}<br />

}<br />

//----------------------------<br />

function __destruct()<br />

//----------------------------<br />

{<br />

}<br />

//----------------------------<br />

public function a()<br />

//----------------------------<br />

{<br />

}<br />

public m_a;<br />

//----------------------------<br />

protected function b()<br />

//----------------------------<br />

{<br />

}<br />

protected m_b;<br />

//----------------------------<br />

private function c()<br />

//----------------------------<br />

{<br />

}<br />

private m_c;<br />

Side 10 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

2.6. Teknologier<br />

I vores projekt gør vi brug af flere teknologier.<br />

Her er en opsummering af de teknologier vi bruger i projektet.<br />

2.6.1. CSS / Xhtml<br />

Hjemmesiden gør brug af HTML og CSS.<br />

Vores hjemmeside er godkendt efter W3C<br />

regler således at hjemmesiden er mere<br />

kompatibel med flere browsere.<br />

2.6.2. PHP<br />

Vi har valgt at bruge PHP 5.03 til at skrive<br />

hjemmesiden. Vi har begge erfaringer med dette<br />

fra tideligere og vi kan godt lide PHPs struktur.<br />

Med PHP har vi også mulighed for at lave en<br />

hvis grad af objekt orienteret kode.<br />

2.6.3. Templates<br />

Vi bruger et template system. Temple systemet<br />

fungere via PHP. PHPen har fået classer til hver<br />

enkelt template vi bruger. Classen henter i sin<br />

contructor templaten ind og via forskellige<br />

funktioner kan classen fyldes med infomation<br />

og det kan hentes ud igen. Dette betyder at der<br />

er mange klasser på hver side når man skal have<br />

vist indhold. Det kræver lide mere arbejde at<br />

bruge dette system, men det er rart når der skal<br />

rettes i det , da man kun skal<br />

2.6.4. Apache<br />

Vi bruger Apache 2.0 som webserver.<br />

2.6.5. MySql<br />

Vi har valgt at bruge MySQL 5.0 til vores<br />

database server da den er gratis.<br />

Side 11 af 50


2.6.6. C++<br />

Selve pacman spillet er skrevet i C++. Vi har<br />

valgt at bruge dette da <strong>Tommy</strong> har erfaring med<br />

spil udvikling i C++ i forvejen. Og eftersom<br />

<strong>Pacman</strong> spillet skal objekt orienteres synes vi<br />

C++ er det mest naturlige valg.<br />

Vi bruger Visual studio til at programmere C++.<br />

2.6.7. Flash<br />

Vi har valgt at lave en intro på hjemmesiden i<br />

flash for at hjemmesiden ikke virker så ”død”<br />

når man kommer ind på den. Vi har også lavet<br />

en menu til hjemmesiden i flash.<br />

For at give et godt førstehånds indtryk af<br />

programmet har vi valgt at lave en CDmenu i<br />

flash som køres automatisk når CDrommen<br />

sættes ind i en computer.<br />

2.6.8. GDI<br />

Som grafik behandling bruger vi teknologien<br />

GDI (Graphics Device Interface) som giver<br />

muligheden for at tegne farver til skærmen.<br />

Dette giver mulighed for at opbygge et spil og<br />

dens layout via billeder som bliver behandlet af<br />

GDI’s funktioner<br />

2.6.9. FMOD<br />

Til lyd behandling bruger vi FMOD som er et<br />

ekstern software hentet fra fmod.org<br />

Denne teknologi giver mulighed for at afspillet<br />

mange forskellige musik og lyd formater. I<br />

vores projekt bruger vi følgende lyd formater:<br />

Mp3, mod, s3m og wav.<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 12 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

3.<br />

Analyse<br />

Side 13 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Denne sektion består af analyser til projektet. Vi har overvejet og analyseret de forskellige aspekter<br />

i programmet for at kunne komme videre til at skulle designe spillet og hjemmesiden. Det er ikke en<br />

idé fase, men derimod nærmere en "Kan det lade sig gøre" og "hvordan gør vi det" fase.<br />

3.1. Use case<br />

Vores use case diagram illustrerer hvilke situationer som kan opstå i vores projekt. Dette er tegnet<br />

ved aktører, som kommunikerer med hinanden. Selve mulighederne i programmet er skitseret som<br />

en cirkel, hvor man kan læse funktionen.<br />

3.1.1. Hjemmeside - Forside<br />

På forsiden af vores hjemmeside har brugeren<br />

mulighed for at:<br />

3.1.1.1. Download <strong>Pacman</strong><br />

Downloader <strong>Pacman</strong> spillet.<br />

(Ref: Swimlane 1, 4.2.1.4)<br />

3.1.1.2. Se information om spillet<br />

Brugeren får vist information om spillet inkl.<br />

mulighed for at hente en manual<br />

(Ref: Swimlane 1, 4.2.1.2)<br />

3.1.1.3. Se highscores<br />

Se de highscores der er blevet uploadet<br />

(Ref: Swimlane 1, 4.2.1.1)<br />

3.1.1.4. Forsiden<br />

Sender brugeren til forsiden<br />

(Ref: Swimlane 1, 4.2.1.3)<br />

3.1.2. Spillets hovedmenu<br />

Når spillet er startet kan brugeren enten begynde<br />

et spil eller lukke det ned<br />

3.1.2.1. Start spillet<br />

Starter spillet<br />

(Ref: Flowchart 1, 4.1.12)<br />

3.1.2.2. Luk Spillet<br />

Lukker spillet ned<br />

(Ref: Flowchart 1, 4.1.1)<br />

Side 14 af 50<br />

Bruger<br />

Spillets hovedmenu<br />

Start spillet<br />

Luk Spillet<br />

Program


3.1.3. Indtast navn<br />

3.1.3.1. Indtast navn<br />

Når spillet er startet, skal brugeren indtaste sit<br />

navn.<br />

(Ref: Flowchart 1, 4.1.2)<br />

3.1.3.2. Online<br />

Spilleren har mulighed for at vælge, om han vil<br />

have sin score uploadet til hjemmesiden, når<br />

spillet slutter.<br />

(Ref: Flowchart 1, 4.1.13)<br />

3.1.3.3. Begynd spillet<br />

Når navnet er indtastet, kan spillet startes.<br />

(Ref: Flowchart 1, 4.1.3)<br />

3.1.3.4. Luk spillet<br />

Brugen kan lukke spillet på ethvert givent<br />

tidspunkt.<br />

(Ref: Flowchart 1, 4.1.1)<br />

3.1.4. Inde i spillet<br />

3.1.4.1. Bevæg <strong>Pacman</strong><br />

Når brugeren er inde i spillet, er der mulighed<br />

for at bevæge <strong>Pacman</strong>.<br />

(Ref: Flowchart 1, 4.1.4)<br />

3.1.4.2. <strong>Pacman</strong> dør<br />

Hvis brugeren ikke er forsigtig, kan <strong>Pacman</strong> dø.<br />

(Ref: Flowchart 1, 4.1.8)<br />

3.1.4.3. Game over<br />

Hvis <strong>Pacman</strong> mister alle sine liv, er spillet slut.<br />

(Ref: Flowchart 1, 4.1.15)<br />

3.1.4.4. Powerup<br />

Brugeren kan samle en powerup op med<br />

<strong>Pacman</strong>, som gør ham i stand til at gøre noget<br />

specielt.<br />

(Ref: Flowchart 1, 4.1.6)<br />

3.1.4.5. Næste bane<br />

Når en bane er klaret, bliver brugeren sendt til<br />

næste bane<br />

(Ref: Flowchart 1, 4.1.9)<br />

3.1.4.6. Luk spillet<br />

Brugen kan lukke spillet på ethvert givent<br />

tidspunkt.<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 15 af 50<br />

Bruger<br />

Indtast navn<br />

Indtast navn<br />

Online<br />

Begynd spillet<br />

Luk Spillet<br />

Program


(Ref: Flowchart 1, 4.1.1)<br />

3.1.4.7. Start forfra<br />

Der er også mulighed for at starte spillet forfra.<br />

(Ref: Flowchart 1, 4.1.14)<br />

3.1.5. Game over<br />

3.1.5.1. Vis highscore<br />

Når spillet er slut får brugeren vist de lokale<br />

highscores.<br />

(Ref: Flowchart 1, 4.1.11)<br />

3.1.5.2. Upload hihscore<br />

Spillet uploader brugerens score, hvis der blev<br />

givet lov til det, da spilleren skulle indtaste sit<br />

navn.<br />

(Ref: Flowchart 1, 4.1.10)<br />

3.1.5.3. Afslut spillet<br />

Brugen kan lukke spillet på ethvert givent<br />

tidspunkt.<br />

(Ref: Flowchart 1, 4.1.1)<br />

3.1.5.4. Start forfra<br />

Der er også mulighed for at starte spillet forfra.<br />

(Ref: Flowchart 1, 4.1.14)<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 16 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

3.2. Beskrivelse af use cases<br />

Nedenstående bokse giver en beskrivelse af hver use-case. I boksene vil der være en kort forklaring<br />

af formålet med ’casen’ og hvordan forløbet forventes at gå. Herefter er der små detaljer om deres<br />

forudsætninger, deres aktører og hvad som sker bagefter. Da der ikke er plads til alle use-case<br />

beskrivelserne kan resten findes i bilagene.<br />

Use case navn: Bevæg pacman<br />

Aktører: Bruger, program<br />

Formål: Når spillet er i gang bliver denne funktion aktiveret hver gang en spiller trykker<br />

på en af piltasterne. Funktionen checker brugerens input og kontroller om<br />

pacman kan bevæge sig den vej<br />

Normal Forløb: 1. Spillet er i gang<br />

2. Brugeren trykker på en tast<br />

Alternativ • Brugeren afslutter programmet<br />

forløb:<br />

• <strong>Pacman</strong> dør af et spøgelse<br />

Forudsætter: Spillet ikke er i pause<br />

Vejen er fri<br />

Bagefter: <strong>Pacman</strong> begynder at bevæge sig den valgte vej<br />

Use case navn: Upload highscore<br />

Aktører: Bruger, program<br />

Formål: Funktionen etablere kontakt til webserveren og sender brugerens score af sted.<br />

Normal Forløb: 1. <strong>Pacman</strong> dør og scoren bliver sendt til webserveren.<br />

Alternativ<br />

forløb:<br />

• Brugeren afslutter programmet<br />

Forudsætter: Brugeren har valgt online highscore<br />

Bagefter: Scoren bliver sendt til webserver og opbevaret i databasen.<br />

Resten af use case beskrivelserne kan findes i Bilag 12 – Use-case Beskrivelser<br />

Side 17 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

4.<br />

Design<br />

Side 18 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

4.1. Flowchart<br />

Flowcharts er fantastiske diagrammer til at vise hvordan flowet i et program er.<br />

Denne flowchart er lavet ud fra vores idéer og vores use cases.<br />

Flowcharten viser hvordan vi har designet det logiske flow i programmet dvs. i hvilken rækkefølge<br />

tinge skal aktivere hinanden.<br />

Firkanter illustrer en proces og trekanter er en beslutning. En firkant med runde hjørner er en<br />

terminator. Processens funktion er skrevet ned i kassen og grundlaget for den beslutning der står i<br />

trekanten. På pilene som viser hvilken vej det skal gå står der hvad kriteriet var for at kunne komme<br />

denne vej.<br />

Side 19 af 50


4.1.1 Programmet lukkes<br />

(Ref: Swimlane 1, 4.2.2.1)<br />

4.1.2 Indtast navn menuen<br />

(Ref: Swimlane 1, 4.2.2.2)<br />

4.1.3 Spillet starter<br />

(Ref: Swimlane 1, 4.2.2.12)<br />

4.1.4 Flyt pacman<br />

(Ref: Swimlane 1, 4.2.2.13)<br />

4.1.5 Spøgelser og pacman<br />

bliver sat tilbage til<br />

start pos<br />

(Ref: Swimlane 1, 4.2.2.28)<br />

4.1.6 Aktiverer det<br />

specielle ved<br />

powerup<br />

(Ref: Swimlane 1, 4.2.2.25)<br />

4.1.7 Tilføj point til<br />

highscore<br />

(Ref: Swimlane 1, 4.2.2.26)<br />

4.1.8 <strong>Pacman</strong> dør<br />

(Ref: Swimlane 1, 4.2.2.27)<br />

4.1.9 Start næste bane<br />

(Ref: Swimlane 1, 4.2.2.18)<br />

4.1.10 Upload highscore til<br />

webserveren<br />

(Ref: Swimlane 1, 4.2.2.33)<br />

4.1.11 Vis highscore<br />

(Ref: Swimlane 1, 4.2.2.31)<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 20 af 50<br />

4.1.12 Start spillet?<br />

(Ref: Swimlane 1, 4.2.2.4)<br />

4.1.13 Spil online?<br />

(Ref: Swimlane 1, 4.2.2.3)<br />

4.1.14 Vil du spillet igen?<br />

(Ref: Swimlane 1, 4.2.2.20)<br />

4.1.15 Har pacman flere<br />

liv?<br />

(Ref: Swimlane 1, 4.2.2.19)<br />

4.1.16 Var spillet online?<br />

(Ref: Swimlane 1, 4.2.2.22)<br />

4.1.17 Er der mere mad på<br />

banen?<br />

(Ref: Swimlane 1, 4.2.2.18)<br />

4.1.18 Er det en powerup?<br />

(Ref: Swimlane 1, 4.2.2.17)<br />

4.1.19 Kan pacman spise<br />

spøgelser?<br />

(Ref: Swimlane 1, 4.2.2.16)<br />

4.1.20 Hvad rammer<br />

pacman på banen?<br />

(Ref: Swimlane 1, 4.2.2.24)


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

4.2. Swimlane<br />

Swimlane diagrammet viser hvad der sker når brugeren kører programmet igennem. Man kan se<br />

hvem der servicer brugeren og hvad de gør.<br />

1. Hjemmeside<br />

Første diagram viser hvordan kommunikationen er mellem bruger og server på vores hjemmeside.<br />

Swim Lane - Hjemmeside<br />

Start<br />

Bruger<br />

Åbner<br />

hjemmesiden<br />

Viser forsiden<br />

Slut<br />

Opdatere siden<br />

Se highscore<br />

Læs om pacman<br />

Til forsiden<br />

Hent pacman<br />

Forlader hjemmesiden<br />

4.2.1.1 Til forsiden<br />

(Ref: Klassediagram 1, 5.3.2.CPageFront)<br />

(Ref: IPO , Bilag 1, 29.1)<br />

4.2.1.2 Hent pacman<br />

(Ref: Klassediagram 1, 5.3.2.CPageDownload)<br />

(Ref: IPO , Bilag 1, 28.1)<br />

1<br />

2<br />

3<br />

4<br />

Side 21 af 50<br />

Henter<br />

informationer fra<br />

database<br />

Server<br />

Sender Html<br />

Sender Html<br />

Sender Html<br />

Sender fil<br />

Sender Html<br />

4.2.1.3 Se highscore<br />

(Ref: Klassediagram 1, 5.3.2.CPageRank)<br />

(Ref: IPO , Bilag 1, 30.1)<br />

4.2.1.4 Læs om pacman<br />

(Ref: Klassediagram 1, 5.3.2.CPageAbout)<br />

(Ref: IPO , Bilag 1, 27.1)<br />

Som diagrammet viser, har brugeren åbnet hjemmesiden hvorefter der er adgang til alle resurser på<br />

siden Brugeren kan forlade hjemmesiden på hvilket som helst tidspunkt.


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

2. Applikation del 1<br />

Dette swimlane diagram viser hvordan brugeren og applikation ”snakker” sammen. Diagrammet<br />

viser hvad applikationen gør når brugeren beder den om noget.<br />

4.2.2.1 Afslut / Start spil<br />

(Ref: Flowchart 1, 5.1.1.11)<br />

4.2.2.2 Indtast navn<br />

(Ref: Flowchart 1, 5.1.1.18)<br />

4.2.2.3 Sæt online<br />

(Ref: Flowchart 1, 5.1.1.18)<br />

4.2.2.4 Afslut spil / Begynd<br />

spil<br />

(Ref: Flowchart 1, 5.1.1.18)<br />

4.2.2.5 Åbner programmet<br />

(Ref: Flowchart 1, 5.1.1.1)<br />

4.2.2.6 Viser velkomsskærm<br />

(Ref: Flowchart 1, 5.1.1.5)<br />

4.2.2.7 Opretter og klargøre<br />

app<br />

(Ref: Flowchart 1, 5.1.1.3)<br />

Side 22 af 50<br />

4.2.2.8 Ændre state til<br />

indtast navn<br />

(Ref: Flowchart 1, 5.1.1.10)<br />

4.2.2.9 Viser indtast navn<br />

skærm<br />

(Ref: Flowchart 1, 5.1.1.10)<br />

4.2.2.10 Opbevare navnet<br />

(Ref: Flowchart 1, 5.1.1.19)<br />

4.2.2.11 opbevare valg<br />

(Ref: Flowchart 1, 5.1.1.19)<br />

4.2.2.12 Klargøre alle spil<br />

objekter og variabler<br />

(Ref: Flowchart 1, 5.1.1.21)<br />

Første del af diagrammet viser hvordan brugeren kommer igennem de første menuer inden han kan<br />

spillet. Diagrammet fortsætter på næste side. Her kan man se hvad der sker når spillet er startet.


Applikation del 2<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 23 af 50


4.2.2.13 Bevæger pacman<br />

(Ref: Klassediagram 1, 5.3.1.2.CGameObject)<br />

(Ref: IPO , Bilag 1, 14.9)<br />

4.2.2.14 Afslut spil / Genstart<br />

spil<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameHandler)<br />

(Ref: IPO , Bilag 1, 5.8)<br />

4.2.2.15 Spøgelse<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateGame)<br />

(Ref: IPO , Bilag 1, 15.8)<br />

4.2.2.16 Dødeligt spøgelse<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateGame)<br />

(Ref: IPO , Bilag 1, 15.8)<br />

4.2.2.17 Mad / Powerup<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateGame)<br />

(Ref: IPO , Bilag 1, 15.8)<br />

4.2.2.18 Næste bane / Fortsæt<br />

uændret<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateGame)<br />

(Ref: IPO , Bilag 1, 15.7)<br />

4.2.2.19 Flere liv / Ingen liv<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateGame)<br />

(Ref: IPO , Bilag 1, 15.7)<br />

4.2.2.20 Afslut spil / Genstart<br />

spil<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateHighscore)<br />

(Ref: IPO , Bilag 1, 16.5)<br />

4.2.2.21 Ingen rekord / På<br />

top10<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateHighscore)<br />

(Ref: IPO , Bilag 1, 16.8)<br />

4.2.2.22 Ikke online / Online<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateHighscore)<br />

(Ref: IPO , Bilag 1, 16.2)<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 24 af 50<br />

4.2.2.23 Viser spillet<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateGame)<br />

(Ref: IPO , Bilag 1, 15.5)<br />

4.2.2.24 Collision check med<br />

pacman<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateGame)<br />

(Ref: IPO , Bilag 1, 15.8)<br />

4.2.2.25 Aktiver powerup<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateGame)<br />

(Ref: IPO , Bilag 1, 15.8)<br />

4.2.2.26 Giv point<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateGame)<br />

(Ref: IPO , Bilag 1, 15.8)<br />

4.2.2.27 Mister 1 liv<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameStateGame)<br />

(Ref: IPO , Bilag 1, 15.13)<br />

4.2.2.28 Klargør resurserne<br />

og genstart spillet<br />

(Ref: Flowchart 1, 5.1.1.15)<br />

4.2.2.29 Klargør resurserne<br />

og genstart spillet<br />

(Ref: Flowchart 1, 5.1.1.15)<br />

4.2.2.30 Check highscore<br />

(Ref: Flowchart 1, 5.1.1.24)<br />

4.2.2.31 Vis highscore<br />

(Ref: Flowchart 1, 5.1.1.24)<br />

4.2.2.32 Registrer highscore<br />

(Ref: Flowchart 1, 5.1.1.24)<br />

4.2.2.33 Register online<br />

highscore<br />

(Ref: Flowchart 1, 5.1.1.24)


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

4.3. Detaljeret forklaring af spillets features<br />

• <strong>Pacman</strong> er en lille gul ”ost” der spiser mad.<br />

• 4 spøgelser med hver deres personlighed til at jagte <strong>Pacman</strong>.<br />

• <strong>Pacman</strong> skal spise al maden på banen for at vinde.<br />

• Alt <strong>Pacman</strong> spiser giver point.<br />

• Hvis spøgelserne fanger <strong>Pacman</strong> mister <strong>Pacman</strong> et liv.<br />

• <strong>Pacman</strong> starter med 3 liv.<br />

• Scoren starter på 0.<br />

• Normal mad giver 10 point.<br />

• Store stykker mad giver 100 point.<br />

• Hvis pacman spiser et stort stykke mad kan han spise spøgelserne i 10 sekunder. Hvert<br />

spøgelse pacman spiser giver 200 point, gange 2^ i det antal spøgelser han har spist inden<br />

for de 10 sekunder. Dvs 200/400/800/1600 point. Der er 4 stykker mad af denne type på en<br />

bane. Hvis pacman spiser endnu et stykke stort mad mens han stadig har det aktivt starter 10<br />

sekunders tælleren bare forfra. Den gemmer det antal spøgelser pacman har spist.<br />

• Når et spøgelse er blevet spist skal det finde tilbage til deres hule som er i midten af banen.<br />

Hvorefter det bliver til et normalt spøgelse igen.<br />

• Banen er bygget op af klodser.<br />

• Der er en genvej mellem siderne af banen. Dvs at går man ud af den genvej kommer man<br />

om på den anden side af banen.<br />

• Hvis pacman spiser al maden bliver han sendt videre til næste bane.<br />

• Spøgelserne bliver mere aggressive jo længere man når. De bliver ikke inde i kassen lige så<br />

længe som på forrige bane og bruger mere tid på at jagte pacman for hver bane.<br />

• Der er tid på hver bane. Spilleren har 5min til at klare første bane. Næste bane har spilleren<br />

4:45. næste igen 4:30 osv.<br />

4.4. Grafik Buffer<br />

Selve spillet vil blive designet med dobbeltbuffer således at grafikken bliver opbevaret 2 steder.<br />

Dette er for at undgå flimmer. Hvis man både tegner og viser i den samme arbejdsbuffer, vil<br />

brugeren kunne se hvordan tingene fremkommer og det kan virke forstyrrende. Så for at gøre det så<br />

pænt som muligt, laver vi det således, at vi har en visning og en arbejds buffer. Resultatet bliver<br />

således at vi tegner og arbejder i den ene buffer og når vi har opdateret spillet så lægger vi resultatet<br />

over på den anden buffer. Således at den ene buffer konstant viser resultat og den anden bliver<br />

slettet ved hver frame og tegnet om igen.<br />

Side 25 af 50


4.5. Kunstig intelligens<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Selve spillet består af 4 spøgelser med hver deres udseende og intelligens. Spøgelsernes opgave er<br />

at forhindre pacman i at klare banen. Denne opgave kræver at hvert spøgelse har en taktik og bedst<br />

muligt får presset pacman til at fejle.<br />

Fælles regler.<br />

• Ingen spøgelser kan dreje mod dem selv (180 grader)<br />

• Spøgelsernes tid når de er dødelige er fælles hos dem alle.<br />

• Spøgelsernes hastighed når de er dødelige er halveret<br />

• Når spøgelserne er dødelige prøver de alle at komme væk fra pacman<br />

• Spøgelsernes tid efter de er blevet spist og er i startstedet er fælles.<br />

Spøgelser<br />

Taktik<br />

Blinky<br />

Blinky vil jage sit<br />

mål ved at<br />

fokusere mest på<br />

horisont aksen.<br />

Pinky<br />

Pinky vil jage sit<br />

mål ved at<br />

fokusere mest på<br />

vandret aksen.<br />

Side 26 af 50<br />

Inky<br />

Inky vil jage sit<br />

mål ved at gå efter<br />

den længste<br />

afstand på aksen.<br />

Clyde<br />

Clyde har ingen<br />

favorit retning,<br />

men holder sig<br />

stadig nær <strong>Pacman</strong>.<br />

Start tid 0 sek(Starter ude) 0 sekunder 6 sekunder 10 sekunder<br />

Situation Blinky løsning Pinky løsning Inky løsning Clyde løsning


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Spøgelserne vil ikke konstant jage pacman, men derimod holde<br />

en kort pause engang imellem og søge mod deres hjemsted.<br />

Årsagen til dette er at der ikke hele tiden skal være 4 spøgelser<br />

på ryggen af pacman, men derimod at de er mere spredt rundt<br />

omkring på banen. Dette betyder at hvert spøgelse vil have et<br />

tidsinterval som bestemmer hvornår de skal søge efter deres<br />

hjemsted og hvornår de skal være aggressive.<br />

4.6. Timer<br />

En timer bruges til at sikre at alle computere bevæger<br />

objekterne med samme hastighed. Hvis man ikke bruger en<br />

timer vil objekterne bevæge sig efter hvor mange gange en while løkke bliver kørt. Hvis en cpu vil<br />

kunne trække hele spil-løkken 80 gange, så vil objekter rykke sig 80 gange. Dette vil ikke være så<br />

smart hvis man finder en anden maskine som kun kan trække spil-løkken 17 gange, da dette vil<br />

formindske alle objekternes bevægelse.<br />

Måden man fikser dette, er ved er at tage en start tid ved løkke-start og en slut tid når løkken er slut.<br />

Herfra kan man udregne en delta tid som vil variere efter hvor hurtig løkken blev kørt. Denne værdi<br />

kan nu bruges til at gange med objektets hastighed og hermed vil hastigheden variere efter hvor<br />

hurtig løkken blev kørt. Dette betyder at en hurtig computer vil få en lav værdi og hver objekt vil<br />

rykke meget lidt per løkke-kald som giver en flydende bevægelse. Hvorimod en langsom computer<br />

får en høj værdi som for objekter til at springe, således at objekter stadig opfylder deres hastighed.<br />

4.7. Billeder<br />

Billede behandling bruger vi til at vise objekter på skærmen. Da vi har nogle krav til dette såsom<br />

rotation og ’masking’ kræver det lidt udregninger før det kan lade sig gøre. Normalt kan GDI api’en<br />

Side 27 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

loade .bmp filer uden problemer, men når man skal rotere det og lave ’masking’ kræver det lidt<br />

ekstra arbejde.<br />

Måden ’masking’ virker på er ved at danne et monokromt billede ud fra originalen. Dette gøres ved<br />

at oprettet et tomt monokrom bitmap og kopiere originalen (Figur 1) over til det monokrome-bitmap<br />

(Figur 2). Hermed sker der en konversion således at billedet bliver sort / hvid ud fra hvilke farve<br />

man har valgt som masking-farve.<br />

Til sidst er det nu muligt at tegne grafik ud fra masking billedet således at man får alt det<br />

unødvendige grafik skåret væk.<br />

Den anden vigtige ting vi har fået med i billede behandling er rotation. Dette gør det muligt at rotere<br />

et stykke grafik et vist antal grader således at man ikke behøver at have et billede for hver retning.<br />

Dette ses hvor vi skaber banen som kræver at vi vender og drejer hver stump så de passer sammen.<br />

Det sammen med pacman som skal kunne dreje rundt i labyrinten.<br />

Måden det bliver foretaget på er ved at tage oplysninger fra bitmappet og ellers lave en matematisk<br />

udregning på hvert enkelt pixel i billede og så gemme position resultatet i et bitmap. Udregningen<br />

ser således ud:<br />

Side 28 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

5.<br />

Endeligt<br />

Programdesign<br />

Side 29 af 50


5.1. Flowchart<br />

Forklaring af flowcharts findes i punkt 4.1<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Denne flowchart er lavet efter programmet er blevet skrevet færdigt. Funktions og klasse navne er<br />

inkluderet i diagrammet.<br />

I forhold til sidst har vi fået 2 nye figurer. En cirkel er et loop. Loopets kriterium står i cirklen.<br />

En aflang firkant betyder en ny tråd.<br />

Programmet<br />

startes<br />

Oprydning:<br />

9<br />

Gamestate skiftes<br />

til Menu.<br />

Brugeren skal<br />

indtaste navn og<br />

vælge og om<br />

highscores skal<br />

være online<br />

18<br />

Spillet begyndes<br />

Oprydning:<br />

19<br />

Gamestate skiftes<br />

til Game.<br />

Vinduet,<br />

Pacwindow bliver<br />

startet<br />

Gameloop<br />

1<br />

Start spillet<br />

Menuen til vinduet<br />

bliver skabt.<br />

Spillets tråd startes.<br />

kører<br />

Brugeren<br />

skal vælge et<br />

menupunkt<br />

10 11<br />

20<br />

Spillet kører.<br />

17<br />

Banen Loades og<br />

tegnes.<br />

Entiter bliver sat<br />

ind i spillet<br />

21<br />

Oprydning:<br />

22<br />

Spillet er slut<br />

Oprydning:<br />

Gamestate skiftes<br />

til Gameover.<br />

Side 30 af 50<br />

Afslut spillet<br />

Gamehandler bliver<br />

startet.<br />

Spillets Tråd<br />

ukkes ned.<br />

Spillet<br />

startes<br />

forfra<br />

Vinduet bliver<br />

kaldt med et lukke<br />

kald<br />

12<br />

Spillet lukkes ned<br />

Bliver spillet<br />

startet forfra?<br />

Lokal highscore<br />

bliver hentet frem.<br />

Lokalhighscore<br />

gemmes igen.<br />

Highscoren bliver<br />

uploadet hvis det er<br />

valgt.<br />

Timeren startes.<br />

2 3 4<br />

16<br />

23<br />

8<br />

7<br />

15<br />

24<br />

Intro skærmen<br />

startes.<br />

Vent på der sker<br />

noget med<br />

vinduet<br />

6<br />

5<br />

Loop<br />

Vinduet lukkes ned<br />

Deinit kørende<br />

elementer<br />

13<br />

Programmet<br />

afsluttes<br />

14<br />

Flowcharten viser hvordan flowet i programmet hænger sammen. Som det kan ses bliver spil delen<br />

lagt over i sin egen windowstråd. Dette gør det muligt at brugeren altid kan få kontakt til selve<br />

vinduet så han f.eks kan minimere eller lukke det.


5.1.1.1 Vinduet, Pacwindow<br />

bliver startet<br />

(Ref: Sekvensdiagram 1, 5.4.1)<br />

5.1.1.2 Menuen til vinduet<br />

bliver skabt.<br />

(Ref: Klassediagram 1, 5.3.1.1.CPacWindow)<br />

(Ref: IPO , Bilag 1,4.6)<br />

5.1.1.3 Gamehandler bliver<br />

startet<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameHandler)<br />

(Ref: IPO , Bilag 1,5.2)<br />

5.1.1.4 Timeren startes<br />

(Ref: Klassediagram 1, 5.3.1.1.CTimer)<br />

(Ref: IPO , Bilag 1,3.1)<br />

5.1.1.5 Intro skærmen<br />

startes<br />

(Ref: Sekvensdiagram 1, 5.4.3)<br />

5.1.1.6 Vent på der sker<br />

noget med vinduet<br />

(Ref: Klassediagram 1, 5.3.1.1.CPacWindow)<br />

(Ref: IPO , Bilag 1,4.1)<br />

5.1.1.7 Spillets tråd hThread<br />

lukkes ned<br />

(Ref: IPO , Bilag 1,5.3)<br />

(Ref: Klassediagram 1, 5.3.1.3. CGameHandler)<br />

5.1.1.8 Spillets tråd startes<br />

(Ref: IPO , Bilag 1,5.2)<br />

(Ref: Klassediagram 1, 5.3.1.3. CGameHandler)<br />

5.1.1.9 Oprydning intro<br />

(Ref: Sekvensdiagram 1, 5.4.7)<br />

5.1.1.10 Gamestate skiftes til<br />

menu<br />

(Ref: IPO , Bilag 1,5.1)<br />

(Ref: Klassediagram 1, 5.3.1.3. CGameHandler)<br />

5.1.1.11 Brugeren skal vælge<br />

et menupunkt<br />

(Ref: IPO , Bilag 1,17.6)<br />

(Ref: Klassediagram 1, 5.3.1.3. CGameStateIntro)<br />

5.1.1.12 Vinduet bliver kaldt<br />

med et lukke kald<br />

(Ref: IPO , Bilag 1,4.1)<br />

(Ref: Klassediagram 1, 5.3.1.1. CPacWindow)<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 31 af 50<br />

5.1.1.13 Deinit kørende<br />

elementer<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameHandler)<br />

(Ref: IPO , Bilag 1,5.3)<br />

5.1.1.14 Programmet afsluttes<br />

(Ref: Sekvensdiagram 1, 5.4.22)<br />

5.1.1.15 Bliver spillet startet<br />

forfra?<br />

(Ref: Klassediagram 1, 5.3.1.3.CGameHighscore)<br />

(Ref: IPO , Bilag 1,16.5)<br />

5.1.1.16 Oprydning game<br />

(Ref: Sekvensdiagram 1, 5.4.14)<br />

5.1.1.17 Spillet kører<br />

(Ref: Klassediagram 1, 5.3.1.3. CGameStateGame)<br />

(Ref: IPO , Bilag 1,15.2)<br />

5.1.1.18 Brugeren skal<br />

indtaste navn og<br />

vælge og om<br />

highscores skal være<br />

online<br />

(Ref: Sekvensdiagram 1, 5.4.6)<br />

5.1.1.19 Oprydning menu<br />

(Ref: Sekvensdiagram 1, 5.4.8)<br />

5.1.1.20 Gamestate skiftes til<br />

game<br />

(Ref: IPO , Bilag 1,5.1)<br />

(Ref: Klassediagram 1, 5.3.1.3. CGameHandler)<br />

5.1.1.21 Banen loades og<br />

tegnes<br />

(Ref: Sekvensdiagram 1, 5.4.10)<br />

5.1.1.22 Oprydning highscore<br />

(Ref: Sekvensdiagram 1, 5.4.20)<br />

5.1.1.23 Gamestate skiftes til<br />

gameover<br />

(Ref: IPO , Bilag 1,5.1)<br />

(Ref: Klassediagram 1, 5.3.1.3. CGameHandler)<br />

5.1.1.24 Lokal highscore<br />

bliver hentet frem...<br />

(Ref: IPO , Bilag 1,16.6)<br />

(Ref: Klassediagram 1, 5.3.1.3. CGameStateHighscore)


Diagrammet viser hvordan spøgelserne virker.<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Diagrammet viser, med tekst, hvordan spøgelserne kommer i gennem deres programflow. Der er<br />

ikke skrevet hvilke funktioner der bliver kaldt, men derimod hvilke kriterier der bestemmer hvilken<br />

del af spøgelsernes funktionalitet der skal aktiveres.<br />

5.1.2.1 Ghost init<br />

(Ref: Sekvensdiagram 1, 5.4.11)<br />

(Ref: IPO , Bilag 1,6.3)<br />

(Ref: Klassediagram 1, 5.3.1.2. CGameEntity)<br />

5.1.2.2 Tegn grafik<br />

(Ref: IPO , Bilag 1,7.2)<br />

(Ref: Klassediagram 1, 5.3.1.2. GGhost)<br />

5.1.2.3 Spillet starter<br />

(Ref: IPO , Bilag 1,15.9)<br />

(Ref: Klassediagram 1, 5.3.1.3. CGameStateGame)<br />

5.1.2.4 Spillet slutter<br />

(Ref: IPO , Bilag 1,15.7)<br />

(Ref: Klassediagram 1, 5.3.1.3. CGameStateGame)<br />

5.1.2.5 Bevæg væk fra<br />

pacman<br />

(Ref: IPO , Bilag 1,7.15)<br />

(Ref: Klassediagram 1, 5.3.1.2. GGhost)<br />

Side 32 af 50<br />

5.1.2.6 Start forfra i huset<br />

(Ref: IPO , Bilag 1,7.4)<br />

(Ref: Klassediagram 1, 5.3.1.2. GGhost)<br />

5.1.2.7 Jeg er død. Ryk mod<br />

huset<br />

(Ref: IPO , Bilag 1,7.14)<br />

(Ref: Klassediagram 1, 5.3.1.2. GGhost)<br />

5.1.2.8 Udregn hvilken vej<br />

jeg skal gå<br />

(Ref: IPO , Bilag 1,7.1)<br />

(Ref: Klassediagram 1, 5.3.1.2. GGhost)<br />

5.1.2.9 Gå til ’mit’ område<br />

(Ref: IPO , Bilag 1,7.1)<br />

(Ref: Klassediagram 1, 5.3.1.2. GGhost)<br />

5.1.2.10 Ghost deinit<br />

(Ref: Sekvensdiagram 1, 5.4.12)<br />

(Ref: IPO , Bilag 1,6.4)<br />

(Ref: Klassediagram 1, 5.3.1.2. CGameEntity)


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

5.2. Database<br />

Vi har en enkelt database som kører på en mysql server. Databasen indeholder en tabel. Vi gemmer<br />

kun vores highscores til hjemmesiden på mysql.<br />

Highscores<br />

Navn Type<br />

Navn<br />

Highscore<br />

Dato<br />

Varchar(50)<br />

Int<br />

Datetime<br />

Side 33 af 50


5.3. Klassediagram<br />

Forklaring af alle elementer i klasse diagrammet.<br />

5.3.1. <strong>Pacman</strong> spillet<br />

5.3.1.1. Utilities / Tools<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Nedenstående billede under viser selve klassediagrammet over vores utilities og værktøjer. Dette<br />

består af klasser som hjælper til med at opbygge programmet. Hvis man kigger i første boks som<br />

består af Utilites som CLog, CInternet og CTimer, så bliver disse brugt rundt omkring i programmet<br />

og virker som tilbehør til andre klasser. Forstået således at hvis en anden klasse har brug for at<br />

udskrive en fejllog så bruger den CLog eller hvis en skal tilgå nettet så er det CInternet.<br />

Vi har også en samling af Struct / Enum som kort sagt består af en samling værdier. Dette gør det<br />

mere læseligt og mere kompakt at have flere variabler pakket end i en struct. Dette giver fordele når<br />

man kaster rundt med værdier i parameter at man kan nøjes med 1 navn og ikke hvert element inde i<br />

pakken..<br />

Den sidste kasse består af CPicture, CGameMap og CPacWindow. Disse klasser er vigtige<br />

redskaber for at få programmet op og kører. Selve CGameMap håndtere alt der med banen at gøre.<br />

CPicture håndterer billederne og CPacWindow behandler alt der har med selv vinduet at gøre..<br />

Side 34 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

5.3.1.2. Entiteter<br />

Selve klassediagrammet over vores entiteter. Vores entititer i spillet består af de levende objekter<br />

som kræver noget grafik og logisk behandling. Måden selve strukturen virker på er at alle objekter<br />

nedarver fra ’Interfacet’ CGameEntity således at alle underklasser er tvunget til at have metoden<br />

Draw() og Handle(). Så kort sagt er et interface blevet bestemt som alle skal overholde.<br />

Den næste klasse i arkivet er ’CGameObject’ som håndterer standard egenskaberne i et spil objekt.<br />

Dette er ting som kollision check op mod banen og bevægelse af objektet. Denne klasse er<br />

’Abstrakt’ da den indeholder en del kode og attributter i forhold til interfacet. Selve klassen kan<br />

man dog ikke oprette en instance af da den er abstrakt og kræver at et andet objekt har nedarvet og<br />

overskrevet nogle af dens metoder.<br />

Dette kan vi se på klassediagramet hvor en masse klasse objekter nedarver og overloader med deres<br />

egne metoder. Dette er ting som <strong>Pacman</strong>, Frugt, Powerup, Teleport og spøgelserne. Det smarte ved<br />

hele denne struktur er at man ved overordnet at alle klasser har Draw() og Handle() metoderne da<br />

interfacet tvinger dem ind. Dette kan man udnytte i koden og bruge når man skal tegne og opdaterer<br />

alle objekter på en gang. Så behøver man ikke spekulerer på hvilke type objekt det er, da de alle har<br />

egenskaberne fra CGameEntity.<br />

Side 35 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 36 af 50


5.3.1.3. Gamestate<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Klassediagrammet for tilstanden i spillet. Selve spillet kan være i 4 tilstande og det er Intro, Menu,<br />

Spillet eller i highscore. Til dette har vi en klasse til at behandle hver tilstand. Disse klasser har til<br />

ansvar at skabe de nødvendige resurser til kørsel af scenen og ellers kalde de funktioner som er<br />

nødvendige.<br />

Overordnet kørsel bliver styret af ’CGameHandler’ som opretter klassen for den nuværende tilstand<br />

og ellers holder styr på tilstanden og giver dem de informationer som de har behov for.<br />

5.3.2. Hjemmeside<br />

Klassediagrammet over vores hjemmeside. Hjemmesidens klasser er inddelt i 3 felter hvor det ene<br />

er templates, siderne og værktøjerne. Selve værktøjerne er globale og statiske metoder som vi kan<br />

bruge løbende til hjælp. Dette er ting som forbindelse til databasen og udskrivning til logfilen.<br />

Selve ’CPage’ klassen virker som et interface, som bestemmer hvilke metoder som underklasserne<br />

skal have. Dem som nedarver er dermed tvunget til at oprette GetContext(), GetJavaScript() og<br />

GetTile(). Selve disse metoder bliver brugt til at skabe en Xhtml side. Da hjemmesiden består af 4<br />

punkter (Forside, Download, Info og Top10) er der en klasse til hver side.<br />

Det sidste felt er klasser over templates. Overordnet er der en abstrakt klasse ’CTpl’ som giver et<br />

par standard metoder og attributter som layout. Underklasserne kan dermed bruge Load() metoden<br />

Side 37 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

som de har nedarvet og nemt loade deres tilhørende template fil. Selve hver underklasse har til<br />

ansvar at styre hver deres template (xhtml) fil og tilpasse indholdet ved deres GetContent() metode.<br />

Side 38 af 50


5.4. Sekvensdiagram<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Vores sekvensdiagram, som findes på næste side, giver en oversigt over levetiden af objekterne og<br />

rækkefølgen de bliver oprettet i.<br />

I diagrammet kan man se at første punkt er brugeren som starter programmet. Hermed bliver<br />

klassen CPacWindow aktiveret som styrer vinduet. Lige efter bliver klassen CGameHandler<br />

aktiveret og denne sørger for noget grafik inde i vinduet. Det første grafik som fremkommer er<br />

introen. Dermed er det ’CStateIntro’ som kører, og samtidig har CGameHandler også sat noget<br />

musik på via FMod klassen.<br />

Når introen afslutter så hopper den tilbage til CGameHandler som herefter sætter næste tilstand i<br />

gang som er ’CStateMenu’. Selve musikken bliver ved med at afspille. Når menuen afsluttes, så<br />

bliver der sat gang i et par ting. Selve musikken stopper og ’CStateGame’ bliver aktiveret som også<br />

starter ’CEntities’ og ’CMap’. Disse ting vil køre synkroniseret med hinanden indtil spillet afslutter<br />

og når dette sker, vil ’CStateHighscore’ overtage. Ved ’CStateHighscore’ vil ny musik blive<br />

afspillet og under kørsel af ’cStateHighscore’ vil klassen ’CInternet’ blive brugt som sender scoren<br />

til hjemmesiden. Når CInternet er afsluttet, så for ’CGameHandler’ besked og den kan beslutte sig<br />

for at lukke grafikken og vinduet ned, således at programmet lukker.<br />

Side 39 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 40 af 50


5.4.1 Starter App<br />

(Ref: IPO , Bilag 1,4.3)<br />

(Ref: Klassediagram 1, 5.3.1.1 CPacWindow)<br />

5.4.2 Starter grafik<br />

(Ref: IPO , Bilag 1,5.2)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameHandler)<br />

5.4.3 Starter intro<br />

(Ref: IPO , Bilag 1,17.2)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateIntro)<br />

5.4.4 Afspiller intro musik<br />

(Ref: IPO , Bilag 1,5.1)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameHandler)<br />

5.4.5 Stopper intro musik<br />

(Ref: IPO , Bilag 1,5.1)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameHandler)<br />

5.4.6 Starter menu<br />

(Ref: IPO , Bilag 1,18.2)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateMenu)<br />

5.4.7 Afslutter intro<br />

(Ref: IPO , Bilag 1,17.3)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateIntro)<br />

5.4.8 Afslutter menu<br />

(Ref: IPO , Bilag 1,18.3)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateMenu)<br />

5.4.9 Starter spillet<br />

(Ref: IPO , Bilag 1,15.2)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateGame)<br />

5.4.10 Skaber banen<br />

(Ref: IPO , Bilag 1,13.1)<br />

(Ref: Klassediagram 1, 5.3.1.1 CGameMap)<br />

5.4.11 Skaber entities<br />

(Ref: IPO , Bilag 1,15.9)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateGame)<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 41 af 50<br />

5.4.12 Fjerner entities<br />

(Ref: IPO , Bilag 1,15.14)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateGame)<br />

5.4.13 Fjerner banen<br />

(Ref: IPO , Bilag 1,13.2)<br />

(Ref: Klassediagram 1, 5.3.1.1 CGameMap)<br />

5.4.14 Afslutter spillet<br />

(Ref: IPO , Bilag 1,15.3)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateGame)<br />

5.4.15 Viser highscore<br />

(Ref: IPO , Bilag 1,16.2)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateHighscore)<br />

5.4.16 Play highscore<br />

musik<br />

(Ref: IPO , Bilag 1,16.2)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateHighscore)<br />

5.4.17 Opretter forbindelse<br />

til online highscore<br />

(Ref: IPO , Bilag 1,1.3)<br />

(Ref: Klassediagram 1, 5.3.1.1 CInternet)<br />

5.4.18 Afslutter forbindelse<br />

(Ref: IPO , Bilag 1,1.2)<br />

(Ref: Klassediagram 1, 5.3.1.1 CInternet)<br />

5.4.19 Stop highscore<br />

musik<br />

(Ref: IPO , Bilag 1,16.3)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateHighscore)<br />

5.4.20 Afslutter highscore<br />

(Ref: IPO , Bilag 1,16.3)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameStateHighscore)<br />

5.4.21 Grafik lukker<br />

(Ref: IPO , Bilag 1,5.3)<br />

(Ref: Klassediagram 1, 5.3.1.3 CGameHandler)<br />

5.4.22 Vinduet lukker<br />

(Ref: IPO , Bilag 1,4.4<br />

(Ref: Klassediagram 1, 5.3.1.1 CPacWindow)<br />

5.5. IPO<br />

IPO står for Input Procedure Output. Vi har lavet et komplet diagram af alle vores klasser og dets<br />

funktioner. Det er sat op i tabeller som set under denne tekst.<br />

Overordnet viser hver tabel en klasse og alle dets funktioner.


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Som man kan se viser det funktionens navn, dets input og output. Nedenunder står en kort<br />

forklaring af funktionen.<br />

Klassens navn<br />

Funktionens navn Input type Output type<br />

Kort forklaring af funktionen.<br />

Alle klasser og funktioner er beskrevet i Bilag 1 – IPO diagram.<br />

CInternet<br />

Procedure Input Output<br />

InitInternet() void bool<br />

Bruges til at klargøre net klassen og sætte forbindelse typen. Returnere sand/falsk om det gik godt<br />

DeInitInternet() void bool<br />

Fjerner alle de resurser som er loadet ind til brug af net-klasen<br />

Connect() char *Url, char* Web_File, int iPort bool<br />

Opretter forbindelse til domainet ’Url’ og åbner filen ’Web_File’ på porten ’iPort’<br />

Eksempel:<br />

Klassen Cinternet indeholder følgende funktioner: InitInternet(), DeInitInternet() og Connect().<br />

InitInternet() kræver intet input og har en bool som output.<br />

Funktion bruges til at klargøre klassen og output bool fortæller om det gik godt eller skidt.<br />

InitInternet() kræver intet input og har en bool som output.<br />

Funktion bruges til at rydde op i klassen. Den fjerner alle resurser der er taget i brug og output bool<br />

fortæller om det gik godt eller skidt.<br />

Connect() kræver 3 input parametre og har en bool som output. Den skal have en char pointer til<br />

”URL”, en char pointer til ”Web_file” og en port som int.<br />

Funktionen strikker de tre inputs sammen til en streng og prøver at forbinde til den<br />

sammenstrikkede url. Den returnere en bool om det gik godt eller skidt.<br />

Alle klasser og funktioner er beskrevet i Bilag 1 – IPO diagram.<br />

Side 42 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

5.6. Client / Server / sikkerhed<br />

Kommunikationen mellem klienten og serveren forgår via http. Selve klienten laver et request til<br />

serveren hvor data’en ankommer med metoden ’GET’. Dette vil i vores eksempel være noget<br />

lignende dette:<br />

UploadHighscore.php?Score=MTAw&Checksum=MjEw&Navn=VE9NTVk=<br />

Ikke muligt at læse i ONLINE-versionen, da top10 highscoren skal være retfærdigt! sorry...<br />

Side 43 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

5.7. Guldkorn<br />

Vi har valgt nogle kodestumper ud som vi mener, er ”Guldkorn”. Disse kodestumper har vi brugt til<br />

at løse nogle specielle problemer eller tilføre en bestemt funktionalitet til vores kode.<br />

5.7.1. Exception handling:<br />

Exception handling bruges de steder hvor<br />

man har mistanke om at programmet kan<br />

gå ned.<br />

Ved disse steder kan man bruge<br />

exception handling således at hvis<br />

programmeret gør noget ulovligt så<br />

bliver det spolet tilbage til hvor<br />

programmet virkede.<br />

Et eksempel er når vi håndtere Internettklassen<br />

og dens udfald kan svinge. Der er<br />

meget kode som bliver kørt igennem for<br />

at kontakte en server. Herefter er det<br />

også muligt at ændre i vores konfig fil<br />

hvilke server som skal kontaktes.<br />

5.7.2. Funktion overloading:<br />

Funktion overloading bruges de steder<br />

hvor programmøren kan have behov for<br />

at kalde en metode forskelligt.<br />

Forstået således at en metode() kan<br />

modtage flere og forskellige parameter<br />

ved samme metode navn.<br />

Et godt eksempel er når vi loader<br />

billeder, så kan man kalde den ved flere<br />

metoder. Hvor stien er angivet og hvor<br />

både stien og rotationen er angivet.<br />

Dermed kan man selv bestemme om<br />

billedet skal rotere eller beholde den<br />

oprindelige indstilling.<br />

Side 44 af 50


5.7.3. Multithread:<br />

Multithread bruges hvor man gerne vil<br />

dele programkørsels i flere bider. Således<br />

at flere stykker kode kan køre<br />

usynkroniseret.<br />

Dette ses tit i IO-behandling hvor man<br />

ikke vil have at bestemt kode skal bremse<br />

selve hovedprogrammet.<br />

I vores projekt har vi brugt det til at<br />

adskille spillet og vinduet. Således at<br />

spillet kan fortsætte med at køre selvom<br />

man bruger vinduet’s muligheder som<br />

menuen og højre-klip popup.<br />

5.7.4. Operator overloading:<br />

Operator overloading bruges til at<br />

overloade en operator til at kunne flere<br />

ting. En operator består af standard tegn<br />

med hver deres betydning som: + - * / ^ |<br />

|| & && < > += ^= osv...<br />

Denne type teknologi bruges allerede i<br />

std::string hvor det er muligt at bruge<br />

operatoren += til at tilføje tekst, eller + 2<br />

strings sammen.<br />

I vores kode har vi brugt det i CLog til at<br />

vise hvordan det kan gøres. I selve vores<br />

CLog klasse har vi overloaded<br />

operatoren xor ^, således at den udskriver<br />

tekst til log filen.<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 45 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

5.7.5. OOP (Objekt orienteret programmering)<br />

(Indkapsling, Nedarving og Polymorf)<br />

OOP programmering er når man<br />

udvikler i objekter som bruger<br />

indkapsling, nedarving og polymorf.<br />

I vores tilfælde bruger vi meget<br />

indkapsling og dette kan ses ved keyordene<br />

’public’, ’protected’ og ’private’.<br />

Her bestemmer vi hvem som må tilgå<br />

hvad i klassen.<br />

Nedarving bruger vi når objekter har<br />

samme egenskaber og dette kan ses i<br />

vores abstrakte spøgelse-klasse hvor de<br />

4 spøgelser nedarver fra.<br />

Polymorf bruger vi til alt som har<br />

nedarvet fra CEntity klassen. CEntity<br />

klassen er hvad som man kalder en<br />

interface og er abstrakt. Dette betyder at<br />

man ikke kan oprette en instance af den,<br />

men derimod kun kan nedarve fra den.<br />

Det vi så gør med alle dem som nedarver<br />

fra den er at overloade dens pure-virtual<br />

metoder således at det bliver de nedarves<br />

klasser metoder som bruges (Polymorf).<br />

Side 46 af 50


5.7.6. Bane loading<br />

Selve vores <strong>Pacman</strong> bane er gemt i en<br />

tekst fil hvor banen er opbygget i<br />

ascii. Dette giver mange fordele son<br />

nem redigering og nem opbevaring<br />

(database, tekstfil, xml osv...)(Figur 1)<br />

Da den rå data ikke indeholder hvilke<br />

grafik som skal bruges til murene, så<br />

har vi lavet en metode som løber alle<br />

’x’erne igennem og finder hvor<br />

mange naboer de har. Herefter<br />

analysere den hvor naboerne er<br />

placeret og giver dem et uniq ID<br />

nummer som fortæller hvilke billeder<br />

som skal bruges.<br />

(Figur 2)<br />

Det smarte ved dette er at vi nemt kan<br />

redigere banen uden at spekulere om<br />

hvilke retning muren skal vende, da<br />

dette bliver skabt inde i spillet.<br />

Resultat kan ses i (Figur 3) hvor alt<br />

grafikken er loadet ind og bliver vist<br />

med .bmp billeder. Her kan man se<br />

hvordan hvert ascii karakter er blevet<br />

erstattet med et billede med størrelse<br />

24*24.<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Side 47 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

6.<br />

Konklusion<br />

Side 48 af 50


6.1. Konklusion<br />

<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

Hvis man skal kigge på hele projektet og dets omfang er vi begge meget tilfredse med hele forløbet.<br />

At skabe et Objekt Orienteret pacman spil, har været en interessant udfordring synes vi begge to. Vi<br />

gik til stålet fra start og var egentlig aldrig under tidspres. Vi har haft sjove timer med at<br />

programmere og teste spillet. Vi er begge meget enige om at det har været lettere at holde<br />

koncentrationen når man programmerer spil end når man laver en hjemmeside.<br />

Vi synes begge to at projektet var en succes. Der var en del nødder der skulle knækkes, men de blev<br />

knækket.<br />

<strong>Tommy</strong>’s erfaring er helt sikkert et af nøgleelementer i vores succes, uden <strong>Tommy</strong> var spillet slet<br />

ikke blevet det det er i dag. <strong>Tommy</strong> har en del erfaring med at programmere spil i forvejen og de<br />

ting han ved om spilprogrammering har gjort os i stand til at forbedre spillet på mange måder.<br />

Vi synes vi har nået de mål vi satte da vi fandt ud af projektets omfang. Vi havde mange flere idéer<br />

vi kunne implementere i spillet, men desværre havde vi ikke tid nok til at kunne realisere alle de<br />

ting vi ville. Vi blev nødt til at vælge. Vi valgte at lave det originale pacman uden modifikationer.<br />

Vi havde ellers en del på tegnebrættet. Det kan være de bliver implementeret hvis vi tager projektet<br />

op som et fritidsprojekt.<br />

Spillets fremtid er på ingen måder fastsat på nuværende tidspunkt. Spillet lever videre så længe folk<br />

har lyst til at prøve kræfter med det. Om de spiller det for at slå highscoren på hjemmesiden eller<br />

bare for at slappe lidt af en gang i mellem, betyder ikke noget. Bare folk kan lide det spil vi har<br />

skabt og nyder at spille det, så føler vi at vi har gjort hvad vi kunne for at give vores <strong>Pacman</strong> en<br />

fremtid i denne verden.<br />

For at runde konklusionen af skal det siges at vi er begge to meget tilfredse med vores produkt og<br />

de 4 uger projektet har varet, har været 4 gode uger.<br />

6.2. Problemer<br />

6.2.1. Grafik<br />

Da ingen af os er mestre i at lave grafik var vi lidt urolige for hvordan spillet skulle ende med at se<br />

ud, men vi synes at vi er sluppet godt fra det med at låne lidt hist og pist. En del af vores problemer<br />

blev løst ved hjælp af vores rotations kode. Det gjorde at vi ikke behøvede at vende og dreje alle<br />

billeder inden de kunne bruges i spillet.<br />

6.2.2. Gameplay<br />

Vi var lidt urolige for at vi ikke kunne skabe den originale stemning og gameplay i vores <strong>Pacman</strong><br />

spil. Vi synes dog selv at det er lykkedes ret godt, og mange af dem vi har bedt teste spillet har ment<br />

Side 49 af 50


<strong>Rapport</strong> – Objekt Orienteret <strong>Pacman</strong> spil<br />

det samme. Vores plan med at uploade highscores har haft en meget positiv indflydelse på levetiden<br />

af spillet da der er konkurrence med i spillet via highscore listen.<br />

Spillet kører rigtig godt og spøgelserne opfører sig som de skal. Selv synes vi at spillet har et godt<br />

gameplay, dog er det lidt ensformigt. Det er ikke noget man sidder og spiller i flere timer, men<br />

derimod et spil man kan tage frem og hygge sig med hvis man lige har 10min.<br />

6.2.3. Bugs<br />

Vi har fået testet spillet af en del mennesker er der blevet mange fundet en del bugs.<br />

Vi har rettet alle de bugs vi kunne nå at rette inden vi kom for langt med dokumentationen. Der er<br />

dog stadig et par bugs tilbage i spillet, og sikkert mange der ikke er fundet. Vi har ikke haft tid til at<br />

rette de sidste bugs i den version der er i projektet da vi var kommet for langt med vores<br />

dokumentation, men ingen af dem er kritiske.<br />

6.3. Litteraturliste<br />

www.google.com<br />

www.microsoft.com<br />

MSDN<br />

6.4. Bilag<br />

• Bilag 1 – IPO diagram<br />

• Bilag 2 - Tidsplan<br />

• Bilag 3 - Installations vejledning<br />

• Bilag 4 – Logbog<br />

• Bilag 5 - Test rapport<br />

• Bilag 6 - Kildekode Website<br />

• Bilag 7 - Kildekode <strong>Pacman</strong><br />

• Bilag 8 – Brugermanual<br />

• Bilag 9 – Kravspecifikation<br />

• Bilag 10 – Skærmbilleder<br />

• Bilag 11 – Milepæl<br />

• Bilag 12 – Use-Case Beskrivelser<br />

Side 50 af 50

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

Saved successfully!

Ooh no, something went wrong!