using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Prom { class Samochod { public int x, y; int kierunek; // 0 z prawej do lewej, 1 z lewej do prawej Kolejka prawa; Kolejka lewa; Prom prom; bool rysowany = true; public bool koniecDzialania = false; public Samochod(int kierunek, Kolejka prawa, Kolejka lewa, Prom prom) { this.kierunek = kierunek; if (kierunek == 0) { x = 1180; y = 150; } else { x = -250; y = 200; } this.prawa = prawa; this.lewa = lewa; this.prom = prom; } //watek samochodu public void Przeprawa() { if(kierunek == 0) //z prawej do lewej { prawa.Oczekuje(); //dodaj sie do licznika oczekujacych na prawym brzegu for (int i = prawa.PobierzDlugoscKolejki() - 1; i > -1; i--) { podjedz(prawa.StanWKolejce(i).X); //zajmij kolejne miejsce w kolejce i na nie podjedz if(i != prawa.PobierzDlugoscKolejki() - 1) //zwolnij poprzednie miejsce w kolejce prawa.ZwolnijMiejsce(i + 1); } //Pierwszy w kolejce /////////////////// prom.wolneMiejscaPrawo.Wait(); //zajmij semafor okreslajacy pojemnosc promu w kierunku prawym prom.wjazdPrawy.Wait(); //zajmij wjazd prawy //teraz watek ma juz wszystko co potrzebuje by sie na most wpakowac prawa.ZwolnijMiejsce(0); //zwolnij pierwsze miejsce w kolejce prawa.PrzestalemOczekiwac(); // zmniejsz licznik oczekujacych na brzegu //wjedz na prom podjedz(prom.x + 60); rysowany = false; //zwolnij wjazd i powiedz promowi, ze wjechales prom.odplywanie.Release(); prom.wjazdPrawy.Release(); //czekanie na zjazd //czekaj az bedzie mozna zjechac prom.zjazd.Wait(); // zjezdza x = prom.x - 50; rysowany = true; podjedz(x - 130); //zwolnij most dla kolejnego prom.zjazd.Release(); prom.wolneMiejscaPrawo.Release(); //wyjedz za plansze podjedz(-100); koniecDzialania = true; } else //jak wyzej, tylko z lewej do prawej { lewa.Oczekuje(); for (int i = lewa.PobierzDlugoscKolejki() - 1; i > -1; i--) { podjedz(lewa.StanWKolejce(i).X); if (i != lewa.PobierzDlugoscKolejki() - 1) lewa.ZwolnijMiejsce(i + 1); } //Pierwszy w kolejce /////////////////// prom.wolneMiejscaLewo.Wait(); prom.wjazdLewy.Wait(); lewa.ZwolnijMiejsce(0); lewa.PrzestalemOczekiwac(); podjedz(prom.x + 20); rysowany = false; prom.odplywanie.Release(); prom.wjazdLewy.Release(); prom.zjazd.Wait(); x = prom.x + 50; rysowany = true; podjedz(x + 130); prom.zjazd.Release(); prom.wolneMiejscaLewo.Release(); podjedz(1100); koniecDzialania = true; } } public void podjedz(int kierunekX) { if (x > kierunekX) //Jeżeli jedziesz w lewo while (x > kierunekX) //dopóki twój x nie będzie mniejszy od docelowego { x -= 10; //posun sie w lewo Thread.Sleep(40); //sztuczne opoznienie, zeby jechal a nie sie teleportowal } else while (x < kierunekX) { x += 10; Thread.Sleep(40); //sztuczne opoznienie, zeby jechal a nie sie teleportowal } } public void Rysuj(Graphics g) { if (rysowany) { g.FillRectangle(new SolidBrush(Color.Orange), x + 10, y + 10, 50, 30); if (kierunek == 0) g.FillRectangle(new SolidBrush(Color.Blue), x + 15, y + 12, 15, 25); else g.FillRectangle(new SolidBrush(Color.Blue), x + 40, y + 12, 15, 25); } } } }