运用顺序队和顺序栈,字符动画
#include <iostream>
#include <string>
#include<cstringt.h>
#include <stack>
#include<Windows.h>
#include<malloc.h>
#include<algorithm>
#include<time.h>
#include<iomanip>
#include<chrono>
#define MAXL 100
using namespace std;
typedef struct node
{
string cp;
int car_color=1;
double time_in,time_out;
}Node;
typedef struct qNode { //队列指针
int Front, Rear;
node sidewalk[MAXL];
}Queue;//front存,rear空
Queue que;
Node park[MAXL];
Node Out;
int park_space;
int park_car_number = 0;
int compare_park(string s);
int compare_side(string s);
//long long tim(Node tt);
void menu();
void animation_in_park();
void animation_in_side();
void animation_out_side(int x);
void animation_out_park(int x);
void print_park();
void print_side();
void init_Queue(Queue& que);
void in_car();
void out_car();
void en_Queue(Queue& q, string s, int i);
void de_Queue(Queue& q);
void car_cout(node q);
void change_color(int i);
void change_color(int i)//车辆颜色
{
switch (i)
{
case 0:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//白色
break;
case 1:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色
break;
case 2:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置绿色
break;
case 3:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色
break;
case 4:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);//黄色
break;
case 5 :
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);//粉色
break;
default:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//青色
break;
}
return;
}
void car_cout(node q)
{
change_color(q.car_color);
cout << "_____/----\\_______" << endl;
cout << " (o)["<< setw(9) << std::left << q.cp<< "](o)" << endl;
return;
}
void print_park()
{
change_color(1);
cout << "停车场内:" << endl;
int i = 1;
while (i <= park_car_number)
{
car_cout(park[i]);
i++;
}
return;
}
void print_side()
{
change_color(1);
cout << "便道内:\n";
int i = 0;
while(que.Front+i<que.Rear)
{
car_cout(que.sidewalk[i + que.Front]);
i++;
}
return;
}
void animation_out_park(int x)
{
//车退栈
for (int i = 1;i <=park_space - x;i++)
{
Sleep(500);
system("cls");
cout << "停车场内:\n";
for (int k = 1;k < x;k++)
{
car_cout(park[k]);
}
for (int j = 0;j <=i;j++)
{
cout << endl;
}
for (int j = x;j <= park_car_number;j++)
{
car_cout(park[j]);
}
}
for (int i = x;i <=park_car_number;i++)//栈变值
{
park[i] = park[i + 1];
}
park_car_number--;
if (que.Rear - que.Front > 0)//队列入栈
{
park[park_space].cp = que.sidewalk[que.Front].cp;
park[park_space].car_color = que.sidewalk[que.Front].car_color;
park[park_space].time_in = clock();
que.Front++;
park_car_number++;
}
//车进栈
for (int i = park_car_number - x;i > 0;i--)//车进栈
{
Sleep(200);
system("cls");
for (int k = 1;k < x;k++)
{
car_cout(park[k]);
}
for (int j = 0;j < i;j++)
{
cout << endl;
}
for (int j = x;j <= park_car_number;j++)
{
car_cout(park[j]);
}
print_side();
}
system("cls");
print_park();
print_side();
return;
}
void animation_out_side(int x)
{
node s;
s.cp= que.sidewalk[x+que.Front].cp;
s.car_color = que.sidewalk[x + que.Front].car_color;
for (int i = x;i+que.Front < que.Rear;i++)
{
que.sidewalk[i + que.Front] = que.sidewalk[i + que.Front+1];
}
que.Rear--;
int t = x;
while (t)
{
//system("pause");
Sleep(100);
system("cls");
print_park();
change_color(1);
cout << "便道内" << endl;
int j = 0;
while (j < t - 1)
{
car_cout(que.sidewalk[que.Front + j]);
j++;
}
change_color(que.sidewalk[que.Front + t-1].car_color);
cout << "_____/----\\_______";
change_color(s.car_color);
cout<< " " << "_____/----\\_______" << endl;
change_color(que.sidewalk[que.Front + t-1].car_color);
cout << " (o)[" << setw(9) << std::left << que.sidewalk[que.Front + t-1].cp << "](o)";
change_color(s.car_color);
cout << " " << " (o)[" << setw(9) << std::left << s.cp << "](o)" << endl;
j++;
while (que.Front + j < que.Rear)
{
car_cout(que.sidewalk[que.Front + j]);
j++;
}
t--;
Sleep(1000);
}
system("cls");
print_park();
print_side();
change_color(1);
cout << "该车在便道内,无需支付费用" << endl;
menu();
return;
}
void out_car()
{
cout << "请输入车牌号" << endl;
cin >> Out.cp;
int pos1 = compare_park(Out.cp);
int pos2 = compare_side(Out.cp);//pos2为与队头距离
if (pos1 == -1&&pos2==-1)
{
cout << "未找到此车" << endl;
menu();
return;
}
if (pos2>=0)
{
animation_out_side(pos2);
return;
}
if(pos1>=0)
{
park[pos1].time_out = clock();
animation_out_park(pos1);
auto duration = park[pos1].time_in - park[pos1].time_out;
//cout<<ctime(&park[pos1].time_out)
cout << "需缴纳:" << duration/1000 << "元" << endl;
menu();
}
}
void in_car()
{
string license_plate_number;
cout << "请输入车牌号" << endl;
cin >> license_plate_number;
if (compare_park(license_plate_number) >= 0)
{
cout << "此车已在入停车场" << endl;
menu();
return;
}
if (compare_side(license_plate_number) >= 0)
{
cout << "此车已在入便道" << endl;
menu();
return;
}
if (park_car_number < park_space)//入停车场
{
park_car_number++;
park[park_car_number].cp = license_plate_number;
park[park_car_number].time_in = clock();
park[park_car_number].car_color = rand() % 7;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
// 设置控制台窗口缓冲区大小
COORD bufferSize = { 120, 120 };
SetConsoleScreenBufferSize(hOut, bufferSize);
animation_in_park();
menu();
}
else//入便道
{
int Car_color = rand() % 7;
//que.Rear++;
en_Queue(que, license_plate_number,Car_color);
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
// 设置控制台窗口缓冲区大小
COORD bufferSize = { 120, 120 };
SetConsoleScreenBufferSize(hOut, bufferSize);
animation_in_side();
}
}
void de_Queue(Queue& q)
{
q.Front++;
}
void en_Queue(Queue& q, string s,int i)
{
q.sidewalk[q.Rear].cp = s;
q.sidewalk[que.Rear].car_color = i;
q.Rear++;
}
void init_Queue(Queue& que) {
que.Front = 1;
que.Rear = 1;
}
void animation_in_park()
{
change_color(1);
int park_space_residue = park_space - park_car_number+1;//新车与最后方车辆间隔
while (park_space_residue--)
{
Sleep(100);
system("cls");
int i = 1;
change_color(1);
cout << "停车场内:" << endl;
while (i <park_car_number)
{
car_cout(park[i]);
i++;
}
for (i = 0;i < park_space_residue;i++)
{
cout << endl;
}
car_cout(park[park_car_number]);
}
for (int i = 0;i < park_space - park_car_number;i++)
{
cout << endl;
}
}
void animation_in_side()
{
int t = 5;
while (t--)
{
Sleep(100);
system("cls");
change_color(1);
cout << "停车场内:" << endl;
for (int i = 1;i <= park_space;i++)
car_cout(park[i]);
change_color(1);
cout << "便道内:" << endl;
if (que.Front+1 < que.Rear )
{
int i = que.Front;
while(i < que.Rear-1)
{
car_cout(que.sidewalk[i]);
i++;
}
}
for (int i = 0;i < t;i++)
{
cout << endl;
}
car_cout(que.sidewalk[que.Rear - 1]);
}
menu();
}
void menu()
{
change_color(1);
cout << "********星树*********" << endl
<< "* 1:新车入场 *" << endl
<< "* 2:车离场 *" << endl
<< "* 3:显示当前场地情况 *" << endl
<< "**********************" << endl;
char c;
cin >> c;
switch (c)
{
case'1':
in_car();
break;
case'2':
out_car();
break;
case'3':
system("cls");
print_park();
print_side();
menu();
break;
default:
string error_input;
cin >> error_input;
cout << "输入错误";
Sleep(1000);
system("cls");
menu();
break;
}
return;
}
int compare_park(string s)
{
int i = 0;
while (i <=park_car_number)
{
if (strcmp(s.c_str(), park[i].cp.c_str()) == 0)
{
return i;
}
i++;
}
return -1;
}
int compare_side(string s)
{
int i = 0;
while (i <= que.Rear-que.Front)
{
if (strcmp(s.c_str(), que.sidewalk[que.Front + i].cp.c_str()) == 0)
{
return i;
}
i++;
}
return -1;
}
int main()
{
cout << "请输入停车场容量:" << endl;
cin >> park_space;
init_Queue(que);
menu();
return 0;
}