题目:
//第三次实验:键盘交互与计时器 - 容器
//模拟一个办事机构(如银行)的叫号程序。
//在一个显示区域内从上到下按顺序显示5个号码,最开始是1-5。四个方向键控制显示区域的移动。空格键产生一个新号码,将最前面的号码挤出显示区。ESC键退出系统。
//使用键盘交互与计时器实现该程序,使用容器装载号码。
题解:
#include<iostream>
#include<vector>
#include <conio.h>
#include <windows.h>
#include <time.h>
#include <list>
#include <thread>
using namespace std;
//第三次实验:键盘交互与计时器 - 容器
//模拟一个办事机构(如银行)的叫号程序。
//在一个显示区域内从上到下按顺序显示5个号码,最开始是1-5。四个方向键控制显示区域的移动。空格键产生一个新号码,将最前面的号码挤出显示区。ESC键退出系统。
//使用键盘交互与计时器实现该程序,使用容器装载号码。
int n = 0;
int up = 0, down = 1, l = 0, r = 1;
class Num //号码
{
private:
int num;
public:
Num() :num(0) {};
Num(int num) :num(num) {};
int getnum() { return num; }
};
void show(list<Num> li) {
system("cls");//清屏
cout << endl;
for (int i = 0; i < down - up; i++)
cout << endl;
for (Num num : li)
{
for (int j = 0; j < r - l; j++)
cout << " ";
cout << num.getnum() << endl;
}
}
void update()//按时更新 线程
{
while (1)
{
Num num1(n + 1), num2(n + 2), num3(n + 3), num4(n + 4), num5(n + 5);
list<Num> li = { num1, num2, num3, num4, num5 };
show(li);
int ch = _getch(); //读取键盘输入字符,上下左右键
if (ch == 224) { //判断是否为方向键
ch = _getch(); //如果是方向键,再读一次
if(ch == 72) {up++; continue; } //上
if(ch == 80) {down++; continue; } //下
if(ch == 75) {l++; continue; } //左
if(ch == 77) {r++; continue; } //右
}
if (ch == 27)//ESC键
{
cout << "程序已退出 0.0 ";
break;
}
if (ch == 32)//空格键
{
n++;
//l.pop_front();
//l.push_back(five++);
}
}
}
int main()
{
thread th2(update);//双线程
//th2.join();
while (1)
{
Num num1(n + 1), num2(n + 2), num3(n + 3), num4(n + 4), num5(n + 5);
list<Num> li = { num1, num2, num3, num4, num5 };
n++;
Sleep(5000);
show(li);
}
}