Extrauppgifter

Denna kurs bygger mycket på eget arbete där du jobbar mot olika tutorials och på detta sätt lär dig nya saker. I detta arbetssättet så är det naturligt att olika elever arbetar olika snabbt. För att hålla ihop gruppen på ungefär samma moment så har jag skapat ett antal extrauppgifter som du kan göra efter behov och/eller intresse.

Nedan kommer extrauppgifter presenteras med en koppling till ett moment där det är en lämplig svårighetsgrad eller att uppgiften bygger på kunskaper som vi har arbetat med i just detta moment. Vissa extrauppgifter bygger på tidigare extrauppgifter, vissa bygger vidare på uppgifter som är gjorda i det rekommenderade momentet eller tidigare moment. Vissa uppgifter kommer innehålla tekniker som vi kommer arbeta med senare i kursen men det är ändå en lämplig utbyggnad vid den tidpunkten.

Du gör vad du vill med dessa extrauppgifter, arbeta med det som verkar roligt eller jobba med något som du känner gör dig bättre som programmerare. Hela kursen handlar om att bygga på dina kunskaper och ge dig fler verktyg för att kunna prestera så bra som det ä möjligt i slutprojektet där du skall visa vilket betyg du skall ha på kursen.

Moment02

Extrauppgift: Arbeta med egenskapade klasser

Tidigare har vi arbetat med Banken och då lagrades transaktionerna i en lista. Skapa en kopia på detta projekt och bygg om transaktionerna så att de istället blir objekt som lagras i en lista.

Saker att tänka på:

  • Vilka medlemmar behöver du i klassen?
  • Tidigare representerades ett uttag av ett negativt tal. Hur vill du göra nu?

Extrauppgift: Lagra objekt i fil

Tidigare när vi har lagrat data i filer så har vi antingen gjort det väldigt enkelt för oss så att vi endast lagrat ett värde på varje rad eller så har vi varit tvungna att separera data med någon form av delimiter. När vi jobbar med objekt och listor så finns det inbyggda metoder i C# för att spara en hel samling i en fil och även möjlighet att läsa in hela samlingen tillbaka till en lista.

JSON

JSON är en lagringsstruktur som används för att lagra och utbyta data mellan olika system. En stor fördel med JSON är att det är relativt lätt för våra ögon att läsa innehållet i filen. JSON har också en struktur som passar väldigt bra ihop med objekt då uppbyggnaden liknar varandra.

JSON-struktur

[klicka för att visa]

[
   {
      "Name":"Anders",
      "Age":17
   },
   {
      "Name":"Bodil",
      "Age":18
   },
   {
      "Name":"Cilla",
      "Age":19
   },
   {
      "Name":"David",
      "Age":20
   }
]

Visa JSON

Att lagra JSON-data i en fil med filändelsen .json gör att du kan öppna filen i Firefox för att se innehållet på ett strukturerat och enkelt sätt. Övriga webbläsare har olika tillägg för att visa detta.

JSON är ett smidigt sätt att lagra data men det kan vara lite svårt att få grepp om större datamängder genom att kika i den genererade filen. Då finns det några applikationer online som hjälper dig att visa upp innehållet, vissa applikationer ger dig också möjlighet att ändra och validera datastrukturen.

Uppgiften blir att lagra någon lista till fil och sedan läsa in den igen. Testa på bilapplikationen, bankapplikationen eller på någon annan applikation.

Här fanns tidigt ett exempel som är smidigt och som fungerar bra. Problemet är att det är svårt att bygga vidare på detta senare när vi skall addera arvet. Därför kommer jag visa två alternativa lösningar; det första alternativet är det som fanns här först och det andra alternativet är det som rekommenderas för att slippa bygga om senare.

Kodexempel: Första alternativet - JSON

Klicka för att visa koden!

Här följer klassen Person som lagrar namn och ålder på en person.

Kodexempel

Här följer programkoden. Filändelsen har jag satt till .dat vilket är en förkortning för data. Den kunde lika gärna vara .txt, .json, eller något annat.

Kodexempel

Filens [personer.dat] innehåll ser ut så här när programmet har kört.

[{"Name":"Anders","Age":17},{"Name":"Bodil","Age":18},{"Name":"Cilla","Age":19},{"Name":"David","Age":20}]

Kodexempel: Andra alternativet - JSON.net

Klicka för att visa koden!

Här följer klassen Person som lagrar namn och ålder på en person.

Kodexempel Kodexempel Kodexempel

Filens [personList.json] innehåll ser ut så här när programmet har körts.

[{"Name":"Anders","Age":17},{"Name":"Bodil","Age":18},{"Name":"Cilla","Age":19},{"Name":"David","Age":20},{"Name":"Åsa","Age":42},{"Name":"Östen","Age":39}]

Alla kodfiler

Moment03

Extrauppgift: Lagra generisk klass i fil

En generisk klass kan vara en lista med objekt som är påverkade av ett arv. Här kommer nu ett exempel på hur denna lagring kan se ut.

Detta exempel bygger vidare på det andra alternativet i det förra exemplet. Den första tekniken har inte möjlighet att bygga vidare så att arvet bibehålls.

Kodexempel: JSON.net

Klicka för att visa koden!

Klassen Person

Kodexempel

Klassen Student

Kodexempel

Klassen Teacher

Kodexempel

Programmet

Kodexempel Kodexempel

Filens [personList.json] innehåll ser ut så här när programmet har körts. Det viktigaste här är att hålla reda på vilken klass ett objekt grundar sig i för att kunna återskapa samma objekt. Denna info finns i attributet $type där det sedan talar om vilket namespace som klassen tillhör och vilket namn klassen har. Efter kommatecknet så står det också namnet på projektet. Jag är osäker på (har inte testat) om detta innebär att denna fil inte går att läsa in till ett annat projekt, eller annat namespace, med samma deklaration av klassen Student/Teacher.

{
   "$type":"System.Collections.Generic.List`1[[listToFile_json_derived.Person, listToFileDerived]], mscorlib",
   "$values":[
      {
         "$type":"listToFile_json_derived.Student, listToFileDerived",
         "Field":"Naturvetenskapsprogrammet",
         "Name":"Anders",
         "Age":17
      },
      { // dolda objekt },
      {
         "$type":"listToFile_json_derived.Teacher, listToFileDerived",
         "StartYear":2015,
         "Name":"Åke",
         "Age":43
      }
  ]
}

Alla kodfiler

Extrauppgift: Arbeta med egenskapade klasser

Om du har byggt egna klasser för t.ex. banken och transaktioner så skulle du här kunna bygga vidare på den strukturen och skapa olika typer av konton. Transaktionerna ser inte olika ut bland olika konto men det finns olika konton såsom balanskonto och sparkonto. På ett sparkonto har du möjlighet att få ränta på dina pengar.

Om du vill bygga vidare på din bankapplikation så finns det mängder av möjligheter. Här kan du också få möjlighet att bygga in information om vem som äger ett konto, eller så skapar du klassen Person som kan ha ett eller flera konto kopplat till sig.

Saker att tänka på;

  • Vad skall ärvas? Hur ser arvet ut, är relationer mellan objekt "is a" eller "has a"?
  • Hur skall strukturen se ut? Är det lättare att koppla en person till ett konto, eller ett konto till en person?

Extrauppgift: SpaceShooter

Om du får tid över så kan du leka lite med SpaceShooter för att på egen hand utveckla spelet och befästa dina kunskaper om arv och spelutveckling.

I slutet av kursen så skall man för att nå betyget E eller C göra förändringar i spelet och lägga till egen funktionalitet. Här nedan följer ett antal saker som du kan göra på egen hand.

  • Skapa en ny fiende. Lägg till en ny klass och se till att denna fiende fungerar i spelet. Skapa en egen sprite, eller hitta en på nätet, bestäm hur din fiende skall röra sig och implementera den i spelet.
  • Spawna nya fiender så att spelet inte tar slut. Fundera på var någonstans det är lämpligt att nya fiender skapas.
  • När en bullet träffar en fiende så fortsätter denna bullet att leva, det är inte så rimligt. Se till att bullet tas bort när den träffar en fiende.
  • Bygg vidare på spelet på egen hand, det finns hur många möjligheter som helst, det är bara din egen fantasi som sätter stopp.

Innan du testar att göra en eller flera av dessa förändringar så ta en säkerhetskopia av ditt projekt. Du skall senare bygga vidare på det spel som du nu har skapat.

Moment04

Extrauppgift: GameStats

Bygg in ytterligare en GameState till ditt spel som går att nå från huvudmenyn. Denna GameState skall innehålla info om spelet, hur det spelas, vem som har gjort det och hur det får spridas. Tänk på att om du använder sprites och ljud från nätet så är det viktigt att kolla under vilken licens du får använda detta. Vissa saker får du inte använda, vissa saker får du använda under förutsättning att du talar om var de kommer ifrån. Här är ett bra ställe att ge credits.

Extrauppgift: HighScore

Bygg ihop någon version av ditt SpaceShooter med applikationen HighScore så att du kan lagra Highscore i ditt spel.

Moment05

Extrauppgift: Listor, objekt och arv

Som du märkte i vår tutorial så valde jag att fokusera på GUI och slarvade därför bort klassen Car som vi använt oss av tidigare. Jag använde mig också av ListView Control för att lagra våra bilar.

Om jag istället vill använda mig av de objekt och listor vi byggt tidigare så går detta bra, då skapar jag bara ett nytt objekt när detta skall läggas till i applikationen för att sedan lägga till det i listan. Denna lista visas sedan upp i vår ListView Control. Tas ett objekt bort så behöver det tas bort i listan och sedan skall vår ListView Control spegla listans utseende.

Vill du dessutom visa upp arvet så bygg in Vehicle och Lorry till applikationen.

Extrauppgift: API

Du har tidigare byggt en GUI-applikation där du kan lagra bilar i en lista, kanske har du också byggt vidare på den uppgiften så att du använde klassen Car. Bygg nu ihop applikationen där du kan söka efter bilinfo med någon applikation där du kan lagra en bil på något sätt.

I nästa avsnitt så skall vi kika på hur vi kan lagra information om bilar i en databas, då finns det möjlighet att bygga vidare på denna applikation.

Extrauppgift: Databas

Bygg en databaskoppling till någon av de tidigare uppgifterna med GUI.

Kanske är det nu du skall bygga en applikation som fungerar med GUI, som lagrar alla bilar som objekt i en lista, som hämtar info via ett API så att du får riktiga värden samt att allt detta lagras i en databas.

Extrauppgift: Databas med flera tabeller

Efter genomgången av hur en databas med flera tabeller fungerar så kanske det är dags att bygga till tabellen person, eller någon annan lämplig tabell, och bygga ihop detta med din allt större GUI-applikation.