Math Snake. Afsluttende projekt. Andreas Kær Eriksen, Niclas Larsen og Jens Werner Nielsen. Klasse 3.4. 11. maj 2012. Informationsteknologi B



Relaterede dokumenter
Klasse 1.4 Michael Jokil

Børn, unge og sundhed

MS Visual Studio Basic En kort vejledning

Mircobit Kursus Lektion 3 (Du skal her vælge Lets Code Og nederst Microsoft Block Editor.)

Fang Prikkerne. Introduktion. Scratch

Spil Master Mind. Indledning.

Kapitel 4 Løkker i C#

Visualiseringsprogram

Computer spil Kom it Roskilde teknisk gymnasium. Rasmus Kibsgaard Riehn-Kristensen, Michael Jokil og Christine Johnsen

Andreas Lauge V. Hansen klasse 3.3t Roskilde HTX

Programmering C Eksamensprojekt. Lavet af Suayb Köse & Nikolaj Egholk Jakobsen

Læringsprogram. Christian Hjortshøj, Bjarke Sørensen og Asger Hansen Vejleder: Karl G Bjarnason Fag: Programmering Klasse 3.4

IT opgave. Informationsteknologi B. Vejleder: Karl. Navn: Devran Kücükyildiz. Klasse: 2,4

Introduction til.net remoting i VB.NET

Kapitel 3 Betinget logik i C#

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.

Kom godt i gang med Fable-robotten

5/11/2015. Programmering. Hussein Al-Saidi ROSKILDE TEKNINSK GYMNASIE VEJLEDER: CHRISTOFFER S.

Fable Kom godt i gang

Fable Kom godt i gang

Specialiseringen Rapport Lavede Af Rasmus R. Sørensen Side 1 af 6

Spil Rapport. Spil lavet i GameMaker. Kevin, Mads og Thor

JSP, Tomcat. Tutorial lavet af Jákup W. Hansen TSU semester 10.october 2007

Viditronic NDVR Quick Guide. Ver. 2.0

Introduktion til CD ere og Arkivdeling Gammel Dok - September-oktober Jonas Christiansen Voss

AgroSoft A/S AgroSync

Guide til din computer

Indholdsfortegnelse. Roskilde Tekniske Gymnasium Pernille K. Klavsen Klasse 1.2

Hent filoplysninger fra billeder og filer

HTX, RTG. Rumlige Figurer. Matematik og programmering

NVR Client system. Bruger Manual. SuperVision Alarmteknik ApS Cedervej 2, 8462 Harlev J

Brugermanual 3D Webcam

Test af It-komponent

Visual Basic for begyndere

Større skriftlige opgaver i Microsoft Word 2007 Indhold

I gang med dit Gamer: bit Arkade Kit Denne guide er oversat og en smule forenklet fra Sparkfuns Hook-Up guide

Derfor vil jeg bygge dette eksempel på een table hvor der kan tilkyttes personer til ALLE noder og der kan tilføjes et vilkårligt antal niveauer

Adgang til WebGraf. 1. Start Microsoft Internet Explorer. 2. Skriv:

"# $%$ " # $ % $ $ " & ( ) *+!,! Sum_Cost >= 5000SirName = Beltov Continue = %!- + ( ( - True) Continue *! If Antal <= 20 Then EnhedsOmk = 1.

Computerspil dokumentation. Dokumentation af spillet Rescue Me

Computerspil. Hangman. Stefan Harding, Thomas Bork, Bertram Olsen, Nicklas Thyssen og Ulrik Larsen Roskilde Tekniske Gymnasium.

Andreas Møinichen og Aske Märcher

Spil og svar. Journal nr Et webbaseret værktøj udviklet af Programdatateket i Skive

vil jeg blive mindet om det af VBA allerede mens jeg skriver koden, da der er tale om en såkaldt kompileringsfejl:

Trådløs sikkerhed Windows XP

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Overvågningskamera. ~Af Svend, Valdemar og Frederik~

Computerens - Anatomi

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse Styring af layout.. 5. Zoom funktioner..

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Informationsteknologi

ViKoSys. Virksomheds Kontakt System

Opret en Powerpoint præsentation automatisk med VBA

Betjeningsvejledning. for. UniRace

Denne artikel er en detaljeret gennemgag af det fundamentale i batchfiler til hjemmebrug :-) FEEL THE POWER! ;-)

Introduktion til ActionScript

Michael Jokil

Guide til Umbraco CMS

EDUCATE.AU.DK/BLACKBOARD

Mircobit Kursus Lektion 4 (Du skal her vælge Lets Code Og herefter Block Editor.)

DRFLive - dynamisk visning af resultater fra DRF Stævnesystem

Greenfoot En kort introduktion til Programmering og Objekt-Orientering

Foscam FI9853P og FI9851P med Fibaro Home Center

Dual boot. af Windows 7 og Linux Mint. Af Thomas Bødtcher-Hansen

Dokumentation af programmering i Python 2.75

TEKNISK VEJLEDNING SPILLET FREMTIDENS LANDBRUG

Computerspil - Kappa

FC-intranet: FC-intranet er et fælles mail- og konferencesystem, hvor lærere og elever kan kommunikere.

Kapitel 6 Events i C#

Pædagogisk vejledning til. Materialesæt. Sphero.

DMX styring med USB-interface

SIDEN PÅ WORDPRESS.COM

Ide med Diff. Mål. Tidsplan. 1.uge: 2.uge:

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste

Ghostbusters. Introduktion. Scratch. Du skal lave et fangelegsspil med spøgelser! Arbejdsliste. Test dit Projekt. Gem dit Projekt

Tag smarte skærmskud

EVALUERING I SURVEYXACT TRIN FOR TRIN

4.0 SharePoint redigering De lokale hjemmesider er bygget i et Microsoft program kaldet SharePoint2010.

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13

Vejledning til. LearnSpace

Verniers spektrofotometer SPRT-VIS USB 650

Microsoft PowerPoint 2010

EVALUERING I SURVEYXACT TRIN FOR TRIN

Brugervejledning til Tildeling.dk brugere Tilbudsgiver

Vistemmernu. Et webbaseret værktøj udviklet af Programdatateket i Skive. programdatateket@viauc.dk Web:

Brugervejledning til Tildeling.dk Superbrugere Tilbudsgiver

DiSEqC-Positioner. Best. nr. HN4892 (Brugsanvisnings nr. 361)

Programmering. Det rent og skært nødvendige, det elementært nødvendige! Morten Dam Jørgensen

Skab Din Egen Verden

Afsluttende - Projekt

6. Eventstyret programmering og Windows

Easy Guide i GallupPC

SÅDAN BRUGER DU REGNEARK INTRODUKTION

Opsætning af Backup. Dette er en guide til opsætning af backup med Octopus File Synchronizer.

Bekrig Klonerne. Introduktion. Scratch. I dette projekt skal du lære, hvordan du laver et spil, hvor du skal redde Jorden fra monstre i rummet.

2017 Recordit.nu version 2. Call Recorder Kvikguide for Apresa Client

Transkript:

Math Snake Afsluttende projekt Andreas Kær Eriksen, Niclas Larsen og Jens Werner Nielsen Klasse 3.4 11. maj 2012 Fag: Vejleder: Skole: Informationsteknologi B Karl G. Bjarnason Roskilde Tekniske Gymnasium, HTX

Indholdsfortegnelse Indholdsfortegnelse... 1 1. Indledning... 2 2. Problemformulering... 2 3. Målgruppe... 2 4. Krav... 3 5. Løsnings forslag... 4 6. Valg af løsning... 4 7. Valg af programmeringssprog... 5 8. Produkt... 6 9. Kanylemodel... 6 10. Testspecifikationer... 7 11. Teori... 8 11.1. Designeren... 8 11.2. Koden... 9 12. Design af brugerfladen... 12 13. Implementering... 16 13.1. Vært... 16 13.2. Klient... 21 13.3. Fælles for både vært og klient... 22 14. Test... 24 15. Evaluering... 25 16. Konklusion... 25 Fuld kildekode... 26 1

1. Indledning Vi er tre drenge fra klasse 3.4 fra Roskilde Tekniske Gymnasium der alle går på Matematik/IT/Programmering linjen. I dette projekt vil vi lave et produkt der både appellere til det yngre publikum ved hjælp af et simpelt og nemt at forstå gameplay, men også til ældre publikum ved hjælp af at kunne forøge sværhedsgrad. I projektet har vi set på måder at lave et spil der både kan være lærerigt og en god træning for deltagere. 2. Problemformulering Vi vil gøre matematik sjovt og socialt for at det har en bedre interesse for børn og unge. Måden det kan gøres på er ved spil eller andet som er interaktivt. En måde at gøre det socialt på er ved hjælp af multiplayer. Da det både giver en mulighed for at have det sjovt med andre og gøre det til en konkurrence. Hvis det skal være en konkurrence skal det gerne være et spil og mulighed for at se scores for hver enkelt spiller. Der skal gerne være flere sværhedsgrader for at spillet eller andet interaktivt program kan interessere flere aldersgrupper og færdighedsniveau. 3. Målgruppe Vores målgruppe er børn og unge der vil repetere eller øve hovedregning, det er vigtigt for os at appellere til både børn og unge, ved hjælp af at gøre spillet sjovt og udfordrende. For det unge publikum Et simpelt gameplay samt en nem sværhedsgrad, et point system for at se på udviklingen og et combo system. For det ældre publikum Sværere sværhedsgrader samt en multiplayer funktion for at gøre det sjovt og udfordrende at spille med venner, et point system og combo system. 2

4. Krav Ud fra vores målgruppe kan vi stille en række krav til vores projekt: Simpelt Nemt at bruge Lærerigt Flere sværhedsgrader Multiplayer Point system Simpelt Fordi at alle skal kunne være med, derfor er et simpelt gameplay vigtigt. Nemt at bruge Det skal være nemt at komme i gang og styrer, igen for at alle skal kunne være med. Lærerigt Spillet skal kunne lære den der spiller noget, for eksempel hovedregning eller repetition af matematik. Flere sværhedsgrader Det skal have flere sværhedsgrader for at kunne udfordre flere målgrupper, både børn og unge. Multiplayer Multiplayer er til for at gøre spillet mere interessant for unge, da de så kan spille med venner og endda lave en lille konkurrence ud af det. Point system Der skal være et point system for at kunne give spilere en måde at sammenligne hinanden, og derved konkurrere med hinanden. 3

5. Løsnings forslag Vi har tænkt over en række løsningsforslag: 1. Et Snake lignende spil hvor spilleren er en slange der skal svare rigtigt på et givende matematik spørgsmål, man kan så opbygge points ved at svare rigtigt, dette kan også spilles i multiplayer. 2. Et simpelt spil hvor et matematik spørgsmål er givet og man skal så skrive det rigtige svar i en boks i spillet. 3. Et spil hvor man spiller en figur der skal klare sig igennem en bane ved at svare på matematik spørgsmål, man kan så opbygge point ved at svare rigtigt og til sidst gennemfører banen. 6. Valg af løsning Vi har givet de forskellige løsnings forslag point mellem 0 og 5 ud fra forskellige synspunkter: Løsning 1 (Snake) Løsning 2 (Box) Løsning 3 (Bane spil) Simpelt 4 5 3 Nemt at bruge 4 5 4 Lærerigt 4 4 4 Flere sværhedsgrader 5 5 5 Multiplayer 5 0 2 Point system 4 4 3 Total: 26 23 20 Vi valgte at bruge løsning 1 da vi mener den har størst mulighed for at opfylde vores givne krav, da det har en logisk måde at gøre til multiplayer, og har stor mulighed for at appellere til konkurrence mennesket i os alle. 4

7. Valg af programmeringssprog Vi har valgt at anvende Visual Basic af 3 simple årsager. 1. Nemt 2. Pålideligt 3. Gratis Vi alle har erfaring i at anvende det og er alle godt tilfredse med det. I vores valg overvejede vi også at bruge Lazarus som vi har arbejdet med i forbindelse med tidligere projekter da sproget minder meget om Visual Basic, men valgte at bruge Visual Basic fordi det er mere stabilt og pålideligt. Her ses et billede af udviklingsmiljøet: 5

8. Produkt Vi vil lave et spil som er i stil med Snake. I spillet skal vi gerne have det til at være multiplayer for at få et socialt aspekt over det. Måden vi vil få sjov matematik ind over det er ved at der står en matematik ligning på skærmen, man får så point får at nå til det rigtige svar på ligningen før de andre spillere når svaret. Ved at man tager det rigtige svar får man point og bliver større, men tager man det forkerte bliver man mindre. Hvis man får en streak, som er ved at få flere rigtige i streg, får man bonus points oveni. 9. Kanylemodel Her har vi kanylemodellen og vil nu beskrive det lidt dybere. Kanylemodellen består af: Afsender Vores afsender som i kan se er Andreas E., Jens W. og Niclas L. Vi er 3 elever fra Roskilde Tekniske Gymnasium. Indkodning Indkodningen er det sprog og program vi laver vores program i. Vi bruger Visual Basic.NET til at lave vores program som skal hjælpe med matematikken. Media Det media vi har tænkt os at bruge for at hjælpe med matematikken er et spil. Vi valgte at bruge et spil, fordi mange folk finder spil mere interessante end bare at sidde og læse. Vi kom med nogle forskellige ideer til, hvilke slags spil vi kunne bruge og tænkte på nogle klassiske spil, som vi ville lave til et spil der kan hjælpe med matematikken. Grunden til et klassisk spil er, fordi at folk ved hvad det er og hvad det går ud på. Budskab Vores budskab med spillet er at vi gerne vil gøre matematik mere interessant at lære. Det er så det ved gør ved at lave matematikken interaktiv i et spil. 6

Støj Det problem der kan komme ved vores spil er at det kan blive for nemt for nogle spillere, men det er så meningen at man skal kunne gøre dette med ligninger og andre svære matematik regnestykker. Afkodning Måden de bruger spillet på skal så gerne være på den måde at de finder regnestykkerne til deres niveau og bruger det niveau. Spillet er på forskellige niveauer i sværhed. Hvis man er nybegynder tager man den nemmeste, øvede den efter og til sidst den sværeste. Modtager Vores modtagere som vi gerne vil ud til ed dette spil er folkeskole elever og gymnasium elever som har brug for motivation til matematik. Spillet som det er lige nu er mest til folkeskole elever da det kun er plus, minus, gange og dividere. 10. Testspecifikationer Vores Snake spil skal være multiplayer og baseret på at man skal besvare matematik spørgsmål for at blive længere. Derfor vil vi have nogle specifikke ting vi gerne vil gå efter når vi tester dette spil. For at spillet skal være en succes for os som har lavet det, skal disse krav opfyldes: Skal kunne bevæge sig som en slange med piletasterne. Man skal kunne blive længere når man får points. Spørgsmålene skal være på et niveau som kan gøres svære og tilpasses til brugeren. Det skal kunne spilles i multiplayer. Det skal være sjovt at spille. Det skal være brugbart og lærerigt at spille. Hvis disse krav til testen bliver opfyldt er det en succes for os og vores prototype af spillet. 7

11. Teori I dette afsnit vil vi komme ind på alle de funktioner i Visual Basic som vi gør brug af i produktet. 11.1. Designeren Det første man ser efter at have oprettet et nyt projekt er designeren der viser et tomt vindue. Det smarte ved designeren er at du kan se og redigere direkte i brugerfladen helt uden at skulle skrive noget kode eller starte programmet. Måden det fungere på er at man trækker forskellige såkaldte Controls ind i vinduet fra boksen Toolbox. I dette tilfælde en knap. 8

Når man har tilføjet en Control til vinduet, kan man ændre dens egenskaber i boksen Properties. I dette tilfælde ændres knappens tekst til Knap. Alle de forskellige Controls har mange forskellige egenskaber der let kan tilpasses så programmet får det udseende man ønsker. 11.2. Koden Her vil vi komme ind på nogle af de basale funktioner i programmeringssproget Visual Basic. Kommentarer ' angiver at resten af linjen er en kommentar. Kommentarer gør intet i forhold til programmet, men kan bruges til at skrive noter direkte i koden. Her er et eksempel på en kommentar: 'Dette er en kommentar 9

Datatyper Der findes mange forskellige datatyper, de mest brugte er Integer som er heltal, Decimal som er decimaltal og String som er tekst. Variabler Dim, Private, Public og Static kan bruges til at definere en ny variabel. Hvis enten Dim eller Private bruges er variablen privat og kan kun bruges af den klasse eller funktion der har defineret den. Hvis Public bruges vil variablen i stedet for være tilgængelig over alt i programmet. Static kan kun bruges til at definere en privat variabel inde i en funktion, Static gør det samme som Dim, med undtagelse af den beholder sin værdi når funktionen køres igen senere, i stedet for som Dim at nulstille værdien. Nogle datatyper kræver keywordet New foran navnet på datatypen. Her er et eksempel på brug af Dim til at definere en variabel ved navn Variabel af typen String med værdien "Dette er en tekst": Dim Variabel As String = "Dette er en tekst" Hvis If tester om et udtryk er sandt eller falskt, den efterfølgende kode køres kun hvis udtrykket er sandt. Eksempler på udtryk kunne være 1 + 1 = 2 som er sandt, og "Tekst" = "String" som er falsk. To udtryk kan også kombineres med AndAlso eller Or. AndAlso betyder "og" og kræver at begge udtryk er sande før det samlede udtryk er sandt. Or betyder "eller" og kræver at bare et af de to udtryk er sande før det samlede udtryk er sandt. Her er et eksempel på brug af en If blok: If Udtryk1 Then '1 If Udtryk2 Then '2 '3 Hvis Udtryk1 er sandt køres '1, men ikke '2 og '3. Hvis Udtryk1 i stedet var falsk ville '1 blive sprunget over, derefter ville Udtryk2 blive testet på samme måde. 10

Funktioner Sub og Function bruges til at definere funktioner, hvis ikke funktionen skal returnere en værdi bruges Sub, ellers bruges Function. Ved at angive keywordet ByVal laver man en funktion der kræver nogle argumenter, funktionen kan så bruge disse argumenter til hvad den vil og hvis den er af typen Function returnere en værdi. Her er et eksempel på en Sub der kalder en Function med to argumenter, funktionen lægger de to argumenter sammen og returnere resultatet: Private Sub Funktion1() Dim Resultat As Integer = Funtion2(4, 5) 'Resultat = 9 Private Function Funtion2(ByVal Tal1 As Integer, ByVal Tal2 As Integer) As Integer Return Tal1 + Tal2 End Function Funktioner kan også blive kaldt automatisk når en bestem Event bliver aktiveret. Her er et eksempel på en Sub der bliver kørt automatisk når programmet starter: Private Sub Funktion() Handles MyBase.Load 11

12. Design af brugerfladen Når du åbner spillet bliver du mødt af en dialogboks der spørger efter hvad du vil kalde dig i spillet, hvilken farve du vil være samt om du vil starte et nyt spil eller tilslutte til et eksisterende. Når dialogboksen åbnes er tekstboksen udfor Navn: allerede udfyldt med det brugernavn du er logget på computeren med, og farven i boksen til højre for indeholder allerede en tilfældig farve. Dialogboksen ser således ud: På billedet til venstre er navet angivet til Vært og farven til rød, der er valgt at starte et nyt spil med sværhedsgraden Medium (1-50), det betyder at tallene der indgår i regnestykkerne ligger mellem 1 og 50. På billedet til højre er navnet angivet til Klient og farven til blå, der er valgt at tilslutte til et eksisterende spil på computeren localhost, i denne tekstboks skal computernavnet eller IP adressen på værts computeren angives, alternativt kan man angive localhost eller 127.0.0.1 hvis klienten er på samme computer som værten. Der er tre forskellige sværhedsgrader at vælge imellem, Let (1-10), Medium (1-50) og Svær (1-100) : 12

Hvis enten navnet eller computernavnet på værten ikke er angivet er det ikke muligt at trykke på knappen Start : For at ændre farven skal man klikke på den farvede firkant og en Windows dialogboks bliver vist hvor man kan vælge en anden farve. Hvis man fortryder er det muligt at vælge Annuller eller lukke vinduet og vende tilbage til den forrige dialogboks uden at ændre farven. 13

Her ses spillet i aktion med to spillere, nemlig Vært og Klient, ud for hver af deres navne står der et 0 som angiver hvor mange point de har i øjeblikket. Tallet vil ændre sig efterhånden som spillerne får point. Spørgsmålet som spillerne skal svar på står øverst til venstre i vinduet, på billedet er det 4*32 resultatet på det regnestykke er 128. Der er placeret fire svar muligheder tilfældigt på banen, en rigtig og tre andre tilfældige, det kan ske at en af de tilfældige er det samme som den rigtige, og i den situation gælder den også som rigtig. Opgaven for de to spillere er så at udregne sprøgsmålet og nå først hen til det rigtige svar. Svares der rigtigt får spilleren points ganget op med hans nuværrende længde, svares der forkert mistes pointene ikke, men længden reduceres til udgangspunktet, og spilleren har derved mistet sin combo. Her ses et billede hvor spilleren Klient har svaret rigtigt en gang og dermed fået et point og blevet lidt længere. På billedet ses det også hvordan der er muligt at går ud over kanten af skærmen og komme ind på den anden side. 14

Efter at have spillet lidt tid har Vært opnået 29 point og Klient 57 point, Vært har netop svaret forkert og fået sin længde reduceret tilbage til udgangspunktet. Hvis klienten mister forbindelsen til værten eller hvis værten lukkes, vises denne dialogboks hvor der er mulighed for at vende tilbage til start dialogboksen eller lukke spillet. 15

13. Implementering Det første der sker når programmet bliver startet er at vise Options dialogboksen, hvis dialogboksen lukkes med en status der ikke er OK så lukkes programmet fordi brugeren har lukket dialogboksen. Næste skridt er så at starte server eller klient komponenten i programmet alt efter om brugeren har valgt at starte et nyt spil eller tilslutte til et eksisterende. Hvis det fejler vises der en fejlmeddelelse og Options dialogboksen vises endnu engang. Retry: 'Vis "Options" vinduet vent til brugeren har valgt indstillingerne If Options.ShowDialog <> Windows.Forms.DialogResult.OK Then Application.Exit() Exit Sub 'Alt efter hvilke indstillinger bruger har valgt skal spillet starte en vært eller klient Try If Options.RadioButtonHost.Checked Then Server = New Server(80) Client = New Client(Options.TextBoxHostname.Text, 80) Catch ex As Exception MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Error) GoTo Retry End Try Efter en succesfuld forbindelse deler programmet sig i to dele alt efter hvilken rolle brugeren har valgt, hvis programmet skal være vært starter den spillet op, laver spørgsmål, begynder at tegne osv.. Det er værten der styre alt. Det betyder også at hvis spillet skal starte op som klient skal den intet foretage sig, lige med undtagelse af at vente på de færdigbehandlede billeder den modtager fra værten og vise dem på skærmen. Vi vil ikke gå i detaljer omkring de to klasser Server og Client, eller dialogboksen Options i dette afsnit, men kildekoden kan findes bagerst i rapporten under overskrifterne Network.vb og Options.vb. Det samme gælder for klasserne Snake og Label der bliver brugt senere, de kan ligeledes findes bagerst i rapporten under overskrifterne Snake.vb og Label.vb. Årsagen til dette er at afsnittet ville blive alt for langt hvis disse også skulle forklares i detaljer, hovedparten af handlingen i spillet er i Form.vb som bliver gennemgået i de to næste underafsnit. 13.1. Vært Værten finder og gemmer det højeste tal der må forekomme i regnestykkerne i en variabel, tallet er baseret på den valgte sværhedsgrad. Select Case Options.ComboBoxDifficulty.SelectedIndex Case 0 Difficulty = 10 Case 1 Difficulty = 50 Case 2 Difficulty = 100 End Select 16

Næste skridt er at tilføje sig selv til listen over spillere med det valgte navn og farve. Derefter kaldes funktionen ResetLabels() der opstiller det første spørgsmål. Snakes.Add(New Snake(Options.TextBoxName.Text, Options.LabelColor.BackColor, Convert.ToBase64String(System.Guid.NewGuid.ToByteArray))) ResetLabels() Sidste skridt er at starte en ny tråd der køre i baggrunden der holder hele spillet kørende. Den starter med at rykke alle spillerne en tak frem og tjekker om de rammer ind i sig selv eller en anden spiller, hvis det er tilfældet straffes spilleren ved at få deres længde reduceret til udgangspunktet. Derefter tjekker den om der er en af spillerne der har ramt en af svarmulighederne, hvis det er tilfældet gives der enten point eller en straf til spilleren alt efter om svaret er korrigt eller ej og funktionen ResetLabels() bliver kaldt igen for at generere nogle nye svarmuligheder. Efter alle testene er kørt igennem tegner værten et billede med alle spillerne, svarmulighederne og spørgsmålet på. Billedet gemmes i hukommelsen i PNG format og sendes derefter ud til alle klienterne. Billedet vises selvfølgelig også på skærmen. Til sidst ryddes der op for at frigive ubrugte ressourcer og der ventes 50 millisekunder før hele dette step gentages fra starten af. Threading.Tasks.Task.Factory.StartNew( Sub() Do SyncLock Snakes '### Grafik og styring (Andreas) - Start ### For Each Snake As Snake In Snakes Snake.Move() If Snake.HitSelf Then Snake.Incorrect() Continue For For Each Snake2 As Snake In Snakes If Snake2 IsNot Snake Then If Snake2.HitBy(Snake) Then Snake.Incorrect() Exit For ExitLabelHitTest: If Cooldown > 0 Then Cooldown -= 1 SyncLock Labels For Each Snake As Snake In Snakes For Each Label As Label In Labels If Snake.Hit(Label) Then If Label.IsCorrect Then Snake.Correct() Snake.Incorrect() ResetLabels() GoTo ExitLabelHitTest 17

Loop ) Dim Bitmap As New Bitmap(PictureBox.Width, PictureBox.Height) Using Graphics As Graphics = Graphics.FromImage(Bitmap) Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit For Each Snake As Snake In Snakes Snake.Draw(Graphics) SyncLock Labels For Each Label As Label In Labels Label.Draw(Graphics, Cooldown > 0) Graphics.DrawString(Question, GraphicsFont, Brushes.Black, 10, 10) Graphics.DrawRectangle(Pens.Black, 0, 0, Bitmap.Width - 1, Bitmap.Height -1) End Using '### Grafik og styring (Andreas) - Stop ### 'Send oplysninger Using Memory As New IO.MemoryStream Bitmap.Save(Memory, Drawing.Imaging.ImageFormat.Png) Server.Send(Memory.ToArray) End Using 'Vis billedet PictureBox.Image = Bitmap 'Ryd op GC.Collect() 'Vent Threading.Thread.Sleep(50) Hver gang klienten trykker på en af piletasterne for at skifte retning eller en ny klient netop er tilsluttet sendes der en besked over netværket til værten som så kan ændre retningen på spilleren. Når der ankommer en ny besked fra en af klienterne køres denne funktion automatisk. Hvis meddelelsen er af indeholder teksten Setup oprettes en ny spiller med det valgte navn og farve samt id. Hvis der allerede findes en spiller med det pågældende id ignoreres meddelelsen. Hvis meddelelsen er af indeholder teksten Direction i stedet for finder værten spilleren med det pågældende id og ændre retningen på den. Private Sub Server_Received(Data() As Byte) Handles Server.Received '*** Værten har modtaget meddelelsen {Data} fra en af klienterne *** 'Konverter meddelelsen til tekst og opdel den i bidder (splitter med " ") Dim Message() As String = System.Text.Encoding.UTF8.GetString(Data).Split(" ") 'Her er en liste over gyldige meddelelser ' ' {Client Guid} Setup {Client Name} {Client Color} ' {Client Guid} Direction Up ' {Client Guid} Direction Down 18

' ' {Client Guid} Direction Left {Client Guid} Direction Right Select Case Message(1) Case "Setup" SyncLock Snakes 'Ignorer meddelelsen hvis klienten allerede er på listen For Each Snake As Snake In Snakes If Snake.Guid = Message(0) Then Exit Sub 'Tilføj klienten til listen Snakes.Add(New Snake(Message(2), Color.FromArgb(Message(3)), Message(0))) Case "Direction" Select Case Message(2) End Select Case "Up" SyncLock Snakes 'Find klienten på listen og ændre retningen til "Up" For Each Snake As Snake In Snakes If Snake.Guid = Message(0) Then Snake.Direction = Direction.Up Exit For Case "Down" SyncLock Snakes 'Find klienten på listen og ændre retningen til "Down" For Each Snake As Snake In Snakes If Snake.Guid = Message(0) Then Snake.Direction = Direction.Down Exit For Case "Left" SyncLock Snakes 'Find klienten på listen og ændre retningen til "Left" For Each Snake As Snake In Snakes If Snake.Guid = Message(0) Then Snake.Direction = Direction.Left Exit For Case "Right" SyncLock Snakes 'Find klienten på listen og ændre retningen til "Right" For Each Snake As Snake In Snakes If Snake.Guid = Message(0) Then Snake.Direction = Direction.Right Exit For End Select 19

Når der er behov for nye svarmuligheder, enten fordi programmet lige er startet eller fordi en spiller har taget en af svarmulighederne, køres denne funktion som fjerner alle svarmulighederne og generere et nyt spørgsmål samt nogle nye svarmuligheder i den valgte sværhedsgrad. Det er tilfældigt om det bliver et plus-, minus-, gange- eller divisionsstykke. Tallene der indgår, er også tilfældige. Cooldownen på svarmulighederne bliver i samme omgang nulstillet så det ikke er muligt at svare inden for de første par sekunder, dette er en sikring i mod at spilleren ved en fejl rammer en af de nye svarmuligheder der kan poppe op lige foran ham, men i stedet for køre igennem den. Private Sub ResetLabels() SyncLock Snakes SyncLock Labels Labels.Clear() Dim Answer As String Dim Temp As String Dim A As Integer = Random.(1, Difficulty) Dim B As Integer = Random.(1, Difficulty) Select Case Random.(0, 4) Case 0 Question = A & "+" & B Answer = A + B AddLabel(Answer, True) For i As Integer = 0 To 2 Temp = Random.(1, Difficulty) + Random.(1, Difficulty) AddLabel(Temp, Temp = Answer) Case 1 Question = A & "-" & B Answer = A - B AddLabel(Answer, True) For i As Integer = 0 To 2 Temp = Random.(1, Difficulty) - Random.(1, Difficulty) AddLabel(Temp, Temp = Answer) Case 2 Question = A & "*" & B Answer = A * B AddLabel(Answer, True) For i As Integer = 0 To 2 Temp = Random.(1, Difficulty) * Random.(1, Difficulty) AddLabel(Temp, Temp = Answer) Difficulty)), 2) Case 3 Question = A & "/" & B Answer = Decimal.Round(CDec(A / B), 2) AddLabel(Answer, True) For i As Integer = 0 To 2 Temp = Decimal.Round(CDec(Random.(1, Difficulty) / Random.(1, AddLabel(Temp, Temp = Answer) End Select Cooldown = LabelCooldown 20

Funktionen gør brug af en hjælpefunktion AddLabel(Text, IsCorrect) til at placere de nye svarmuligheder således de ikke lander direkte oven på en af de andre svarmuligheder eller spillere. Private Sub AddLabel(ByVal Text As String, ByVal IsCorrect As Boolean) Dim NewLabel As New Label(Text, IsCorrect) Retry: For Each Snake As Snake In Snakes If Snake.Hit(NewLabel) Then NewLabel.Reposition() GoTo Retry For Each Label As Label In Labels If Label.Hit(NewLabel) Then NewLabel.Reposition() GoTo Retry Labels.Add(NewLabel) 13.2. Klient Klienten opretter en tilfældig tekst som værten kan bruge til at identificere den med, og sender en besked til værten om hvad navn og farve brugeren har valgt. Guid = Convert.ToBase64String(System.Guid.NewGuid.ToByteArray) Client.Send(Guid & " Setup " & Options.TextBoxName.Text & " " & Options.LabelColor.BackColor.ToArgb) Hver gang værten har generet et billede sendes det via netværket og modtages af klienten. Når der ankommer et nyt billede bliver denne funktion automatisk kørt. Den forsøger at åbne billedet og vise det på skærmen, hvis noget går galt ignoreres fejlen og klienten venter på det næste billede. Private Sub Client_Received(Data() As Byte) Handles Client.Received '*** Klienten har modtaget meddelelsen {Data} fra værten *** 'Forsøg at vise billedet i vinduet Try Using Memory As New IO.MemoryStream(Data) PictureBox.Image = New Bitmap(Memory) End Using Catch ex As Exception End Try 21

Hvis klienten mister forbindelsen til værten eller vinduet lukkes køres denne funktion automatisk. Hvis vinduet ikke blev lukket manuelt og forbindelsen til værten er afbrudt vises der en fejlmeddelelse hvor brugeren får muligheden for at vise Options dialogboksen igen eller lukke spillet. Private Sub Client_Disconnected() Handles Client.Disconnected '*** Klienten har mistet forbindelsen til værten *** 'Ignorer denne fejlmeddelse, forbindelsen blev afbrudt fordi vinduet blev lukket If IsFormClosing Then Exit Sub 'Sørg for kun at vise en fejlmeddelse på skærmen selvom denne funktion bliver kørt flere gange SyncLock Me Static AskedAlready As Boolean = False If Not AskedAlready Then AskedAlready = True 'Spørg brugeren om han/hun vil spille igen, hvorefter spillet enten genstartes eller lukkes If MessageBox.Show("Mistet forbindelsen til værten. Vil du spille igen?", Text, MessageBoxButtons.YesNo, MessageBoxIcon.Error) = Windows.Forms.DialogResult.Yes Then Application.Restart() Application.Exit() 13.3. Fælles for både vært og klient Når brugeren lukker vinduet afbrydes forbindelsen til værten eller alle klienterne, alt efter om programmet fungerer som klient eller vært. Private Sub Form_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing '*** Vinduet bliver lukket *** 'Afbryd forbindelserne If Server IsNot Nothing Then Server.Disconnect() If Client IsNot Nothing Then IsFormClosing = True Client.Disconnect() 22

Når der trykkes på en af tasterne på tastaturen køres denne funktion automatisk. Den starter med at finde ud af om der blev trykket op, ned, højre eller venstre, og enten ændre retningen direkte hvis programmet er vært, eller sende en besked til værten om at skifte retning hvis programmet er en klient. Private Sub Form_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown Select Case e.keycode Case Keys.Up If Server IsNot Nothing Then 'Server Snakes(0).Direction = MathSnake.Direction.Up 'Client Client.Send(Guid & " Direction Up") Case Keys.Down If Server IsNot Nothing Then 'Server Snakes(0).Direction = MathSnake.Direction.Down 'Client Client.Send(Guid & " Direction Down") Case Keys.Left If Server IsNot Nothing Then 'Server Snakes(0).Direction = MathSnake.Direction.Left 'Client Client.Send(Guid & " Direction Left") Case Keys.Right If Server IsNot Nothing Then 'Server Snakes(0).Direction = MathSnake.Direction.Right 'Client Client.Send(Guid & " Direction Right") End Select 23

14. Test Vi har siddet flere og testet spillet, for at få noget ud af multiplayer funktionen. Vi havde i starten problemer med spillet, fordi det kun var værten der kunne spille ordentlig, de andre spillere havde en forsinkelse på flere sekunder. Vi fandt så ud af at grunden til dette var at værten blev oversvømmet med data fra de forskellige klienter som gjorde at den ikke kunne nå at reagere på det hele inden for rimelig tid. Vi ordnede dette ved at sige, at man ikke bliver fjernet fra spillet hvis forbindelsen bliver afbrudt eller hvis man ikke har været til stede i et stykke tid. Det gjorde så at værten ikke længere blev oversvømmet med data som gjorde programmet langsomt. Efter vi ordnede dette problem testede vi spillet igen for at se om det nu fungerede bedre og om det nu levede op til de andre krav. Multiplayer funktionen fungerer også helt fint nu i forhold til hvad den startede med at gøre. Der er bare det problem at, hvis man går ud af spillet og derefter går ind i det samme spil som værten stadig er i gang med er der pludselig to af den samme, men kan kun bevæge den ene spiller. Det er ikke et stort problem som det andet, men stadig en fejl som er i spillet. Vi testede spillet igen og fandt det meget morsomt at spille og samtidig skulle vi tænke lidt over hvilke svar vi tog. Meget af spillet er meget simpelt lige nu, men dette er kun en prototype og spillet kan gøre sværere ved at brugte ligninger i stedet for plus, minus, gange og divider. Vi kan sige at spillet lever op til den morsomme del af kravene. Den kan også leve op til at vi kan ændre niveauet, bare ikke ændre niveauet så meget endnu. Det er et spil som er brugbart for folk i folkeskolen på det niveau som vi har spillet til at være lige nu, men kan gøres sværere og brugbart for folk i højere klasser som gymnasiet. Vores pointsystem i spillet fungerer også som det skal. Man får points når man gætter rigtigt på et spørgsmål og man bliver længere. Vi tænkte dog vi ville lave en funktion som ville give minuspoints til den person som gætter forkert eller lave noget, som ville holde en stille, hvis man gættede forkert. Måden man bevæger sig i spillet på fungerer også helt fint og man mister længde, hvis man gætter forkert eller man går ind i sig selv eller andre spillere. Alt i alt fungere spillet som vi gerne ville have det skulle fungere og vi har opnået et produkt vi føler opfylder de krav vi har sat. Spillet er både simpelt og nemt at komme i gang med for alle aldre og dens sværhedsgrader kan også justeres fra nemt til svært for at alle aldre kan være med. Man skal dog være opmærksom på hvilke andre programmer der køre på computeren samtidigt, vi havde Skype kørende i baggrunden som af en eller anden grund allerede brugte port 80, det resulterede i følgende fejlmeddelelse når vi prøvede at oprette et nyt spil. 24

15. Evaluering Hele projektet gik forholdsvist godt. Vi programmerede i Visual Basic som vi har arbejdet med før og kender til. Vi syntes det mest problematiske ved projektet var at få værten i vores program til at fungere som den skal. Den virkede ikke optimalt i starten, men fandt ud af hvad problemet var og ordnede det. Vi ordnede det ved at fjerne, disconnecting efter man ikke har rørt sig i et stykke tid, da problemet var at der blev sendt for meget data. Det interessante ved hele projektet var at teste spillet da vi fandt det meget morsom at spille, men også at vi fandt nogle småfejl som gjorde spillet bedre fungerende. Det var også interessant at tænke på problemet og ideerne vi ville bruge som løsning af vores problem. Samarbejdet i vores gruppe har også fungeret meget fint. Vi fik arbejdet sammen om programmeringsdelen og designet. Der var også godt samarbejde med skrivningen af rapporten og uddelingen af opgaver. 16. Konklusion Vores problem som vi løse er at gøre matematik mere interessant og motiverende at lave for folkeskole elever og gymnasieelever. Problemet er at der er folk som ikke rigtig kan finde motivationen til at lære noget, men måden vi vil løse dette problem er ved at gøre matematik interaktivt ved hjælp af et spil. Et spil plejer som regel at være noget der interesserer sig for folk i unge aldre. Spillet indeholder matematik og fungere på den måde at man spiller Snake, men med matematik. Der komme et regnestykke som man så skal kunne besvare. Der kommer flere forskellige svarmuligheder frem. Hvis man svarer rigtigt får du point og bliver længere, men svare du forkert bliver du forkortet. Der er mulighed for at ændre i niveauet på spillet. Spillet er også gjort multiplayer for at man kan spille med sine venner så det er mere socialt. Det vi fik ud af vores test af spillet var at vi fandt det meget morsomt og man får også brugt sin matematik, en indtil videre i vores prototype er der kun til folkeskoleelever, men det kan sagtens laves til gymnasieelever, hvis man fik det med ligninger i stedet for plus og minus stykker. I forhold til de krav vi satte for hvad vi ville i vores problemformulering opfylder vores produkt godt, det formåer at være lærende og trænende når det kommer til matematik, mens det har et sjovt og konkurrence fokuserede element i multiplayer som alle der testede spillet var enige i. Efter de problemer vi stødte på blev rettet, fungerede spillet rigtig godt og var sjovt for alle der spillede med. 25