使用C++,easyx实现 一个十字路口,添加四个交通灯,南北,东西各一个,南北和东西交通灯颜色互斥,时间为10秒,不考虑黄灯。添加几个来自任意四个方向的直行车辆进程,红灯停绿灯行,车辆不能相撞,路口只允许一辆车通过,车辆通过路口时间固定。 实现一个开始按钮开始进程,一个添加按钮添加车辆
时间: 2023-10-08 16:12:12 浏览: 163
这是一个相对比较复杂的程序,需要使用多线程和图形界面库进行实现。以下是一种可能的实现方式,使用了C++语言和EasyX图形库。
首先,需要定义一个交通灯类,包含灯的位置、颜色和状态等信息,以及改变灯的颜色和状态的方法。代码如下:
```cpp
class TrafficLight {
public:
TrafficLight(int x, int y, COLORREF color1, COLORREF color2);
void draw();
void turnOn();
void turnOff();
void changeColor();
private:
int x, y; // 灯的位置
COLORREF color1, color2; // 灯的两种颜色
bool on; // 灯的状态,true表示亮着,false表示灭着
int colorIndex; // 当前颜色的索引
COLORREF colors[2]; // 颜色数组
};
```
其中,构造函数用于初始化交通灯的位置和颜色信息;`draw()`方法用于在屏幕上绘制交通灯;`turnOn()`和`turnOff()`方法用于打开和关闭灯;`changeColor()`方法用于改变灯的颜色。具体实现代码如下:
```cpp
TrafficLight::TrafficLight(int x, int y, COLORREF color1, COLORREF color2) {
this->x = x;
this->y = y;
this->color1 = color1;
this->color2 = color2;
on = false;
colorIndex = 0;
colors[0] = color1;
colors[1] = color2;
}
void TrafficLight::draw() {
setfillcolor(on ? colors[colorIndex] : BLACK);
solidcircle(x, y, 20);
}
void TrafficLight::turnOn() {
on = true;
}
void TrafficLight::turnOff() {
on = false;
}
void TrafficLight::changeColor() {
colorIndex = (colorIndex + 1) % 2;
}
```
接下来,需要定义一个车辆类,包含车的位置、方向和状态等信息,以及移动车的方法。代码如下:
```cpp
class Car {
public:
Car(int x, int y, int direction);
void draw();
void move();
bool isColliding(Car* other);
bool isArrived();
private:
int x, y; // 车的位置
int direction; // 车的方向,0表示南向北,1表示西向东,2表示北向南,3表示东向西
bool moving; // 车的状态,true表示正在移动,false表示已经停止
int speed; // 车的速度,每帧移动的像素数目
int length; // 车的长度
int width; // 车的宽度
};
```
其中,构造函数用于初始化车的位置和方向信息;`draw()`方法用于在屏幕上绘制车;`move()`方法用于移动车;`isColliding()`方法用于判断车和其他车是否相撞;`isArrived()`方法用于判断车是否到达目的地。具体实现代码如下:
```cpp
Car::Car(int x, int y, int direction) {
this->x = x;
this->y = y;
this->direction = direction;
moving = false;
speed = 5;
length = 40;
width = 20;
}
void Car::draw() {
setfillcolor(YELLOW);
switch (direction) {
case 0:
solidrectangle(x - width / 2, y, x + width / 2, y + length);
break;
case 1:
solidrectangle(x, y - width / 2, x + length, y + width / 2);
break;
case 2:
solidrectangle(x - width / 2, y - length, x + width / 2, y);
break;
case 3:
solidrectangle(x - length, y - width / 2, x, y + width / 2);
break;
}
}
void Car::move() {
switch (direction) {
case 0:
y -= speed;
break;
case 1:
x += speed;
break;
case 2:
y += speed;
break;
case 3:
x -= speed;
break;
}
}
bool Car::isColliding(Car* other) {
int x1 = x - width / 2, y1 = y - length / 2, x2 = x + width / 2, y2 = y + length / 2;
int x3 = other->x - other->width / 2, y3 = other->y - other->length / 2, x4 = other->x + other->width / 2, y4 = other->y + other->length / 2;
return !(x2 < x3 || x1 > x4 || y2 < y3 || y1 > y4);
}
bool Car::isArrived() {
switch (direction) {
case 0:
return y <= 60;
case 1:
return x >= 540;
case 2:
return y >= 540;
case 3:
return x <= 60;
}
return false;
}
```
接下来,需要定义一个交通控制类,包含交通灯和车辆等信息,以及控制交通的方法。代码如下:
```cpp
class TrafficControl {
public:
TrafficControl();
void draw();
void run();
void addCar();
private:
TrafficLight light1, light2, light3, light4; // 四个交通灯
vector<Car*> cars; // 车辆数组
int direction; // 当前通过路口的车的方向,0表示南向北,1表示西向东,2表示北向南,3表示东向西
bool moving; // 车是否在移动中
int speed; // 车的速度,每帧移动的像素数目
int interval; // 添加车辆的时间间隔,单位为帧数
int timer; // 计时器,用于控制添加车辆的时间
};
TrafficControl::TrafficControl() :
light1(300, 220, RED, GREEN),
light2(460, 320, RED, GREEN),
light3(300, 420, GREEN, RED),
light4(140, 320, GREEN, RED) {
direction = 0;
moving = false;
speed = 5;
interval = 120;
timer = 0;
}
void TrafficControl::draw() {
cleardevice();
setfillcolor(GREEN);
solidrectangle(0, 0, 600, 600);
setfillcolor(BLACK);
solidrectangle(200, 0, 400, 600);
light1.draw();
light2.draw();
light3.draw();
light4.draw();
for (int i = 0; i < cars.size(); i++) {
cars[i]->draw();
}
}
void TrafficControl::run() {
while (true) {
draw();
if (moving) {
for (int i = 0; i < cars.size(); i++) {
if (!cars[i]->isArrived()) {
cars[i]->move();
for (int j = 0; j < cars.size(); j++) {
if (i != j && cars[i]->isColliding(cars[j])) {
cars[i]->move();
}
}
}
}
if (direction % 2 == 0) {
if (light1.isGreen() && light3.isRed() && cars.size() > 0 && cars[0]->isArrived()) {
delete cars[0];
cars.erase(cars.begin());
moving = false;
timer = 0;
}
} else {
if (light2.isGreen() && light4.isRed() && cars.size() > 0 && cars[0]->isArrived()) {
delete cars[0];
cars.erase(cars.begin());
moving = false;
timer = 0;
}
}
} else {
timer++;
if (timer >= interval) {
addCar();
timer = 0;
}
}
if (direction % 2 == 0) {
if (light1.isGreen() && light3.isRed()) {
moving = true;
} else {
moving = false;
}
} else {
if (light2.isGreen() && light4.isRed()) {
moving = true;
} else {
moving = false;
}
}
if (moving) {
if (direction % 2 == 0) {
if (cars.size() == 0 || cars.back()->y > 100) {
cars.push_back(new Car(300, 520, direction));
}
} else {
if (cars.size() == 0 || cars.back()->x < 500) {
cars.push_back(new Car(80, 320, direction));
}
}
}
light1.changeColor();
light2.changeColor();
light3.changeColor();
light4.changeColor();
Sleep(50);
}
}
void TrafficControl::addCar() {
if (direction % 2 == 0) {
if (cars.size() == 0 || cars.back()->y > 100) {
cars.push_back(new Car(300, 520, direction));
}
} else {
if (cars.size() == 0 || cars.back()->x < 500) {
cars.push_back(new Car(80, 320, direction));
}
}
direction = (direction + 1) % 4;
}
```
其中,构造函数用于初始化交通灯和车辆等信息;`draw()`方法用于在屏幕上绘制交通灯和车辆;`run()`方法用于控制交通的运行;`addCar()`方法用于添加车辆。具体实现代码如下:
最后,需要在主函数中创建交通控制对象,并启动程序。代码如下:
```cpp
int main() {
initgraph(600, 600);
TrafficControl tc;
tc.run();
closegraph();
return 0;
}
```
以上是一种可能的实现方式,仅供参考。实际实现中可能需要根据具体需求进行调整和优化。
阅读全文