Smalltalk

Zadanie zaliczeniowe - Metagra

Na prostokątnej planszy znajdują się obiekty. Każdy z obiektów wykonuje pewien program napisany w języku programowania Action Lang (opis języka znajduje się dalej)). Rodzaje obiektów oraz język programowania definiują pewien świat (system), który będziemy symulować.

Obiekty mogą być łączone w zespoły (można przyjąć, że samodzielne obiekty są zespołami 1-elementowymi). Spośród obiektów będących członkami tego samego zespołu tylko jeden wykonuje instrukcje swojego programu. Obiekt jest wyłaniany w każdym kroku drogą losowania lub wskazywany przez użytkownika (decydujemy o tym w momencie tworzenia zespołu).

Obiekty wykonują swoje programy po kolei, po jednej instrukcji, czyli w jednym kroku symulacji wszystkie zespoły obiektów wykonują po 1 instrukcji.

Wszystkim obiektom w momencie ich umieszczania na planszy przypisujemy program, który będą wykonywały. Obiekty mogą być tworzone automatycznie w czasie działania programu. Action Lang pozwala na interakcję z użytkownikiem. Można zapytać go o konkretną wartość lub poprosić o wybranie instrukcji z listy. W obu przypadkach możliwe jest wprowadzenie maksymalnego czasu do namysłu przez użytkownika. Jeśli nie wykona ruchu na czas to zwracana jest wartość domyślna. Umożliwia to symulację np. gier zręcznościowych.

Język ActionLang

Język zawiera zestaw instrukcji standardowych oraz zestaw operacji zależnych od symulowanego systemu.
Każdy obiekt musi umieć wykonywać instrukcje standardowe.
Programem w języku ActionLang jest ciąg ponumerowanych instrukcji. Program może zawierać zmienne robocze (lokalne dla programu).
 

Instrukcje standardowe:

    GOTO num;                        skok do instrukcji o numerze num
    JUMPIF warunek, num;      skok warunkowy
    STOP                                 zakończenie programu (obiekt nic już nie robi)
    SKIP                                  pusta instrukcja (np. domyślna akcja)
    EXECUTE listaInstrukcji, instrukcjaDomyślna, timeout;       wykonuje instrukcję wybraną przez użytkownika
    <zmienna robocza> := wyrażenie
    <zmienna robocza> := READ tekst, wartośćDomyślna, timeout

Język zawiera wyrażenia standardowe oraz funkcje zależne od symulowanego systemu. Wyrażenia standardowe są to wyrażenia arytmetyczne (+,*,-, stałe liczbowe, zmienne robocze). Można założyć, że wszystkie zmienne robocze są na początku zerowane. Warunki - relacje i wyrażenia logiczne zbudowane z relacji oraz operatorów logicznych and, or, not.

Dla każdego symulownego systemu język ten będzie musiał być rozszerzony o operacje i funkcje specyficzne dla systemu. Przy wpisywaniu przez użytkownika nie sprawdzamy ich poprawności, to po prostu nazwa i kilka argumentów.
Przykłady operacji i funkcji:
    PrzesuńSięNa i, j                    przesunięcie się obiektu aktywnego na pole (i,j)
    Zabij i, j                                 zabij obiekt (aktywny lub pasywny) na polu (i,j)
    Przenieś i, j                            przenieś to co stoi na twoim polu na pole (i,j)
    StrzelajNaOdległość k, d       strzelaj w kierunku k na odległość d
    CzyPoleZajęte i, j                  zwraca TRUE, jeśli pole (i,j) jest zajęte
    IleSąsiadów i, j                      zwraca liczbę sąsiadów (zajętych pól) dla (i,j)
itp., zależnie od potrzeb i fantazji.

Należy zaprojektować (wykonać analizę i projektowanie) oraz zaprogramować w Smalltalku program symulujący opisany system.
 

Program powinien umożliwiać:

  1. Pisanie programów do wykonywania przez obiekty metodą wybierania kolejnych instrukcji i wyrażeń z listy.
  2. Umieszczanie na planszy obiektów oraz przypisywanie im programów do wykonania.
  3. Łączenie obiektów w zespoły.
  4. Łatwe dodawanie nowych rodzajów obiektów, a także konstruowanie nowych języków dla programów wykonywanch przez obiekty (czyli modyfikowalność całego systemu). Uważamy, że modyfikacje wykonuje się łatwo jeśli wymagają co najwyżej dołączenia nowych klas lub metod.
Symulacja powinna być możliwa w następujących trybach:
a). Symulacja działania systemu poprzez cykliczne wykonywanie przez reprezentanta każdego z zespołów obiektów po jednej instrukcji jego programu lub instrukcji wskazanej przez użytkownika i np. kończenie gry gdy wszystkie wykonają STOP lub na sygnał z klawiatury.
b). Możliwość krokowego działania programu (wykonywanie instrukcji na sygnał z zewnątrz) oraz wykonywanie po jednym kroku z podglądaniem każdego z wykonywanych przez obiekty programów (śledzenie krok po kroku).

Przykłady:

  1. Symulacja życia komórek: na planszy umieszczone są obiekty, które w każdym kroku sprawdzają ilu mają sąsiadów i w zależności od ich liczby rozmnażają sie lub obumierają. W tym przypadku wszystkie obiekty mają ten sam program. (uwaga: to nie jest oryginalna gra w życie)
  2. Gra w warcaby: Mamy dwa zespoły obiektów, ich reprezentantów w każdym kroku wyznacza użytkownik, użytkownik wybiera także instrukcję do wykonania w każdym kroku przez wyznaczony obiekt.
Uwaga:
Jeśli ktoś chciałby zrelizować dodatkowo innne sposoby symulacji lub inne sposoby wyznaczania obiektów lub instrukcji do wykonania, to oczywiście może to zrobić

Projekt powinien spełniać następuące warunki:
1. Powinien być stworzony zgodnie z regułami analizy i projektowania obiektowego.
2. Powinien być na tyle dokładny, aby widać było sposób wykonania programu, który go realizuje.

Oceniane będą:
- projekt i konstrukcja programu (obiektowość, łatwa modyfikowalność)
- możliwości programu (rodzaje symulacji, stopień skomplikowania świata)
- jakość interfejsu użytkownika (łatwość komunikowania się z programem)

Zadanie zaliczeniowe "małe"

Zaprojektuj i zaimplementuj klasy reprezentujące Piłkarzy i Drużyny. Każdy piłkarz wie w jakiej jest drużynie (dokładnie jednej), każda drużyna ma swoja nazwę. Piłkarze dzielą się na napastników (wiedzą czy grają na skrzydle lewym, prawym czy po środku), pomocników (wiedzą czy są pomocnikami ofensywnymi czy defensywnymi), obrońców (wiedzą czy są zwykłymi obrońcami czy libero) i bramkarzy (wiedzą ile procent strzałów bronią).

Każdy piłkarz jest człowiekiem. Każdy człowiek zna swoje imię i nazwisko. Każdy człowiek potrafi wypisać dane o sobie (np. printString), podając komplet swoich danych. Uwaga - nie należy powtarzać raz już napisanego kodu. Należy dostarczyć oprócz klas część testującą (generującą przykładowe dane) i wszystko zapakować w pakiet.

Smalltalk

Dolphin