SOISK - SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
Tomasz Puchała

Projekty

Wymagania dotyczące projektu
• Projekty realizowane są przez zespoły co najwyżej 4-osobowe.
• Ostateczny termin oddania - ostatnie zajęcia projektowe.
• Realizacja: dowolny język/środowisko umożliwiający wielobieżność (C/C++, Java, Delphi, C#, itp.) z użyciem wątków lub procesów.
• Programy symulacyjne MUSZĄ mieć przejrzysta formę graficzną obrazującą w sposób czytelny przebieg symulacji (może to być forma prostej grafiki lub przejrzysta forma tekstowa).
• Każdy program musi zawierać informację o autorach i temacie projektu i prostą pomoc.
• Sprawozdanie jest obowiązkowe (opis założeń programu, sposób rozwiązania
poszczególnych kwestii, np. zakresu informacji wymienianych miedzy wątkami,
synchronizacji, model sztucznej inteligencji, jeśli takowa istnieje w programie symulacji).
• Jeżeli wymagana jest synchronizacja międzywątkowa/międzyprocesowa to zalecane jest wykorzystanie mechanizmów zaprezentowanych na wykładzie/laboratoriach (sekcja krytyczna, semafory, obiekty zdarzeń).
• W przypadku programów symulacyjnych proszę ograniczyć ogólna liczbę wątków do ok.20.
• Oddanie projektu to: program w uruchamialnej wersji skompilowanej, kod źródłowy
programu, sprawozdanie (może być w formie elektronicznej na CD, format sprawozdania - plik PDF).
• Jeżeli plik wykonywalny projektu się nie uruchomi lub będzie zawirusowany - projekt nie zostanie zaliczony!
Tematy projektów:
1) Równolegla implementacja algorytmów wyszukiwania wzorca jednocześnie w kilku plikach tekstowych naraz. Minimum 3 różne metody wyszukiwania wzorca (np. Rabina-Karpa, Knutha- Morrisa-Pratta, Boyera-Moore’a, metoda naiwna). Jeden wątek szuka wzorca w jednym pliku tekstowym za pomocą jednej metody. Program pozwala wybrać ilość plików do przeszukania (maksimum 10) oraz metodę/metody wyszukiwania.
2) Pseudo-gra "Piłkarzyki". Na boisku są dwie drużyny: Biali i Czarni (po 4-ch zawodników). Każdy piłkarz to jeden wątek/proces, w bramkach nie ma bramkarzy. Należy stworzyć spójny algorytm zachowania piłkarzy na boisku, np. wykryto kolizje obiektu piłkarza z obiektem piłka -> obiekt piłkarz pcha piłkę w kierunku bramki przeciwnika. Kolizja z kolega z drużyny -> obaj odchodzą w losowo wybranych kierunkach, itp.
3) Symulacja akwarium. Każda ryba to pojedynczy wątek/proces. Ryby mogą być rożnych rozmiarów i rosną. Kolizja większej ryby z mniejsza kończy się zjedzeniem mniejszej z ryb i wzrostem większej. Po przekroczeniu pewnego rozmiaru ryba ginie. Stworzyć spójne algorytmy zachowania ryb. Co jakiś czas należy uzupełniać akwarium o brakujące sztuki (w akwarium ma „pływać” 5-10 ryb).
4) Symulacja przejścia dla pieszych (przejście ze światłami, droga jednokierunkowa trzy pasy ruchu, pojazdy jadące prawym pasem i skręcające w prawo mogą przejeżdżać na czerwonym świetle pod warunkiem, że na jezdni nie ma pieszych). Każdy pieszy i pojazd to osobny wątek/proces.
5) Symulacja ruchu na rondzie (rondo z jednym pasem ruchu, cztery drogi dochodzące do ronda, pojazd wjeżdżający na rondo ustępuje pierwszeństwa pojazdowi znajdującemu się na rondzie). Każdy pojazd to osobny wątek/proces.
6) Symulacja włączania się do ruchu z drogi podporządkowanej (skrzyżowanie typu T, obie drogi – podporządkowana i z pierwszeństwem są dwukierunkowe). Każdy pojazd to osobny wątek/proces.
7) Symulacja pracy windy (budynek 5-cio piętrowy, winda przewozi jednego pasażera naraz, wysadza go na zadanym pietrze i jedzie po pasażera który czeka na windę najdłużej – wcisnął guzik ściągający windę najwcześniej). Winda i pasażerowie to wątki/procesy.
8) Symulacja ruchu na lotnisku (lotnisko z trzema pasami startowymi, samoloty lądują na dowolnym niezajętym pasie i kołują do hangaru, po odczekaniu losowo wybranego czasu w hangarze samolot z powrotem kołuje na pierwszy wolny pas i startuje). Każdy samolot to osobny wątek/proces.
9) Symulacja stada ptaków (drapieżniki i gołębie). Każdy ptak to osobny wątek/proces. Drapieżnik próbuje co jakiś czas doprowadzić do kolizji z obiektem gołębia (polowanie). Jeśli się to powiedzie – gołąb ginie. Należy uzupełniać stado gołębi (w sumie na ekranie ma „latać” 5-10 ptaków).
10) Symulacja przystanku autobusowego. Na przystanek przychodzą pasażerowie (każdy czeka na określony autobus) i co jakiś czas (wg pseudorozkładu jazdy lub losowo) przyjeżdżają autobusy (każdy ma określona pojemność – możne nie zabrać wszystkich chętnych pasażerów). Pasażerowie i autobusy to pojedyncze wątki/procesy.
11) Symulacja działania sieci komputerowej w technologii Ethernet. Siec równorzędna, dostęp do medium na zasadzie rywalizacji (CSMA/CD), topologia szyny. Każda stacja w sieci, medium (nośnik, kabel) to pojedynczy wątek/proces. Stacje losowo chcą nadawać do siebie komunikaty (każdy max. 3 pakietowy) i maja możliwość prostego adresowania (np. stacja A nadaje do stacji D). W danej chwili nadawać może tylko jedna stacja - przed nadawaniem stacje sprawdzają czy nośnik
jest wolny (nikt nie nadaje).
12) Symulacja działania sieci opartej na technologii Token Ring. Dostęp do medium na zasadzie przekazywania żetonu (token passing). Każda stacja w sieci oraz medium (nośnik, kabel) to pojedynczy wątek/proces. Stacje losowo chcą nadawać do siebie komunikaty (każdy max. 3 pakietowy) i maja możliwość prostego adresowania (np. stacja A nadaje do stacji D). Zakładamy, ze stacje maja jednakowe priorytety. W pierścieniu krąży żeton lub komunikat. Stacja może nadawać tylko wtedy, gdy ma żeton. Jeśli ma żeton, ale nie chce nadawać - przekazuje żeton sąsiadowi.
13) Gra WĄŻ (komputer gra sam ze sobą). Na ekranie "wije się" kilka węży (liczbę wybiera użytkownik, ale nie więcej niż 4 - mogą mieć losową długość). Węże to wątki/procesy. Zasada: trzeba tak wybierać kierunek ruchu, żeby nie kolidował z innymi węzami (unikać przecięcia węża). Program powinien pozwolić na ustawienie tempa gry (symulacji gry).
14) Gra WYSCIGI BOLIDÓW według zasad przedstawionych w filmie TRON (na www.youtube.com można znaleźć trailer przedstawiający rzeczony wyścig dla dwóch bolidów). Cztery bolidy (każdy to osobny wątek/proces) startują z przeciwległych stron ekranu i próbują zajechać sobie drogę. Uwzględnić takie zmienne jak prędkość bolidów, pseudolosowe kierunki skrętu (zajeżdżania drogi), itp.
15) Symulacja kurnika. Kilka kur losowo co jakiś czas znosi jako. Do kurnika co jakiś czas przychodzi hodowca i zbiera jajka (jeśli jakieś są). Jeśli kura znosi jajko a poprzednie nie zostało zabrane - oba ulegają stłuczeniu. Kury i hodowca to osobne wątki/procesy.
16) Problem czytelników i pisarzy (http://pl.wikipedia.org/wiki/Problem_czytelnik %C3%B3w_i_pisarzy). Do wirtualnej biblioteki (zasobu) maja dostęp czytelnicy i pisarze, przy czym w danej chwili może w niej przebywać albo jeden pisarz albo dowolna liczba czytelników. Jeżeli na wejście do biblioteki czekają pisarze i czytelnicy to pierwszeństwo ma jeden z pisarzy. ALE pisarz opuszczający bibliotekę wpuszcza do niej w pierwszej kolejności czytelnika nawet, jeśli na wejście czekają inni pisarze. Pierwszy czytelnik wchodzący do biblioteki wpuszcza wszystkich czekających czytelników. Czas przebywania w bibliotece pisarzy i czytelników jest losowy. Chęć wejścia do biblioteki również jest losowa. Czytelnicy i pisarze to osobne wątki/procesy (nie więcej niż po 4-5 w danej grupie).
17) Symulacja GRA W ŻYCIE (zasady opisane tutaj: http://pl.wikipedia.org/wiki/Gra_w_%C5%BCycie). Jedna komórka to jeden wątek, zaimplementować automat komórkowy o 20-30 komórkach.
18) Symulacja sklepu. Do sklepu przychodzą klienci z zamiarem kupna jednego z 3ch rodzajów towarów (klient losowo decyduje ile i co chce kupić, jeśli zamiar przekracza obecny stan towaru – klient kupuje wszystko). Towar do sklepu dowożą dostawcy – każdy przed dostawą losuje sobie rodzaj i ilość dostarczanego towaru. Jeżeli brakuje towaru, jaki klient chce kupić – klient czeka 1sek. na dostawę i w przypadku niepowodzenia opuszcza sklep. Analogicznie, jeśli dostawca dostarczył towar, którego stan w sklepie jest maksymalny, czeka 1sek. na miejsce na półce i w przypadku niepowodzenia opuszcza sklep. Dostawcy (4ch-5ciu) i klienci (5ciu-6ciu) to wątki. Półki sklepowe – zasób współdzielony.
19) Napisz równoległą implementację wyznaczania najkrótszych ścieżek w grafie skierowanym ważonym. Proponowane rozwiązanie – wątków jest tyle, ile węzłów w grafie, do wyznaczania najkrótszych ścieżek w grafie zastosuj algorytm Dijkstry (literatura: Cormen, Leiserson, Rivest, „Wprowadzenie do algorytmów”, WNT), każdy wątek dostaje informację o węźle startowym i wywołuje alg. Dijkstry dla pozostałych węzłów w grafie (docelowych). Graf musi być opisany w pliku wejściowym tekstowym (zaproponuj format pliku), podobnie wyniku szukania najkrótszych ścieżek (również zapisane w plikach TXT – każdy wątek w osobnym pliku).
20) Temat własny (autor musi podać szczegóły założeń do końca listopada 2009!)
21) Napisz równoległą implementację problemu odwzorowania dowolnego grafu skierowanego nieważonego (możliwe cykle w grafie) w przestrzeń metryczną dwuwymiarową o rozmiarze NxN (macierz kwadratowa) lub NxM (macierz prostokątna) typu „miasto” (http://pl.wikipedia.org/wiki/Przestrze%C5%84_metryczna#Metryka_.E2.80.9Emiasto.E2.80.9D) dla wszelkich możliwych układów „miejskich”. Proponowane rozwiązanie: wątków jest tyle, ile węzłów w grafie, każdy wątek układa „miasto” i „ulice” dla jednego węzła (zwróć uwagę, że w mieście z danego węzła mogą wychodzić tylko 4 ulice, więc w przypadku węzłów w grafie o stopniu większym niż 4 niektóre drogi mogą być dłuższe niż 1). Jeden wątek ma generować wszystkie możliwe układy miasta dla swojego węzła a wyniki zapisywać we wspólnym pliku TXT (opracuj format tego pliku) – niezbędna tu będzie synchronizacja między wątkami w dostępie do wspólnego pliku TXT. Graf do odwzorowania również ma być wczytany z pliku TXT (zaproponuj format pliku).


Projekt 9

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Ptaki
{
    public partial class Form1 : Form
    {
        //zmienne
        public int[,] ptakiLOK = new int[10, 2];//lokacje startowe ptakow
        public int[,] ptakiPOZ = new int[10, 2];//aktualne pozycje ptakow
        public int[,] sokolLOK = new int[2, 2];//lokacja startowa sokola
        public int[,] sokolPOZ = new int[2, 2];//aktualna pozycja sokola
        public Thread[] ptakiTHR = new Thread[10];//tablica watkow ptakow
        public int[] kolizjePTK = new int[20];//tablica informujaca o kolizjach
        public int[,] odbPtak = new int[10, 10];//tablica zliczajaca odbicia obiektow

        public Semaphore sem;//semafor deklaracja
        public delegate void del();//delegacja aby poruszac obiektami nie nalezacymi do watku


        Random rand = new Random(666);//funkcja losujaca przypadkowe liczby
        int END = 0;//zmienna konczaca watki w tle
        //int jakSzybkoLatajaOfiary = 1, jakSzybkoLataSokol = 1;//czasy ms opoznien latania ptakow
        int ZabitychPtakow = 0;//zmienna zliczajaca kolizje z ptakami

        public Form1()
        {
            InitializeComponent();
            //uruchom();

            for (int i = 0; i < 10; i++)//czyszczenie tablicy pomocniczej
            {
                odbPtak[i, 0] = 2;
                odbPtak[i, 1] = 0;
            }

            ptak1.Location = new Point(rand.Next(650), rand.Next(450));
            ptak2.Location = new Point(rand.Next(650), rand.Next(450));
            ptak3.Location = new Point(rand.Next(650), rand.Next(450));
            ptak4.Location = new Point(rand.Next(650), rand.Next(450));
            ptak5.Location = new Point(rand.Next(650), rand.Next(450));
            ptak6.Location = new Point(rand.Next(650), rand.Next(450));
            ptak7.Location = new Point(rand.Next(650), rand.Next(450));
            ptak8.Location = new Point(rand.Next(650), rand.Next(450));
            ptak9.Location = new Point(rand.Next(650), rand.Next(450));
            ptak10.Location = new Point(rand.Next(650), rand.Next(450));
            sokol.Location = new Point(rand.Next(650), rand.Next(450));


            ptakiPOZ[0, 0] = ptakiLOK[0, 0] = ptak1.Location.X;
            ptakiPOZ[0, 1] = ptakiLOK[0, 1] = ptak1.Location.Y;
            ptakiPOZ[1, 0] = ptakiLOK[1, 0] = ptak2.Location.X;
            ptakiPOZ[1, 1] = ptakiLOK[1, 1] = ptak2.Location.Y;
            ptakiPOZ[2, 0] = ptakiLOK[2, 0] = ptak3.Location.X;
            ptakiPOZ[2, 1] = ptakiLOK[2, 1] = ptak3.Location.Y;
            ptakiPOZ[3, 0] = ptakiLOK[3, 0] = ptak4.Location.X;
            ptakiPOZ[3, 1] = ptakiLOK[3, 1] = ptak4.Location.Y;
            ptakiPOZ[4, 0] = ptakiLOK[4, 0] = ptak5.Location.X;
            ptakiPOZ[4, 1] = ptakiLOK[4, 1] = ptak5.Location.Y;
            ptakiPOZ[5, 0] = ptakiLOK[5, 0] = ptak6.Location.X;
            ptakiPOZ[5, 1] = ptakiLOK[5, 1] = ptak6.Location.Y;
            ptakiPOZ[6, 0] = ptakiLOK[6, 0] = ptak7.Location.X;
            ptakiPOZ[6, 1] = ptakiLOK[6, 1] = ptak7.Location.Y;
            ptakiPOZ[7, 0] = ptakiLOK[7, 0] = ptak8.Location.X;
            ptakiPOZ[7, 1] = ptakiLOK[7, 1] = ptak8.Location.Y;
            ptakiPOZ[8, 0] = ptakiLOK[8, 0] = ptak9.Location.X;
            ptakiPOZ[8, 1] = ptakiLOK[8, 1] = ptak9.Location.Y;
            ptakiPOZ[9, 0] = ptakiLOK[9, 0] = ptak10.Location.X;
            ptakiPOZ[9, 1] = ptakiLOK[9, 1] = ptak10.Location.Y;
            sokolLOK[0, 0] = sokolPOZ[0, 0] = sokol.Location.X;
            sokolLOK[0, 1] = sokolPOZ[0, 1] = sokol.Location.Y;


            //ptak1.ImageLocation = ptak2.ImageLocation = ptak3.ImageLocation = ptak4.ImageLocation = ptak5.ImageLocation = ptak6.ImageLocation = ptak7.ImageLocation = ptak8.ImageLocation = ptak9.ImageLocation = ptak10.ImageLocation = "ptak.jpg";
            ptak1.ImageLocation = "ptak1.jpg";
            ptak2.ImageLocation = "ptak2.jpg";
            ptak3.ImageLocation = "ptak3.jpg";
            ptak4.ImageLocation = "ptak4.jpg";
            ptak5.ImageLocation = "ptak5.jpg";
            ptak6.ImageLocation = "ptak6.jpg";
            ptak7.ImageLocation = "ptak7.jpg";
            ptak8.ImageLocation = "ptak8.jpg";
            ptak9.ImageLocation = "ptak9.jpg";
            ptak10.ImageLocation = "ptak10.jpg";

            sokol.ImageLocation = "sokol.jpg";
        }
      
        void uruchom()
        {
            sem = new Semaphore(5, 5);//mniej miejsc niz ptakow, reszta czeka w kolejce

            for (int i = 0; i < 10; i++)//robie 10 ptakow
            {
                ptakiTHR[i] = new Thread(Fptaki);
            }

            for (int i = 0; i < 10; i++)//robie 10 ptakow
            {
                ptakiTHR[i].Start();
            }

            //Thread sokol = new Thread(przesunSokola);
            //sokol.Start();
        }

        public void Fptaki()
        {

        kolejkaDoStada://powrot do kolejki semafora dla uzupelnienia stada
            Thread.Sleep(1000);//ten ktory wypadnie niech jeszcze poczeka i da szanse wskoczyc innemu w tym czasie
                //tu ptak ktory wylecial czeka na najblizsze wejscie
                sem.WaitOne();

            //MessageBox.Show("Jestem w niej: " + Thread.CurrentThread.ManagedThreadId);

            try//wykorzystane, aby zgubic komunikat o zbyt duzej liczbie odwolan
            {
                switch (Thread.CurrentThread.ManagedThreadId)//wyswietlanie ptakow ktore weszly
                {
                    case 6:
                        ptak1.Invoke((del)delegate
                        {
                            ptak1.Visible = true;
                        });
                        break;
                    case 7:
                        ptak2.Invoke((del)delegate
                        {
                            ptak2.Visible = true;
                        });
                        break;
                    case 8:
                        ptak3.Invoke((del)delegate
                        {
                            ptak3.Visible = true;
                        });
                        break;
                    case 9:
                        ptak4.Invoke((del)delegate
                        {
                            ptak4.Visible = true;
                        });
                        break;
                    case 10:
                        ptak5.Invoke((del)delegate
                        {
                            ptak5.Visible = true;
                        });
                        break;
                    case 11:
                        ptak6.Invoke((del)delegate
                        {
                            ptak6.Visible = true;
                        });
                        break;
                    case 12:
                        ptak7.Invoke((del)delegate
                        {
                            ptak7.Visible = true;
                        });
                        break;
                    case 13:
                        ptak8.Invoke((del)delegate
                        {
                            ptak8.Visible = true;
                        });
                        break;
                    case 14:
                        ptak9.Invoke((del)delegate
                        {
                            ptak9.Visible = true;
                        });
                        break;
                    case 15:
                        ptak10.Invoke((del)delegate
                        {
                            ptak10.Visible = true;
                        });
                        break;
                }
            }
            catch {}


            int y = 0;
            while (END == 0)
            {
                try
                {
                    Thread.Sleep(50);
                    switch (Thread.CurrentThread.ManagedThreadId)//(Thread.CurrentThread.ManagedThreadId)
                    {
                        case 6:
                            ptak1.Invoke((del)delegate
                            {
                                przesunPtaka(1);
                            });
                            if (kolizjePTK[0] == 1)//jesli kolizja to out do konca kolejki czekac
                            {
                                ptak1.Invoke((del)delegate
                                {
                                    ptak1.Visible = false;
                                });

                                ZabitychPtakow++;//zwieksz ilosc zabitych
                                kolizjePTK[0] = 0;//zresetuj status kolizji
                                sem.Release();//zwolnij semafor
                                goto kolejkaDoStada;//wylec przedwejscie do semafora i czekaj w kolejce
                            }
                            break;
                        case 7:
                            ptak2.Invoke((del)delegate
                            {
                                przesunPtaka(2);
                            });
                            if (kolizjePTK[1] == 1)//jesli kolizja to out do konca kolejki czekac
                            {
                                ptak2.Invoke((del)delegate
                                {
                                    ptak2.Visible = false;
                                });

                                ZabitychPtakow++;
                                kolizjePTK[1] = 0;
                                sem.Release();
                                goto kolejkaDoStada;
                            }
                            break;
                        case 8:
                            ptak3.Invoke((del)delegate
                            {
                                przesunPtaka(3);
                            });
                            if (kolizjePTK[2] == 1)//jesli kolizja to out do konca kolejki czekac
                            {
                                ptak3.Invoke((del)delegate
                                {
                                    ptak3.Visible = false;
                                });

                                ZabitychPtakow++;
                                kolizjePTK[2] = 0;
                                sem.Release();
                                goto kolejkaDoStada;
                            }
                            break;
                        case 9:
                            ptak4.Invoke((del)delegate
                            {
                                przesunPtaka(4);
                            });
                            if (kolizjePTK[3] == 1)//jesli kolizja to out do konca kolejki czekac
                            {
                                ptak4.Invoke((del)delegate
                                {
                                    ptak4.Visible = false;
                                });

                                ZabitychPtakow++;
                                kolizjePTK[3] = 0;
                                sem.Release();
                                goto kolejkaDoStada;
                            }
                            break;
                        case 10:
                            ptak5.Invoke((del)delegate
                            {
                                przesunPtaka(5);
                            });
                            if (kolizjePTK[4] == 1)//jesli kolizja to out do konca kolejki czekac
                            {
                                ptak5.Invoke((del)delegate
                                {
                                    ptak5.Visible = false;
                                });

                                ZabitychPtakow++;
                                kolizjePTK[4] = 0;
                                sem.Release();
                                goto kolejkaDoStada;
                            }
                            break;
                        case 11:
                            ptak6.Invoke((del)delegate
                            {
                                przesunPtaka(6);
                            });
                            if (kolizjePTK[5] == 1)//jesli kolizja to out do konca kolejki czekac
                            {
                                ptak6.Invoke((del)delegate
                                {
                                    ptak6.Visible = false;
                                });

                                ZabitychPtakow++;
                                kolizjePTK[5] = 0;
                                sem.Release();
                                goto kolejkaDoStada;
                            }
                            break;
                        case 12:
                            ptak7.Invoke((del)delegate
                            {
                                przesunPtaka(7);
                            });
                            if (kolizjePTK[6] == 1)//jesli kolizja to out do konca kolejki czekac
                            {
                                ptak7.Invoke((del)delegate
                                {
                                    ptak7.Visible = false;
                                });

                                ZabitychPtakow++;
                                kolizjePTK[6] = 0;
                                sem.Release();
                                goto kolejkaDoStada;
                            }
                            break;
                        case 13:
                            ptak8.Invoke((del)delegate
                            {
                                przesunPtaka(8);
                            });
                            if (kolizjePTK[7] == 1)//jesli kolizja to out do konca kolejki czekac
                            {
                                ptak8.Invoke((del)delegate
                                {
                                    ptak8.Visible = false;
                                });

                                ZabitychPtakow++;
                                kolizjePTK[7] = 0;
                                sem.Release();
                                goto kolejkaDoStada;
                            }
                            break;
                        case 14:
                            ptak9.Invoke((del)delegate
                            {
                                przesunPtaka(9);
                            });
                            if (kolizjePTK[8] == 1)//jesli kolizja to out do konca kolejki czekac
                            {
                                ptak9.Invoke((del)delegate
                                {
                                    ptak9.Visible = false;
                                });

                                ZabitychPtakow++;
                                kolizjePTK[8] = 0;
                                sem.Release();
                                goto kolejkaDoStada;
                            }
                            break;
                        case 15:
                            ptak10.Invoke((del)delegate
                            {
                                przesunPtaka(10);
                            });
                            if (kolizjePTK[9] == 1)//jesli kolizja to out do konca kolejki czekac
                            {
                                ptak10.Invoke((del)delegate
                                {
                                    ptak10.Visible = false;
                                });

                                ZabitychPtakow++;
                                kolizjePTK[9] = 0;
                                sem.Release();
                                goto kolejkaDoStada;
                            }
                            break;
                    }
                }
                catch { }
            }
            sem.Release();
        }

        void przesunPtaka(int ptak)//przesuwam ptaka w zaleznosci ktory numerek dostane
        {
            //Thread.Sleep(jakSzybkoLatajaOfiary);
            switch (ptak)
            {
                case 1:
                    odbijaczPtakow(ptakiPOZ[0, 0], ptakiPOZ[0, 1], 0,odbPtak[0,0],odbPtak[0,1]);
                    ptak1.Location = new Point(ptakiPOZ[0, 0], ptakiPOZ[0, 1]);
                    //ptakiPOZ[0, 0]++;
                    //if (ptakiPOZ[0, 0] > 650) ptakiPOZ[0, 0] = 0;
                    break;
                case 2:
                    odbijaczPtakow(ptakiPOZ[1, 0], ptakiPOZ[1, 1], 1, odbPtak[1, 0], odbPtak[1, 1]);
                    ptak2.Location = new Point(ptakiPOZ[1, 0], ptakiPOZ[1, 1]);
                    //ptakiPOZ[1, 0]++;
                    //if (ptakiPOZ[1, 0] > 650) ptakiPOZ[1, 0] = 0;
                    break;
                case 3:
                    odbijaczPtakow(ptakiPOZ[2, 0], ptakiPOZ[2, 1], 2, odbPtak[2, 0], odbPtak[2, 1]);
                    ptak3.Location = new Point(ptakiPOZ[2, 0], ptakiPOZ[2, 1]);
                    break;
                case 4:
                    odbijaczPtakow(ptakiPOZ[3, 0], ptakiPOZ[3, 1], 3, odbPtak[3, 0], odbPtak[3, 1]);
                    ptak4.Location = new Point(ptakiPOZ[3, 0], ptakiPOZ[3, 1]);
                    break;
                case 5:
                    odbijaczPtakow(ptakiPOZ[4, 0], ptakiPOZ[4, 1], 4, odbPtak[4, 0], odbPtak[4, 1]);
                    ptak5.Location = new Point(ptakiPOZ[4, 0], ptakiPOZ[4, 1]);
                    break;
                case 6:
                    odbijaczPtakow(ptakiPOZ[5, 0], ptakiPOZ[5, 1], 5, odbPtak[5, 0], odbPtak[5, 1]);
                    ptak6.Location = new Point(ptakiPOZ[5, 0], ptakiPOZ[5, 1]);
                    break;
                case 7:
                    odbijaczPtakow(ptakiPOZ[6, 0], ptakiPOZ[6, 1], 6, odbPtak[6, 0], odbPtak[6, 1]);
                    ptak7.Location = new Point(ptakiPOZ[6, 0], ptakiPOZ[6, 1]);
                    break;
                case 8:
                    odbijaczPtakow(ptakiPOZ[7, 0], ptakiPOZ[7, 1], 7, odbPtak[7, 0], odbPtak[7, 1]);
                    ptak8.Location = new Point(ptakiPOZ[7, 0], ptakiPOZ[7, 1]);
                    break;
                case 9:
                    odbijaczPtakow(ptakiPOZ[8, 0], ptakiPOZ[8, 1], 8, odbPtak[8, 0], odbPtak[8, 1]);
                    ptak9.Location = new Point(ptakiPOZ[8, 0], ptakiPOZ[8, 1]);
                    break;
                case 10:
                    odbijaczPtakow(ptakiPOZ[9, 0], ptakiPOZ[9, 1], 9, odbPtak[9, 0], odbPtak[9, 1]);
                    ptak10.Location = new Point(ptakiPOZ[9, 0], ptakiPOZ[9, 1]);
                    break;
            }           
        }

           /* lok = kierunek(1, 2);
                //lok = 1;
                odbicia++;
            }

            if (odbicia > 4)//reset sokola do innej lokacji
            {
                sokolPOZ[0, 0] = rand.Next(650);
                sokolPOZ[0, 1] = rand.Next(450);
                odbicia = 0;
            }
            kolizje();
        }*/

        int kierunekPtak(int jeden, int dwa,int trzy)//funkcja losujaca aktualne odbicie sokola
        {
            int wynik=0;

            if (rand.Next(666) % 2 == 0)
            {
                wynik = jeden;
            }
            if (rand.Next(666) % 5 == 0)
            {
                wynik = dwa;
            }
            else
            {
                wynik = trzy;
            }

            return wynik;
        }

        int kroki = 0;

        void odbijaczPtakow(int ptakX, int ptakY, int tabPtak, int lck, int odbicia)
        {
            //int newX=0, newY=0;

            //sokol.Location = new Point(sokolPOZ[0, 0], sokolPOZ[0, 1]);

            int wczesniejOdbij = 0, czyOdbicieWczesniej = 0;


            switch (lck)
            {
                case 1:
                    ptakX--;
                    ptakY++;
                    break;
                case 2:
                    ptakX--;
                    ptakY--;
                    break;
                case 3:
                    ptakX++;
                    ptakY--;
                    break;
                case 4:
                    ptakX++;
                    ptakY++;
                    break;
                case 5:
                    ptakX++;
                    break;
                case 6:
                    ptakY++;
                    break;
                case 7:
                    ptakX--;
                    break;
                case 8:
                    ptakY--;
                    break;
            }

            kroki++;

            if (rand.Next(666) % 7 == 0 && kroki > 150)
            {
                czyOdbicieWczesniej = 1;
                kroki = 0;
            }

            wczesniejOdbij = rand.Next(8);

            if (ptakY > 430 || (czyOdbicieWczesniej == 1 && ptakY < 320))//y
            {
                odbPtak[tabPtak, 0] = kierunekPtak(2, 3, ;//2;
                //odbPtak[tabPtak, 1]++;
                //lck = 2;
                //odbicia++;
            }
            if (ptakX < 0 || (czyOdbicieWczesniej == 1 && ptakX > 100))//x
            {
                odbPtak[tabPtak, 0] = kierunekPtak(3, 4, 5);//3;
                //odbPtak[tabPtak, 1]++;
                //lck = 3;
                //odbicia++;
            }
            if (ptakY < 0 || (czyOdbicieWczesniej == 1 && ptakY > 150))//y
            {
                odbPtak[tabPtak, 0] = kierunekPtak(4, 1, 6);//4;
                //odbPtak[tabPtak, 1]++;
                //lck = 4;
                //odbicia++;
            }
            if (ptakX > 650 || (czyOdbicieWczesniej == 1 && ptakX < 450))//x
            {
                odbPtak[tabPtak, 0] = kierunekPtak(1, 2, 7);//1;
                //odbPtak[tabPtak, 1]++;
                //lck = 1;
                //odbicia++;
            }

            if (odbicia > 4 || czyOdbicieWczesniej == 1)//reset sokola do innej lckacji
            {
                //ptakX = rand.Next(650);
                //ptakY = rand.Next(450);
                //odbPtak[tabPtak, 1] = 0;
                //odbicia = 0;
            }

            ptakiPOZ[tabPtak, 0] = ptakX;//x
            ptakiPOZ[tabPtak, 1] = ptakY;//y
            //return new Point(newX, newY);
        }

        int odbicia = 0;

        void przesunSokola()//przesuwam ptaka w zaleznosci ktory numerek dostane
        {
            //int lok=1;
            //while (END == 0)
            //{
            //    Thread.Sleep(jakSzybkoLataSokol);
            //    sokol.Invoke((del)delegate
            //    {
            //        sokol.Location = new Point(sokolPOZ[0, 0], sokolPOZ[0, 1]);
            //    });

            //    switch (lok)
            //    {
            //        case 1:
            //            sokolPOZ[0, 0]--;
            //            sokolPOZ[0, 1]++;
            //            break;
            //        case 2:
            //            sokolPOZ[0, 0]--;
            //            sokolPOZ[0, 1]--;
            //            break;
            //        case 3:
            //            sokolPOZ[0, 0]++;
            //            sokolPOZ[0, 1]--;
            //            break;
            //        case 4:
            //            sokolPOZ[0, 0]++;
            //            sokolPOZ[0, 1]++;
            //            break;
            //    }

               
            //    if (sokolPOZ[0, 1] > 430)//y
            //    {
            //        lok = 2;
            //        odbicia++;
            //    }
            //    if (sokolPOZ[0, 0] < 0)//x
            //    {
            //        lok = 3;
            //        odbicia++;
            //    }
            //    if (sokolPOZ[0, 1] <0 )//y
            //    {
            //        lok = 4;
            //        odbicia++;
            //    }
            //    if (sokolPOZ[0, 0] > 650)//x
            //    {
            //        lok = 1;
            //        odbicia++;
            //    }

            //    if (odbicia > 6)//reset sokola do innej lokacji
            //    {
            //        sokolPOZ[0, 0] = rand.Next(650);
            //        sokolPOZ[0, 1] = rand.Next(450);
            //        odbicia = 0;
            //    }

            //    kolizje();
            //}
        }

        void kolizje(string kto)
        {
            //lblZabite.Invoke((del)delegate
            //{
                lblZabite.Text = ZabitychPtakow.ToString();
            //});

                if (kto == "sokol")
                {
                    if (ptak1.Visible == true && (sokol.Location == ptak1.Location || (((sokol.Location.Y > ptak1.Location.Y - 20 && sokol.Location.Y > sokol.Location.Y - 20) && (sokol.Location.Y < ptak1.Location.Y + 20 && sokol.Location.Y < sokol.Location.Y + 20)) && ((sokol.Location.X > ptak1.Location.X - 20 && sokol.Location.X > sokol.Location.X - 20) && (sokol.Location.X < ptak1.Location.X + 20 && sokol.Location.X < sokol.Location.X + 20)))))
                    {
                        kolizjePTK[0] = 1;
                        //ZabitychPtakow++;
                    }
                    if (ptak2.Visible == true && (sokol.Location == ptak2.Location || (((sokol.Location.Y > ptak2.Location.Y - 20 && sokol.Location.Y > sokol.Location.Y - 20) && (sokol.Location.Y < ptak2.Location.Y + 20 && sokol.Location.Y < sokol.Location.Y + 20)) && ((sokol.Location.X > ptak2.Location.X - 20 && sokol.Location.X > sokol.Location.X - 20) && (sokol.Location.X < ptak2.Location.X + 20 && sokol.Location.X < sokol.Location.X + 20)))))//(sokol.Location == ptak2.Location || sokol.Location.Y + 15 == ptak2.Location.Y || sokol.Location.Y - 15 == ptak2.Location.Y)
                    {
                        kolizjePTK[1] = 1;
                        //ZabitychPtakow++;
                    }
                    if (ptak3.Visible == true && (sokol.Location == ptak3.Location || (((sokol.Location.Y > ptak3.Location.Y - 20 && sokol.Location.Y > sokol.Location.Y - 20) && (sokol.Location.Y < ptak3.Location.Y + 20 && sokol.Location.Y < sokol.Location.Y + 20)) && ((sokol.Location.X > ptak3.Location.X - 20 && sokol.Location.X > sokol.Location.X - 20) && (sokol.Location.X < ptak3.Location.X + 20 && sokol.Location.X < sokol.Location.X + 20)))))//(sokol.Location == ptak3.Location || sokol.Location.Y + 15 == ptak3.Location.Y || sokol.Location.Y - 15 == ptak3.Location.Y)
                    {
                        kolizjePTK[2] = 1;
                        //ZabitychPtakow++;
                    }
                    if (ptak4.Visible == true && (sokol.Location == ptak4.Location || (((sokol.Location.Y > ptak4.Location.Y - 20 && sokol.Location.Y > sokol.Location.Y - 20) && (sokol.Location.Y < ptak4.Location.Y + 20 && sokol.Location.Y < sokol.Location.Y + 20)) && ((sokol.Location.X > ptak4.Location.X - 20 && sokol.Location.X > sokol.Location.X - 20) && (sokol.Location.X < ptak4.Location.X + 20 && sokol.Location.X < sokol.Location.X + 20)))))//(sokol.Location == ptak4.Location || sokol.Location.Y + 15 == ptak4.Location.Y || sokol.Location.Y - 15 == ptak4.Location.Y)
                    {
                        kolizjePTK[3] = 1;
                        //ZabitychPtakow++;
                    }
                    if (ptak5.Visible == true && (sokol.Location == ptak5.Location || (((sokol.Location.Y > ptak5.Location.Y - 20 && sokol.Location.Y > sokol.Location.Y - 20) && (sokol.Location.Y < ptak5.Location.Y + 20 && sokol.Location.Y < sokol.Location.Y + 20)) && ((sokol.Location.X > ptak5.Location.X - 20 && sokol.Location.X > sokol.Location.X - 20) && (sokol.Location.X < ptak5.Location.X + 20 && sokol.Location.X < sokol.Location.X + 20)))))//(sokol.Location == ptak5.Location || sokol.Location.Y + 15 == ptak5.Location.Y || sokol.Location.Y - 15 == ptak5.Location.Y)
                    {
                        kolizjePTK[4] = 1;
                        //ZabitychPtakow++;
                    }
                    if (ptak6.Visible == true && (sokol.Location == ptak6.Location || (((sokol.Location.Y > ptak6.Location.Y - 20 && sokol.Location.Y > sokol.Location.Y - 20) && (sokol.Location.Y < ptak6.Location.Y + 20 && sokol.Location.Y < sokol.Location.Y + 20)) && ((sokol.Location.X > ptak6.Location.X - 20 && sokol.Location.X > sokol.Location.X - 20) && (sokol.Location.X < ptak6.Location.X + 20 && sokol.Location.X < sokol.Location.X + 20)))))//(sokol.Location == ptak6.Location || sokol.Location.Y + 15 == ptak6.Location.Y || sokol.Location.Y - 15 == ptak6.Location.Y)
                    {
                        kolizjePTK[5] = 1;
                        //ZabitychPtakow++;
                    }
                    if (ptak7.Visible == true && (sokol.Location == ptak7.Location || (((sokol.Location.Y > ptak7.Location.Y - 20 && sokol.Location.Y > sokol.Location.Y - 20) && (sokol.Location.Y < ptak7.Location.Y + 20 && sokol.Location.Y < sokol.Location.Y + 20)) && ((sokol.Location.X > ptak7.Location.X - 20 && sokol.Location.X > sokol.Location.X - 20) && (sokol.Location.X < ptak7.Location.X + 20 && sokol.Location.X < sokol.Location.X + 20)))))//(sokol.Location == ptak7.Location || sokol.Location.Y + 15 == ptak7.Location.Y || sokol.Location.Y - 15 == ptak7.Location.Y)
                    {
                        kolizjePTK[6] = 1;
                        //ZabitychPtakow++;
                    }
                    if (ptak8.Visible == true && (sokol.Location == ptak8.Location || (((sokol.Location.Y > ptak8.Location.Y - 20 && sokol.Location.Y > sokol.Location.Y - 20) && (sokol.Location.Y < ptak8.Location.Y + 20 && sokol.Location.Y < sokol.Location.Y + 20)) && ((sokol.Location.X > ptak8.Location.X - 20 && sokol.Location.X > sokol.Location.X - 20) && (sokol.Location.X < ptak8.Location.X + 20 && sokol.Location.X < sokol.Location.X + 20)))))//(sokol.Location == ptak8.Location || sokol.Location.Y + 15 == ptak8.Location.Y || sokol.Location.Y - 15 == ptak8.Location.Y)
                    {
                        kolizjePTK[7] = 1;
                        //ZabitychPtakow++;
                    }
                    if (ptak9.Visible == true && (sokol.Location == ptak9.Location || (((sokol.Location.Y > ptak9.Location.Y - 20 && sokol.Location.Y > sokol.Location.Y - 20) && (sokol.Location.Y < ptak9.Location.Y + 20 && sokol.Location.Y < sokol.Location.Y + 20)) && ((sokol.Location.X > ptak9.Location.X - 20 && sokol.Location.X > sokol.Location.X - 20) && (sokol.Location.X < ptak9.Location.X + 20 && sokol.Location.X < sokol.Location.X + 20)))))//(sokol.Location == ptak9.Location || sokol.Location.Y + 15 == ptak9.Location.Y || sokol.Location.Y - 15 == ptak9.Location.Y)
                    {
                        kolizjePTK[8] = 1;
                        //ZabitychPtakow++;
                    }
                    if (ptak10.Visible == true && (sokol.Location == ptak10.Location || (((sokol.Location.Y > ptak10.Location.Y - 20 && sokol.Location.Y > sokol.Location.Y - 20) && (sokol.Location.Y < ptak10.Location.Y + 20 && sokol.Location.Y < sokol.Location.Y + 20)) && ((sokol.Location.X > ptak10.Location.X - 20 && sokol.Location.X > sokol.Location.X - 20) && (sokol.Location.X < ptak10.Location.X + 20 && sokol.Location.X < sokol.Location.X + 20)))))//(sokol.Location == ptak10.Location || sokol.Location.Y + 15 == ptak10.Location.Y || sokol.Location.Y - 15 == ptak10.Location.Y)
                    {
                        kolizjePTK[9] = 1;
                        //ZabitychPtakow++;
                    }
                }
                if (kto == "ptak")
                {
                }
        }

        void przypadkowaPozycjaXY(int ktoryPtak)
        {
            //switch (ktoryPtak)
            //{
            //    case 1:
            //        break;
            //    case 2:
            //        break;
            //    case 3:
            //        break;
            //    case 4:
            //        break;
            //    case 5:
            //        break;
            //    case 6:
            //        break;
            //    case 7:
            //        break;
            //    case 8:
            //        break;
            //    case 9:
            //        break;
            //    case 10:
            //        break;
            //}     
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            END = 1;
        }

        private void sokol_Click(object sender, EventArgs e)
        {
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = false;
            //Thread.Sleep(100);
            uruchom();
            //tRysownik.Start();
            tSokol.Start();
        }

        private void btnAuthors_Click(object sender, EventArgs e)
        {
            new authors().ShowDialog();
        }

        private void btnPomoc_Click(object sender, EventArgs e)
        {
            new pomoc().ShowDialog();
        }

        private void ptak1_Click(object sender, EventArgs e)
        {

        }

        private void ptak10_Click(object sender, EventArgs e)
        {

        }

        private void tRysownik_Tick(object sender, EventArgs e)
        {
            ptak1.Location = new Point(rand.Next(650), ptakiLOK[0, 1]);
            ptak2.Location = new Point(rand.Next(650), ptakiLOK[1, 1]);
            ptak3.Location = new Point(rand.Next(650), ptakiLOK[2, 1]);
            ptak4.Location = new Point(rand.Next(650), ptakiLOK[3, 1]);
            ptak5.Location = new Point(rand.Next(650), ptakiLOK[4, 1]);
            ptak6.Location = new Point(rand.Next(650), ptakiLOK[5, 1]);
            ptak7.Location = new Point(rand.Next(650), ptakiLOK[6, 1]);
            ptak8.Location = new Point(rand.Next(650), ptakiLOK[7, 1]);
            ptak9.Location = new Point(rand.Next(650), ptakiLOK[8, 1]);
            ptak10.Location = new Point(rand.Next(650), ptakiLOK[9, 1]);
            //label1.Text = odbicia.ToString();
        }

        private void ptak6_Click(object sender, EventArgs e)
        {

        }


        int lok = 1, krokis = 0;
        private void tSokol_Tick(object sender, EventArgs e)
        {
            int czyOdbicieWczesniej = 0;

            if (rand.Next(666) % 7 == 0 && kroki > 150)
            {
                czyOdbicieWczesniej = 1;
                krokis = 0;
            }

            sokol.Location = new Point(sokolPOZ[0, 0], sokolPOZ[0, 1]);

            switch (lok)
            {
                case 1:
                    sokolPOZ[0, 0]--;
                    sokolPOZ[0, 1]++;
                    break;
                case 2:
                    sokolPOZ[0, 0]--;
                    sokolPOZ[0, 1]--;
                    break;
                case 3:
                    sokolPOZ[0, 0]++;
                    sokolPOZ[0, 1]--;
                    break;
                case 4:
                    sokolPOZ[0, 0]++;
                    sokolPOZ[0, 1]++;
                    break;
            }


            if (sokolPOZ[0, 1] > 430 || (czyOdbicieWczesniej == 1 && sokolPOZ[0, 1] < 400))//y
            {
                lok = kierunek(2, 3);
                //lok = 2;
                odbicia++;
            }
            if (sokolPOZ[0, 0] < 0 || (czyOdbicieWczesniej == 1 && sokolPOZ[0, 0] > 200))//x
            {
                lok = kierunek(3, 4);
                //lok = 3;
                odbicia++;
            }
            if (sokolPOZ[0, 1] < 0 || (czyOdbicieWczesniej == 1 && sokolPOZ[0, 1] > 200))//y
            {
                lok = kierunek(4, 1);
                //lok = 4;
                odbicia++;
            }
            if (sokolPOZ[0, 0] > 650 || (czyOdbicieWczesniej == 1 && sokolPOZ[0, 0] < 300))//x
            {
                lok = kierunek(1, 2);
                //lok = 1;
                odbicia++;
            }

            if (odbicia > 4)//reset sokola do innej lokacji
            {
                //sokolPOZ[0, 0] = rand.Next(650);
                //sokolPOZ[0, 1] = rand.Next(450);
                //odbicia = 0;
            }
            kolizje("sokol");
        }

        int kierunek(int jeden, int dwa)//funkcja losujaca aktualne odbicie sokola
        {
            int wynik=0;

            if (rand.Next(666) % 2 == 0)
            {
                wynik = jeden;
            }
            else
            {
                wynik = dwa;
            }

            return wynik;
        }

        private void btnResetSokola_Click(object sender, EventArgs e)
        {
            odbicia = 10;
        }

        private void checkRuchomePtaki_CheckedChanged(object sender, EventArgs e)
        {
            //if (checkRuchomePtaki.Checked)
            //{
            //    tRysownik.Start();
            //}
            //else
            //{
            //    tRysownik.Stop();
            //}
        }

        private void btnMieszajPtaki_Click(object sender, EventArgs e)
        {
            ptak1.Location = new Point(rand.Next(650), rand.Next(450));
            ptak2.Location = new Point(rand.Next(650), rand.Next(450));
            ptak3.Location = new Point(rand.Next(650), rand.Next(450));
            ptak4.Location = new Point(rand.Next(650), rand.Next(450));
            ptak5.Location = new Point(rand.Next(650), rand.Next(450));
            ptak6.Location = new Point(rand.Next(650), rand.Next(450));
            ptak7.Location = new Point(rand.Next(650), rand.Next(450));
            ptak8.Location = new Point(rand.Next(650), rand.Next(450));
            ptak9.Location = new Point(rand.Next(650), rand.Next(450));
            ptak10.Location = new Point(rand.Next(650), rand.Next(450));

            ptakiPOZ[0, 0] = ptakiLOK[0, 0] = ptak1.Location.X;
            ptakiPOZ[0, 1] = ptakiLOK[0, 1] = ptak1.Location.Y;
            ptakiPOZ[1, 0] = ptakiLOK[1, 0] = ptak2.Location.X;
            ptakiPOZ[1, 1] = ptakiLOK[1, 1] = ptak2.Location.Y;
            ptakiPOZ[2, 0] = ptakiLOK[2, 0] = ptak3.Location.X;
            ptakiPOZ[2, 1] = ptakiLOK[2, 1] = ptak3.Location.Y;
            ptakiPOZ[3, 0] = ptakiLOK[3, 0] = ptak4.Location.X;
            ptakiPOZ[3, 1] = ptakiLOK[3, 1] = ptak4.Location.Y;
            ptakiPOZ[4, 0] = ptakiLOK[4, 0] = ptak5.Location.X;
            ptakiPOZ[4, 1] = ptakiLOK[4, 1] = ptak5.Location.Y;
            ptakiPOZ[5, 0] = ptakiLOK[5, 0] = ptak6.Location.X;
            ptakiPOZ[5, 1] = ptakiLOK[5, 1] = ptak6.Location.Y;
            ptakiPOZ[6, 0] = ptakiLOK[6, 0] = ptak7.Location.X;
            ptakiPOZ[6, 1] = ptakiLOK[6, 1] = ptak7.Location.Y;
            ptakiPOZ[7, 0] = ptakiLOK[7, 0] = ptak8.Location.X;
            ptakiPOZ[7, 1] = ptakiLOK[7, 1] = ptak8.Location.Y;
            ptakiPOZ[8, 0] = ptakiLOK[8, 0] = ptak9.Location.X;
            ptakiPOZ[8, 1] = ptakiLOK[8, 1] = ptak9.Location.Y;
            ptakiPOZ[9, 0] = ptakiLOK[9, 0] = ptak10.Location.X;
            ptakiPOZ[9, 1] = ptakiLOK[9, 1] = ptak10.Location.Y;
            sokolLOK[0, 0] = sokolPOZ[0, 0] = sokol.Location.X;
            sokolLOK[0, 1] = sokolPOZ[0, 1] = sokol.Location.Y;
        }
    }
}

_________________________________________________________________________________________
Projekt 15

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int ileKur; // liczba kur
int ileZebranychJaj; // liczba zebranych jaj
int ileZniesionychJaj; // liczba zebranych jaj
int *jajaKury; // tablica z liczba zniesionych jaj przez kury
int *jajaHodowcy; // tablica z liczba zebranych jaj przez hodowce od kur
int maxCzasAkcja; // maksymalny czas oczekiwania na akcje
int minCzasProgram; // minimalny czas dzialania programu
CRITICAL_SECTION *sekcje;
CRITICAL_SECTION odrysowanie;
int pozycjaHodowcy=-1;
typedef struct {
    int nr_kury;
} TPARAM, *PTPARAM;

void czekaj(int czas) {
    //    EnterCriticalSection(&sekcjaKrytyczna);
    //    LeaveCriticalSection(&sekcjaKrytyczna);
    if (czas < 3000) {
        czas += 3000;
    }
    //printf("sleep: %dn",czas);
    Sleep(czas);

}

void odrysuj() {
//    if(1)return;
    EnterCriticalSection(&odrysowanie);
    system("cls");
    int i;
    //printf("kury: jaja: zebrane jaja:nn");
    printf("n");
    for (i = 0; i < ileKur; i++) {
        printf("kura%2d ", i+1);
        if (jajaKury[i] == 0) {
            printf(" -");
        } else if (jajaKury[i] == 1) {
            printf(" O");
        } else if (jajaKury[i] == 2) {
            printf(" X", i);
        }
        printf("  |  ");
        if (jajaHodowcy[i] == 1) {
            printf("O");
        } else {
            printf("-");
        }
        if(pozycjaHodowcy == i){
            printf(" <--");
        }
        printf("n");
    }
    printf("n");
    printf("n");
    printf("Legenda do programu:n");
    printf("ekran sklada sie z 5 czesci:n");
    printf("1 2 3 4 5n");
    printf("1 - nazwa i numer kuryn");
    printf("2 - zawartosc "pod" kuran");
    printf("3 - "scianka" oddzielajaca hodowce od kur |n");
    printf("4 - aktualnie zabrane jajkan");
    printf("5 - aktualna pozycja hodowcy w kurniku <--n");
    printf("n");
    printf("Wartosci jakie moga byc pod 2 i 4 to:n");
    printf("O - jajkon");
    printf("X - zbite jajkan");
    printf("- - pusto(przed zlozeniem pierwszego jaja lub po zabraniu przez hodowce)n");
    printf("n");
    printf("Hodowca zaglada po kolei do kazdej z kur i jesli ma jajko przeklada na swoja strone. Gdy odwiedzi wszystkie kury wynosi jaja z kurnika.n");
    LeaveCriticalSection(&odrysowanie);
}

int wczytajDane(void) {
    int wynik, nrKury, daneOk = 0;

    system("cls");
    printf("Podaj liczbe kur: ");
    wynik = scanf("%d", &ileKur);
    if (wynik == 1 && ileKur > 0) {
        daneOk++;
    }
    printf("Podaj maksymalny czas oczekiwania na akcje (sekundy): ");
    wynik = scanf("%d", &maxCzasAkcja);
    if (wynik == 1 && maxCzasAkcja >= 0) {
        daneOk++;
    }
    printf("Podaj minimalny czas dzialania programu (sekundy): ");
    wynik = scanf("%d", &minCzasProgram);
    if (wynik == 1 && minCzasProgram >= 0) {
        daneOk++;
    }
    if (daneOk == 3) {
        jajaKury = malloc(ileKur * sizeof(int));
        jajaHodowcy = malloc(ileKur * sizeof(int));
        sekcje = malloc(ileKur * sizeof(CRITICAL_SECTION));
        for (nrKury = 0; nrKury < ileKur; nrKury++) {
            jajaKury[nrKury] = 0;
            CRITICAL_SECTION cs;
            InitializeCriticalSection(&cs);
            sekcje[nrKury] = cs;
        }
        InitializeCriticalSection(&odrysowanie);
        return 0;
    } else {
        return -1;
    }
}

DWORD WINAPI f_kury(LPVOID arg) {
    int nrKury = ((PTPARAM) arg)->nr_kury;
    //    printf("uruchomienie watku kury %dn",nrKury+1);
    srand(time(NULL));
    while (1) {
        int startTime =time(NULL);
        czekaj((rand() % 1000) + (rand() % maxCzasAkcja) * 1000);
        EnterCriticalSection(&sekcje[nrKury]);
        if (jajaKury[nrKury] == 0 || jajaKury[nrKury] == 2) {
            jajaKury[nrKury] = 1;
            ileZniesionychJaj++;
            //    printf("Kura nr %d zniosla pierwsze jajo.nn", nrKury + 1);
        } else {
            jajaKury[nrKury] = 2;
            //    printf("Kura nr %d zniosla drugie jajo. Oba jaja stukly sie!nn", nrKury + 1);
        }
        odrysuj();
        LeaveCriticalSection(&sekcje[nrKury]);
    }
}

DWORD WINAPI f_gospodarza(LPVOID arg) {
    int nrKury;
    //printf("uruchomienie watku gospodarzan n");
    srand(time(NULL));
    while (1) {
        int jaja = 0;
        czekaj((rand() % 1000) + (rand() % maxCzasAkcja) * 1000);
        //printf("Gospodarz wchodzi do kurnika.n");
        for (nrKury = 0; nrKury < ileKur; nrKury++) {
            pozycjaHodowcy = nrKury;
            EnterCriticalSection(&sekcje[nrKury]);
            if (jajaKury[nrKury] == 1) {
                jaja++;
                jajaKury[nrKury] = 0;
                jajaHodowcy[nrKury] = 1;
                //printf("- zebral jajo od kury nr %d.n", nrKury + 1);
            } else {
                jajaHodowcy[nrKury] = 0;
            }
            odrysuj();
            Sleep(1000);
            LeaveCriticalSection(&sekcje[nrKury]);
        }
        ileZebranychJaj += jaja;
        for (nrKury = 0; nrKury < ileKur; nrKury++) {
                    jajaHodowcy[nrKury] = 0;
                }
        pozycjaHodowcy=-1;
        odrysuj();
        //printf("Gospodarz zebral teraz %d jaj, w sumie %d.nn", jaja, ileZebranychJaj);
    }
}

int main(int agrc, char **argv) {
    long czasPoczatkowy;

    if (wczytajDane() < 0) {
        printf("nBledne dane!nnn");
        system("pause");
        return -1;
    }
    system("cls");
    srand(time(NULL));
    czasPoczatkowy = time(NULL);
    HANDLE threads[ileKur + 1];
    TPARAM params[ileKur];
    DWORD nrs[ileKur];
    int i;
    odrysuj();
    for (i = 0; i < ileKur; i++) {
        params[i].nr_kury = i;
        threads[i] = CreateThread(NULL, 0, f_kury, &params[i], 0, &nrs[i]);
        czekaj(100+(rand() % 100));
        odrysuj();
    }
    DWORD nrh;
    threads[ileKur] = CreateThread(NULL, 0, f_gospodarza, NULL, 0, &nrh);
    czekaj(minCzasProgram * 1000);

    //posprzatanie po sobie:
    //zabicie watkow
    for (i = 0; i < (ileKur + 1); i++) {
        TerminateThread(threads[i], -1);
        CloseHandle(threads[i]);
    }
    //usuniecie sekcji krytycznych
    for (i = 0; i < (ileKur); i++) {
        DeleteCriticalSection(&sekcje[i]);
    }
    //zwolnienie zaalokowanej pamieci
    free(jajaKury);
    free(jajaHodowcy);
    free(sekcje);
   
    printf("n*** Uplynal czas dzialania programu ***nn");
    printf("Kury zniosly w sumie %d jaj.nn", ileZniesionychJaj);
    printf("Gospodarz zebral w sumie %d jaj.nn", ileZebranychJaj);
    system("pause");
    return 0;
}