Avatar billede aligncenter Nybegynder
05. juni 2001 - 00:54 Der er 6 kommentarer og
1 løsning

kode tjeck



disse løkker skulle teste om w1 overlapper et punkt fra map vectoren, hvis der er overlap skal w1 flyttes tilbage to position den modsatte retning så w1 ikke kommer i kontakt i GUI med en væg dette sker bare ikke hvad er der galt med koden, kan ikke figure it out









int i;
  for(i = 0;i < enemys.size();i++)  {

  Worm w1 = (Worm)enemys.elementAt(i);

  int r = randomInt(1,4);
 
  switch (r)  {
    case 1:
    w1.moveEast();
    int j;
    boolean found = false;
    for(j = 0;j < map.size() && !found;j++)    {
      Wall tmp = (Wall)map.elementAt(j);
      if (w1.getPoint().equals(tmp.getPosition()))  {
        w1.moveWest(); w1.moveWest();
        found = true;System.out.println(\"1\");   
      }
    }
   
    break;
    case 2:
    w1.moveWest();
   
    found = false;
    for(j = 0;j < map.size() && !found;j++)    {
      Wall tmp = (Wall)map.elementAt(i);
      if (w1.getPoint().equals(tmp.getPosition()))  {
        w1.moveEast();w1.moveEast();
        found = true;System.out.println(\"2\");   
      }
    }
   
    break;
   
    case 3:
    w1.moveNorth();
   
    found = false;
    for(j = 0;j < map.size() && !found;j++)    {
      Wall tmp = (Wall)map.elementAt(j);
      if (w1.getPoint().equals(tmp.getPosition()))  {
        w1.moveSouth(); w1.moveSouth();
        found = true;System.out.println(\"3\");   
      }
    }
   
    break;
    case 4:
    w1.moveSouth();
   
    found = false;
    for(j = 0;j < map.size() && !found;j++)    {
      Wall tmp = (Wall)map.elementAt(j);
      if (w1.getPoint().equals(tmp.getPosition()))  {
        w1.moveNorth();w1.moveNorth();
        found = true;System.out.println(\"4\");   
      }
    }
   
    break;
   
  }//end switch
  }//end for   
}
Avatar billede erikjacobsen Ekspert
05. juni 2001 - 00:57 #1
Hvad gør den randomInt godt for ?
Avatar billede pstric Nybegynder
05. juni 2001 - 04:14 #2
erikjacobsen>> randomInt() gør switch\'en nondeterministisk

aligncenter>> får du i det hele taget udskrevet et tal?
returnerer getPoint() og getPosition() begge java.awt.Point, eller en anden klasse, hvor equals() gør \'som forventet\'?

Prøv evt. at rydde lidt op i koden - det gør det tit nemmere at finde fejlen.

  for (int i=0; i < enemys.size(); i++) {
    Worm w1 = (Worm) enemys.get(i);
    int r = randomInt(1, 4);
    switch (r) {
      case 1:
        w1.moveEast();
        if (atWall(w1)) {
          w1.moveWest();
          w1.moveWest();
        }
        break;
      case 2:
        ...
    }
  }

private boolean atWall(Worm worm) {
  for (int i = 0; i < map.size(); i++) {
    Wall wall = (Wall) map.get(i);
    if (worm.getPoint().equals(wall.getPosition())) {
      return true;
    }
  }
  return false;
}


Nu kan du evt. lave lidt om i din Worm:

public class Worm {
  public static final int EAST = 1;
  ... WEST, NORTH, SOUTH ...

  public void forward(int direction, int steps) {
    // enten: lav en switch, der kalder moveEast() (eller move...) steps gange
    // eller: flyt moveEast()... logikken herind.
    // det sidste giver nok det bedste resultat, men det kommer an på din Worm.
  }

  public void reverse(int direction, int steps) {
    // lav direction om til den modsatte retning og kald
    forward(reverseDirection, steps);
  }

  ... resten af Worm
}

Så kan du rydde endnu mere op i den oprindelige løkke:

  for (int i=0; i < enemys.size(); i++) {
    Worm w1 = (Worm) enemys.get(i);
    int r = randomInt(Worm.EAST, Worm.SOUTH);
    w1.forward(r, 1);
    if (atWall(w1)) {
      w1.reverse(r, 2);
    }
  }

Nu får jeg så lyst til at stille et nye spørgsmål: hvorfor vil du rykke to skridt tilbage, og ikke kun det ene, du rykkede frem?
Er du sikker på at der altid er mindst to punkter mellem to vægge, så er det ikke noget problem. Ellers kunne det være der, dit problem ligger.
Måske skulle du først prøve, bare at rykke et skridt tilbage.

enten
w1.reverse(r, 1);

eller
      if (w1.getPoint().equals(tmp.getPosition()))  {
        w1.moveWest();
        found = true;System.out.println(\"1\");   
      }
Avatar billede erikjacobsen Ekspert
05. juni 2001 - 08:25 #3
:) Ja, pstric - det kan jeg da godt regne ud... Men mon ikke det kunne være fordi
den ér nondeterministisk, at den ikke regner det rigtigt ud. Når der er et problem skal
det vel findes, altid, og så nondeterministisk vælge blandt de mulige løsninger. Her
kommer man til at overse et problem - måske.
Avatar billede aligncenter Nybegynder
05. juni 2001 - 13:20 #4
Nondetemernistisk betyder?

>Worm er implementerert med MOveEast, moveWest, moveSouth,MoveNorth metode der definere denne adfærd

Der returnes i begge tilfælde et objekt af typen java.awt.Point.

:)
Avatar billede erikjacobsen Ekspert
05. juni 2001 - 16:09 #5
Nondeterministisk betyder, at der ikke sker det samme hver gang du kører
programmet. Jeg har stort kigget på den der sætning med randomInt, og synes
at der må være tilfælde du ikke opdager, fordi du ikke hver gang kigger i alle
retninger. Men jeg er bestemt ikke sikker på det.
Avatar billede aligncenter Nybegynder
05. juni 2001 - 19:01 #6
jeg forstår ikke \"kigge i alle retninger\", jeg tester om w1 ligger i et punkt der eroptaget,hvis det tilfældet flyttes w1 to gamge tilbage modsatte regning.

et punkt i programmet kan kun eksistere et sted det har programmet taget forhold til
Avatar billede aligncenter Nybegynder
05. juni 2001 - 21:56 #7
lukker
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