slide puzzel java

Status
Niet open voor verdere reacties.

Degano

Gebruiker
Lid geworden
2 nov 2014
Berichten
12
Beste

ik zou graag een slide puzzel willen maken om mee verder te experimenteren.
Maarja hoe begin je aan zo'n simpel spelletje ?
 
eerst uitdenken hoe zo'n spel in elkaar zit.
- hoeveel vlakken wil je.
- 1 vlak moet altijd leeg zijn.
- vlakken moeten kunnen schuiven.
- een vlak kan altijd maar 1 kant op schuiven (richting het lege vlak)
- elk schuifbaar deel moet een ID hebben en coordinaten.
- etc..

daarna code snippets opzoeken voor bijvoorbeeld:
- schuif animatie
- functie om coordinaten te vergelijken
- etc..
 
staat er ook ergens waar er commentaar bijstaat wat het stuk code doet
ben nog niet echt pro in java
 
[edit]
De volgende tutorials kjken kan geen kwaad:

http://mi-soft.nl/tutorials.php?page=java/Arrays
http://mi-soft.nl/tutorials.php?page=java/Loops

[/edit]

ScorpionX zit hier op het goede pad! Eerst zal je moeten denken wat moet er allemaal gebeuren (nu heeft ScorpionX dat allemaal al gedaan).
De volgende stap is: Hoe?

We beginnen met:

- hoeveel vlakken wil je.
- 1 vlak moet altijd leeg zijn.

Nou ik ga even simpel beginnen met 9.
Waar gaan we die 9 opschrijven? op papier? Nee. In een variabele? Beter :)

We beginnen dus heel simpel met het aanmaken van een variabele:
[JS]int aantalVlakken = 9;[/JS]


We gaan er nu vanuit dat "aantalVlakken" altijd netjes te verdelen is over een bord.
Een stukje controle kan je onderaan de post lezen onder het kopje "AantalVlakken zetten"


ScorpionX komt nog met het volgende aanzetten:
- vlakken moeten kunnen schuiven.
- een vlak kan altijd maar 1 kant op schuiven (richting het lege vlak)
- elk schuifbaar deel moet een ID hebben en coordinaten.

Daar kunnen we in ieder geval vast 1 ding uit halen voor nu. Het woordje coordinaten.
Hoe gaan we in hemelsnaam bijhouden waar welk tegeltje ligt?

Ik teken eventjes een bord:

1 2 3
4 5 6
7 8

Nu gaan we even alle wiskunderegels aan onze laars lappen en zeggen we dat linksboven de assen beginnen. Oftewel het nummer 1 staat op plek 0,0 (0x 0y).
2 staat dan op 1x, 0y (1,0).

Dit lijkt mij erg veel op een lijst met nummers.
We kunnen nu zeggen dat het bord een array moet zijn van 3 lijsten (1,2,3) (4,5,6) (7,8,9).
Dit gaan we even doen met:
[JS]int[] bord = new int[3];[/JS]
Nu hebben we een array die 3 nummers kan vasthouden.
We wilden echter een array die 3 lijsten van 3 nummers kon vasthouden. En daar wordt het even ingewikkeld. Nu gaan we over op "multidimensionale arrays".
We gaan het eens even proberen:

[JS]int[][] bord = new int[3][3];[/JS]

Nu hebben we een lijst van 3 lijsten met 3 cijfers. (We vullen de 3 zelf weer aan, dit kan simpeler met het codestukje bij "uitbreidbaar bord" onder aan deze psot)
Dit gaan we even controlleren en daarom vullen we de lijsten met data(dit moet in de constructor):

[JS] bord[0][0] = 1;
bord[0][1] = 2;
bord[0][2] = 3;
bord[1][0] = 4;
bord[1][1] = 5;
bord[1][2] = 6;
bord[2][0] = 7;
bord[2][1] = 8;
bord[2][2] = 9;[/JS]

Vervolgens moeten we de lijst laten uitprinten en dat kan met het volgende stukje code:

[JS] void printBord(int[][] bord){
//voor elke rij in bord
for(int[] i: bord){
//voor elk nummer in elke rij (van het bord)
for(int ii: i){
// print het nummer gevolgd door een spate
System.out.print(ii + " ");
}
//na elke rij ga je naar de volgende regel
System.out.println();
}
}[/JS]

Vervolgens plaatsen we in de constructor nog de volgende regel:

[JS]printBord(bord);[/JS]

En als het goed is wordt er nu keurig hetvolgende afgedrukt:

1 2 3
4 5 6
7 8 9

Nu is het een kwestie van proberen om de nummertjes aan te passen. Veranderen ze op het bord mee? Prima!:thumb:


Dat was me nogal wat! nu de rest...

Wat moeten we nog bedenken voordat we verder kunnen (dat mag u zelf even doen voordat we verdergaan)?

  1. Hoe gaan we schuiven?
  2. Hoe gaan we de nummers aan plaatjes koppelen op een slimme manier? (en ja, er is een slimme manier ;))

Dan nog enkele vragen die in u op kunnen komen:

Waarom werken we in hemelsnaam allemala met println's?

We werken met println's omdat we de basis van de applicatie goed willen hebben. Alles moet straks te regelen zijn met een simpel commando in de constructor.
Deze kunnen we dan later omzetten in GUI elementen.​


Dus, voordat ik verderbouw (met u) aan de applicatie moet u even het volgende doen(tenminste, als u nog meer hulp nodig heeft):

- Bovenstaande vragen beantwoorden
- Oefenen oefenen oefenen met de code die ik gegeven heb.
- Probeer al eens wat uit te breiden! voeg bijv. de detectie eens toe die kijkt of een aangrenzend vakje leeg is.

ps: de code (incl ingewikkeld stuk) zit als bijlage erbij: Bekijk bijlage main.txt



De code hieronder moet je alleen lezen nadat je bovenstaande COMPLEET begrijpt. (test ook eens met aantalvlakken = 16 en rijen van 4)

De code hieronder is wat geavanceerder en zal het bord dynamisch maken. Dit betekend dat je straks door simpelweg de variabele "aantalVlakken" te veranderen een compleet gevuld bord krijgt !

AantalVlakken zetten
Om het programma nog wat mooier te maken willen we hem eigenlijk laten controleren of het aantal vakken wel geplaats kan worden. Dit kunnen we doen met een methode:

[JS] int setAantalVlakken(int aantal){

double wortel = Math.sqrt(aantal);
if(wortel % 2 == 0){
return aantal;
}else{
return 9;
}
}[/JS]

Het zetten van de variabele kan dan als volgt:

int aantalVlakken = setAantalVlakken(9);

Uitbreidbaar bord

Aangezien we net al aantalVlakken berekend hebben (en we weten dat dit op het bord past) kunnen we de grote van de rijen bepalen door de wortel ervan te nemen.
Dat doen we als volgt:

[JS]int[][] maakBord(){
//pak de wortel en maak er een int van, dit gaat goed omdat aantalvlakken altijd een int is.
// die controle doen we namelijk met setAantalVlakken
int rijLengte = (int) Math.sqrt(setAantalVlakken(getAantalVlakken()));
//maak de array met juiste rijlengte
int[][] array = new int[ rijLengte][rijLengte];
return array;
}[/JS]

We kunnen het bord dan voor nu (om te testen) ook dynamisch vullen met het volgende stukje code:
[JS] void vulBord(){
//voor elke rij in bord
int counter = 1;
for(int rij = 0; rij < bord.length; rij++){
//voor elk nummer in elke rij (van het bord)
for(int positie = 0; positie< bord[rij].length; positie++){
//zet het nummer in de array en verhoog het nummer
bord[rij][positie] = counter;
counter ++;
}
//volgende rij
}
}[/JS]
 
Laatst bewerkt:
bedankt voor een goede omschrijving van de code. Maar ik krijg hem niet grafisch op beeld ik heb dus in mijn init geprobeert om hem te painten door middel van die klasse aan te spreken hij voert dan de code uit in mijn output maar niet grafisch
is hier ergens een oorzaak voor ik ben gewent om met C# te programmeren en het is blijkbaar een grote aanpassing naar java lol

Alvast bedankt
 
Laatst bewerkt door een moderator:
Beste

Ik heb die tutorials bekeken en het meeste lijkt op C# wat het dus ook wel gemakkelijker maakt.

Maar heb nu wat staan prutsen met die puzzel
en heb nu nog 3 problemen

Ik heb dus een textfield waar ik een fotonaam kan ingeven en dan met een button word het spel dan gestart
nu het probleem is als ik het spel start kan ik niet meer schuiven, ik denk dat het komt omdat al die code in mijn actionperformed staat maar dit weet ik dus niet zeker.
heb al paar dingen geprobeerd maar dan krijg ik telkens exceptions.

2de is shuffle ik heb dus een methode shuffle gemaakt maar als ik die toepas dan krijg ik ook exceptions dus denk dat ik daar iets fout heb gedaan
en 3de is kan ik ergens een melding voorzien dat je gewonnen hebt.

heb dit eerst hier getypt if (labelY == buttonY && (labelX - buttonX) == size.width ){gewonnen()}

maar dit bleek dus niet coorect te zijn.

dit is mijn netbeans project

https://app.box.com/s/n82pd8nciahc7z0xqscy
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan