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);
}
}
}
}