Avatar billede supermichael Nybegynder
11. februar 2007 - 21:29 Der er 7 kommentarer og
1 løsning

RMI og afvent respons

Jeg er igang med at lave et netværksspil som er tur-baseret.

Jeg er nu kommet til at runden skal foretages, og hver spiller i List<PlayerInterface> skal tage deres tur.

Det har jeg tænkt mig at gøre i en for-løkke. Men spilleren i den anden ende skal have tid til at overveje sit træk.

Hvordan kan jeg lave det fornuftigt, så for-løkken venter i 60 sekunder, før trækket skippes og næste spiller for sin tur.

Jeg har prøvet at lave en funktion hos spilleren der først returnere når spilleren har indtastet brugerinput, men min løkke springer over med det samme, på trods af manglene retur-værdi

Min kode skulle gerne ligne nedenstående

Player playerUp = null;

//Denne funktion bliver kaldt af serveren
public void tur() {
  for (alle spillere i Listen players) {
    player.sendBesked("din tur");
    playerUp = player;
    //efter et minut uden respons skal der springes videre i løkken
  }
}

//Denne bliver kaldt over RMI af spiller
public void move() {
  if (playerUp == spilleren der køre funktionen) {
    //bevæg spillers brik
  }
}
Avatar billede arne_v Ekspert
11. februar 2007 - 22:28 #1
skal det ikke være mere event baseret ?

du har en state som fortæller hvis tur det er til at trække

ved ændring af den state sendes information ud om hvis tur det er til at trække

state kan ændres på to måder:
1) spiller sender træk
2) timer sender timeout

du starter så en timer hver gang betænknings tiden starter
Avatar billede supermichael Nybegynder
11. februar 2007 - 23:15 #2
aha..

Hvordan kan jeg lave det.. Jeg fandt i øvrigt ud af at rmi godt kan afvente resultat.. Det var bare mig der havde lavet en dumme-fejl (!= i stedet for ==). Det gør det hele lidt forvirrende. :o)

Jeg har nu lavet en timer der printer retur-værdien fra playeren ud. Den timer starter jeg så i min for-løkke. Men hvordan får jeg forløkken til at afvente et resultat. Skal jeg til at rode med thread.sleep og interrupt ?
Avatar billede arne_v Ekspert
11. februar 2007 - 23:31 #3
jeg ville slet ikke have den for løkke
Avatar billede supermichael Nybegynder
11. februar 2007 - 23:36 #4
Hvordan ville du så gøre det ?
Jeg er helt blank..

Jeg skal sikre mig at alle spillere i spiller-listen har haft deres tur, og at de enten er passive eller har rykket.
Avatar billede arne_v Ekspert
12. februar 2007 - 00:04 #5
jeg snakker om en move logik som:

move:
  hvis denne clients skal trække så
    cancel timer
    udfør træk
    sæt næste client til at skulle trække
    start timer
  ellers
    fejl

og ingen for løkke på server
Avatar billede supermichael Nybegynder
12. februar 2007 - 00:37 #6
Ahaaa.. Nu forstår jeg..
Jeg laver det på den måde at

Timeren stopper hvis værdien "move" er andet end null, og playerUp sættes til næste spiller.
Hvis timeren når at løbe ud, sættes playerUp til næste spiller..

Dette foretages indtil alle spillere har taget deres tur..

Det skal nok virke. Der er selvfølgelig en masse andre faktorer, men jeg er for træt til at nævne det nu. Jeg vil ind og sove. Læg et svar, så har du ekstra points i morgen
Avatar billede arne_v Ekspert
12. februar 2007 - 00:51 #7
det er meget sjældent at sleep er en god løsning
Avatar billede arne_v Ekspert
12. februar 2007 - 00:51 #8
og et svar
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