------------------------------
Sieci Komputerowe Laboratorium
Zadanie 2
Termin: ??.??.2001
------------------------------
       M*I*M*O*P*O*L (R)

Gra w Mimopol(R) sklada sie z nastepujacych elementow:
- Gracze. Wystepuja w dowolnej ilosci, kazdy gracz ma unikalny identyfikator
  np imie oraz koto w banku na ten identyfikator;
- Bank. Jest obiektem CORBA. Moze wykonac nastepujace funkcje:
  - Zalozenie konta o podanej nazwie, pocztkowo zawiera $500
  - Zmiana stanu konta. Stan konta nie moze spasc ponizej $0. Operacja, ktora
    by to powodowala nie moze zostac wykonana
  - Pobranie wysokosci salda danego konta
  - Skasowanie konta
- Zestaw pol gry (w liczbie conajmniej 10). Kazde pole jest obiektem CORBA.
  Pola zorganizowane sa w cykliczna liste. Generyczne pole potrafi wykonac
  nastepujace czynnosci:
  - Wejdz(gracz): Gracz przechodzi na to pole. W wyniku otrzymuje opis pola.
    Na polu moze znajdowac sie jednoczesnie nie wiecej niz jeden gracz
    (proba wejscia na zajete pole powoduje blad).
  - DajAkcje(): Pobiera liste akcji (z opisami kazdej z nich) dostepnych dla
    gracza. Akcje sa zalezne od rodzaju pola (patrz ponizej). Jako efekt
    uboczny akcja moze zmienic stan konta gracza przebywajacego na polu
    (byc moze rowniez innych graczy).
  - WykonajAkcje(akcja): wybiera jedna z otrzymanych poprzednia funkcja akcji.
    Jesli jej wykonanie jest mozliwe gracz jako rezultat otrzymuje nazwe
    nastepnego pola. W przeciwnym przypadku (np brak $ na koncie) blad i
    nalezy wybrac inna akcje. Zawsze dostepna jest akcja 'Przegralem',
    w wyniku ktorej nie otrzymuje sie nazwy nastepnego pola. Gracz, ktory ja
    wybierze, przegrywa (jego konto w Banku jest kasowane). Wykonanie akcji
    powoduje opuszenie pola przez gracza.

Celem zadania jest napisanie implementacji obiektow Banku i Pol oraz dwoch
programow. Pierwszy program rejestruje obiekty i dziala jako serwer.
Drugi jest interaktywnym programem klienta sluzacym do prowadzenia rozgrywki
przez gracza. Klient na poczatku pobiera identyfikator gracza i zaklada
odpowiednie konto w Banku. Nastepnie pozwala na wykonanie nastepujacych
czynnosci:
 - przejscie na pole (o ile sie na zadnym nie znajduje; jesli to poczatkek
   rozgrywki to jest to pole o nazwie 'start'), powoduje pojawienie sie opisu
   pola i listy akcji do wyboru; jesli pole jest zajete to gracz zostaje o
   tym poinformowany i moze powtorzyc probe przejscia do skutku
 - sprawdzenie stanu konta;
 - wybor akcji (w wyniku czego otrzyma nazwe nastepnego pola).
 - przerwanie rozgrywki (jesli znajduje sie aktualnie na polu, to powoduje to
   automatyczny wybor akcji 'Przegalem')

Obiekty CORBA w tym zadaniu powinny rejestrowac sie w serwisie nazw w 
nastepujace drzewo:
Mimopol (context) --> Bank (context)
                  \-> Pola (context) --> nazwa pola 1
                                     |-> ...
                                     \-> nazwa pola n

Wiecej o polach:
1. Wybor kolejnego pola
Jesli nie zostalo to inaczej zdefiniowane (dla okreslonego rodzaju pola) 
uzywany jest nastepujacy algorytm wyboru pola (wersja z jedna kostka):
Znajac k kolejnych pol (gdzie k to zwyczjowo 6) w ustalonym cyklicznym
porzadku pol, jako pole nastepne podane zostaje losowo wybrane z tych k pol.

Dla chetnych (jesli rozumieja ten opis) - zaimplementowac wersje z 2 kostkami
(musi byc wtedy sensownie duzo pol), w ktorej znane jest 11 kolejnych pol
z pominiecie pierwszego i losowanie pola nastepuje z odpowiednim rozkladem
prawdopodobienstwa.

2. Rodzaje pol
a. Start - jest dokladnie jedno takie pole (nazwa 'start')
Pole startowe, jedyna dostepna akcja jest 'Wyplata', gracz otrzymuje $100.
b. Relaks
Jedna akcja - pusta (nic nie zmienia).
c. Ryzyko/Szansa
Jest zawsze jedna akcja powodujaca losowe (ale podane wczescniej w opisie
akcji) zmiany na koncie bankowym gracza. Akcjom tym towarzysza irracjonalne
opisy typu 'Bank pomylil sie na twoja korzysc, otrzymujesz $1000',
'Mandat za przekroczenie predkosci, placisz $10' itp. Wynikiem wylosownej
akcji moze byc arbitralne przeniesienie na pole o okreslonej nazwie np
'Idziesz do wiezienia' podaje 'Wiezienie' jako nastepne pole.
d. Grunt - najczesciej wystepujace pole
Pole gruntu posiada nastepujace charakterustyki:
- cene gruntu
- nazwe wlasciciela (na poczatku bez)
- ilosc hoteli (od 0 do 5, poczatkowo 0)
- cene wybudowania hotelu
- oplate za postoj (zalezna od ilosci hoteli)
Dostepne akcje sa zalezne od wlasciciela gruntu:
- brak wlasciciela:
  - kupno gruntu (pomniejsza stan konta o cene gruntu, ustawia aktualnego
    gracza na wlasciciela)
  - nic
- wlasny grunt:
  - budowa hotelu (o ile liczba hoteli < 5; pomniejsza stan konta o cene hotelu)
  - nic
- grunt innego gracza:
  - oplata (pomniejsza stan konta o cene postoju i powieksza o ta sama kwote
    koto wlasciciela)

Uwagi:
- Gra, tak jak zostala wyspecyfikowana, nie dzieli rozgrywki na tury i jest
  to zamierzone;
- Program klienta musi buforowac zapytania do serwisu nazw, nie moze
  pobierac dwukrotnie odwolania do pola o tej samej nazwie;
- Bledy opisane powyzej (za maly stan konta, pole zajete) a takze inne, nie
  przewidziane, nalezy obslugiwac przez zdefiniowanie i uzywanie odpowiednich
  wyjatkow;
- W miejscach, gdzie jako argumentow dla zdalnych wywolan wydaje sie naturalne
  uzycie sekwencji, mozna ograniczyc sie do przesylania napisow i/lub
  stosowania metod-iteratorow w celu uproszczenia zarzadzania pamiecia;

Na pytania dotyczace zadania odpowiada: Michal Szafranski <stalker@mimuw.edu.pl>

Powodzenia!