Nie bardzo widzę to rozwiązanie z zastosowaniem semaforów...
Masz na myśli jeden semafor obsługiwany przez 2 graczy? Schemat działania gracza byłby chyba mniej więcej taki:
class Gracz implements Runnable {
private static String aktualnyGracz = null; /* static - gracz, który powinien wykonać teraz ruch */
private String mojaNazwa = null; /* moja nazwa gracza, np "A" */
private Semaphore semaphore = null;
private PoleGry poleGry = null;
public Gracz(String nazwa, Semaphore semafor, PoleGry poleGry) {
this.mojaNazwa = nazwa;
this.semaphore = semafor;
this.poleGry = poleGry;
}
public void run() { /* Runnable.run() */
while (true) {
semaphore.acquire(); /* + try/catch Exception */
if ( aktualnyGracz.equals(mojaNazwa) ) {
_znajdź kolejny ruch (na podstawie polaGry)_
_zmień aktualnegoGracza na przeciwnego (np. "A" -> "B", "B" -> "A")_
} else {
_? sleep() ?_ /* wymagane? */
}
semaphore.release();
}
}
}
int main() {
PoleGry pole = new PoleGry(); /* czymkolwiek jest :) */
Semaphore s = new Semaphore(1);
Gracz graczA = new Gracz("A", s, pole);
Gracz graczB = new Gracz("B", s, pole);
(new Thread(graczA)).start();
(new Thread(graczB)).start();
}
Taka koncepcja wymaga użycia sleep() przy else {}, w przeciwnym razie wykorzystanie procka wzrasta drastycznie (jak to przy while(true)). Można zrobić to bez sleep()? Tak, aby wątek czekał przy wywołaniu semaphore.acquire() DOKŁADNIE tyle czasu ile potrzeba? Chyba źle to implementuję...
Szukam takiego rozwiązania, aby gracz mógł zmienić status w dowolnym momencie na gracza interaktywnego - czyli kolejnego ruchu dokonuje człowiek, a po jego wyborze gracz komputerowy wykonuje ruch automatycznie...