Archief - [PROG][JAVA] Schuifpuzzel

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

6sic6

Legacy Member
lo,

ben bezig aan een project voor hier op school ... schuifpuzzel ineen steken (zoiets dus).
Had dit al gedaan met behulp van cellen en absolute posities, nu blijkt het verplicht te zijn om buttons te gebruiken :naughty: :naughty: .
Wat is nu het doel ?
Schuifpuzzel maken die een image load, deze inleest en in een zelf op te geven aantal stukken deelt (3x3 of 4x4), deze aan de buttons vastzet en ze vervolgens door elkaar haalt. Verder ook een teller van het aantal moves en een reset knop. No big deal :applause: .

Nu had ik dat al met de cellen gedaan met cijfers erin, nog nix van afbeeldingen e.d. dus nu heb ik een paar vraagjes:

Knoppen 1
Als je op een knop drukt, hoe kan je dan opvragen dat de ruimte ernaast leeg is, zodat de knop dus kan verplaatst worden. De lege ruimte is dan ook een knop maar dan invisible. Bij de cellen gebruikte ik de afstand van knop tot knop ... maar dit is nu niet meer mogelijk, ik moet dus op de een of andere manier opvragen dat de knop links, rechts, boven of onder invisible is :help:. Heb me er al uren op suf gezocht, maar vindet maar niet.

Knoppen 2
Verder ... omdat het aantal stukken waaruit de puzzel bestaat variabel is, zal ik dit maar beter als klasse maken? Zodat de aantal knoppen variabele zijn en zo de gridlayout wordt aangepast en het gepaste aantal knoppen erop staan. Is gridlayout hier het beste voor ofniet ?

Reset
Om de knoppen door elkaar te halen een toepassing op de random generator gebruiken? Met de random-output als de positie van de knop op het raster ?

al bedankt :bow:
l8erz

.Acku.

Legacy Member
GridLayout met JButtons, gebruik gewoon setVisible() en isVisible().
Raster klasse, ja waarom niet he
Math.random() zal zeker volstaan

Kn0t

Legacy Member
Doodgewoon random posities genereren voor je knoppen kan er voor zorgen dat je spelbord in een onoplosbare toestand komt. Je moet gewoon een x aantal random legale zetten doen (het lege vakje van plaats verwisselen met een aanliggend vakje dus).

6sic6

Legacy Member
.Acku. zei:
GridLayout met JButtons, gebruik gewoon setVisible() en isVisible().
Raster klasse, ja waarom niet he
Math.random() zal zeker volstaan

Net opnieuw begonne. Code moet dus eigelijk als volgt zijn (effe in mensentaal, want ik weet begot ni welke klasses ik kan gebruiken)

Code:
if ((e.getActionCommand().equals("ingedrukte knop")) && (de knop links, rechts, boven of onder is de onzichtbare(lege) knop)

dan mogen beide knoppen verwisselen

Iemand een idee hoe dit te doen? Hoe ik dus de positie van de lege knop opvraag ... ?

6sic6

Legacy Member
Heb het dan maar als volgt gedaan ... weet wel niet of die Location en getSource codes kloppen want deze klotepc heeft maar J2SE 1.4 en nog niet die 1.5 (5.0), en die is nodig om deze klasses aan te roepen. Die downloads op de java site werken ni wegens site-onderhoud, dus ik kan het er ni opzetten nu. Ben ik goed bezig zo ? Filechooser, imageslicer e.d. heb ik er wel vantusse gelate zodat het wa compact is. Als je het kan verzetten krijg je de boodschap, maar kweet dus ni of het werkt ... nog wa wachte tot den 1.5 opnieuw online staat

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class venster2x2 extends JFrame implements ActionListener
{
	private JTextField score;
	private JLabel tekst;
	private JButton knop1, knop2, knop3, knop4; 
	public venster2x2()
	{ 
		super("Schuifpuzzel");
		Container c = getContentPane();
		c.setLayout(new GridLayout(3,2));
		knop1 = new JButton("1");
		knop1.addActionListener(this);
		knop2 = new JButton("2");
		knop2.addActionListener(this);
		knop3 = new JButton("3");
		knop3.addActionListener(this);
		knop4 = new JButton("4");
		knop4.setVisible(false);
		knop4.addActionListener(this);
		score = new JTextField(5);
		tekst  = new JLabel(" en ");
		tekst.setVerticalTextPosition(AbstractButton.CENTER);
		tekst.setHorizontalTextPosition(AbstractButton.CENTER);
		c.add(knop1);
		c.add(knop2);
		c.add(knop3);
		c.add(knop4);
		c.add(tekst);
		c.add(score);
        setSize(400, 400); 
		show();     
    }
    public void actionPerformed(ActionEvent e)
    {
    	int controleX = getSource().getLocationOnScreen.x - knop4.getLocationOnScreen.x;
    	int controleY = getSource().getLocationOnScreen.y - knop4.getLocationOnScreen.y;
    	if((controleX == knop1.width()) && (controleY == knop1.height()))
    	{
    		JOptionPane.showMessageDialog(null, "Goed", "Geldige zet", JOptionPane.PLAIN_MESSAGE);
    	}
    	else
    	{
    		JOptionPane.showMessageDialog(null, "Fout", "Ongeldige zet", JOptionPane.ERROR_MESSAGE);
    	}
    }
    public static void main(String[] args)
    {
    	venster2x2 venster = new venster2x2();
    }
}

forloRn_

Legacy Member
Zit je toevallig op Groep T? Heb vorig jaar ook zoiets moeten maken, en dat is uiteindelijk een redelijk groot programmaatje geworden (als je alle iteratiestappen volgt, tenminste). Als je de knoppen continu wilt laten verschuiven in plaats van discreet te laten verspringen, moet je met threads werken bijvoorbeeld.

Anyway, die code hierboven zal niet werken. Je moet bijvoorbeeld e.getSource() aanroepen, en bovendien nog downcasten naar een JButton (of beter nog een JComponent, als je beslist om JButton te vervangen door een JLabel bijvoorbeeld). Je bent ook een aantal haakjes vergeten achter getLocationOnScreen. Je GridLayout moet je ook kleiner maken.

De width en height van een JButton zijn altijd positief, terwijl controleX en controleY hierboven negatief kunnen zijn, dus je code zal misschien werken voor bepaalde posities van de knoppen, maar voor andere weer niet. Ik zou ook niet vertrouwen op getLocationOnScreen() om conclusies te trekken uit de posities van de knoppen maar zelf de positie bijhouden. De tegeltjes van mijn schuifpuzzel waren instanties van de klasse Tile, die op zich een subklasse was van JButton, en hielden zelf hun posities bij.

Ik zou je de code van mijn schuifpuzzel willen geven, maar ik heb ze niet meer in digitale vorm.

6sic6

Legacy Member
Niet groep T neen, KaHo Sint-Lieven in Gent, departement Industrieel Ingenieur 2de Kan om volledig te zijn :)
Anyway, vandaag ga ik nog wat verder doen... heb je er echt nix meer van staan ? Any help would be appreciated!

MacK

Legacy Member
Ha, een kaho'er hier. Nu weten we van de eerste keer wat we volgend jaar moeten doen bij ict voor industrieel ir..

kewl :-) , maar kheb toch liever C# :'(

6sic6

Legacy Member
update: bijna klaar, enkel nog wa opkuis van de code en commentaar bijzette.
Hier is de source ... is kijken alsjebliiiief :p :D :p :baard:

Zit wel nog met 2 problemen:

1.
Als ik op een knop klik, verspring hij de eerste keer goed, als ik op diezelfde knop een tweede keer klik dan krijgt hij plots een andere figuur, fout zit erges bij AanmaakKnoppen.java vanaf lijn 139. :eek: :eek: :eek:

2.
Ik geraak niet aan de score (zie SchuifPuzzel.java, lijn 161) Heel vreemd, of zijn men ogen nu al zo dwaas dat ik zo een lompe fout kan maken :doh:

Iemand een idee ? Dan kan ik het verder afwerken

Merrrrciiiii

6sic6

Legacy Member
fout komt dus voort uit de random generator, ik heb nu twee 1-dim arrays, eentje voor de rijen, eentje voor de kolommen die elk apart worden geshuffeld. Hierdoor gaan automatisch de andere mee wijzigen (als je de code bekijkt zie je't wel wat ik bedoel).
Iemand een idee hoe je een 2-dim array kunt shufflen ? Als ik dat vind is het probleem opgelost !!!!!
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan