IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++控制台代码实现一定的界面效果Ⅴ(完成版) -> 正文阅读

[C++知识库]C++控制台代码实现一定的界面效果Ⅴ(完成版)

此头文件的更老版本可以参考: ICUF_HEAD_06.h.

开发环境:Visual Studio 2019


TANXL_CONSOLE_LIST.H(ICUF_HEAD_07.H)

正在使用此头文件进行推箱子游戏的开发,完成后将公布所有源代码。

//TANXL_CONSOLE_LIST.H(ICUF_HEAD_07.H)

#ifndef TANXL_CONSOLE_LIST
#define TANXL_CONSOLE_LIST
#ifndef TANXL_LIST//检查是否使用了其他版本的TANXL_CONSOLE_LIST
#define TANXL_LIST 1
#define LIST 1
#else
#define LIST 0
#endif
#endif
#if LIST
#ifndef IOSTREAM//检查是否已经包含IOSTREAM
#define IOSTREAM
#include <iostream>
#endif
#ifndef STRING//检查是否已经包含STRING
#define STRING
#include <string>
#endif
#ifndef CONIO_H//检查是否已经包含CONIO_H
#define CONIO_H
#include <conio.h>
#endif
#ifndef IOMANIP//检查是否已经包含IOMANIP
#define IOMANIP
#include <iomanip>
#endif
const char* HeadFile = "HeadFile.txt";
inline void Col(int ColN)//设置自定义行的背景颜色
{
	if (ColN == 0)std::cout << "\033[0m";//清除颜色
	else
	{
		std::cout << "\033[4;1;7m";
		if (ColN == 1)std::cout << "\033[31m";//背景红色
		else if (ColN == 2)std::cout << "\033[32m";//背景绿色
		else if (ColN == 3)std::cout << "\033[33m";//背景黄色
		else if (ColN == 4)std::cout << "\033[34m";//背景蓝色
		else if (ColN == 5)std::cout << "\033[35m";//背景紫色
		else if (ColN == 6)std::cout << "\033[36m";//背景淡蓝
		else if (ColN == 7)std::cout << "\033[37m";//背景白色
		else if (ColN == 8)Col((rand() % 6) + 1);//随机颜色(1-7)
		else if (ColN == 10)std::cout << "\033[40m";//字体黑色
		else if (ColN == 11)std::cout << "\033[41m";//字体红色
		else if (ColN == 12)std::cout << "\033[42m";//字体绿色
		else if (ColN == 13)std::cout << "\033[43m";//字体黄色
		else if (ColN == 14)std::cout << "\033[44m";//字体蓝色
		else if (ColN == 15)std::cout << "\033[45m";//字体紫色
		else if (ColN == 16)std::cout << "\033[46m";//字体淡蓝
		else if (ColN == 17)std::cout << "\033[47m";//字体白色
		else if (ColN == 18)Col((rand() % 6) + 11);//随机颜色(11-17)
	}
}
typedef enum class Status
{
	eMainList,
	eSonList
}Status;
typedef class MainList
{
public:
	void SetCol(int ColS, int ColU, int ColD = 7, int SonC = 6);//列表的背景颜色设置功能
	void SetFont(int ColS, int ColU, int ColD, int SonC);//列表的字体颜色设置功能
	void RecoverTimes();//复原被转移的Times值
	void ResetTimes();//将Times的值转移到TempTimes
	void InitList(int Start = 0);//列表初始化函数,默认初始化第一个选项为选定状态
	void Append(std::string FunctionName, int Times = 1);//List数组添加String成员
	void RemoveAll();//用于移除List数组中的所有String成员
	void SetLimit(int Max);//设置每页的最大显示数量,超出范围则默认为9
	void DisplayList(MainList List);//能够访问私有变量的子列表输出器
	void SetListName(std::string Name);//设置列表的名称
	void ShowTitle();//展示标题,标题背景色采用DefaultCol
	void SetTitle(std::string Temp);//设置标题内容
	void SetStatus(Status Sta);//设置页面级别
	void SetSpace(int Left = 23, int Right = 17, int Title = 33);//设置空格数
	int InsertAction();//输入控制(针对WASD、ZXC、↑↓←→以及数字1到9作出反应)
	int DisplayList(int LStart = 0, int LEnd = 9, int Switch = 0, int Return = 0);//显示列表,两个默认参数表示显示的开始行和结束行
	int DisplayListS(int LStart = 0, int LEnd = 9, int Return = 0);//子列表输出函数
	int CheckCurrent();//找到当前指向的选项  当找不到时返回-1
	int GetLimit();//获取每页的最大显示数量
	int GetPages();//获取总页面数
	int GetSonLists();//获取子页面选项数量
	int GetTimes();//获取页面执行次数的值
	int GetTimeS();//获取页面执行次数的值并在获取后加一
	int GetTempTimes();//获取页面执行次数的临时值
	Status GetStatus();//获取页面级别
	std::string GetListName();//获取列表的名称
private:
	void MoveUp();//选项上移
	void MoveDown();//选项下移
	int Times{};//用于计算某一函数的执行次数,同时用于限定某些代码只执行一次
	int TempTimes{};//临时存放Times的值
	int Page{ 1 };//当前指向的页面
	int Pages{ 1 };//总页面数量
	int LimitEachPage{ 9 };//页面选项上限
	int SonLists{ 0 };//表示类中含有的字符串数量
	int ListStatus[50]{ -1 };//存放选项状态
	int SonCol{ 6 };//子列表背景颜色
	int SelectedCol{ 7 };//选中的背景颜色
	int UnSelectedCol{ 1 };//未选中的背景颜色
	int DefaultCol{ 1 };//标题背景颜色
	int SonFont{ 10 };//子列表字体颜色
	int SelectedFont{ 10 };//选中的字体颜色
	int UnSelectedFont{ 10 };//未选中的字体颜色
	int DefaultFont{ 10 };//标题字体颜色
	int WidthL{ 23 }, WidthR{ 17 }, WidthT{ 33 };//选项和标题的空格数
	Status Stat{ Status::eSonList };//页面级别
	std::string ListName;//列表的名称
	std::string List[50]{};//存放选项名称
	std::string Title{ "欢迎使用TANXL_CONSOLE_LIST  WiChG_Trade" };//默认标题字符
}MainList;
inline void Free(MainList* Fun)//释放指针
{
	delete Fun;
	Fun = NULL;
}
void MainList::SetCol(int ColS, int ColU, int ColD, int SonC)//列表的背景颜色设置功能
{
	this->SelectedCol = ColS;//选中物品栏的颜色
	this->UnSelectedCol = ColU;//未选中的其他物品颜色
	this->DefaultCol = ColD;//默认主题颜色
	this->SonCol = SonC;//默认子列表颜色
}
void MainList::SetFont(int ColS, int ColU, int ColD, int SonC)//列表的字体颜色设置功能
{
	this->SelectedFont = ColS;//选中物品栏的颜色
	this->UnSelectedFont = ColU;//未选中的其他物品颜色
	this->DefaultFont = ColD;//默认主题颜色
	this->SonFont = SonC;//默认子列表颜色
}
void MainList::RecoverTimes()//复原被转移的Times值
{
	this->Times += ++this->TempTimes;
	this->TempTimes = 0;
}
void MainList::ResetTimes()//将Times的值转移到TempTimes
{
	this->TempTimes += ++this->Times;
	this->Times = 0;
}
void MainList::InitList(int Start)//列表初始化函数,默认初始化第一个选项为选定状态
{
	for (int i = 0; i < SonLists; i++)
	{
		ListStatus[i] = 0;
	}
	for (int i = SonLists; i < 50; i++)
	{
		ListStatus[i] = -1;
	}
	ListStatus[Start] = 1;
}
void MainList::DisplayList(MainList TempList)
{
	int Start = (TempList.Page - 1) * TempList.LimitEachPage;
	int End = Start + TempList.LimitEachPage;
	int UnSeCol = TempList.SonCol;
	int UnSeFont = TempList.SonFont;
	for (int i = Start; i < End + (9 - TempList.LimitEachPage); i++)
	{
		if (TempList.ListStatus[i] != -1)
		{
			if (TempList.ListStatus[i] == 1)
			{
				Col(TempList.SelectedCol);
				Col(TempList.SelectedFont);
			}
			else
			{
				Col(UnSeCol);
				Col(UnSeFont);
			}
			std::cout << std::setw(WidthL) << TempList.List[i] << std::setw(WidthR) << " " << std::endl;
			Col(0);
		}
	}
	std::cout << std::endl;
}
int MainList::DisplayList(int LStart, int LEnd, int Switch, int Return)//显示列表 ICUF_H_06中添加两个默认参数,可用于显示指定行
{
	int Start = (Page - 1) * LimitEachPage;
	int End = Start + LimitEachPage;
	int UnSeCol = UnSelectedCol;
	int UnSeFont = UnSelectedFont;
	int ReturnS{};
	if (Switch == 1)//Switch值为1时 显示此页面的各种基本信息
		std::cout << "FunId: " << CheckCurrent() << "  Limit: " << LimitEachPage << "  Page: " << Page << "  Start: " << Start << "  End: " << End << std::endl << std::endl;
	if (Switch == 2)//Switch值为2时 输出子页面的列表 且使用子页面的颜色
	{
		UnSeCol = SonCol;
		UnSeFont = SonFont;
	}
	for (int i = Start + LStart; i < End + (LEnd - LimitEachPage); i++)
	{
		if (ListStatus[i] != -1)
		{
			if (ListStatus[i] == 1)
			{
				Col(SelectedCol);
				Col(SelectedFont);
			}
			else
			{
				Col(UnSeCol);
				Col(UnSeFont);
			}
			std::cout << std::setw(WidthL) << List[i] << std::setw(WidthR) << " " << std::endl;
			if (Switch != 2)
				std::cout << std::endl;
			Col(0);
		}
	}
	if (Switch == 2)
		std::cout << std::endl;
	if (Return != 0)
		ReturnS = InsertAction();
	else
		return 0;
	return ReturnS;
}
int MainList::InsertAction()//输入控制
{
	char Key;
	int Temp;
	Key = _getch();
	if (Key == 'c' || Key == 'C')//如果输入了大小写的C则返回上一级
		return 3;
	if (SonLists == 0)
		return 0;
	if ((int)(Key - 48) > 0 && (int)(Key - 48) <= 9)//判断是否是从零到九的数字
	{
		if ((int)(Key - 48) > SonLists)//如果是,且小于等于选项总数则直接指定这个选项
			InitList(SonLists - 1);
		else
			InitList((int)(Key - 48) - 1);//如果超出了最大值,则指向最大值
		return 4;
	}
	else if (Key == 'w' || Key == 'W' || Key == 72)//如果输入了大小写的W或者上箭头,则执行MoveUp函数
	{
		MoveUp();
		return 0;
	}
	else if (Key == 's' || Key == 'S' || Key == 80)//如果输入了大小写的S或者下箭头,则执行MoveDown函数
	{
		MoveDown();
		return 0;
	}
	else if (Key == 'a' || Key == 'A' || Key == 75)//如果输入了大小写的A或者左箭头,则执行向上翻页函数
	{
		if (Page == GetPages() && GetPages() == 1)
		{
			Temp = CheckCurrent();
			ListStatus[Temp] = 0;
			ListStatus[0] = 1;
		}
		else if (Page != 1)
		{
			Page--;
			Temp = CheckCurrent();
			ListStatus[Temp] = 0;
			ListStatus[Temp - LimitEachPage] = 1;
		}
		else
		{
			Page = GetPages();
			Temp = CheckCurrent();
			ListStatus[Temp] = 0;
			ListStatus[(Page - 1) * LimitEachPage] = 1;
		}
		return 0;
	}
	else if (Key == 'd' || Key == 'D' || Key == 77)//如果输入了大小写的D或者右箭头,则执行向下翻页函数
	{
		if (Page == GetPages() && GetPages() == 1)
		{
			Temp = CheckCurrent();
			ListStatus[Temp] = 0;
			ListStatus[SonLists - 1] = 1;
		}
		else if (Page != GetPages())
		{
			Page++;
			Temp = CheckCurrent();
			ListStatus[Temp] = 0;
			if (Temp + LimitEachPage >= SonLists - 1)
				ListStatus[SonLists - 1] = 1;
			else
				ListStatus[Temp + LimitEachPage] = 1;
		}
		else
		{
			Page = 1;
			Temp = CheckCurrent();
			ListStatus[Temp] = 0;
			ListStatus[Temp % LimitEachPage] = 1;
		}
		return 0;
	}
	else if (Key == 'z' || Key == 'Z')//保留原功能的情况下,预留两个用户自定义返回值
	{
		return 1;
	}
	else if (Key == 'x' || Key == 'X')
	{
		return 2;
	}
	else if (Key == '\r')//回车确认
		return 4;
	return 0;
}
int MainList::CheckCurrent()//找到当前指向的选项  当找不到时返回-1
{
	for (int j = 0; j < SonLists; j++)
	{
		if (ListStatus[j] == 1)
			return j;
	}
	return -1;
}
void MainList::Append(std::string FunctionName, int Times)//List数组添加String成员
{
	if (Times != 0)
		return;
	List[SonLists] = FunctionName;

	SonLists += 1;//成员计数器
}
void MainList::RemoveAll()//用于移除List数组中的所有String成员
{
	for (int i = 0; i < 10; i++)
	{
		List[i] = {};
		SonLists = 0;
	}
}
void MainList::SetLimit(int Max)//设置每页的最大显示数量,超出范围则默认为9
{
	LimitEachPage = (Max > 9 || Max <= 0) ? 9 : Max;
}
int MainList::GetPages()//获取总页面数
{
	if (SonLists % LimitEachPage != 0)
		Pages = SonLists / LimitEachPage + 1;
	else
		Pages = SonLists / LimitEachPage;
	return Pages;
}
int MainList::GetLimit()//获取每页的最大显示数量
{
	return LimitEachPage;
}
void MainList::MoveUp()//选项上移
{
	int i = CheckCurrent();//找到当前指向的选项
	if (i == 0 && SonLists == 1)//如果只有一个选项则不变
		ListStatus[i] = 1;
	else if (i == 0 && SonLists != 1)//如果指向第一个且不止包含一个选项,则改为指向最下方的选项
	{
		ListStatus[i] = 0;
		Page = GetPages();
		ListStatus[SonLists - 1] = 1;
	}
	else if ((i + 1) % LimitEachPage == 1)//如果指向某一页面的第一项则翻页,并指向前一页的最后一项
	{
		if (Page != 1)
		{
			Page--;
			ListStatus[i] = 0;
			ListStatus[i - 1] = 1;
		}
		else
		{
			Page = GetPages();
			ListStatus[i] = 0;
			ListStatus[SonLists - 1] = 1;
		}
	}
	else//正常情况
	{
		ListStatus[i] = 0;
		ListStatus[i - 1] = 1;
	}
}
void MainList::MoveDown()//选项下移
{
	int i = CheckCurrent();//找到当前指向的选项
	if (i == 0 && SonLists == 1)//如果只有一个选项则不变
		ListStatus[i] = 1;
	else if (i != 0 && i == SonLists - 1)//如果指向最后一个且不止包含一个选项,则改为指向最上方的选项
	{
		ListStatus[SonLists - 1] = 0;
		Page = 1;
		ListStatus[0] = 1;
	}
	else if ((i + 1) % LimitEachPage == 0)//如果指向某一页面的最后一项则翻页,并指向下一页的第一项
	{
		if (Page != GetPages())
		{
			Page++;
			ListStatus[i] = 0;
			ListStatus[i + 1] = 1;
		}
		else
		{
			Page = 1;
			ListStatus[i] = 0;
			ListStatus[0] = 1;
		}
	}
	else//正常情况
	{
		ListStatus[i] = 0;
		ListStatus[i + 1] = 1;
	}
}
void MainList::SetListName(std::string Name)
{
	this->ListName = Name;
}
std::string MainList::GetListName()
{
	return this->ListName;
}
void MainList::SetTitle(std::string Temp)
{
	Title = Temp;
}
void MainList::ShowTitle()
{
	Col(DefaultCol); Col(DefaultFont);
	std::cout << std::endl << std::endl << std::endl << std::endl;
	std::cout << std::setw(WidthL) << " " << std::setw(WidthT) << Title << std::setw(WidthR) << " " << std::endl << std::endl; Col(0);
}
int MainList::DisplayListS(int LStart, int LEnd, int Return)//显示列表 ICUF_H_06中添加两个默认参数,可用于显示指定行
{
	int Start = (Page - 1) * LimitEachPage;
	int End = Start + LimitEachPage;
	int ReturnS{};
	for (int i = Start + LStart; i < End + (LEnd - LimitEachPage); i++)
	{
		if (ListStatus[i] != -1)
		{
			if (ListStatus[i] == 1)
			{
				Col(SelectedCol);
				Col(SelectedFont);
			}
			else
			{
				Col(SonCol);
				Col(SonFont);
			}
			std::cout << std::setw(WidthL) << List[i] << std::setw(WidthR) << " " << std::endl;
			Col(0);
		}
	}
	std::cout << std::endl;
	if (Return != 0)
		ReturnS = InsertAction();
	else
		return 0;
	return ReturnS;
}
int MainList::GetSonLists()
{
	return SonLists;
}
int MainList::GetTimes()
{
	return Times;
}
int MainList::GetTimeS()
{
	return Times++;
}
int MainList::GetTempTimes()
{
	return TempTimes;
}
void MainList::SetStatus(Status Sta)
{
	Stat = Sta;
}
Status MainList::GetStatus()
{
	return Stat;
}
void MainList::SetSpace(int Left, int Right, int Title)
{
	WidthL = Left;
	WidthR = Right;
	WidthT = Title;
}
#endif
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:27:16  更:2021-07-29 11:28:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/27 21:25:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码