Lập trình oop c++

Xin chào mọi người mình có một chương trình mong mọi người giúp đỡ
hiện tại mình ko biết làm sao để di chuyển xe sao cho đến ngã tư nếu đèn xanh thì chạy tiếp, đèn đỏ thì dừng lại và làm sao để di chuyển xe ở bên trái đường sang phải nếu nó ko chạm vào xe kia.

// oop6.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include < Windows.h >
#include < windowsx.h >
#include < tchar.h >
#include < time.h >
#include < stdio.h >
using namespace std;

void wait(int seconds) {
    clock_t endwait;
    endwait = clock() + seconds * CLOCKS_PER_SEC;
    while (clock() < endwait) {}
}
// Класс ФИГУРА
class Figure {
    protected:
        HWND hWnd;
    HDC hDC;

    COLORREF Color;
    int CenterX;
    int CenterY;
    public:
        Figure(HWND _hWnd, int iCenterX, int iCenterY) {
            hWnd = _hWnd;
            hDC = GetDC(_hWnd); //Получаем контекст устройства по полученному дескриптору

            Color = RGB(255, 0, 0);
            CenterX = iCenterX;
            CenterY = iCenterY;
        }
    virtual~Figure(void) {
        ReleaseDC(hWnd, hDC);
    }

    void SetNewColor(COLORREF NewColor) {
        Hide();
        Color = NewColor;
        Show();
    }

    virtual void Show() = 0;
    virtual void Hide() {
        COLORREF prev_col = Color;
        Color = RGB(0, 0, 0);
        Show();
        Color = prev_col;
    }

    void Move(int DeltaX, int DeltaY) {
        Hide();
        CenterX += DeltaX;
        CenterY += DeltaY;
        Show();
    }
};

// Класс ОКРУЖНОСТЬ
class Circle: public Figure {
    private: int Radius;
    public: Circle(HWND _hWnd, int iCenterX, int iCenterY, int iRadius): Figure(_hWnd, iCenterX, iCenterY) {
        Radius = iRadius;
    }
    void Show();

};

// Класс ПРЯМОУГОЛЬНИК
class Rectangle_my: public Figure {
    private: int h; // Высота
    int w; // Ширина
    public: Rectangle_my(HWND _hWnd, int iCenterX, int iCenterY, int ih, int iw): Figure(_hWnd, iCenterX, iCenterY) {
        h = ih;
        w = iw;
    }
    void Show();
};
// Методы ОКРУЖНОСТИ
void Circle::Show() {
    HPEN hPen = CreatePen(PS_SOLID, 1, Color); //установка пера
    HBRUSH hBrush = CreateSolidBrush(Color);
    SelectObject(hDC, hPen);
    SelectObject(hDC, hBrush);

    Ellipse(hDC, CenterX - Radius, CenterY - Radius, CenterX + Radius, CenterY + Radius);

    DeleteObject(hBrush);
    DeleteObject(hPen);
}
// Методы ПРЯМОУГОЛЬНИКА
void Rectangle_my::Show() {
    HPEN hPen = CreatePen(PS_SOLID, 1, Color); //установка пера
    HBRUSH hBrush = CreateSolidBrush(Color);
    SelectObject(hDC, hPen);
    SelectObject(hDC, hBrush);

    Rectangle(hDC, CenterX, CenterY, CenterX + w, CenterY + h);

    DeleteObject(hBrush);
    DeleteObject(hPen);
}

class Lines: public Figure {
    private: int h;
    int w;
    public: Lines(HWND _hWnd, int iCenterX, int iCenterY, int ih, int iw): Figure(_hWnd, iCenterX, iCenterY) {
        h = ih;
        w = iw;
    }
    void Show();
};
void Lines::Show() {
    POINT lppt;
    HPEN hPen = CreatePen(PS_SOLID, 1, Color);
    HBRUSH hBrush = GetStockBrush(NULL_BRUSH);
    SelectObject(hDC, hPen);
    SelectObject(hDC, hBrush);
    MoveToEx(hDC, CenterX, CenterY, & lppt);
    LineTo(hDC, CenterX + h, CenterY + w);
    DeleteObject(hBrush);
    DeleteObject(hPen);
}

// Головная функция
int main() {
    HWND hWnd = GetConsoleWindow(); //Получаем дескриптор окна консоли
    COLORREF Color;
    HBRUSH hBrush;
    Lines L1(hWnd, 0, 200, 600, 0);
    Lines L2(hWnd, 600, 200, 0, -200);
    Lines L3(hWnd, 750, 0, 0, 800);
    Lines L4(hWnd, 900, 0, 0, 200);
    Lines L5(hWnd, 900, 200, 500, 0);
    Lines L6(hWnd, 0, 500, 600, 0);
    Lines L7(hWnd, 600, 500, 0, 300);
    Lines L8(hWnd, 900, 800, 0, -300);
    Lines L9(hWnd, 900, 500, 500, 0);
    Lines L10(hWnd, 0, 350, 1400, 0);
    Lines L11(hWnd, 270, 380, 30, 20);
    Lines L22(hWnd, 300, 400, 30, -20);
    Lines L12(hWnd, 920, 200, 0, -150);
    Lines L13(hWnd, 920, 50, 70, 0);
    Lines L14(hWnd, 990, 50, 0, 150);
    Circle C1(hWnd, 955, 175, 20);
    Circle C2(hWnd, 955, 125, 20);
    Circle C3(hWnd, 955, 75, 20);
    Circle C4(hWnd, 30, 270, 10);
    Circle C5(hWnd, 90, 270, 10);
    Circle C6(hWnd, 275, 460, 10);
    Circle C7(hWnd, 325, 460, 10);
    Figure * R1;
    R1 = new Rectangle_my(hWnd, 10, 210, 50, 100);
    Figure * R2;
    R2 = new Rectangle_my(hWnd, 350, 450, -50, -100);
    L1.Show();
    L2.Show();

    if (HPEN hPen = CreatePen(PS_DASH, 1, Color = RGB(153, 153, 153))) {
        L3.Show();
        L3.SetNewColor(Color);
        L10.Show();
        L10.SetNewColor(Color);
    }
    L4.Show();
    L5.Show();
    L6.Show();
    L7.Show();
    L8.Show();
    L9.Show();
    L11.Show();
    L22.Show();
    L12.Show();
    L13.Show();
    L14.Show();

    if (Color = RGB(0, 255, 0)) {
        C1.Show();
        C1.SetNewColor(Color);
    }

    if (Color = RGB(255, 255, 0)) {
        C2.Show();
        C2.SetNewColor(Color);
    }

    C3.Show();

    if (Color = RGB(0, 0, 255)) {
        C4.Show();
        C4.SetNewColor(Color);
        C5.Show();
        C5.SetNewColor(Color);
    }

    if (Color = RGB(255, 153, 51)) {
        C6.Show();
        C6.SetNewColor(Color);
        C7.Show();
        C7.SetNewColor(Color);
    }

    if (Color = RGB(153, 51, 255)) {
        R2 - > Show();
        R2 - > SetNewColor(Color);
    }

    if (Color = RGB(51, 255, 255)) {
        R1 - > Show();
        R1 - > SetNewColor(Color);
    }

    std::cin.get();

    delete R1;
    delete R2;

    return 0;
}

1 Like

Dùng Luồng (Thread).

1 Like

chào bạn, nhưng mình chưa được học về luồng, bạn có cách khác ko vậy

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?