05. juni 2001 - 00:54Der 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\"); } }
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\"); }
:) 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.
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.
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
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.