Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа по дисциплине «Технология прог....doc
Скачиваний:
8
Добавлен:
27.10.2018
Размер:
1.05 Mб
Скачать

3.4 Поэтапная разработка программы

3.4.1 Первый этап

На первом этапе было реализовано компонент лодки, рисование всего в окне и синхронизация потоков.

Листинг программы приведён ниже.

Класс Дорога.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Threading;

using Car;

namespace Bogoslovskaya

{

public partial class Doroga : Form // класс дорога, унаследован от класса Form

{

Container container;

Mutex resurs_rova;

Mutex resurs_zapravki;

Rectangle pryamougolnil_azs;

List<Point> tochki_bolchogo_kruga;

List<Point> tochki_malogo_kruga;

Thread potok_peperisovki_okna;

bool live;

public Doroga() // конструктор класса дороги

{

InitializeComponent();

container = new Container();

resurs_rova = new Mutex();

resurs_zapravki = new Mutex();

pryamougolnil_azs = new Rectangle(50, 241, 30, 40);

//подписка на событие нажатия на окно

this.MouseClick += new MouseEventHandler(Doroga_MouseClick);

tochki_bolchogo_kruga = new List<Point>();

tochki_malogo_kruga = new List<Point>();

// создание точек, по которым будут двигаться машины

tochki_bolchogo_kruga.Add(new Point(105, 206));

tochki_bolchogo_kruga.Add(new Point(124, 160));

tochki_bolchogo_kruga.Add(new Point(177, 102));

tochki_bolchogo_kruga.Add(new Point(286, 69));

tochki_bolchogo_kruga.Add(new Point(433, 114));

tochki_bolchogo_kruga.Add(new Point(490, 231));

tochki_bolchogo_kruga.Add(new Point(457, 381));

tochki_bolchogo_kruga.Add(new Point(400, 432));

tochki_bolchogo_kruga.Add(new Point(254, 449));

tochki_bolchogo_kruga.Add(new Point(173, 418));

tochki_bolchogo_kruga.Add(new Point(101, 341));

tochki_bolchogo_kruga.Add(new Point(89, 278));

tochki_malogo_kruga.Add(new Point(168, 251));

tochki_malogo_kruga.Add(new Point(186, 198));

tochki_malogo_kruga.Add(new Point(265, 144));

tochki_malogo_kruga.Add(new Point(323, 137));

tochki_malogo_kruga.Add(new Point(403, 185));

tochki_malogo_kruga.Add(new Point(416, 296));

tochki_malogo_kruga.Add(new Point(367, 372));

tochki_malogo_kruga.Add(new Point(269, 386));

tochki_malogo_kruga.Add(new Point(213, 357));

tochki_malogo_kruga.Add(new Point(175, 299));

//создание потока перерисовки окна

potok_peperisovki_okna = new Thread(new ThreadStart(peperisovat));

live = true;

potok_peperisovki_okna.Start();

this.FormClosed += new FormClosedEventHandler(Doroga_FormClosed);

}

void Doroga_FormClosed(object sender, FormClosedEventArgs e)

{

live = false;

foreach (Component component in container.Components)

{

Mashinka mashinka = (Mashinka)component;

//останавливаем

mashinka.stop();

//удаляем

container.Remove(mashinka);

}

}

// функция потока перерисовки окна

void peperisovat()

{

while (live)

{

this.Invalidate();

potok_peperisovki_okna.Join(20);

}

}

//обработчик клика мышкой по окну

void Doroga_MouseClick(object sender, MouseEventArgs e)

{

sozdatMashinku();

}

private void sozdatMashinku()

{

//созданние машинки

Mashinka mashinka = new Mashinka(container.Components.Count, resurs_rova, resurs_zapravki, pryamougolnil_azs

, tochki_bolchogo_kruga, tochki_malogo_kruga);

mashinka.vyehalEvent += new vyehalDeleagate(mashinka_vyehalEvent);

container.Add(mashinka);

}

//фунция перерисовки окна

protected override void OnPaint(PaintEventArgs e)

{

//рисуем точки большого круга

foreach(Point point in tochki_bolchogo_kruga)

{

e.Graphics.DrawString(tochki_bolchogo_kruga.IndexOf(point).ToString(), new Font("Arial", 8), Brushes.Blue, point);

}

//рисуем точки малого круга

foreach (Point point in tochki_malogo_kruga)

{

e.Graphics.DrawString(tochki_malogo_kruga.IndexOf(point).ToString(), new Font("Arial", 8), Brushes.Red, point);

}

//рисуем машинки

foreach(IComponent comp in container.Components)

{

Mashinka mashinka = (Mashinka)comp;

e.Graphics.FillRectangle(mashinka.Brush, new Rectangle(mashinka.Location, new Size(10, 15)));

e.Graphics.DrawString(mashinka.Fuel.ToString(), new Font("Arial", 8), Brushes.Red, mashinka.Location);

}

//Ресуем заправку

e.Graphics.DrawRectangle(Pens.Gray, pryamougolnil_azs);

}

}

}

Класс машина

//компонент - машинка

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 Car

{

public delegate void vyehalDeleagate(int name);

public class Mashinka : Component

{

Mutex resurs_rova;

Mutex resurs_zapravki;

Rectangle pryamougolnil_azs;

List<Point> tochki_bolchogo_kruga;

List<Point> tochki_malogo_kruga;

Thread potok;

bool live;

int tekushaya_tochka;

Point location;

bool v_rove;

bool v_malom_kruge;

int chislo_krugov;

int n; /

Brush brush;

int speed;

int delta;

int fuel;

//событие выезда машинки из рова

public event vyehalDeleagate vyehalEvent;

public Mashinka(int N, Mutex resursRova, Mutex resursZapravki, Rectangle pryamougolnikAzs, List<Point> tochki_b, List<Point> tochki_m)

{

n = N;

brush = Brushes.RosyBrown;

resurs_rova = resursRova;

resurs_zapravki = resursZapravki;

pryamougolnil_azs = pryamougolnikAzs;

tochki_bolchogo_kruga = tochki_b;

tochki_malogo_kruga = tochki_m;

location = tochki_bolchogo_kruga[1];

v_rove = false;

v_malom_kruge = false;

//создание потока

potok = new Thread(new ThreadStart(potok_dvijeniya));

live = true;

chislo_krugov = 0;

fuel = 1000;

Random random = new Random(DateTime.Now.Millisecond);

speed = random.Next(10, 30);

delta = random.Next(10, 20) % 2 == 0 ? -1 : 1;

tekushaya_tochka = delta > 0 ? 2 : tochki_bolchogo_kruga.Count - 2;

//запуск потока машинки

potok.Start();

}

public Brush Brush

{

get

{

return brush;

}

}

public int N

{

get

{

return n;

}

}

public int Fuel

{

get

{

return fuel;

}

}

public Point Location

{

get

{

return location;

}

}

//фунция остановки машинки

public void stop()

{

live = false;

}

//функция потока машинки

void potok_dvijeniya()

{

while (live)

{

if (fuel > 0)

{

--fuel;

}

else

{

while (pryamougolnil_azs.Location != location)

{

if (location.X < pryamougolnil_azs.Location.X)

{

location.X++;

}

if (location.X > pryamougolnil_azs.Location.X)

{

location.X--;

}

if (location.Y < pryamougolnil_azs.Location.Y)

{

location.Y++;

}

if (location.Y > pryamougolnil_azs.Location.Y)

{

location.Y--;

}

potok.Join(speed);

}

resurs_zapravki.WaitOne();

potok.Join(2000);

fuel = 1000;

resurs_zapravki.ReleaseMutex();

}

if (!v_malom_kruge)

{

if ((tekushaya_tochka < tochki_bolchogo_kruga.Count && delta > 0)

|| (tekushaya_tochka < 0 && delta < 0))

{

//движение к следующей точке

if (location.X < tochki_bolchogo_kruga[tekushaya_tochka].X)

{

location.X++;

}

if (location.X > tochki_bolchogo_kruga[tekushaya_tochka].X)

{

location.X--;

}

if (location.Y < tochki_bolchogo_kruga[tekushaya_tochka].Y)

{

location.Y++;

}

if (location.Y > tochki_bolchogo_kruga[tekushaya_tochka].Y)

{

location.Y--;

}

//елси машинка доехала до рова

if (location == tochki_bolchogo_kruga[5])

{

resurs_rova.WaitOne(); // ожидание своей очереди у ресурса

v_rove = true;

}

if (v_rove)

{

if (location.Y == tochki_bolchogo_kruga[5].Y + 40) {

if (vyehalEvent != null)

{

vyehalEvent(n);

}

resurs_rova.ReleaseMutex();

v_rove = false;

}

}

if (location == tochki_bolchogo_kruga[tekushaya_tochka])

{

tekushaya_tochka += delta;

}

potok.Join(speed);

}

else /

{

tekushaya_tochka = 0;

v_malom_kruge = true;

}

}

else

{

if (tekushaya_tochka < tochki_malogo_kruga.Count)

{

if (location.X < tochki_malogo_kruga[tekushaya_tochka].X)

{

location.X++;

}

if (location.X > tochki_malogo_kruga[tekushaya_tochka].X)

{

location.X--;

}

if (location.Y < tochki_malogo_kruga[tekushaya_tochka].Y)

{

location.Y++;

}

if (location.Y > tochki_malogo_kruga[tekushaya_tochka].Y)

{

location.Y--;

}

if (location == tochki_malogo_kruga[tekushaya_tochka])

{

tekushaya_tochka++;

}

potok.Join(speed);

}

else

{

if (chislo_krugov == 1)

{

v_malom_kruge = false;

chislo_krugov = 0;

}

else

{

chislo_krugov++;

}

tekushaya_tochka = 0;

}

}

}

//освобождаем ресурсы

if(v_rove)

{

resurs_rova.ReleaseMutex();

}

}

}

}