Expert Review Senna de Vries¶
K1 Je hebt object georiënteerde software gemaakt die samenwerkt met een database.¶
Object georienteerd programmeren bestaat uit de volgende onderdelen: encapsulation, abstraction, inheritance en polymorphism.
Encapsulation¶
Bij encapsulation wordt data bij elkaar gebundeld in een class. Deze class kan vervolgens verborgen worden gehouden voor andere classes/buitenstaanders waardoor de code van buiten af niet kan worden beinvloed.
protected void CardCounterText(TextGameObject cardCounterObject)
{
int cardCounter = 0;
if (SpecialTile.Position == pawnWhite.Position || SpecialTile.Position == pawnBlack.Position || SpecialTile.Position == rookWhite.Position || SpecialTile.Position == rookBlack.Position || SpecialTile.Position == knightWhite.Position || SpecialTile.Position == knightBlack.Position || SpecialTile.Position == bishopWhite.Position || SpecialTile.Position == bishopBlack.Position)
{
cardCounter += 1;
Console.WriteLine("Cards: " + cardCounter);
cardCounterObject = new TextGameObject("Fonts/SpriteFont", 1, "text");
cardCounterObject.Position = new Microsoft.Xna.Framework.Vector2(10, 10);
Add(cardCounterObject);
texts.Add(cardCounterObject);
}
}
De bovenstaande code is protected gemaakt omdat de counter niet overal aangepast moet kunnen worden. Echter moeten andere classes die inheritten van de counter wellicht wel de waarden aan kunnen passen of gebruiken.
Abstraction¶
Abstraction is het kort en bondig maken van de code waarbij irrelevante details worden weggelaten. Dit vergroot de leesbaarheid en herbruikbaarheid van de code.
for (int i = 0; i < 3; i++)
{
Random number = new Random();
int x = number.Next(1, 7);
int y = number.Next(4, 6);
SpecialTile = new SpriteGameObject("Images/UI/special tile", 0, "special tile");
SpecialTile.Position = new Microsoft.Xna.Framework.Vector2(x * 72.5f + 358, y * 72.5f - 28);
SpecialTile.Scale = 0.9932f;
Add(SpecialTile);
}
Het werkt als volgt: Er wordt een random nummer gegenereerd voor een x en een y waarde. Deze waarden komen overeen met de tiles in de grid. Vervolgens wordt er een nieuw gameobject gemaakt waarbij een sprite wordt ingeladen. Hierna wordt de sprite gekoppeld aan een positie door middel van een vector en de random x en y waarden. Vervolgens wordt de sprite gescaled zodat hij goed in de tile past en wordt hij toegevoegd aan de game. Al het bovenstaande wordt 3 keer gelooped.
Het loopen van de code houdt de code compact en overzichtelijk. Alleen de nodige eigenschappen zoals positie, image en scale worden gekoppeld aan de sprite. Dit zijn voorbeelden van abstraction.
Inheritance¶
Inheritance is het overnemen van eigenschappen en methodes tussen classes. Hierbij neemt een child class de eigenschappen over van zijn parent class.
public class GameState : MovableMenuItem
{
protected SpriteGameObject SpecialTile;
public GameState() : base()
{
Remove(background);
for (int i = 0; i < 3; i++)
{
Random number = new Random();
int x = number.Next(1, 7);
int y = number.Next(4, 6);
SpecialTile = new SpriteGameObject("Images/UI/special tile", 0, "special tile");
SpecialTile.Position = new Microsoft.Xna.Framework.Vector2(x * 72.5f + 358, y * 72.5f - 28);
SpecialTile.Scale = 0.9932f;
Add(SpecialTile);
}
}
protected void CardCounterText(TextGameObject cardCounterObject)
{
int cardCounter = 0;
if (SpecialTile.Position == pawnWhite.Position || SpecialTile.Position == pawnBlack.Position || SpecialTile.Position == rookWhite.Position || SpecialTile.Position == rookBlack.Position || SpecialTile.Position == knightWhite.Position || SpecialTile.Position == knightBlack.Position || SpecialTile.Position == bishopWhite.Position || SpecialTile.Position == bishopBlack.Position)
{
cardCounter += 1;
Console.WriteLine("Cards: " + cardCounter);
cardCounterObject = new TextGameObject("Fonts/SpriteFont", 1, "text");
cardCounterObject.Position = new Microsoft.Xna.Framework.Vector2(10, 10);
Add(cardCounterObject);
texts.Add(cardCounterObject);
}
}
}
public class GameState : MovableMenuItem
{
SpecialTile = new SpriteGameObject("Images/UI/special tile", 0, "special tile");
cardCounterObject = new TextGameObject("Fonts/SpriteFont", 1, "text");
}
Bronnen¶
Encapsulation
Abstraction
Inheritance
K4 Je gebruikt basisprincipes van Game Design om een spel te ontwerpen en te maken.¶
Bij het designen van de game is er rekening gehouden met de formal game elements. Ook is er uiteengezet wat de core mechanics en secondary mechanics zijn binnen onze game.
De core mechanic van onze game zijn de standaard schaakregels en het gebruik van kaarten. De secondary mechanics zijn veranderde schaakstukken (koning en koningin zijn vervangen door 1 speciaal nieuw stuk). Verder is een secondary mechanic van ons spel dat je kaarten kan krijgen door jouw stukken op een speciale tile te zetten op het bord.
De formal game elements zien er voor onze game als volgt uit:
objective: Capture –> Capture alle pionnen en de speciale unit van de tegenstander
resources: kaarten, stukken en blokkades
Procedures: Aan het begin van de beurt mag een speler een kaart spelen. Vervolgens mag de speler een stuk verplaatsen
rules: De speler mag aan het begin van zijn beurt een kaart spelen. Vervolgens mag de speler een stuk verplaatsen.
conflict: obstacles door middel van kaarten die een buff, nerf of muren genereren.
outcome: een speler kan winnen als hij alle pionnen van de tegenstander en de speciale unit (superpawn) heeft gepakt. Er kan een gelijkspel optreden als alleen de 2 speciale units over zijn.
players: 1v1 pvp
boundaries: De stukken kunnen niet verder bewegen dan het bord reikt
Bronnen¶
Formal game elements
Core mechanics
G1 Je ontwikkelt je op persoonlijk vlak en blijft leren.¶
Gedurende dit project merk ik dat ik nog veel moeite heb met het begrijpen van c# en de opbouw/samenhang van het project. Om meer begrip hiervan te krijgen heb ik op w3schools de volledige c# course gelezen en de opdrachten gemaakt. Verder heb ik nog enkele videos bekeken over c# en OOP. Ook scan ik regelmatig door de verschillende files in het project heen om een goed beeld te krijgen van de functies van elke file en hoe deze met elkaar samenwerken.
Verder heb ik geëxperimenteerd met coderen waarbij een deel van wat ik wilde bereiken is gelukt.
Bronnen¶
w3schools c#
c# basics video
c# OOP video
G3 Je werkt planmatig en volgens gegeven aanpak aan een project.¶
Binnen ons project hebben we de volgende aanpak opgesteld: We maken als eerst alle core/secondary mechanics. Deze mechanics zijn essentieel voor het spel.
Vervolgens maken we alle extra features en daarna maken we het design compleet en voegen we een thema toe aan onze game.
Aan het einde van sprint 1 heb ik samengewerkt met een groepsgenoot om alle stukken op het bord af te beelden. De stukken konden niet bewegen maar het afbeelden vormde wel een basis voor één van de core mechanics van de game: het schaken volgens de traditionele schaakregels (met uitzondering van de speciale unit).
Vervolgens is een groepgenoot aan de slag gegaan met de andere core mechanic: het kaartsysteem. Dus ben ik verder gegaan met de secondary mechanic: special tiles. Als het kaartsysteem werkend is ga ik dit koppelen aan de special tiles.
Op deze manier willen wij zo snel mogelijk een MVP produceren zodat wij zo snel en effectief mogelijk kunnen gaan testen.