9 blokjes in plaats van 16 puzzel

Status
Niet open voor verdere reacties.

programan

Nieuwe gebruiker
Lid geworden
30 sep 2007
Berichten
4
Hoi allemaal,

Weet iemand toevallig hoe ik deze schuifpuzzel kan veranderen in 9 blokjes waarvan 1 leeg is.

Dit is de broncode:

Code:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.String;
 
public class Schuifpuzzel extends Applet implements ActionListener
{

 private Button Knop[]; 
//16 knopjes
 private int OnzichtbaarBlokje; 
//plaats van het onzichtbare blokje
 private int Teller=0; 
//telt aan het aantal keren dat u een blokje verschuift
 private String s;//tekst voor het einddialoog

 //initialiseer het applet
 public void init()
  {
  Knop = new Button[16];  
//maak het array aan
   int rij=0,kolom=0;
   setBackground(new Color(0,0,0));
       //initialiseer alle knopjes
   for (int i=0;i<16;i++)
   {
     Knop[i]=new Button();
     kolom++;
     if (kolom==4)
      {kolom=0;rij++;}
   }
  setLayout( new GridLayout(4,4));
  for (int i=0;i<16;i++)
    {
    Knop[i].addActionListener(this); 
//actionListener bijvoegen
    Knop[i].setActionCommand(String.valueOf(i));
 //actionCommand instellen
    Knop[i].setLabel(String.valueOf(i+1)); //label instellen
    add(Knop[i]);  
//voeg het bij het applet
    }
  Knop[15].setVisible(false); //laatste blokje wordt onzichtbaar
  OnzichtbaarBlokje=15;
  Shuffle();  
//schudt de blokjes...
  }
 //op blokje geklikt?
 public void actionPerformed(ActionEvent e)
 {
  //op welk blokje?
  int plaats =(new Integer(e.getActionCommand())).intValue();
  System.out.println("Action:"+plaats+" "+OnzichtbaarBlokje);
  //grenst het aan het lege blokje?
  if (GrenstAan(plaats,OnzichtbaarBlokje))
   {
   String temp;
   System.out.println("OK! verwisseld..."+ ++Teller);
   Knop[plaats].setVisible(false);
   Knop[OnzichtbaarBlokje].setVisible(true);
   temp=Knop[plaats].getLabel();
   Knop[plaats].setLabel(Knop[OnzichtbaarBlokje].getLabel());
   Knop[OnzichtbaarBlokje].setLabel(temp);
   OnzichtbaarBlokje=plaats;
   }
  else
   {
   System.out.println("nope...dat gaat niet...");
   }
 if (Opgelost()) 
 //spel opgelost?
  {
  System.out.println("Klaar!!!"); 
//doe hier later iets nuttiger...
  s=new String("Spel is afgelopen, na "+Teller+" keren klikken!");
  EindDialoog.MaakFrame(s); 
//Toon einddialoog
  Teller=0;  
//reset de teller
  Shuffle(); 
// en opnieuw shuffelen...
  }
 }

// Schud de blokjes...    Verwissel 10000 maal twee blokjes,
public void Shuffle()
 {
 String temp;
 int r1,r2;
 for (int i=1;i<10000;i++)
  {
   r1=(int)Math.round(Math.random()*15);
   r2=(int)Math.round(Math.random()*15);
   // Moeten aan elkaar grenzen
   // en één van beide moet het onzichtbaar blokje zijn
   if (GrenstAan(r1,r2)&&(r1==OnzichtbaarBlokje || 
     {
     System.out.println(r1+" "+r2);
     temp=Knop[r1].getLabel();
     Knop[r1].setLabel(Knop[r2].getLabel());
     Knop[r2].setLabel(temp);
     if (r1==OnzichtbaarBlokje)
      OnzichtbaarBlokje=r2;
     else
      OnzichtbaarBlokje=r1;
     }
  } 

 //en maak het blokje met label 16 onzichtbaar
  for (int i=0;i<16;i++)
     {
      Knop[i].setVisible(true);
      if (new Integer(Knop[i].getLabel()).intValue()==16)
       { OnzichtbaarBlokje=i;
        Knop[i].setVisible(false);
       }
     }
 }
//test of twee blokjes aan elkaar grenzen
public boolean GrenstAan(int p,int q)
  {
  int i;
  if (p>q) {i=p;p=q;q=i;} //zet kleinste eerst
  if ( (Math.abs(p-q)==1
     &&( (p!=3 && q!=4)) //niet achter het randje...
     &&( (p!=7 && q!=8))
     &&( (p!=11 && q!=12))
     ) ||
    (Math.abs(p-q)==4) )
      return true;
  return false;
  }
//puzzel opgelost?
public boolean Opgelost()
  {
  boolean temp=true;
  for (int i=0;i<16;i++)
   if (i!=new Integer(Knop[i].getLabel()).intValue()-1)
    temp=false;
  return temp;
  }
}
 
Laatst bewerkt door een moderator:
Code:
// Schud de blokjes... Verwissel 10000 maal twee blokjes,
    public void Shuffle() {
        String temp;
        int r1,r2;
        for (int i=1;i<10000;i++) {
            r1=(int)Math.round(Math.random()*15);
            r2=(int)Math.round(Math.random()*15);
// Moeten aan elkaar grenzen
// en één van beide moet het onzichtbaar blokje zijn
            if (GrenstAan(r1,r2)&&(r1==OnzichtbaarBlokje || r2==OnzichtbaarBlokje))
            {
                System.out.println(r1+" "+r2);
                temp=Knop[r1].getLabel();
                Knop[r1].setLabel(Knop[r2].getLabel());
                Knop[r2].setLabel(temp);
                if (r1==OnzichtbaarBlokje){
                    OnzichtbaarBlokje=r2;
                } else{
                    OnzichtbaarBlokje=r1;
                }
            }
        }
        
//en maak het blokje met label 16 onzichtbaar
        for (int i=0;i<16;i++) {
            Knop[i].setVisible(true);
            if (new Integer(Knop[i].getLabel()).intValue()==16) {
                OnzichtbaarBlokje=i;
                Knop[i].setVisible(false);
            }
        }
    }

Bij het rode stuk mist nog het 'Or' oftewijl het stuk na de ||
Of hoort daar )) te staan?

Code:
EindDialoog.MaakFrame(s);
Op regel 81 geeft bij mij een fout.
Hij kan de variabele EindDialoog niet vinden.


___________________________----

Aangepast naar 9
Rode heb ik aangepast.
Groene moet je zelf nog even aanpassen indien nodig.

Code:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.String;

public class Schuifpuzzel extends Applet implements ActionListener {
    
    private Button Knop[];
//16 knopjes
    private int OnzichtbaarBlokje;
//plaats van het onzichtbare blokje
    private int Teller=0;
//telt aan het aantal keren dat u een blokje verschuift
    private String s;//tekst voor het einddialoog
    
//initialiseer het applet
    public void init() {
[COLOR="Red"]        //Knop = new Button[16];
        Knop = new Button[9];[/COLOR]
//maak het array aan
        int rij=0,kolom=0;
        setBackground(new Color(0,0,0));
//initialiseer alle knopjes
       [COLOR="Red"] //for (int i=0;i<16;i++) {
        for (int i=0;i<9;i++) {[/COLOR]
            Knop[i]=new Button();
            kolom++;
            [COLOR="Red"]//if (kolom==4)
            if (kolom==3){[/COLOR]
                
                kolom=0;rij++;}
        }
        [COLOR="Red"]//setLayout( new GridLayout(4,4));
        setLayout( new GridLayout(3,3));
        //for (int i=0;i<16;i++) {
        for (int i=0;i<9;i++) {[/COLOR]
            Knop[i].addActionListener(this);
//actionListener bijvoegen
            Knop[i].setActionCommand(String.valueOf(i));
//actionCommand instellen
            Knop[i].setLabel(String.valueOf(i+1)); //label instellen
            add(Knop[i]);
//voeg het bij het applet
        }
        [COLOR="Red"]//Knop[15].setVisible(false); //laatste blokje wordt onzichtbaar
        Knop[8].setVisible(false);
        //OnzichtbaarBlokje=15;
        OnzichtbaarBlokje=8;[/COLOR]
        Shuffle();
//schudt de blokjes...
    }
//op blokje geklikt?
    public void actionPerformed(ActionEvent e) {
//op welk blokje?
        int plaats =(new Integer(e.getActionCommand())).intValue();
        System.out.println("Action:"+plaats+" "+OnzichtbaarBlokje);
//grenst het aan het lege blokje?
        if (GrenstAan(plaats,OnzichtbaarBlokje)) {
            String temp;
            System.out.println("OK! verwisseld..."+ ++Teller);
            Knop[plaats].setVisible(false);
            Knop[OnzichtbaarBlokje].setVisible(true);
            temp=Knop[plaats].getLabel();
            Knop[plaats].setLabel(Knop[OnzichtbaarBlokje].getLabel());
            Knop[OnzichtbaarBlokje].setLabel(temp);
            OnzichtbaarBlokje=plaats;
        } else {
            System.out.println("nope...dat gaat niet...");
        }
        if (Opgelost())
//spel opgelost?
        {
            System.out.println("Klaar!!!");
//doe hier later iets nuttiger...
            s=new String("Spel is afgelopen, na "+Teller+" keren klikken!");
            EindDialoog.MaakFrame(s);
//Toon einddialoog
            Teller=0;
//reset de teller
            Shuffle();
// en opnieuw shuffelen...
        }
    }
    
// Schud de blokjes... Verwissel 10000 maal twee blokjes,
    public void Shuffle() {
        String temp;
        int r1,r2;
        for (int i=1;i<10000;i++) {
           [COLOR="Red"] //r1=(int)Math.round(Math.random()*15);
            //r2=(int)Math.round(Math.random()*15);
            r1=(int)Math.round(Math.random()*8);
            r2=(int)Math.round(Math.random()*8);[/COLOR]
// Moeten aan elkaar grenzen
// en één van beide moet het onzichtbaar blokje zijn
            if (GrenstAan(r1,r2)&&(r1==OnzichtbaarBlokje)) {
                System.out.println(r1+" "+r2);
                temp=Knop[r1].getLabel();
                Knop[r1].setLabel(Knop[r2].getLabel());
                Knop[r2].setLabel(temp);
                if (r1==OnzichtbaarBlokje){
                    OnzichtbaarBlokje=r2;
                } else{
                    OnzichtbaarBlokje=r1;
                }
            }
        }
        
//en maak het blokje met label 16 onzichtbaar
[COLOR="Red"]        //for (int i=0;i<16;i++) {
        for (int i=0;i<9;i++) {[/COLOR]
            Knop[i].setVisible(true);
[COLOR="Red"]            //if (new Integer(Knop[i].getLabel()).intValue()==16) {
            if (new Integer(Knop[i].getLabel()).intValue()==9) {[/COLOR]
                OnzichtbaarBlokje=i;
                Knop[i].setVisible(false);
            }
        }
    }
//test of twee blokjes aan elkaar grenzen
    [COLOR="Lime"]public boolean GrenstAan(int p,int q) {
        int i;
        if (p>q) {
            i=p;
            p=q;
            q=i;
        } //zet kleinste eerst
        if ( (Math.abs(p-q)==1
                &&( (p!=3 && q!=4)) //niet achter het randje...
                &&( (p!=7 && q!=8))
                &&( (p!=11 && q!=12))
                ) ||
                (Math.abs(p-q)==4) ){
            return true;
        }
        return false;
    }[/COLOR]
//puzzel opgelost?
    public boolean Opgelost() {
        boolean temp=true;
        [COLOR="Red"]//for (int i=0;i<16;i++){
        for (int i=0;i<9;i++){[/COLOR]
            if (i!=new Integer(Knop[i].getLabel()).intValue()-1){
                temp=false;
            }
        }
        return temp;
    }
}
 
Laatst bewerkt:
9 blokjes in plaats van 16 schuifpuzzel

Hoi,

De code moet het nu doen.

Code:
die || . Hier moest nog een onzichtbaar blokje erbij.
 {
 String temp;
 int r1,r2;
 for (int i=1;i<10000;i++)
  {
   r1=(int)Math.round(Math.random()*15);
   r2=(int)Math.round(Math.random()*15);
   // Moeten aan elkaar grenzen
   // en één van beide moet het onzichtbaar blokje zijn
   if (GrenstAan(r1,r2)&&([COLOR="Red"]r1==OnzichtbaarBlokje || r2==OnzichtbaarBlokje))[/COLOR]



[COLOR="red"]Nieuwe Code:[/COLOR]

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.String;
 
public class Main extends Applet implements ActionListener
{
 private Button Knop[]; 
//16 knopjes
 private int OnzichtbaarBlokje; 
//plaats van het onzichtbare blokje
 private int Teller=0; 
//telt aan het aantal keren dat u een blokje verschuift
 private String s;//tekst voor het einddialoog
 //initialiseer het applet
 public void init()
  {
  Knop = new Button[16];  
//maak het array aan
   int rij=0,kolom=0;
   setBackground(new Color(0,0,0));
       //initialiseer alle knopjes
   for (int i=0;i<16;i++)
   {
     Knop[i]=new Button();
     kolom++;
     if (kolom==4)
      {kolom=0;rij++;}
   }
  setLayout( new GridLayout(4,4));
  for (int i=0;i<16;i++)
    {
    Knop[i].addActionListener(this); 
//actionListener bijvoegen
    Knop[i].setActionCommand(String.valueOf(i));
 //actionCommand instellen
    Knop[i].setLabel(String.valueOf(i+1)); //label instellen
    add(Knop[i]);  
//voeg het bij het applet
    }
  Knop[15].setVisible(false); //laatste blokje wordt onzichtbaar
  OnzichtbaarBlokje=15;
  Shuffle();  
//schudt de blokjes...
  }
 //op blokje geklikt?
 public void actionPerformed(ActionEvent e)
 {
 
  int plaats =(new Integer(e.getActionCommand())).intValue();
  System.out.println("Action:"+plaats+" "+OnzichtbaarBlokje);
  //grenst het aan het lege blokje?
  if (GrenstAan(plaats,OnzichtbaarBlokje))
   {
   String temp;
   System.out.println("OK! verwisseld..."+ ++Teller);
   Knop[plaats].setVisible(false);
   Knop[OnzichtbaarBlokje].setVisible(true);
   temp=Knop[plaats].getLabel();
   Knop[plaats].setLabel(Knop[OnzichtbaarBlokje].getLabel());
   Knop[OnzichtbaarBlokje].setLabel(temp);
   OnzichtbaarBlokje=plaats;
   }
  else
   {
   System.out.println("nope...dat gaat niet...");
   }
 if (Opgelost()) 
 //spel opgelost?
  {
  System.out.println("Klaar!!!"); 
//doe hier later iets nuttiger...
  s=new String("Spel is afgelopen, na "+Teller+" keren klikken!");
  
  }
 }



 
// Schud de blokjes...    Verwissel 10000 maal twee blokjes,
public void Shuffle()
 {
 String temp;
 int r1,r2;
 for (int i=1;i<10000;i++)
  {
   r1=(int)Math.round(Math.random()*15);
   r2=(int)Math.round(Math.random()*15);
   // Moeten aan elkaar grenzen
   // en één van beide moet het onzichtbaar blokje zijn
   if (GrenstAan(r1,r2)&&(r1==OnzichtbaarBlokje || r2==OnzichtbaarBlokje))
     {
     System.out.println(r1+" "+r2);
     temp=Knop[r1].getLabel();
     Knop[r1].setLabel(Knop[r2].getLabel());
     Knop[r2].setLabel(temp);
     if (r1==OnzichtbaarBlokje)
      OnzichtbaarBlokje=r2;
     else
      OnzichtbaarBlokje=r1;
     }
  }
  //en maak het blokje met label 16 onzichtbaar
  for (int i=0;i<16;i++)
     {
      Knop[i].setVisible(true);
      if (new Integer(Knop[i].getLabel()).intValue()==16)
       { OnzichtbaarBlokje=i;
        Knop[i].setVisible(false);
       }
     }
 }
//test of twee blokjes aan elkaar grenzen
public boolean GrenstAan(int p,int q)
  {
  int i;
  if (p>q) {i=p;p=q;q=i;} //zet kleinste eerst
  if ( (Math.abs(p-q)==1
     &&( (p!=3 && q!=4)) //niet achter het randje...
     &&( (p!=7 && q!=8))
     &&( (p!=11 && q!=12))
     ) ||
    (Math.abs(p-q)==4) )
      return true;
  return false;
  }

//puzzel opgelost?
public boolean Opgelost()
  {
  boolean temp=true;
  for (int i=0;i<16;i++)
   if (i!=new Integer(Knop[i].getLabel()).intValue()-1)
    temp=false;
  return temp;
  }
}
 
Laatst bewerkt door een moderator:
Ik heb ik het laastste stuk van mijn vorige post een aanpassing neergezet.

Zou jij je code nog even tussen code tags willen zetten? :) dan krijgen we niet zo'n lang topic :D

Code:
hier je code
 
re aanpassingen schuifpuzzel

Hoi,

Hij doet het perfect bedankt,alleen het schuifen gaat alleen als je klikt op nummerblok 7.

Weet je toevallig hoe dat kan komen.

Alvast bedankt

Bedankt nog voor de tip.


Code:
package Schuifpuzzel;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.lang.String;

public class Schuifpuzzel extends Applet implements ActionListener {
    
    private Button Knop[];
//16 knopjes
    private int OnzichtbaarBlokje;
//plaats van het onzichtbare blokje
    private int Teller=0;
//telt aan het aantal keren dat u een blokje verschuift
    private String s;//tekst voor het einddialoog
    
//initialiseer het applet
    public void init() {
        //Knop = new Button[16];
        Knop = new Button[9];
//maak het array aan
        int rij=0,kolom=0;
        setBackground(new Color(0,0,0));
//initialiseer alle knopjes
        //for (int i=0;i<16;i++) {
        for (int i=0;i<9;i++) {
            Knop[i]=new Button();
            kolom++;
            //if (kolom==4)
            if (kolom==3){
                
                kolom=0;rij++;}
        }
        //setLayout( new GridLayout(4,4));
        setLayout( new GridLayout(3,3));
        //for (int i=0;i<16;i++) {
        for (int i=0;i<9;i++) {
            Knop[i].addActionListener(this);
//actionListener bijvoegen
            Knop[i].setActionCommand(String.valueOf(i));
//actionCommand instellen
            Knop[i].setLabel(String.valueOf(i+1)); //label instellen
            add(Knop[i]);
//voeg het bij het applet
        }
        //Knop[15].setVisible(false); //laatste blokje wordt onzichtbaar
        Knop[8].setVisible(false);
        //OnzichtbaarBlokje=15;
        OnzichtbaarBlokje=8;
        Shuffle();
//schudt de blokjes...
    }
//op blokje geklikt?
    public void actionPerformed(ActionEvent e) {
//op welk blokje?
        int plaats =(new Integer(e.getActionCommand())).intValue();
        System.out.println("Action:"+plaats+" "+OnzichtbaarBlokje);
//grenst het aan het lege blokje?
        if (GrenstAan(plaats,OnzichtbaarBlokje)) {
            String temp;
            System.out.println("OK! verwisseld..."+ ++Teller);
            Knop[plaats].setVisible(false);
            Knop[OnzichtbaarBlokje].setVisible(true);
            temp=Knop[plaats].getLabel();
            Knop[plaats].setLabel(Knop[OnzichtbaarBlokje].getLabel());
            Knop[OnzichtbaarBlokje].setLabel(temp);
            OnzichtbaarBlokje=plaats;
        } else {
            System.out.println("nope...dat gaat niet...");
        }
        if (Opgelost())
//spel opgelost?
        {
            System.out.println("Klaar!!!");
//doe hier later iets nuttiger...
            s=new String("Spel is afgelopen, na "+Teller+" keren klikken!");
            
        }
    }
    
// Schud de blokjes... Verwissel 10000 maal twee blokjes,
    public void Shuffle() {
        String temp;
        int r1,r2;
        for (int i=1;i<10000;i++) {
            //r1=(int)Math.round(Math.random()*15);
            //r2=(int)Math.round(Math.random()*15);
            r1=(int)Math.round(Math.random()*8);
            r2=(int)Math.round(Math.random()*8);
// Moeten aan elkaar grenzen
// en één van beide moet het onzichtbaar blokje zijn
            if (GrenstAan(r1,r2)&&(r1==OnzichtbaarBlokje)) {
                System.out.println(r1+" "+r2);
                temp=Knop[r1].getLabel();
                Knop[r1].setLabel(Knop[r2].getLabel());
                Knop[r2].setLabel(temp);
                if (r1==OnzichtbaarBlokje){
                    OnzichtbaarBlokje=r2;
                } else{
                    OnzichtbaarBlokje=r1;
                }
            }
        }
        
//en maak het blokje met label 16 onzichtbaar
        //for (int i=0;i<16;i++) {
        for (int i=0;i<9;i++) {
            Knop[i].setVisible(true);
            //if (new Integer(Knop[i].getLabel()).intValue()==16) {
            if (new Integer(Knop[i].getLabel()).intValue()==9) {
                OnzichtbaarBlokje=i;
                Knop[i].setVisible(false);
            }
        }
    }
//test of twee blokjes aan elkaar grenzen
    public boolean GrenstAan(int p,int q) {
        int i;
        if (p>q) {
            i=p;
            p=q;
            q=i;
        } //zet kleinste eerst
        if ( (Math.abs(p-q)==1
                &&( (p!=3 && q!=4)) //niet achter het randje...
                &&( (p!=7 && q!=8))
                &&( (p!=11 && q!=12))
                ) ||
                (Math.abs(p-q)==4) ){
            return true;
        }
        return false;
    }
//puzzel opgelost?
    public boolean Opgelost() {
        boolean temp=true;
        //for (int i=0;i<16;i++){
        for (int i=0;i<9;i++){
            if (i!=new Integer(Knop[i].getLabel()).intValue()-1){
                temp=false;
            }
        }
        return temp;
    }
}
 
Ik denk dat je mogelijk nog wat aan de functie "GrenstAan(int p,int q)" aan moet passen.
 
Blokjes begrenzen

Hoi,

Bedankt voor het helpen nog.

Alleen ik zit nog steeds in de knoei met die blokjes (grenstaan).

Weet je toevallig hoe ik dit dan toch kan fixen.


Alvast bedankt,

Programan
 
Hey,

Neem ook eens een kijkje hier:
Java X on X puzzle code exemple

Het bevat de java source code voor een puzzle. Je kan makkelijk de 'range' aanpassen van 3x3 naar bvb 4x4 of verder...

Het leukste aan het codevoorbeeld is dat het programmaatje zelf een oplossing zoekt nadat een shuffle werd uitgevoerd!!

Er zit ook een JAR file bij die je kan downloaden. Je kan dan meteen het progje uitvoeren en testen.

Indien vragen over de source, kan je die me altijd stellen!

Grtz
Fred
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan