Avatar billede madshenrik Nybegynder
01. november 2000 - 15:24 Der er 19 kommentarer og
1 løsning

Timer igen !!! Haster


Jeg har denne kode som burde virke men ikke gør det.

public static void givKort()
{

    if (Giver.getGiver() % 2 == 1)    // Hvis player 1 gir
    {
try{
        for (int i = 0; i < 2; i ++)
        {
            CardGame.ps2.insertAtTop(CardGame.p.removeTopCard()); // player 2 får de to første kort
            (CardGame.ps2.getTopCard()).turnFaceUp();
            Thread.sleep(2000);
        }   
           
}
catch (Exception e) {}
try{
        for (int j = 0; j < 2; j ++)
        {   
            CardGame.ps1.insertAtTop(CardGame.p.removeTopCard()); // player 2 får de to første kort
       
            Thread.sleep(2000);
        }
           
}
catch (Exception e) {}
try{
        for (int i = 2; i < 4; i ++)
        {
            CardGame.ps2.insertAtTop(CardGame.p.removeTopCard()); // player 1 får de to sidste kort
            (CardGame.ps2.getTopCard()).turnFaceUp();
            Thread.sleep(2000);
        }
           
}
catch (Exception e) {}
try{
        for (int j = 2; j < 4; j ++)

        {   
            CardGame.ps1.insertAtTop(CardGame.p.removeTopCard()); // player 2 får de to sidste kort
       
        }
}
catch (Exception e) {}
    }

Grunden til at jeg ikke kan forstå at det ikke virker er at dette virker

public static void main( String a[] ){
        try{
                for( int i = 0; i<5; i++ ){
                        System.out.print(\".\");
                        Thread.sleep(2000);
                }
                System.out.println(\"\\nJeg kunne se fem prikker der kom langsomt frem paa skaermen\");
        }
       
catch (Exception e) {}
}
}

Igår fik jeg hjælp af el_gnu til at lave denne funktion, jeg har dog ændret den lidt fordi jeg skal kalde denne metode fra en metode som ikke kan håndtere Exceptions. Derfor har jeg ændret throws Exceptions til try og catch.

Problemet er at når jeg vælger det menu punkt der skal udfører koden. Så udfører maskinen koden godt nok men der vises ikke noget på skærmen. Det vil sige den løber metoden givkort igennem uden at gøre noget og først tilsidst efter at have været alle linier igennem fordeles kortene.

Håber der er nogen der kan hjælpe.

Mads


Avatar billede stigc Nybegynder
01. november 2000 - 15:46 #1
Du skal have defineret en main i din klasse!
Avatar billede madshenrik Nybegynder
01. november 2000 - 18:41 #2
Hvordan f.. gør man det når det er en metode der skal kaldes indefra en anden klasse.

Mads
Avatar billede mtilsted Nybegynder
01. november 2000 - 20:02 #3
Du kan ikke lave funktioner i java, kun metoder.
Saa du skal have din funktion i en class.

Altsaa
public class Functions
{
  public static void givKort()
  {
      // Din code her
  }
}


// --------------

Fra dit program kalder du saa Funktioner.givKort()


Avatar billede madshenrik Nybegynder
01. november 2000 - 23:23 #4
Det er jeg godt klar over men problemet er at få den til at afvikle koden samtidig med at systemet sover en gang imellem.

Mads
Avatar billede el_gnu Nybegynder
04. november 2000 - 13:44 #5
madshenrik => nu gi\'r du mig vist æren for lbhansen\'s svar :-)

Jeg vil stadig foreslå dig at bruge en Timer i stedet for Thread.sleep().

Her er din kode som det kan gøres med en timer:

class klasseMedGivKort implements ActionListener {

    Timer t = new Timer(2000, this);
    int count = 0;

    public static void givKort(int kort)
    {
        if (Giver.getGiver() % 2 == 1)    // Hvis player 1 gir
        {
            switch (kort) {
                case 1:
                case 2:
                case 5:
                case 6:
                    CardGame.ps2.insertAtTop(CardGame.p.removeTopCard());
                    (CardGame.ps2.getTopCard()).turnFaceUp();
                    break;
                case 8:
                    t.stop();
                    kort = 0;
                case 3:
                case 4:
                case 7:
                    CardGame.ps1.insertAtTop(CardGame.p.removeTopCard());
            }
        }
    }

    public void actionPerformed(ActionEvent e)
    {
        givKort(++count);
    }
}


Når der skal gives kort kalder du bare t.start()
Avatar billede madshenrik Nybegynder
06. november 2000 - 00:15 #6
Hvad skal importeres for at compileren kan finde classen timer

Mads
Avatar billede el_gnu Nybegynder
06. november 2000 - 08:20 #7
javax.swing.Timer
Avatar billede madshenrik Nybegynder
06. november 2000 - 17:29 #8
Der kommer en fejl

Interface ActionListener of class GivKort not found.

GivKort er den klasse jeg arbejder i.

Mads
Avatar billede el_gnu Nybegynder
06. november 2000 - 18:07 #9
Det er nok fordi du ikke har importeret java.awt.event.* som er den pakke der indeholder ActionListener
Avatar billede madshenrik Nybegynder
06. november 2000 - 21:12 #10
el_gnu

Jeg har nu fundet ud af det pånær variablen this som den påstår den ikke kender og ikke er blevet initialiseret jeg går/gik udfra at this skulle kalde selve klassen om og om igen. jeg ved ikke om jeg har misforstået dette eller hvad. Vil være taknemmelig hvis du lige ville forklare dens brug.

Mads
Avatar billede el_gnu Nybegynder
06. november 2000 - 21:58 #11
Du har forstået det helt rigtig, this er en reference til det pågældene objekt, der lavet ud fra denne klasse.

Det kan være at man ikke kan bruge this allerede ved initialiseringen af variabler, det kan jeg ikke lige huske.

Prøv at lave en constructor hvor du så initialiserer timeren.

Eks.

public klasseMedGivKort() {
  t = new Timer(2000, this);
}


Det kræver så at du først instansierer klassen før den bruges.

Eks.

klasseMedGivKort kmgk = new klasseMedGivKort();
Avatar billede madshenrik Nybegynder
08. november 2000 - 22:25 #12
El_gnu

Kan det ikke lade sig gøre at lave en private variabel i stil med dette

private Timer t = new Timer(2000, actionPerformed(ActionEvent e));

Altså hvor man kalder timeren med et andet parameter end this for det kan jeg ikke får den til at æde.

Derefter kunne man så lave nogle metoder der kunne håndtere start og stop f.eks. i stil med dette.

public static void startTimer ()
    {
        t.start();
    }

public static void stopTimer ()
    {
        t.stop();
    }

Problemet er så bare at jeg ikke kan få den til dette

private Timer t = new Timer(2000, actionPerformed(ActionEvent e));

Umiddelbart når jeg læser javadoc til timeren burde dette være en fremgangsmåde. Men jeg kan ikke få det til at virke.

Håber du kan hjælpe.


Mads 
Avatar billede el_gnu Nybegynder
08. november 2000 - 23:50 #13
prøv at lave en seperat klasse som kan du kan få til at gøre det du vil.
Denne klasse skal så bruges som argument til timeren.

Eks.

class myAction implements ActionListener {
  int count = 0;
  private klasseMedGivKort kmgk;

  public void actionPerformed(ActionEvent e) {
    kmgk.givKort(++count);
    if (count >= 8) count = 0;
  }

  public myAction(klasseMedGivKort kmgk) {
    this.kmgk = kmgk;
  }
}

class klasseMedGivKort {
  myAction ma = new myAction(this); //OBS! jeg ved godt der står this, men prøv alligevel
  public void givKort() {
    //samme kode som tidligere
  }
}
Avatar billede el_gnu Nybegynder
08. november 2000 - 23:51 #14
glemte lige timeren...

Timer t = new Timer(2000, ma);
Avatar billede madshenrik Nybegynder
09. november 2000 - 20:31 #15
El_gnu

Jeg har nu fået dette kompileret

import java.awt.event.*;
import javax.swing.Timer;

class myAction implements ActionListener {
  int count = 0;
  private GivKort kmgk;

  public void actionPerformed(ActionEvent e) {
    kmgk.givKort(++count);
    if (count >= 8) count = 0;
  }

  public myAction(GivKort kmgk) {
    this.kmgk = kmgk;
  }
}

import java.awt.event.*;
import javax.swing.Timer;

public class GivKort implements ActionListener {
   

    int count = 0;
    myAction ma = new myAction(this);
    public  Timer t = new Timer(2000, ma);

    public void givKort(int kort)
    {
           
        if (Giver.getGiver() % 2 == 1)    // Hvis player 1 gir
        {
            switch (kort) {
                case 1:
                case 2:
                case 5:
                case 6:
                    CardGame.ps2.insertAtTop(CardGame.p.removeTopCard());
                    (CardGame.ps2.getTopCard()).turnFaceUp();
                    CardGame.ps2.insertAtTop(CardGame.p.removeTopCard());
                    (CardGame.ps2.getTopCard()).turnFaceUp();
                    break;
                case 8:
                    t.stop();
                    kort = 0;
                case 3:
                case 4:
                case 7:
                    CardGame.ps1.insertAtTop(CardGame.p.removeTopCard());
                    CardGame.ps1.insertAtTop(CardGame.p.removeTopCard());
            }
        }
    }

    public void actionPerformed(ActionEvent e)
    {
        givKort(++count);
    }
    public  void start()
    {
    t.start();
    }

}

Men mit problem er så at jeg ikke kan kalde denne public void start fra en anden klasse da den ikke er static og gør jeg den static kan metoden ikke kalde t.start pga. static/nonstatic.

Hvad gør jeg


Mads
Avatar billede el_gnu Nybegynder
10. november 2000 - 19:49 #16
hmmm, prøv at erstatte givKort med følgende:

import java.awt.event.*;
import javax.swing.Timer;

public class GivKort {
   
    myAction ma = new myAction(this);
    public Timer t = new Timer(2000, ma);

    public void givKort(int kort)
    {
        if (Giver.getGiver() % 2 == 1)    // Hvis player 1 gir
        {
            switch (kort) {
                case 1:
                case 2:
                case 5:
                case 6:
                    CardGame.ps2.insertAtTop(CardGame.p.removeTopCard());
                    (CardGame.ps2.getTopCard()).turnFaceUp();
                    CardGame.ps2.insertAtTop(CardGame.p.removeTopCard());
                    (CardGame.ps2.getTopCard()).turnFaceUp();
                    break;
                case 8:
                    t.stop();
                    kort = 0;
                case 3:
                case 4:
                case 7:
                    CardGame.ps1.insertAtTop(CardGame.p.removeTopCard());
                    CardGame.ps1.insertAtTop(CardGame.p.removeTopCard());
            }
        }
    }
}

Problemet med static kan klares med at du laver et objekt udfra denne klasse, altså new GivKort()

Men jeg kan ikke se hvordan GivKort skal referere til CardGame og Giver.

Kan du ikke sende din foreløbige kode til min e-mail så jeg kan se det i sammenhæng?
Avatar billede madshenrik Nybegynder
15. november 2000 - 17:19 #17
Giver er også blevet droppet. Men det er meningen at metoden givkort skal kaldes fra cardgame.

Den nye kode du nu har skrevet hvad skal da starte timeren.

Mads 
Avatar billede madshenrik Nybegynder
15. november 2000 - 17:28 #18
Her er den kode som vi har brugt uden timer.



public class GivKort
{
    public static void givKort()
{

        for (int i = 0; i < 2; i ++)
        {
            CardGame.ps1.insertAtTop(CardGame.p.removeTopCard()); // player 1 får de to første kort
            (CardGame.ps1.getTopCard()).turnFaceUp();
        }   

        for (int j = 0; j < 2; j ++)
        {   
            CardGame.ps2.insertAtTop(CardGame.p.removeTopCard()); // player 2 får de to første kort
       
           
        }

        for (int i = 2; i < 4; i ++)
        {
            CardGame.ps1.insertAtTop(CardGame.p.removeTopCard()); // player 1 får de to sidste kort
            (CardGame.ps1.getTopCard()).turnFaceUp();
        }

        for (int j = 2; j < 4; j ++)

        {   
            CardGame.ps2.insertAtTop(CardGame.p.removeTopCard()); // player 2 får de to sidste kort
       
        }

   



   
}


}
Og denne linie kalder vi så metoden med i klassen nytspil
GivKort.givKort();

Det eneste der så var meningen var at man på skærmen kunne se at kortene blev givet to og to på samme måde som hvis man spiller casino i virkeligheden altså med et spil kort.

Mads
Avatar billede el_gnu Nybegynder
15. november 2000 - 17:51 #19
GivKort gk = new GivKort(); //ny instans af GivKort
gk.t.start(); // her gives kort
Avatar billede madshenrik Nybegynder
19. november 2000 - 22:47 #20
Nu virker det faktisk nu skal jeg bare gennemskue det.
Mange tak for hjælpen el_gnu.

Mads
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