Page 2 of 4 First 1234 Last

Thread: Schaken in java

  1. #16

    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  

  2. #17

    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  

  3. #18

    Registered
    18/02/05
    Posts
    106
    iTrader
    0
    Mentioned
    0 Post(s)
    Quote Originally Posted by MilM View Post
    This quote is hidden because you are ignoring this member. Show
    Een eigen klasse aanmaken voor elk stuk zou ik sowieso niet doen.
    Ik zou gewoon één klasse 'Stuk' (of 'Piece' of 'Schaakstuk' of 'ChessPiece') aanmaken met daar gewoon een variabale voor welk stuk het is en welke kleur.

    Dat is voldoende en het properste in mijn ogen.
    Hoe zou dat dan werken? Je moet toch de getters enz aanpassen als het andere stukken zijn, dit doe je dan toch in andere classen?
    no votes  

  4. #19

    Registered
    18/02/05
    Posts
    106
    iTrader
    0
    Mentioned
    0 Post(s)
    Quote Originally Posted by MilM View Post
    This quote is hidden because you are ignoring this member. Show
    Het is inderdaad een boeltje

    Ergens moet je beslissen in hoeverre je korte code wilt of iets langere (meer class gericht), maar dit is wat overdreven.

    Zeer korte code kan bijvoorbeeld het volgende zijn:
    1. Je maakt een 2D tabel zoals je al hebt
    2. In uw 2d tabel steek je nummers. 0 = leeg veld, 1 = zwarte pion, 2 = zwart paard, 3 = zwarte loper, ..., 7 = witte pion, 8 = ...
    3. En nu maak je een simpele dubbele for lus die gewoon op elke positie de image aanmaakt. Je kan bijvoorbeeld W = witte achtergrond nemen en Z = zwarte achtergrond nemen en als tabel[2][3] = 2, dan weet je dat het een witte achtergrond is (3de rij, 4de kolom is altijd wit) en dat je dus image '2W' moet inladen (image 2W is dan een zwart paard op een witte achtergrond)




    Dat is voldoende en het properste in mijn ogen.
    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  

  5. #20

    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  

  6. #21

    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  

  7. #22

    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  

  8. #23

    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  

  9. #24

    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  

  10. #25
    Arboris's Avatar
    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  

  11. #26
    NeverwinterX's Avatar
    Registered
    27/08/04
    Location
    Leuven
    Posts
    930
    iTrader
    0
    Mentioned
    0 Post(s)
    Reputation
    11/38
    Quote Originally Posted by cuinhel View Post
    This quote is hidden because you are ignoring this member. Show
    hierbij krijg ik de fout : Schaakstuk is abstract; cannot be instantiated
    rooster[1][0] = new Schaakstuk("Pion",1);
    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  

  12. #27

    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  

  13. #28

    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  

  14. #29

    Registered
    22/10/02
    Location
    Mechelen
    Posts
    570
    iTrader
    2 (100%)
    Mentioned
    0 Post(s)
    Reputation
    1/4
    Quote Originally Posted by cuinhel View Post
    This quote is hidden because you are ignoring this member. Show
    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.
    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.

    Code:
    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();   
            }
        }
    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 functioneel

    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 Watercooling
    no votes  

  15. #30
    Arboris's Avatar
    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  

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  

Log in

Log in