Behöver hjälp att komma igång med programmering av Schack-spel i Java

Permalänk
Medlem

Behöver hjälp att komma igång med programmering av Schack-spel i Java

Så här jag har tänkt hitills.
Klasser: Game, Board, Square, Piece, Rook, Pawn, Knight, Bishop, Queen & King.
Game består av en instans av board, board består av en array av square, square består av en piece (eller?).
Sedan ärver alla pjäserna av klassen Piece.

Eftersom jag inte är van vid programmering och nyligen har börjat lära mig Java så är jag osäker på hur och var jag ska börja och hur jag ska koda vissa moment.

Exempelvis. Brädet består som sagt av en lista av rut-objekt, hur får jag elementen (dvs. rutorna) att vara växelvis svarta, växelvis vita?
Hur kan jag göra så att rut-listan kan innehålla pjäser?

Jag har hitills bara erfarenhet av JFrame men tänkte försöka använda Graphics2D, eventuellt försöka hitta någon Schack-font till pjäserna. Om rutan är en helt vit/svart ruta, hur får jag då in pjäserna på den och hur skulle jag kunna designa Square klassen med tanke på koden?

En annan grej är val av pjäser. Alltså, om jag klickar på en pjäs på schackbrädet så ska den väljas och vara redo att flyttas. Hur kodar jag den delen? Ska jag programmera in det i samband med en MouseListener?

...och en sista fråga, spelet har ju två spelare, hur kodar jag så att en spelare endast styr sina pjäser under sin tur?

Kommer inte på några fler frågor just nu, har knappt börjat själva programmeringen men kom gärna med några ideér/tips om ni vill.

Permalänk
Medlem
Skrivet av Substansen:

...och en sista fråga, spelet har ju två spelare, hur kodar jag så att en spelare endast styr sina pjäser under sin tur?

Lämpligtvis har du en egenskap belongs eller player i klassen piece som håller reda på vem som äger vilken. När du sedan ska välja en så kollar den helt enkelt om den playern äger den pjäsen.

Eftersom ett schackbräde alltid har samma antal rutor blir det inte så farligt svårt att koda din square klass, åtminstone i teorin. Ett schackbräde ändrar ju heller aldrig mönster så enklast borde ju vara att hårdkoda hur det ser ut.

Och om du är ny med Java kanske det är enklast att göra ett textbaserat utan mönster? Om du nu nödvändigtvis inte har så lång tid på dig och måste lära dig att rita grafik i java fort.

Visa signatur

Citera eller nämn gärna mig (@ToJa92) om du svarar på något jag skrivit.
Uppskattar du eller blir hjälpt av ett inlägg jag skrivit är jag tacksam om du gillar det.

Permalänk
Medlem
Skrivet av ToJa92:

Lämpligtvis har du en egenskap belongs eller player i klassen piece som håller reda på vem som äger vilken. När du sedan ska välja en så kollar den helt enkelt om den playern äger den pjäsen.

Smart, och en setPlayer metod då som gör att man kan välja vilken spelare pjäsen tillhör för varje pjäs?

Skrivet av ToJa92:

Eftersom ett schackbräde alltid har samma antal rutor blir det inte så farligt svårt att koda din square klass, åtminstone i teorin. Ett schackbräde ändrar ju heller aldrig mönster så enklast borde ju vara att hårdkoda hur det ser ut.

Mjo, jag tänker på hur man ska få rutan att hålla en pjäs?
Just nu har jag Square[] board = new Square[64] i Board klassen samt Piece[] piece = new Piece[1] i Square klassen. Men hur väljer jag då i Board klassen vad som ska finnas i en ruta i rut-listan?

Skrivet av ToJa92:

Och om du är ny med Java kanske det är enklast att göra ett textbaserat utan mönster? Om du nu nödvändigtvis inte har så lång tid på dig och måste lära dig att rita grafik i java fort.

Nja, jag måste ha grafik så... inte mycket val. Om jag använder mig av Rectangle2D och gör så att ett Square objekt ser ut som en vit ruta, borde inte listan av rut-objekt då helt enkelt se ut som 64 vita rutor eller en stor vit ruta? Problemet är hur jag ska få varannan ruta svart.
Kan man kanske göra en metod som sätter färgen på rutan i Square klassen och sedan i Board klassen köra en enhanced for-loop som sätter färgen till svart för varannat element i listan?

Uppskattar om fler har lust att dela med sig av sina ideér

Permalänk
Medlem

Antar att slutresultat kommer att likna:

Frågan är då om det inte blir smidigast att använda en två-dimensionell array som sedan innehåller objekt av typen piece.

Ett schackbräde är 8x8, dvs 64 rutor. Lämpligt vore då kanske:
Piece[] board = new Piece[8][8];

[0,0] blir då vilken pjäs som är i övre högra hörnet, i bilden ovan ett torn(även i ditt slutgiltiga spel ett torn). [1,0] blir längst till vänster, ett under hörnet(bonde), osv...

Sedan när du ska rita ut pjäserna loopar du helt enkelt igenom din board, och med någon lämplig metod i piece får du reda på vilken pjäs det är och ritar rätt bild.

Om vi sedan säger att varje ritad schackruta kommer att vara 32x32 pixlar så kommer den längst upp till vänster motsvara [0,0] osv.

Detta är någonting jag bara kom att tänka på sådär, finns säkert vettigare lösningar men jag är ingen proffsprogrammerare så detta är vad jag kunde klura ut

Visa signatur

Citera eller nämn gärna mig (@ToJa92) om du svarar på något jag skrivit.
Uppskattar du eller blir hjälpt av ett inlägg jag skrivit är jag tacksam om du gillar det.

Permalänk
Medlem
Skrivet av ToJa92:

Antar att slutresultat kommer att likna:
http://upload.wikimedia.org/wikipedia/commons/8/83/Utg%C3%A5n...

Frågan är då om det inte blir smidigast att använda en två-dimensionell array som sedan innehåller objekt av typen piece.

Ett schackbräde är 8x8, dvs 64 rutor. Lämpligt vore då kanske:
Piece[] board = new Piece[8][8];

[0,0] blir då vilken pjäs som är i övre högra hörnet, i bilden ovan ett torn(även i ditt slutgiltiga spel ett torn). [1,0] blir längst till vänster, ett under hörnet(bonde), osv...

Sedan när du ska rita ut pjäserna loopar du helt enkelt igenom din board, och med någon lämplig metod i piece får du reda på vilken pjäs det är och ritar rätt bild.

Om vi sedan säger att varje ritad schackruta kommer att vara 32x32 pixlar så kommer den längst upp till vänster motsvara [0,0] osv.

Detta är någonting jag bara kom att tänka på sådär, finns säkert vettigare lösningar men jag är ingen proffsprogrammerare så detta är vad jag kunde klura ut

Hmm, tänkte först använda en två-dimensionell array förut men det känns mer objekt orienterat med en array av objekt. Känns en aning lättare att hålla koll på arrayens index istället för två koordinater :).

Har nu kommit på några metoder jag skulle kunna ha. Om jag har en metod i Square för att lägga till pjäser, hur kommer jag åt den i arrayen i Board?
Om jag har en ruta i Square[5], skriver jag bara ex. Square[5] = Square().AddPiece(King) eller hur kommer jag åt metoden i Square?

Sen måste jag använda design mönster. Jag stötte faktist på ett litet problem i Square där jag märkte att jag kunde använda mig av fabriksmönstret (factory pattern). Har du/ni några förslag på fler som skulle kunna användas rent logiskt i ett schack-spel?

Är det t.ex. möjligt att använda sig av Model-view-controller för att utforma spelet?
I såfall, hur utformar jag modellen? Tänker att jag har ju ett flertal olika klasser, går det bra att modellen består av flera klasser eller bör jag lägga ihop alla klasser i en och samma fil/klass?

Skulle gärna vilja ha lite förslag på hur jag kan bygga upp ett GUI till spelet, kan man göra det i separata klasser eller bör man göra det i de klasser jag redan har? Det ska se ut som på bilden ungefär

Permalänk

Känns som du vill att andra ska göra lite för mycket för att du ska lära dig programmera själv.

Några tips:
* Ta en sak i taget, tänk inte på alla problem direkt, utan ta ett problem först och lös det eller dela upp det i delproblem
* Rita upp alla klasser som behövs och alla attribut de ska innehålla, åtkomstmetoder (getPlayer() och setPlayer() om du har attributet player i din klass för pjäser) är underförstådda, har du ett attribut SKA du ha åtkomstmetoder för det
* Börja koda, sitt inte och tänk på vilka design patterns du kan använda såhär i början, du måste förstå hur olika patterns implementeras för att förstå dem och se om du kan ha någon nytta av dem i din kod
* Det är din kod, inte vår, skriv den du, kom med specifika frågor när du möter problem istället för att komma med en hög med frågor utan någon skriven kod, försök lösa de olika problemen så kommer du se att du klarar det utan att vi säger något

Jag har själv skrivit ett AI som spelar dam som spelas på samma bräde som schack, dina tankar om klasser och så är bra men börja försöka fylla dessa klasser med innehåll istället för att bara räkna upp dem, vad behöver varje klass veta?

Angående MVC, ja, du kan skriva ditt schackspel med MVC, men MVC säger inte att du ska ha EN modell, det säger att du ska separera modellen från presentationen och kontrollen. Du kan ha flera modeller med MVC och dina modeller är just de klasser du har som beskriver brädet, pjäserna och så vidare, din Board-klass modellerar ett bräde, det är precis det M:et i MVC står för.

Du kan heller inte se det som att en ruta består av en pjäs, en ruta kan innehålla en pjäs men den består inte av en pjäs. Däremot består ett bräde av ett antal rutor. Din uppdelning av pjäserna är riktigt bra, då kan du sätta saker som vilken spelare pjäsen tillhör och så i din Piece-klass och sen skriva funktionen för att flytta pjäsen i subklasserna.

Angående din array, dimensionen på din array spelar ingen roll gällande om den innehåller objekt eller inte, har du en klass som beskriver rutorna kommer din array för brädet att innehålla dessa objekt oavsett om den ser ut som board[][] eller board[].

Förstår dock inte ditt stycke efter det om arrayen i ditt sista inlägg. Säg att du har en klass som heter Board som beskriver ditt bräde och i spelet har du ett objekt av den klassen som heter board, då skulle en flytt av en pjäs kunna skrivas såhär från ruta i till ruta j:
board.getSquare(i).removePiece();
board.getSquare(j).addPiece(this);

Den koden ska självklart ligga i metoden för att flytta pjäsen i pjäs-klassen så därför skickar du in this som parameter till addPiece() eftersom this är magisk och alltid hänvisar till det objekt den skrivs i.

Lite hjälp på traven, men försök tänka efter en gång extra efter att du tagit en kaffepaus eller så innan du ställer frågor för ofta kan det räcka med lite vila från problemet för att se lösningen när man sätter sig igen sen. Har själv tagit ett antal kaffepauser på jobbet den här veckan av just den anledningen när allt verkat hopplöst och löst det direkt efter pausen.

Visa signatur

RTFM - vacker sak att säga till folk som ställer dumma frågor

Permalänk
Medlem
Skrivet av jcarlsson:

Vad behöver varje klass veta?

Din uppdelning av pjäserna är riktigt bra, då kan du sätta saker som vilken spelare pjäsen tillhör och så i din Piece-klass och sen skriva funktionen för att flytta pjäsen i subklasserna.

Förstår dock inte ditt stycke efter det om arrayen i ditt sista inlägg. Säg att du har en klass som heter Board som beskriver ditt bräde och i spelet har du ett objekt av den klassen som heter board, då skulle en flytt av en pjäs kunna skrivas såhär från ruta i till ruta j:
board.getSquare(i).removePiece();
board.getSquare(j).addPiece(this);

Den koden ska självklart ligga i metoden för att flytta pjäsen i pjäs-klassen så därför skickar du in this som parameter till addPiece() eftersom this är magisk och alltid hänvisar till det objekt den skrivs i.

Tack för tipsen! Du kanske ser de som att jag ber om färdig kod men så är inte fallet. Det är mer tankesättet jag ibland undrar över, hur man kan tänka när det gäller vissa saker. Fast det är lätt hänt att man vänder sig till ett forum när hjärnan står still :p.

Exempel är, vad behöver varje klass veta?
Du skrev att koden för att flytta en pjäs kan stå i klassen Piece, för mig känns det som att hur man flyttar en pjäs är orelevant för själva pjäsen, om man endast ser pjäsen dvs. Det blir istället relevant för brädet, där man 'kan' flytta en pjäs från en ruta till en annan.

Innan jag läste ditt exempel skrev jag metoden i Board klassen, där den först hämtar ett gammalt och ett nytt index för rutorna i arrayen som argument för metoden, sen tar den bort rutan i det gamla indexet, hämtar färg, typ av pjäs samt spelare (som är argument för att skapa en ny pjäs) och skapar en ny pjäs i det nya indexet.

Om man gör som du sa istället angående metoden att flytta en pjäs, hur får man då pjäsen att veta att det finns ett bräde?
Jag får bara "board cannot be resolved".

Även getSquare(i) skrev jag i Board av samma orsak som jag skrev movePiece där. getPiece() i Square där pjäsen skapas, osv.

Permalänk

Du måste ju berätta för pjäsen hur den kommer åt brädet, du måste alltså ha ett attribut i klassen Piece som heter board eller liknande och sen i Board-klassen har du din getSquare() och så.

Anledningen till att du ska ha metoden för att flytta pjäsen i pjäsklassen och inte i klassen för brädet är att du då definierar den i varje subklass, det är ju bara pjäsen som vet hur den får flytta, pjäsen vet vilken typ av pjäs den är, hur den typen kan röra på sig och så vidare. Sen får du självklart fråga brädet om pjäsen får flytta på det sätt den vill i brädets ögon, står någon i vägen och så vidare.

För några år sen skrev jag ett damspel i Java där programmet spelar själv och det är designat för att möta andra program i en tävling där vi hade tidsbegränsning och så vidare. Koden ligger uppe på nätet, kan leta upp länken om du vill se.

Visa signatur

RTFM - vacker sak att säga till folk som ställer dumma frågor