Краток опис на играта Cocktail Game претставува едноставна игра во која љубителите на алкохолот можат да вежбаат правење на коктели и потоа тоа знаење да го проверат. Кога ќе се стартува играта, играчот треба да го внесе своето име. Играта е замислена така што во текот на едно стартување на апликацијата може да игра само еден играч под името кое го внел на почетокот, и да ги зголемува своите поени. Играта има две нивоа : „Вежбај“ и „Погодувај коктели“. И двете нивоа го овозможуваат следното: -	Со кликнување врз сликите од секој пијалок во чашата се додава 0.05л од соодветниот пијалок -	Коктелот се смета за завршен кога чашата ќе биде полна до горе, односно ќе има 0.5л пијалок во неа. Тогаш чашата ќе почне да трепка, и играчот треба да кликне на неа со цел да го провери својот резултат. Резултатот се состои од поени за тековниот коктел кој го играчот го правел, и вкупен број на поени од сите дотогаш направени коктели.  На нивото „Вежбај“ играчот си додава пијалоци по свој вкус и желба, и откако ќе заврши, кликнува на чашата за да провери колку е добар неговиот коктел. Соодветни информации се печатат за квалитетот на коктелот, односно играчот може да види дали точно погодил некој коктел, дали ги погодил состојките на коктелот, но не и количината на секоја од состојките, или бил далеку од погодување на било каков коктел.  На нивото „Погодувај коктели“ играчот добива  пијалок кој треба точно да го погоди со цел да ги добие сите поени за тој коктел. На ова ниво, играчот може да бара помош, односно со кликнување на копчето „Помош“, на играчот му се печати соодветна порака која ќе му каже кој пијалок да го додаде во колкава количина, но секако му се одземаат соодветно поени за секој клик на ова копче. На крај, играчот треба да кликне на чашата и да види дали го погодил пијалокот кој бил наведен.  Решение на проблемот За потребите на играта, ние дефиниравме неколку класи : Drink, DrinkInCocktail, Cocktail, Game, GameGuessCocktail, GameTryCocktails и Player.  Класата Drink е едноставна класа во која чуваме име на пијалокот (string Name) и дали е алкохолен или не (bool IsAlcohol).  Класата DrinkInCocktail репрезентира пијалок кој го ставаме во коктелот, и чува во себе објект од класата Drink, и квантитет на тој пијалок. Имено, оваа класа служи за репрезентирање на количината на секој пијалок кој го ставаме во коктелот. Класата Cocktail содржи листа на пијалоци од кои е составен коктелот, име на коктелот и број на поени кои играчот ќе го освои ако точно го погоди коктелот. Оваа класа има методи кои подоцна ни служат за разни проверки Следно, ја имаме класата Game. Оваа класа е апстрактна класа, и ја претставува логиката на играта.  Во оваа класа го чуваме тековниот коктел кој го прави играчот и информации за играчот (објект од класата Player).  Во оваа класа освен конструкторот, метод за проверка дали тековниот коктел е ист со некој од листата на коктели има три апстрактни методи :   public abstract void CalculatePoints() - за дефинирање на начинот на кој ќе бидат пресметувани поените на играчот  public abstract void EngGame() – ја завршува играта  public abstract void NewGame() – за почнување на нова игра  Класите GameTryCocktails и GameGuessCocktail наследуваат од апстракната класа Game, и секој ги имплементира методите на начин на кој одговара со соодветните нивоа на играта.  Класата GameTryCocktails нема дополнителни методи освен оние кои треба да ги преоптовари од основната класа. Во методот NewGame() овозможена е иницијализација на сите променливи, а во EndGame() нивно поставување на null вредности. Во методот CalculatePoints() ги пресметува поените на играчот според тоа дали погодил точно некој коктел од листата на коктели, дали коктелот кој го направил е составен само од безалкохолни или само од алкохолни пијалоци (во тој случај добива 0 поени), а доколку ниту едно од овие услови не е исполнето, тогаш поените се пресметуваат според максималниот број на исти пијалоци кои ги имал со некој коктел. Класата GameGuessCocktail освен методите кои треба да ги преоптовари, има методи Hint() и generateRandomCocktail(). Истотака, во себе го чува како променлива коктелот кој играчот треба да го погоди (Cocktail CocktailToBeGuessed). Во методот generateRandomCocktail() генерираме на случаен начин еден коктел од листата на коктели, и тој коктел треба играчот да го погоди (односно, го иницијализираме објектот CocktailToBeGuessed). Со методот Hint() е овозможена помош на играчот – тука на играчот му се кажува кој пијалок да го додаде во која количина, освен ако веќе не ставил во коктелот пијалок кој го нема во коктелот кој треба да го погоди – во тој случај му се печати порака да ја заврши играта.   Опис на класата Cocktail  Класата Cocktail во себе ги чува следните променливи :  -	List<DrinkInCocktail> Drinks: Листа на пијалоци од кои е составен коктелот -	string Name : Име на коктелот -	int Points : Поени кои играчот ќе ги добие ако точно го погоди коктелот Оваа класа има два конструктори :  -	Cocktail(string name) – се иницијализира листата на пијалоци и името се поставува на името пренесено како аргумент во конструкторот (Овој конструктор го користиме кога ние креираме коктели во Form1) -	Cocktail() – се иницијализира листата на пијалоци и името се поставува на празен стринг  - овој конструктор се повикува кога играчот прави коктел, затоа што играчот пред да го направи коктелот, не поставува име на коктелот кој го прави Методи :  -	QuantityOfAllCoctails() : int – Го враќа вкупното количество на сите пијалоци во коктелот -	AddDrink(DrinkIntCocktail d) – Додава пијалок во коктелот. Ако веќе постои таков пијалок во коктелот, само ја зголемува неговата количина, инаку го додава пијалокот во листата на пијалоци. -	NumberOfSameDrinks(Cocktail c) : int – Го враќа бројот на исти пијалоци кои тековниот коктел ги има со коктелот проследен како аргумент (Оваа метода ни треба понатаму за пресметување на поените) -	SameIngredients(Cocktail c) : bool – Проверува дали тековниот коктел ги има истите состојки (не мора и истата количина) со коктелот проследен како аргумент (Истотака оваа метода ни е потребна понатаму за пресметување на поените на играчот) Наша имплементација на методот :  public bool SameIngredients(Cocktail c)         {             if (c.Drinks.Count != this.Drinks.Count)             {                 return false;             }             else             {                 foreach (DrinkIntCocktail d in Drinks)                 {                     bool flag = false;                     foreach (DrinkIntCocktail d2 in c.Drinks)                     {                         if (d.CompareName(d2))                         {                             flag = true;                             break;                         }                     }                     if (flag == false)                     {                         return false;                     }                 }             }             return true;         } -	GlassIsFull() : bool – Проверувка дали коктелот ја достигнал максималната големина (дали количеството на сите пијалоци во коктелот == 0.5) -	IsSoftDrinkCocktail(): bool – Проверувка дали коктелот е составен само од безалкохолни пијалоци  -	IsStrongCocktail() : bool – Проверка дали коктелот е составен само од алкохолни пијалоци -	Equals(Cocktail other) : bool – Проверка дали тековниот коктел е ист како коктелот проследен како аргумент (Дали ги има истите состојки и дали се исти количините) -	ContainsDrink(Drink drink) : bool – Проверка дали коктелот во својата листа на пијалоци го содржи пијалокот проследен како аргумент (Не ни е битно количеството во кое го содржи, само дали го содржи или не) -	ToString() : string – Преоптоварување на методот ToString()