使用C++,easyx实现 一个十字路口,添加四个交通灯,南北,东西各一个,南北和东西交通灯颜色互斥,时间为10秒,不考虑黄灯。添加几个任意四个方向车辆进程,遵循交通规则,红灯停绿灯行,车辆均为直行即可,车辆不能相撞,路口只允许一辆车通过,车辆通过路口时间固定。 实现一个开始按钮开始进程,一个添加按钮添加车辆
时间: 2023-10-06 15:12:21 浏览: 57
这是一个比较复杂的交通灯模拟程序,需要考虑多个线程之间的同步和互斥。以下是一个简单的实现方式,仅供参考。
首先,我们需要定义交通灯和车辆的类。交通灯类包含三种状态:红灯、绿灯和黄灯,以及一个标记变量指示当前状态。车辆类包含车辆编号、进入路口的方向、当前位置等信息。
```c++
enum LightState { RED, GREEN, YELLOW };
class TrafficLight {
public:
TrafficLight(int x, int y);
void SetState(LightState state);
void Draw();
LightState GetState();
private:
int x_, y_;
LightState state_;
};
class Car {
public:
Car(int id, int x, int y, int direction);
void Draw();
void Move();
int GetX();
int GetY();
int GetDirection();
private:
int id_;
int x_, y_;
int direction_;
};
```
然后,我们需要定义一个路口类,包含四个交通灯和一个车辆队列。在路口类的构造函数中,我们创建四个交通灯对象,并初始化车辆队列为空。
```c++
class Intersection {
public:
Intersection();
void Draw();
void AddCar(int direction);
void Run();
private:
TrafficLight north_south_light_;
TrafficLight east_west_light_;
std::queue<Car> car_queue_;
};
```
在 `Run` 函数中,我们需要启动两个线程,分别控制南北和东西方向的交通灯。这两个线程需要不断地交替改变交通灯状态,直到用户停止程序为止。同时,我们还需要启动一个定时器线程,每隔一段时间添加一个新的车辆到队列中。
```c++
void Intersection::Run() {
std::thread t1([&]() {
while (true) {
north_south_light_.SetState(GREEN);
east_west_light_.SetState(RED);
std::this_thread::sleep_for(std::chrono::seconds(10));
north_south_light_.SetState(YELLOW);
std::this_thread::sleep_for(std::chrono::seconds(1));
north_south_light_.SetState(RED);
east_west_light_.SetState(GREEN);
std::this_thread::sleep_for(std::chrono::seconds(10));
east_west_light_.SetState(YELLOW);
std::this_thread::sleep_for(std::chrono::seconds(1));
}
});
std::thread t2([&]() {
while (true) {
east_west_light_.SetState(GREEN);
north_south_light_.SetState(RED);
std::this_thread::sleep_for(std::chrono::seconds(10));
east_west_light_.SetState(YELLOW);
std::this_thread::sleep_for(std::chrono::seconds(1));
east_west_light_.SetState(RED);
north_south_light_.SetState(GREEN);
std::this_thread::sleep_for(std::chrono::seconds(10));
north_south_light_.SetState(YELLOW);
std::this_thread::sleep_for(std::chrono::seconds(1));
}
});
std::thread t3([&]() {
while (true) {
std::this_thread::sleep_for(std::chrono::seconds(3));
AddCar(rand() % 4);
}
});
t1.detach();
t2.detach();
t3.detach();
}
```
在 `AddCar` 函数中,我们根据传入的方向参数创建一个新的车辆对象,并添加到车辆队列中。
```c++
void Intersection::AddCar(int direction) {
int id = car_queue_.size() + 1;
int x, y;
switch (direction) {
case 0: // from south
x = 400;
y = 600;
break;
case 1: // from north
x = 400;
y = -50;
break;
case 2: // from east
x = -50;
y = 300;
break;
case 3: // from west
x = 850;
y = 300;
break;
}
Car car(id, x, y, direction);
car_queue_.push(car);
}
```
最后,在主函数中,我们创建一个路口对象,并启动路口的运行函数。同时,我们还需要处理用户的输入,包括开始按钮和添加按钮的点击事件。
```c++
int main() {
initgraph(900, 700);
Intersection intersection;
intersection.Run();
bool running = false;
bool adding = false;
while (true) {
if (GetAsyncKeyState(VK_SPACE)) {
if (!running) {
running = true;
}
else {
running = false;
}
}
if (GetAsyncKeyState(VK_RETURN)) {
if (!adding) {
adding = true;
}
else {
adding = false;
}
}
if (adding) {
intersection.AddCar(rand() % 4);
}
if (running) {
cleardevice();
intersection.Draw();
intersection.Run();
}
else {
cleardevice();
intersection.Draw();
}
}
closegraph();
return 0;
}
```
完整代码如下:
阅读全文