Just nu i M3-nätverket
Gå till innehåll

full kod, pussel


leesane

Rekommendera Poster

Här kommer hela koden (ej färdigbearbetad) om någon har lust att slänga ett öga på den och hjälpa mig. Det jag har problem med (än så länge enligt min mening iaf) är min flyttbar funktion. Jag har säker gjort massvis med andra fel, men är som sagt nybörjare på detta och skulle uppskatta lite tips från mer erfarna programmerare.

Har ganska mycket bortkommenterat skräp och indenteringen blir skum när jag klistrar in inlägget, hoppas det går att se ändå.

Tack på förhand!

 

 

public class Pussel extends Frame implements ActionListener

{

//om man använder konstanterna RAD o COL nedan , kan man bara genom att ändra

//deras värde ändra pusslet från att vara 3 rader 3 kolumner till tex 5 rader 6 kolumner

private final int RAD=3;

private final int COL=3; // RAD= antal rader ,COL =antal kolumner i pusslet

Button[][] button = new Button [RAD+2][COL+2];

// rad 0 och rad RAD+1 används ej , kolumn 0 och kolumn COL+1 används ej

// detta underlättar tester om blank knapp ligger över under ,vänster eller höger om den

//knapp som tryckts

public static final int FrameWidth = 600;

public static final int FrameHeight = 400;

TextField testText = new TextField("Ej klart",100); // för ett meddelande längst ned

public static void main (String [] args)

{

JFrame frame = new JFrame("Pussel");

frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

 

JPanel pussel = new JPanel();

pussel.add (new Pussel());

frame.getContentPane().add(pussel);

frame.pack();

frame.show();

 

}//metod main

 

 

public Pussel ()

{

int row,col;

int j=0;

Integer m;

setSize (FrameWidth, FrameHeight);

setTitle ("Pussel");

setLayout(new GridLayout(RAD+1,COL)); //en rad extra för meddelande

for(row=1;row<RAD+1;row++)

for(col=1;col<COL+1;col++)

{

j++;

Button b1 = new Button ("" + j + "");

b1.setBackground (Color.red); //tillverka röd knapp med text och lägg ut den med add

add(b1);

 

if (row == 3 && col == 3) //om det är sista knappen görs denna vit och blank.

{

button[row][col] = b1;

button[row][col].setBackground (Color.white); //har haft button[RAD][COL] på dessa rader innnan row, col

button[row][col].setLabel(" ");

add(b1);

button[row][col].addActionListener(this); //lägg ut knapplyssnare

}

}

 

for(int i=0;i<COL+2;i++) // rad 0 används ej, och inte RAD+1 dvs sista raden, kolumn 0 används ej

{ //och inte sista kolumnen detta för att göra det enklare att göra test på

button[0]=new Button("slask"); //om den ruta man klickat på ligger intill ledig ruta

button[RAD+1]=new Button("slask");

}

 

for(int i=0;i<RAD+1;i++)

{

button[0]=new Button("slask");

button[COL+1]=new Button("slask");

}

 

add (testText);

blanda(); // blanda knapparna

setVisible(true);

 

addWindowListener(new WindowAdapter()

{

public void windowClosing(WindowEvent e)

{

System.exit(0); //avsluta applikation

}// metod windowClosing

}); //addWindowListener

}//constructor

 

 

 

//metod blanda(), blandar om knapparna 100 gånger

// obs du får inte flytta om hur som helst utan utgå från den

// där alla är sorterade och flytta om därifrån

 

public void blanda()

{

Point p = new Point();

Random value = new Random();

int count = 1;

while(count<100)

{

int row = value.nextInt()%RAD+1; //slumpa nytt värde på row och col

int col = value.nextInt()%COL+1;

 

if (row <= 3 && col <= 3) //här måste du lägga in en koll att det inte ligger utanför tabellen

{ // och koden för att se om den är flyttbar

//är den flyttbar så flytta tex

p.setLocation(row,col);

if(flyttbar(p)) // osv

{

//flytta(p); //ÄR DETTA RÄTT ???

}

}

}

}//metod blanda

 

 

// metod actionPerformed för att ta hand om knapptryckning

public void actionPerformed(ActionEvent evt)

{

int x,y;

Point p = new Point(); //här får du göra en iteration för att kolla vilken knapp som tryckts

for(x=1;x<RAD+1;x++)

for(y=1;y<COL+1;y++)

{

if(evt.getSource()==button[x][y]) // är det denna knapp??

{

p.setLocation(x,y);

if (button[p.x][p.y].getLabel().equals(" "))

{

testText.setBackground(Color.white);

testText.setText("Tryck inte på den blanka");

}

if(flyttbar(p))

{

//flytta(p); // flytta om den är flyttbar

/*if(sorterat())

{

testText.setBackground(Color.blue);

testText.setText("Grattis nu är det klart ");

}

else

{

testText.setBackground(Color.white);

testText.setText("Ej klart ");

}*/

}

}

}

}//metod actionPerformed

 

 

 

// metoden flyttbar(Point m) tittar om knappen som man tryckt har en blank närmast uppåt eller vänster

// eller nedåt eller höger

public boolean flyttbar(Point p)

{

return (button[p.x-1][p.y].getLabel().equals(" ")||button[p.x+1][p.y].getLabel().equals(" ")||button[p.x][p.y-1].getLabel().equals(" ")||button[p.x][p.y+1].getLabel().equals(" "));

 

 

 

}//metod flyttbar

 

/*Point ptom = new Point();

ptom = tom();

if(ptom==button[row-1][col].getLocation())

{System.out.println ("ADFA");

}return true;

*/

/*Point tryckt = new Point();

tryckt = button[p.x][p.y].getLocation(p);

int i;

for(i=1;i<RAD+1;i++)

if(!button[p.x-1][p.y].getLabel().equals("slask")||button[p.x+1][p.y].getLabel().equals("slask")||button[p.x][p.y-1].getLabel().equals("slask")||button[p.x][p.y+1].getLabel().equals("slask"))

{System.out.println("Jajamen");}

*/

//{

//}

//return (button[p.x][p.y].getLocation()==p);

/* Button denblanka = new Button();

boolean sant = false;

int tryckt, rad, kol, i,j;

for (i=0; i < 4; i=i+1)

for (j=0; j < 4; j=j+1)

{

if (button[p.x][p.y] == button[j])

{

if (button[p.x][p.y].getLabel().equals(" ")) {

System.out.println("Du tryckte på den blanka knappen");

}

else {

 

tryckt = i; rad = tryckt/3; kol = tryckt % 3;

 

if (rad<=3) {

if (button[p.x+1][p.y].getLabel().equals(" ")) denblanka=button[p.x+1][p.y];

}

if (rad>0) {

if (button[p.x-1][p.y].getLabel().equals(" ")) denblanka=button[p.x-1][p.y];

}

if (kol>0) {

if (button[p.x][p.y-2].getLabel().equals(" ")) denblanka=button[p.x][p.y-2];

}

if (kol<=2) {

if (button[p.x][p.y+2].getLabel().equals(" ")) denblanka=button[p.x][p.y+2];

}

 

if (denblanka==button[-1][j]) {

System.out.println("Ingen blank granne");

}

}

}

return (denblanka);

}*/

/*Point punkt,blank,upp,ner,hoger,vanster = new Point();

punkt = p;

 

int x=1,y=1;

for(x=0;x<4;x++)

for(y=0;y<4;y++)

//try

//{

if (

if(button[p.x-1][p.y].getLabel().equals(" "))

{

blank = button[p.x-1][p.y].getLocation();

}

if(button[x+1][y].getLabel().equals(" "))

{

blank = button[x+1][y].getLocation();

}

if(button[x][y-1].getLabel().equals(" "))

{

blank = button[x][y-1].getLocation();

}

if(button[x][y+1].getLabel().equals(" "))

{

blank = button[x][y+1].getLocation();

}

//}

//catch (NullPointerException exception)

//{

//System.out.println ("Fel igen!");

//} */

 

//this.p = p;

//return (button[p.x-1][p.y].getLabel().equals(" ")||button[p.x][p.y-1].getLabel().equals(" ")||button[p.x][p.y+1].getLabel().equals(" ")||button[p.x+1][p.y].getLabel().equals(" "));

/*ner = button[p.x+1][p.y].getLocation();

upp = button[p.x-1][p.y].getLocation();

vanster = button[p.x][p.y-1].getLocation();

hoger = button[p.x][p.y+1].getLocation();

*/

 

 

// metoden flytta(Point p) flyttar knappen till det blanka stället

/*public void flytta(Point p)

{

int x,y;

Point ptom = new Point();

String buttonLabel;

ptom = tom();

buttonLabel = button[p.x][p.y].getLabel();

button[p.x][p.y].setBackground (Color.white); //gamla knappen blir tom (blank)

button[p.x][p.y].setLabel (" "); //gamla knappen blir blank

for(x=1;x<RAD+1;x++);

for(y=1;y<COL+1;y++); //stega genom pussslet

if(ptom==button[x][y].getLocation()) //vilken knapp ptom (tomma knappen) är lika med

{

button[x][y].setLabel(buttonLabel); //sätt in texten från den tryckta knappen på den tomma

}

// ge här den gamla blanka knappen ny text och knapp som tryckts görs blank

}//metod flytta

 

// metoden tom letar upp blank (tom) knapp

private Point tom()

{

Point ptom = new Point();

int x,y;

for(x=1;x<RAD+1;x++);

for(y=1;y<COL+1;y++);

if (button[x][y].getLabel().equals(" "))

{

ptom = button[x][y].getLocation();

}

return ptom;

}//metod tom

 

 

// metoden sorterat kontrollerar om hela pusslet är sorterat

private boolean sorterat()

{

int row,col;

for(row=1;row<RAD+1;row++);

for(col=1;col<COL+1;col++);

if(button[1][1].getLabel() == "1" && button[1][2].getLabel() == "2" && button[1][3].getLabel() == "3"&&button[2][1].getLabel() == "4"&&button[2][2].getLabel() == "5"&&button[2][3].getLabel() == "6" && button[3][1].getLabel() == "7" && button[3][2].getLabel() == "8"&& button[3][3].getLabel() == " ")

{

return true;

}

else

{

return false;

} //för varje x,y punkt kolla om det är i ordningen 1-9

 

 

}// metod sorterat

*/

}//class Pussel

[inlägget ändrat 2004-08-04 11:41:28 av leesane]

Länk till kommentar
Dela på andra webbplatser

Du kan ju inte posta hundra rader med kod utan att förklara vad problemet är. Att säga att du har "problem" med en funktion hjälper ju inte direkt. Du får vara lite mer specifik så får du hjälp.

 

Länk till kommentar
Dela på andra webbplatser

Ok, problemet är att jag vid exekvering får antingen ett ArrayIndexOutOfBoundsException- eller Nullpointermeddelande. Kompilering går bra.

 

Grejen är den att jag på ett enkelt sätt bara vill kunna titta om den knapp (p) man tryckt på i pusslet ligger intill en blank knapp och isf returnera sant.

 

Mina försök har mest kretsat kring att om knappen man tryckt på är button[p.x][p.y] (button[2][2] tex) och x=rad,y=kol så borde knappen button[p.x-1][p.y] vara knappen som ligger på raden ovanför dvs button[1][2] och knappen button[p.x][p.y+1] vara knappen som ligger i kolumnen till höger dvs button[2][3] osv.

 

Spelplanen är 3*3 knappar, varav en vit (blank) och resterande numrerade 1-9. Spelet går ut på att få dessa i nummerordning.

 

Raderna 0 och 4 samt kolumnerna 0 och 4 används inte utan har labeln "slask". Tänkte att detta skulle göra det lättare att kolla om den knapp man tryckt ligger intill en blank (tom) knapp eller inte.

 

Hoppas detta klargjorde lite av vad jag behöver hjälp med. Felet kanske inte ligger i denna funktion (public boolean flyttbar(Point p) överhuvudtaget och jag kanske gjort fel på andra ställen, men det är där pgm:et säger ifrån iaf. Jag är dock medveten om att det förmodligen kryllar av fel men men man måste börja någonstans när man är nybörjare...

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...