Rapport Objektorienteret Pacman - Portfolio - Tommy Andersen
Rapport Objektorienteret Pacman - Portfolio - Tommy Andersen
Rapport Objektorienteret Pacman - Portfolio - Tommy Andersen
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