synchronizacja klient-serwer-klient (scrabble)

0

Witam.
Piszę w Javie projekt na wrzesień. Tematem miała być jakaś gra dwu, lub więcej, osobowa. Wybrałem scrabble, dość nieprzemyślanie. Po długiej wędrówce zakończyłem grę (losowanie literek, układanie na planszy, zatwierdzenie ruchu, zliczenie punktów i dobór liter.

Przyszedł czas na drugi etap. Czas bardzo nagli, a ja nie mogę wpaść na rozwiązanie problemu jakim jest synchronizacja.
Czy ktoś ma z was jakiś pomysł?

Główna gra, czyli klient to applet.
Problem polega na tym, że całe sterowanie nie odbywa się w pętli tylko poprzez buttony. Te których użytkownik wcisnąć nie może są ustawiane jako setVisible(false).

Gdy podłączy się 2 graczy, serwer startuje losuje dla nich literki i wysyła do klientów obiekt Gracz (punkty, ruch, nazwa itp).
Gracz który wygrał losowanie zaczyna i ma do dyspozycji literki i przyciski "wymień","popraw","zatwierdź".

Gracz 2, ten który oczekuje na ruch widzi tylko swoje literki.

I OTO PYTANIE:
Gracz 1, po wciśnięciu "zatwierdź" wysyła do serwera informacje o położeniu liter itp (wysyła obiekt Gracz) i ustawia sobie blokady te same co gracz 2 posiada aktualnie (czyli brak buttonów i zablokowane litery).
I jak w tym momencie zapętlić ruch, żeby gracz 2 rozpoczął grę?!

Problem polega na tym, że wszystkie wywołania funkcji odbywają się podczas zdarzeń w jakimś buttonie.
Kończy się czas, mam jeszcze inne rzeczy do nauki a projekt spędza mi sen z powiek, zwłaszcza, ze zostało już tak blisko do końca.

Proszę o pomoc, z góry dzięki!

0

Zdaje mi się, że zrobiłbym wątek gry - kiedy to gracz ma oczekiwać na ruch przeciwnika(czyli wykonał swój) wątek gry wywoływałby na sobie wait() (Object#wait()), natomiast inny wątek byłby zablokowany w oczekiwaniu na odpowiedź z serwera o zmianie tury - jeżeli takową informacje otrzymamy, wątek odpowiadający za komunikacje wybudza wątek gry po przez notify() (Object#notify())
Działa bez zarzutu, testowane na statkach.

0

ok dzięki za odpowiedź. Równiez myślałem o wątkach, ale jest problem. Mam następujący kod:

 import java.io.IOException;


public class WątekGry extends MyApplet implements Runnable  {

	private Thread watek;
	public void start()
	{
		// jeśli nie ma działającego wątka, utwórz i uruchom nowy
		if (watek == null) 
		{
		watek = new Thread(this);
		watek.start();
		}
	}
	
	@Override
	public void run() 
        {
         g.nazwa="cosTam"; 
	}

	public void stop() 
               {
		watek = null;
		}

}
 

Chciałem zobaczyć czy działają mi operacje na applecie, chciałem nadpisać nazwę gracza i niestety nic się nie dzieje. Przez parametr przecież do metody RUN nie podam obiektu mnie interesującego.

0
import javax.swing.JApplet;

public class WatekGry extends JApplet implements Runnable {
	private String nazwa;
	private Thread watekGry;

	public WatekGry() {
		if (watekGry == null)
			watekGry = new Thread(this);
	}

	@Override
	public void init() {
		if (!(watekGry.isAlive()))
			watekGry.start();
	}

	@Override
	public void destroy() {
		if (watekGry.isAlive()) {
			watekGry.interrupt();
			watekGry = null;
		}
		System.out.println("Wątek zakończony");
	}

	@Override
	public void run() {
		while (true) {
			this.nazwa = "coś tam";
			System.out.println("nazwa: " + this.nazwa);
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				System.err.println("Wątek przerwany!");
				e.printStackTrace();
			}
		}
	}
}

jeśli chcesz żeby wątek działał ciągle metoda run() powinna wyglądać następująco:

@Override
public void run() {
	while (true) {
		this.nazwa = "coś tam";
		System.out.println("nazwa: " + this.nazwa);
		try {
		        Thread.sleep(100);
		} catch (InterruptedException e) {
			System.err.println("Wątek przerwany!");
			e.printStackTrace();
		}
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1