# Labb 2: Klasser - Console Pong
I den här labben ska vi bygga det klassiska spelet Pong i konsolen. Fokus är på att arbeta med klasser och dela upp koden i mindre bitar.

I labben får du ett skal till spelet. Skalet består av tre klasser: `Program` med en main-metod, `Input` som hanterar knapptryckningar och `Game` som hanterar den grundläggande spel-loopen. Det är bara `Game` som du kommer behöva redigera. Utöver det ska du skapa två klasser till:
* `Paddle` som representerar en spelare
* `Ball` som representerar bollen.
`Game`-klassen är den som styr hela spelet. Den har två metoder:
* `StartGame()` som körs i början av spelet. Här kan vi skapa våra andra klasser och sätta inställningar för spelet.
* `Run()` som körs i en loop 10 gånger per sekund. Metoden returnerar en bool: sant om spelet ska fortsätta, falskt om spelet ska avslutas.
### 0. Förberedelse
Använd länken på classroom för att acceptera uppgiften i github-classroom. Då får du ett git-repository som du ska klona i Github desktop och öppna i Visual Studio. Gör det till en vana att commita och pusha i slutet av varje lektion eller efter varje gång du har jobbat på projektet.
### 1. Paddle-klassen
Skapa en ny klass med namn Paddle. Den här klassen ska ha tre stycken egenskaper:
* `x` av typen `int` som representerar spelarens x-position.
* `y` av typen `int` som representerar spelarens y-position.
* `size` av typen `int` som representerar spelarens storlek.
Klassen ska ha en konstruktor som tar in ett argument för varje egenskap och anger ett värde för motsvarande klassvariabel.
Klassen ska ha två metoder:
* `void Move(int yAmount)` som flyttar spelaren i y-led det antal steg som anges i argymentet yAmount.
* `void Draw()` som ritar spelaren i konsolen.
För att rita på en viss plats i konsolen kan vi använda två metoder: `Console.SetCursorPosition(int x, int y)` och `Console.Write()`. Till exempel för att rita ett streck på skärmen, på plats (3,10) kan vi skriva:
```csharp
Console.SetCursorPosition(3, 10);
Console.Write("|");
```
### 2. Skapa Paddle-Objekt
När vi har skapat `Paddle`-klassen vill vi skapa två objekt av typen `Paddle` i `Game`-klassen, och anropas deras i metoder i `Run`-metoden.
1. Skapa två objekt av `Paddle`-klassen inut i `Game`-klassen och instansiera dem i metoden `StartGame()`.
2. Anropa `Paddle`-objektens `Draw`-metod inuti `Run`.
3. Anropa `Paddle`-objektens `Move`-metod inuti respektive if-sats i `Run`-metoden.
### 3. Ball-klassen
Skapa en ny klass med namn Ball. Den här klassen har fyra egenskaper:
* `x` av typen `int` som representerar bollens x-position.
* `y` av typen `int` som representerar bollens y-position.
* `xVelocity` av typen `int` som representerar bollens hastighet i x-led.
* `yVelocity` av typen `int` som representerar bollens hastighet i y-led.
Klassen ska ha en konstruktor som tar in ett argument för varje egenskap och anger ett värde för motsvarande klassvariabel.
Klassen ska ha tre metoder.
* `void Move()` som flyttar bollen utifrån xVelocity och yVelocity.
* `void Draw()` som ritar bollen i konsolen. Se ovan för hur man ritar i konsolen!
* `void CheckCollisions(Paddle p1, Paddle p2, int width, int height)` som ska:
* kolla om bollen nuddar övre eller undre kanten på skärmen och så fall byta riktning på yVelocity
* kolla om bollen nuddar någon av spelarna och i så fall byta riktning på xVelocity
* kolla om bollen nuddar högra eller vänstra kanten och i så fall återställas till mitten av skärmen.
### 4. Skapa Ball-objekt
Nu kan vi skapa ett Ball-objekt i Game-klassen
1. Skapa ett objekt av `Ball`-klassen inut i `Game`-klassen och instansiera den i metoden `StartGame()`.
2. Anropa `Ball`-objektets `Move`-metod och sedan `Draw`-metod inuti `Run`.
3. Anropa `Ball`-objektets `CheckCollision`-metod inut `Run` och skicka med `width`, `height` och båda spelarna.
### 5. (Extra) Poängräkning
För att utveckla spelet kan vi nu lägga till poängräkning. För att göra det behövs följande:
1. Lägg till en egenskap `points` i Paddle-klassen. Den representerar spelarens poäng
2. Öka poäng för rätt spelare i `Ball`-klassens `CheckCollisions`-metod
3. Visa poängen genom att skriva det till konsolen på lämplig plats.
4. Kolla om poängen har blivit lika med till exempel 5, och avsluta spelet genom att returnera `false` i `Game`-klassens `Run`-metod.
### 6. Utmaningar
Nu har vi ett fungerande spel. Det finns flera utmanande saker vi kan göra för att utveckla det. Till exempel:
* Olika riktning på bollen beroende på var den träffar paddeln.
* Just nu blinkar skärmen mycket. Det är för att vi använder oss av `Console.Clear()` i början av varje uppdatering. Vi kan fixa det genom att skriva ett blanksteg på bollen respektive spelarens gamla position i början av varje loop. Gör det genom att implementera en metod `UnDraw()` i både `Ball`-klassen och `Paddle`-klassen.
* En nedräkning (t.ex. "3…2…1…") innan spelet startar.
* Möjlighet att ändra paddelns storlek under spelets gång.
* Implementera en AI-spelare som följer bollen