Prom Car


SUBMITTED BY: chris1217

DATE: July 1, 2018, 10:21 p.m.

FORMAT: C#

SIZE: 5.1 kB

HITS: 199

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. namespace Prom
  9. {
  10. class Samochod
  11. {
  12. public int x, y;
  13. int kierunek; // 0 z prawej do lewej, 1 z lewej do prawej
  14. Kolejka prawa;
  15. Kolejka lewa;
  16. Prom prom;
  17. bool rysowany = true;
  18. public bool koniecDzialania = false;
  19. public Samochod(int kierunek, Kolejka prawa, Kolejka lewa, Prom prom)
  20. {
  21. this.kierunek = kierunek;
  22. if (kierunek == 0)
  23. {
  24. x = 1180;
  25. y = 150;
  26. }
  27. else
  28. {
  29. x = -250;
  30. y = 200;
  31. }
  32. this.prawa = prawa;
  33. this.lewa = lewa;
  34. this.prom = prom;
  35. }
  36. //watek samochodu
  37. public void Przeprawa()
  38. {
  39. if(kierunek == 0) //z prawej do lewej
  40. {
  41. prawa.Oczekuje(); //dodaj sie do licznika oczekujacych na prawym brzegu
  42. for (int i = prawa.PobierzDlugoscKolejki() - 1; i > -1; i--)
  43. {
  44. podjedz(prawa.StanWKolejce(i).X); //zajmij kolejne miejsce w kolejce i na nie podjedz
  45. if(i != prawa.PobierzDlugoscKolejki() - 1) //zwolnij poprzednie miejsce w kolejce
  46. prawa.ZwolnijMiejsce(i + 1);
  47. }
  48. //Pierwszy w kolejce
  49. ///////////////////
  50. prom.wolneMiejscaPrawo.Wait(); //zajmij semafor okreslajacy pojemnosc promu w kierunku prawym
  51. prom.wjazdPrawy.Wait(); //zajmij wjazd prawy
  52. //teraz watek ma juz wszystko co potrzebuje by sie na most wpakowac
  53. prawa.ZwolnijMiejsce(0); //zwolnij pierwsze miejsce w kolejce
  54. prawa.PrzestalemOczekiwac(); // zmniejsz licznik oczekujacych na brzegu
  55. //wjedz na prom
  56. podjedz(prom.x + 60);
  57. rysowany = false;
  58. //zwolnij wjazd i powiedz promowi, ze wjechales
  59. prom.odplywanie.Release();
  60. prom.wjazdPrawy.Release();
  61. //czekanie na zjazd
  62. //czekaj az bedzie mozna zjechac
  63. prom.zjazd.Wait();
  64. // zjezdza
  65. x = prom.x - 50;
  66. rysowany = true;
  67. podjedz(x - 130);
  68. //zwolnij most dla kolejnego
  69. prom.zjazd.Release();
  70. prom.wolneMiejscaPrawo.Release();
  71. //wyjedz za plansze
  72. podjedz(-100);
  73. koniecDzialania = true;
  74. }
  75. else //jak wyzej, tylko z lewej do prawej
  76. {
  77. lewa.Oczekuje();
  78. for (int i = lewa.PobierzDlugoscKolejki() - 1; i > -1; i--)
  79. {
  80. podjedz(lewa.StanWKolejce(i).X);
  81. if (i != lewa.PobierzDlugoscKolejki() - 1)
  82. lewa.ZwolnijMiejsce(i + 1);
  83. }
  84. //Pierwszy w kolejce
  85. ///////////////////
  86. prom.wolneMiejscaLewo.Wait();
  87. prom.wjazdLewy.Wait();
  88. lewa.ZwolnijMiejsce(0);
  89. lewa.PrzestalemOczekiwac();
  90. podjedz(prom.x + 20);
  91. rysowany = false;
  92. prom.odplywanie.Release();
  93. prom.wjazdLewy.Release();
  94. prom.zjazd.Wait();
  95. x = prom.x + 50;
  96. rysowany = true;
  97. podjedz(x + 130);
  98. prom.zjazd.Release();
  99. prom.wolneMiejscaLewo.Release();
  100. podjedz(1100);
  101. koniecDzialania = true;
  102. }
  103. }
  104. public void podjedz(int kierunekX)
  105. {
  106. if (x > kierunekX) //Jeżeli jedziesz w lewo
  107. while (x > kierunekX) //dopóki twój x nie będzie mniejszy od docelowego
  108. {
  109. x -= 10; //posun sie w lewo
  110. Thread.Sleep(40); //sztuczne opoznienie, zeby jechal a nie sie teleportowal
  111. }
  112. else
  113. while (x < kierunekX)
  114. {
  115. x += 10;
  116. Thread.Sleep(40); //sztuczne opoznienie, zeby jechal a nie sie teleportowal
  117. }
  118. }
  119. public void Rysuj(Graphics g)
  120. {
  121. if (rysowany)
  122. {
  123. g.FillRectangle(new SolidBrush(Color.Orange), x + 10, y + 10, 50, 30);
  124. if (kierunek == 0)
  125. g.FillRectangle(new SolidBrush(Color.Blue), x + 15, y + 12, 15, 25);
  126. else
  127. g.FillRectangle(new SolidBrush(Color.Blue), x + 40, y + 12, 15, 25);
  128. }
  129. }
  130. }
  131. }

comments powered by Disqus