Avatar billede _kresten Nybegynder
09. december 2004 - 17:02 Der er 10 kommentarer og
1 løsning

At gemme to liner i ét objekt

Hvordan gemmer man to liner af typen Line2D.Double, som bliver oprettet i en anden metode, så de kan returneres og skrives ud fra paint metoden?

Jeg tænker, at de skal gemmes i et enkelt objekt, som så kan returneres på normal vis og derefter udskrives. Eller er det totalt åndsvagt?
Avatar billede jakoba Nybegynder
09. december 2004 - 17:13 #1
class ToLinier {
  public Line2D.Double linie1, linie2;
  public ToLinier( Line2D.Double lin1, Line2D.Double lin2 ) {
      linie1 = lin1;
      linie2 = lin2;
  } //end constructor
}// endclass ToLinier

og så skal du blot ændre den metode der skal returnere 2 liner til at returnere et objekt af typen ToLinier, og lave return sætningen om til:
    return new ToLinier( denEne, denAnden );

mvh JakobA
Avatar billede _kresten Nybegynder
09. december 2004 - 17:22 #2
Hvad gør jeg så når det hele sker i samme klasse?
Jeg prøvede nemlig, men så sagde den: "load: TicTacToeGame can't be instantiated.", hvilket jeg sådan set også selv kom frem til tidligere... :(
Avatar billede jakoba Nybegynder
09. december 2004 - 17:27 #3
det er ikke til at sådan lige svare på.  Må vi se din kode? til et kryds&bolle spil skulle den være overkommelig.
Avatar billede _kresten Nybegynder
09. december 2004 - 17:30 #4
Lige nu sidder jeg bare og arbejder på grænsefladen, hvilket jeg ikke har prøvet mere end een gang før, men den er her:
import java.applet.Applet;
import java.awt.*;
import java.awt.geom.Line2D;

public class TicTacToeGame extends Applet{
    public Line2D linie1, linie2;

    public TicTacToeGame(Line2D lin1, Line2D lin2 ) {
      linie1 = lin1;
      linie2 = lin2;
    }

    public void paint(Graphics g){
        Graphics2D g2 = (Graphics2D)g;
        int x = 0, y = 0;
        for(int i = 0; i < 3; i++){
            if(i!=0)
                x += 50;
                y = 0;
            for(int j = 0; j < 3; j++){
                Rectangle r = rectangle(x,y);
                g2.draw(r);
                g2.draw((Shape)cross(x, y));
                y += 50;
            }
        }
    }

    public Object cross(int x, int y){
        Line2D line1 = new Line2D.Double(x += 10,y += 10,x += 30,y += 30);
        Line2D line2 = new Line2D.Double(x += 20,y += 10,x += 40,y += 30);
        return new TicTacToeGame(line1,line2);
    }

/*    public Object circle(int x, int y){


        return circle;
    }*/

    public Rectangle rectangle(int x,int y){
        Rectangle rectangle = new Rectangle(x, y, 50, 50);
        return rectangle;
    }
}
Avatar billede _kresten Nybegynder
09. december 2004 - 17:30 #5
Det er selvsagt i cross problemet opstår...
Avatar billede _kresten Nybegynder
09. december 2004 - 17:32 #6
Koden til selve spillet er en længere smøre med minimax søgning og alpha-beta afskæring...
Avatar billede jakoba Nybegynder
09. december 2004 - 17:41 #7
Lidt frås at generere et helt TicTacToeGame objekt bare for at få returneret 2 linier.

og vi kan nok være ret sikre på at det objekt vi laver til at ineholde de 2 linie IKKE vil kunne castes til et Shape.
så linien:
        g2.draw((Shape)cross(x, y));
skal skrives om til:
        ToLinier tempObj = cross(x, y);
        g2.draw( tempObj.linie1 );      // tegn de to linier hver for sig
        g2.draw( tempObj.linie2 );
På den måde vil de parametre vi giver til draw funktioner være objekter af en type der passer til den metode. (vi kan ikke bare give den et totalt nyt og ukendt objekt).

mvh JakobA
Avatar billede _kresten Nybegynder
09. december 2004 - 17:51 #8
Men hvordan får jeg den så til at returnere begge linier?
Avatar billede jakoba Nybegynder
09. december 2004 - 17:58 #9
import java.applet.Applet;
import java.awt.*;
import java.awt.geom.Line2D;

public class TicTacToeGame extends Applet{
    public Line2D linie1, linie2;

    public TicTacToeGame(Line2D lin1, Line2D lin2 ) {
      linie1 = lin1;
      linie2 = lin2;
    }

    class ToLinier {                //TILFØJET
        public Line2D linie1, linie2;
        public ToLinier( Line2D lin1, Line2D lin2 ) {
            linie1 = lin1;
            linie2 = lin2;
        } //end constructor
    }// endclass ToLinier

    public void paint(Graphics g){
        Graphics2D g2 = (Graphics2D)g;
        int x = 0, y = 0;
        for(int i = 0; i < 3; i++){
            if(i!=0)
                x += 50;
                y = 0;
            for(int j = 0; j < 3; j++){
                Rectangle r = rectangle(x,y);
                g2.draw(r);
                ToLinier tempObj = cross(x, y);
                g2.draw( tempObj.linie1 );      // tegn de to linier hver for sig
                g2.draw( tempObj.linie2 );
                //FJERNET g2.draw((Shape)cross(x, y));
                y += 50;
            }
        }
    }

    public ToLinier cross(int x, int y){      //ÆNFRET
        Line2D line1 = new Line2D.Double(x += 10,y += 10,x += 30,y += 30);
        Line2D line2 = new Line2D.Double(x += 20,y += 10,x += 40,y += 30);
        return new ToLinier(line1,line2);    //ÆNDRET
    }

/*    public Object circle(int x, int y){


        return circle;
    }*/

    public Rectangle rectangle(int x,int y){
        Rectangle rectangle = new Rectangle(x, y, 50, 50);
        return rectangle;
    }
}
Avatar billede _kresten Nybegynder
09. december 2004 - 18:16 #10
Heureka!
Tusind tak for hjælpen...
Hvis du dropper et svar ind her under får du nogle point!
Avatar billede jakoba Nybegynder
09. december 2004 - 18:17 #11
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester