Thread: Schaken in java
-
20-04-2011, 15:55 #16Member
- Registered
- 18/02/05
- Posts
- 106
- iTrader
- 0
- Mentioned
- 0 Post(s)
Ik zal proberen het wat fatsoenlijker te maken en bedankt voor de tips.
Dan zal ik straks een update geven
.
Wat ik nu heb is 1 hoofdstuk (schaakstukken) en dan alle andere stukken die daar van erven. Maar ik heb de zwarte stukken en witte stukken appart, dus ik heb een koningzwart en een koningwit.
Dit moet dan dus niet?
@ Aboris
dit heb ik al
maar zetten komen later. Eerst proberen alles tegoei zichtbaar te krijgen.
no votes
-
-
20-04-2011, 16:08 #17Member
- Registered
- 18/02/05
- Posts
- 106
- iTrader
- 0
- Mentioned
- 0 Post(s)
in mijn level staat dit:
rooster = new Schaakstuk[8][8];
rooster[1][0] = new PionW();
rooster[1][1] = new PionW();
rooster[1][2] = new PionW();
rooster[1][3] = new PionW();
rooster[1][4] = new PionW();
rooster[1][5] = new PionW();
rooster[1][6] = new PionW();
rooster[1][7] = new PionW();
rooster[6][0] = new Pion();
rooster[6][1] = new Pion();
rooster[6][2] = new Pion();
rooster[6][3] = new Pion();
rooster[6][4] = new Pion();
rooster[6][5] = new Pion();
rooster[6][6] = new Pion();
rooster[6][7] = new Pion();
rooster[0][0] = new TorenW();
rooster[0][1] = new LoperW();
rooster[0][2] = new PaardW();
rooster[0][3] = new KoninginW();
rooster[0][4] = new KoningW();
rooster[0][5] = new PaardW();
rooster[0][6] = new LoperW();
rooster[0][7] = new TorenW();
rooster[7][0] = new Toren();
rooster[7][1] = new Loper();
rooster[7][2] = new Paard();
rooster[7][3] = new Koning();
rooster[7][4] = new Koningin();
rooster[7][5] = new Paard();
rooster[7][6] = new Loper();
rooster[7][7] = new Toren();
Maar dan heb ik ook voor elk zwart stuk een class nodig en voor elk wit.
kan ik dit ook zo doen?
rooster = new Schaakstuk[8][8];
rooster[1][0] = new Pion(1);
rooster[1][1] = new Pion(1);
rooster[1][2] = new Pion(1);
rooster[1][3] = new Pion(1);
rooster[1][4] = new Pion(1);
rooster[1][5] = new Pion(1);
rooster[1][6] = new Pion(1);
rooster[1][7] = new Pion(1);
rooster[6][0] = new Pion(2);
rooster[6][1] = new Pion(2);
rooster[6][2] = new Pion(2);
rooster[6][3] = new Pion(2);
rooster[6][4] = new Pion(2);
rooster[6][5] = new Pion(2);
rooster[6][6] = new Pion(2);
rooster[6][7] = new Pion(2);
rooster[0][0] = new Toren(1);
rooster[0][1] = new Loper(1);
rooster[0][2] = new Paard(1);
rooster[0][3] = new Koningin(1);
rooster[0][4] = new Koning(1);
rooster[0][5] = new Paard(1);
rooster[0][6] = new Loper(1);
rooster[0][7] = new Toren(1);
rooster[7][0] = new Toren(2);
rooster[7][1] = new Loper(2);
rooster[7][2] = new Paard(2);
rooster[7][3] = new Koning(2);
rooster[7][4] = new Koningin(2);
rooster[7][5] = new Paard(2);
rooster[7][6] = new Loper(2);
rooster[7][7] = new Toren(2);no votes
-
20-04-2011, 16:17 #18Member
- Registered
- 18/02/05
- Posts
- 106
- iTrader
- 0
- Mentioned
- 0 Post(s)
no votes
-
20-04-2011, 16:27 #19Member
- Registered
- 18/02/05
- Posts
- 106
- iTrader
- 0
- Mentioned
- 0 Post(s)
Dit begrijp ik toch ook niet zo goed. Als ik vraag wat er staat, moet ik daarna toch nogaltijd vragen wat het is, dus dan moet daar weer een if (vw instanceof ...) komen te staan, en daarin moet ik dan afvragen als het een 1 of 2 is qua variabele ( speler 1 of 2) wat hij heeft meegekregen. En dan moet ik nog afvragen als hij een witte of een rode achtergrond heeft.
Dus dan wordt het nog een redelijk lange code, en een soep.no votes
-
20-04-2011, 16:41 #20Member
- Registered
- 18/02/05
- Posts
- 106
- iTrader
- 0
- Mentioned
- 0 Post(s)
als ik het goed begrijp moet het dan zo:
private void paintStukken (Graphics g2) // hier wil ik de stukken tekennen
{
for (int i=0; i<8;i++)
{
for (int j=0; j<8;j++)
{
int x = breedte/2 + i*breedte;
int y = breedte/2+ j*breedte;
Schaakstuk vw = l.getSchaakstuk(i,j);
hier moet ik dan de speler opvragen, maar dit is voor iedere classe verschillend?
if ((i+j)%2 ==0)
{
Image image = Toolkit.getDefaultToolkit().getImage("hier moet dan het schaakstuk+welkespeler+welkeachtergrond in komen te staan?");
g2.drawImage(image, x, y, breedte,breedte , null);
}
else
{
Image image = Toolkit.getDefaultToolkit().getImage("hier moet dan het schaakstuk+welkespeler+welkeachtergrond in komen te staan?");
g2.drawImage(image, x, y, breedte,breedte , null);
}
}
}
}
Maar ik weet dus niet wat ik dan moet zetten op de stukken waar ik tekst heb geschreven.no votes
-
21-04-2011, 10:08 #21Member
- Registered
- 20/09/04
- Location
- Kortrijk / Gent
- Posts
- 7,177
- iTrader
- 1 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 3/43
ter verduidelijking: ik heb ook de code in de jar file niet gezien.
Tenzij de move controls in de klasse zelf zitten, is er echt geen reden om een aparte klasse per stuk aan te maken. Zeker omdat er echt geen nieuw schaakstuk zal bijkomen ofzo in het volgend jaar.
Je doet gewoon iets in de aard van:
rooster[7][5] = new Schaakstuk("Paard", "Zwart");
//zwart kun je ook vervangen door boolean en paard door een int die gedefinieerd is door een final constante bijvoorbeeld
Om te tekenen doe je dan gewoon:
Schaakstuk stuk = rooster[x][y];
String backColor = getBackColor(x,y); //geeft bijvoorbeeld 'OnWhite' of 'OnBlack' terug afhankelijk van x en y
String filename = stuk.getType() + stuk.getColor() + backColor +".jpg"';
Die filename is dan bijvoorbeeld = 'PaardZwartOnWhite.jpg'
De enigste reden om verschillende klassen te maken in dit geval is als je verschillend gedrag implementeert. Dit zou dus de move controls kunnen zijn. In dat geval inderdaad overerving, maar dat verandert niets aan de code hierboven. (je moet nog steeds de hoofdklasse 'Schaakstuk' gebruiken hier en niet de subklasse)no votes
-
21-04-2011, 10:40 #22Member
- Registered
- 18/02/05
- Posts
- 106
- iTrader
- 0
- Mentioned
- 0 Post(s)
oke, ja die nieuwe classen, dat moet ik er wel in zetten. Omdat ik dit zo geleerd heb op school.
Het is misschien niet echt nodig in dit project, maar ik moet wel laten zien dat ik dit kan.
Nogmaals bedankt voor de hulp!no votes
-
21-04-2011, 10:55 #23Member
- Registered
- 18/02/05
- Posts
- 106
- iTrader
- 0
- Mentioned
- 0 Post(s)
hierbij krijg ik de fout : Schaakstuk is abstract; cannot be instantiated
rooster[1][0] = new Schaakstuk("Pion",1);no votes
-
21-04-2011, 10:57 #24Member
- Registered
- 18/02/05
- Posts
- 106
- iTrader
- 0
- Mentioned
- 0 Post(s)
ja dat is natuurlijk omdat ik dat in die class heb gedefinieerd.
abstract public class Schaakstuk
{
....
Maar dat moet toch als je erving gaat toepassen?no votes
-
21-04-2011, 13:27 #25Member
- Registered
- 29/03/10
- Location
- Temse
- Posts
- 51
- iTrader
- 1 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 1/1
Niet noodzakelijk, alleen als je klasse echt MOET geërfd worden.
Zoals in het voorbeeld dat ik gaf:
pion/koning/toren ... die overerven van schaakstuk, je wilt dat ieder van deze implementaties de method 'controleerMove' bevat (dit is eigen aan schaakstuk), maar je kan uiteraard geen default implementatie geven in de class schaakstuk zelf. Daarom ga je de method abstract maken (en dus ook de class). Andere methods in 'schaakstuk' kunnen wel default geïmplementeerd worden.
Abstract Methods and Classes (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritance)
En natuurlijk kan je ook niet-abstracte classes overerven; eenvoudigste voorbeeld is de class Object -> is niet abstract (Object API ), maar toch erft ieder object hiervan
Not every story has explosions and car chases. That's why they have nudity and espionage.no votes
-
21-04-2011, 15:13 #26Approved 9-lifer
- Registered
- 27/08/04
- Location
- Leuven
- Posts
- 930
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 11/38
Je bent nu beide oplossingen aan het mixen. Je zal moeten kiezen:
ofwel ga je voor een algemene klasse SchaakStuk (en geen subklassen Pion, Paard ...) en dan mag SchaakStuk niet abstract zijn
ofwel ga je voor overerving met superklasse SchaakStuk die abstract is en subklassen Pion, Paard ... SchaakStuk mag je dan natuurlijk niet instantieren, maak dan een concrete Pion, Paard enz aan.no votes
-
21-04-2011, 15:19 #27Member
- Registered
- 20/09/04
- Location
- Kortrijk / Gent
- Posts
- 7,177
- iTrader
- 1 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 3/43
Inderdaad.
Dan is uw tabel (rooster) van het type 'Schaakstuk', maar steek je daarin subklassen.
Maw, rooster[1][0] = new Pion("Zwart")
En ben je zeker dat de leraar dit perse wilt?
Zoals gezegd, ik heb de code niet bekeken, maar ik vermoed dat de logica van movement niet in deze klassen zit? Indien je dat niet van plan bent, komt het wel redelijk raar over om subklassen te hebben die op geen enkel vlak verschillend zijn buiten de naam van de klasse.
Stel dat je bijvoorbeeld de klasse 'Wagen' hebt.
Indien je veel variabelen en specifiek gedrag gaat implementeren voor specifieke wagens, dan is het normaal dat je met overerving werkt.
Als je echter enkel het merk en model wil bijhouden, dan heb je één klasse Auto met de variabelen 'merk' en 'model' die je gewoon meegeeft aan de constructor.
Mocht je in dat laatste geval voor elk mogelijk model en merk een klasse moeten gaan aanmaken die uiteindelijk niets van variabelen heeft ...no votes
-
21-04-2011, 18:07 #28Member
- Registered
- 18/02/05
- Posts
- 106
- iTrader
- 0
- Mentioned
- 0 Post(s)
Het enigste wat de docent wil is een werkend spel dat ik zelf heb gemaakt op het einde van het semester. Maar ik dacht gewoon zelf dat erin te stoppen omdat we dat ook bij iets anders hadden gezien in de les. Dus het moet er helemaal niet in.
Als ik het goed begrijp dan, zijn al die classes niet nodig omdat enkel de beweging van de stukken anders is. En dit kan ik dan in mijn controller zetten. Dmv die instance off pion (dat hij dan de variabele pion heeft meegekregen). En dan zeggen welke stappen een pion mag doen.
Die manier lijkt me dan ook beter, ik had er zo niet over nagedacht.no votes
-
22-04-2011, 00:28 #29Member
- Registered
- 22/10/02
- Location
- Mechelen
- Posts
- 570
- iTrader
- 2 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 1/4
De simpelste oplossing is bijna altijd de beste. Maar dat neemt ni weg dat je mogelijk ooit wel specifiek gedrag aan je stukken gaat willen toekennen waardoor je wel liever overerving zou toepassen. Maar da's eigenlijk al bij al nog redelijk snel aangepast als het nodig zou blijken. Ik denk dat eender welke approach daarin wel ok is, nu toch.
Wat ik nog zou aanraden voor het eerste geval zonder overerving is ergens een "enum" aan te maken waar je de namen van je stukken in stockeert. Bv. als public inner class in je Schaakstuk class. Je kan zo'n enum een beetje vergelijken met een collection van constanten. Dit heeft dan wel het voordeel dat het een type heeft zoals elke andere class. Op die manier kan je dan verplichten in je constructor om een enum type mee te geven. Anders kan je een Schaakstuk maken dat "Koe" of dergelijke nonsens heet.
Dit laatste is imo wel een "nice to have" terwijl je functionaliteit zelf uiteraard een "must have" is. Groot verschil tussen de twee. Maar het laat wel zien aan je leraar dat je aan meerdere dingen denkt dan zuiver functioneelCode:public enum Voorbeeld { VOORBEELD1("Voorbeeld 1"),VOORBEELD2("Voorbeeld2"); //... //enum constructor Voorbeeld(String naam){ this.naam = naam; } private String naam; public String getNaam() { return naam; } } public class GebruiksVoorbeeld{ private String gebruiksNaam; //hier verplicht je jezelf van een Voorbeeld enum object mee te geven. public GebruiksVoorbeeld(Voorbeeld voorbeeld){ this.gebruiksNaam = voorbeeld.getNaam(); } }
Ik denk ook dat je met gebruik van gewone arrays wel goed zit. Je ziet dat zo vaak niet meer in de praktijk omwille van Collections, wat tal van voordelen oplevert. Maar natuurlijk ook weer extra overhead en gedrag per soort collectie. Dat is natuurlijk niet nodig.
1 ding nog. Als je code post, wat een goeie zaak is, zet deze dan in de "code" tags, da's gemakkelijker om te lezen.Asus Maximus Formula X38 (Rampage BIOS)
Intel Q6600 @ 3700Mhz, Asus Geforce GTX 680
Win7 / Ubuntu, Intel SSD 520 2x120Gb RAID 0
Custom Watercoolingno votes
-
22-04-2011, 08:37 #30Member
- Registered
- 29/03/10
- Location
- Temse
- Posts
- 51
- iTrader
- 1 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 1/1
Voordeel van een enum is ook dat je die in een switch kunt gebruiken, kan je die if-structuur wat opkuisen
Not every story has explosions and car chases. That's why they have nudity and espionage.no votes

