1.前言
不知不觉,这个专栏已经写了14篇了
还是很感谢大家的支持awa
这一篇主要是对前面的补充、封装、再说明(前面几篇可能不会很详细,基本是感叹,勿喷awa)
以及对后面的规划
Let's Go!
2.正文
1.回顾
1.小技巧1(存读档+头文件)
这是这个专栏的第一篇文章(至于为什么要夹杂在一起只是因为文章的分看起来有点低)
(但还是很水)
我不准备改它(毕竟也是一种记忆)
水哩!
2.小技巧2(kd类型)
重点代码就一句:
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)
但是关于一些基本键码肯定是要背下来的(打着打着就会背了)
再贴一遍
(虚拟按键大全)
常量名 对应按键
————————————————————————
VK_LBUTTON 鼠标左键
VK_RBUTTON 鼠标右键
VK_CANCEL Ctrl+Break
VK_MBUTTON 鼠标中键
VK_BACK Backspace键
VK_TAB Tab 键
VK_RETURN 回车键
VK_SHIFT Shift键
VK_CONTROL Ctrl键
VK_MENU Alt键
VK_PAUSE Pause键
VK_CAPITAL Caps Lock键
VK_ESCAPE Esc键
VK_SPACE 空格键
VK_PRIOR Page Up键
VK_NEXT Page Down键
VK_END End键
VK_HOME Home键
VK_LEFT 左箭头键
VK_UP 上箭头键
VK_RIGHT 右箭头键
VK_DOWN 下箭头键
VK_SNAPSHOT Print Screen键
VK_Insert Insert键
VK_Delete Delete键
'0' – '9' 数字0-9
'A' – 'Z' 字母A - Z
VK_LWIN 左WinKey(104键盘才有)
VK_RWIN 右WinKey(104键盘才有)
VK_APPS AppsKey(104键盘才有)
VK_NUMPAD0 小键盘0键
VK_NUMPAD1 小键盘1键
VK_NUMPAD2 小键盘2键
VK_NUMPAD3 小键盘3键
VK_NUMPAD4 小键盘4键
VK_NUMPAD5 小键盘5键
VK_NUMPAD6 小键盘6键
VK_NUMPAD7 小键盘7键
VK_NUMPAD8 小键盘8键
VK_NUMPAD9 小键盘9键
VK_F1 - VK_F24 功能键F1–F24
VK_NUMLOCK Num Lock键
VK_SCROLL Scroll Lock键
3.小技巧3(Sleep与gotoxy)
Sleep没什么好说的,提醒一点:while1里面下意识加一个,不然有些奇怪的bug可能找上你
(其实也没什么,可能就是疾速版而已)
关于gotoxy,这个强调一下
我这里用的,是针对英文版的gotoxy
void gotoxy(int x,int y)
{
COORD pos={(short)x,(short)y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
return ;
}
而中文版的是:
void gotoxy(int x,int y)
{
COORD pos={(short)x,(short)y*2};//注意*2!
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
return ;
}
并且注意:行和列不要搞反!
(当年因为这个*2,我的小技巧5一直有Bug,后来才找到awa)
以及:注意一点:这个函数也可以叫它 SetPos(),locate(),到时候遇到要记得它的含义awa
还有,对于长度变换的变量一定要在输出后面加空格覆盖!!!
举个例子:
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
void gotoxy(int x,int y)
{
COORD pos={(short)x,(short)y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
return ;
}
void hide()
{
CONSOLE_CURSOR_INFO cur={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);
}
int main()
{
hide();
int i=10000,j=i;
while(i)
{
gotoxy(0,0);
printf("%d",i--);
gotoxy(0,1);
printf("%d ",j--);
}
}
4.小技巧4(可点击按钮1)
3里面提到了,没有*2是我的问题
深刻地道个歉
封装不写这里,写在后面
用的时候还是注意:中文gotoxy和英文gotoxy分开写,分开用
不然搞混了有的你受
5.小技巧5(隐藏光标+移除快速编辑模式)
这一篇基本是水的
给个建议:写了隐藏光标的话最好加上显示光标
输入的时候显示一下
不然看不见光标真的很烦很烦
6.小技巧6(随机迷宫)
(我的巅峰之作啊!)
当时这些代码网上基本找不到
只有人给了思路
照着思路硬打才打出来的(可能有人会说我菜,但当时我会的不多,是硬码的)
(打了很久,主要问题是我脑子抽了,在dfs那里卡了一个下午,在并查集那里改vec_to_int又改了一个下午)
(警钟敲烂:注意数组范围!dfs+while1时注意跳出条件不要像我一样!)
7.小技巧7(system)
system在前期还是用的挺多的
但在后期可能相对来说没有windows.h里面的函数多了
有些还是很好用(很方便)的
这里点明一下:
system("title ???");//换标题
system("cls");//有闪清屏,有闪是缺点,清全屏是有点
//cls建议分情况使用
//需要多次清小部分屏gotoxy
//需要单次清大部分屏用cls更优
system("mode con cols= lines=");//改窗口大小
system("start ");//打开···
这些常用的建议记一下
还是很好记的awa
8.小技巧8(弹窗)
这个还是很水的
只注意一点:就是美观程度
能用样式的尽量用上
不然我的强迫症真的会砂仁的!
9.小技巧9(windows.h)
我的巅峰之作2.0!
键鼠操作可以用来整蛊玩家
运行框相关信息也可以来整蛊
你可以把这4个示例合并一下
再禁用关闭键与隐藏键
那就是一个不错的整蛊代码
(不给了,被愤怒的朋友制裁了)
10.小技巧10(color)
这个给个建议就是看情况来使用
system是全屏修改
color比较方便
yanse(对不起为了和color区分用了个奇怪的变量名)比较万能
(但缺点是颜色只有十几个,这个也在winapi里面解决吧QwQ)
要强调的是颜色
0=黑色 8=灰色
1=蓝色 9=淡蓝色
2=绿色 A=淡绿色
3=浅绿色 B=淡浅绿色
4=红色 C=淡红色
5=紫色 D=淡紫色
6=黄色 E=淡黄色
7=白色 F=亮白色
在yanse里是
0=黑色 8=灰色
1=蓝色 9=淡蓝色
2=绿色 10=淡绿色
3=浅绿色 11=淡浅绿色
4=红色 12=淡红色
5=紫色 13=淡紫色
6=黄色 14=淡黄色
7=白色 15=亮白色
(警钟再烂)如果你用了color(a)(a!=15),用完后请记得color(15)
不然有时候是挺奇怪的awa
11.小技巧11(goto)
goto没什么好说
基本是水
注意一下顺序就可以了
这里举个例子(c++游戏小技巧16和17里面会提到,尽请期待)
要求:
在特殊条件下执行一些语句
不满足条件则跳过
这个看似if else就能解决(其实似乎也对?那我为什么要用goto来着???)
看一下吧(c++游戏小技巧16、17就进入游戏实例了哦!)
goto A;
B:
for(int i=1;i<=8;i++)
if(h[i][f]==2) use(h[i][f],f,i);
goto C;
A:
if(bd+pd==1&&bs<3) goto B;
if(bd+pd==2&&bs<4) goto B;
if(bd+pd==3&&bs<5) goto B;
if(bd+pd==4&&bs<6) goto B;
C:
cls;
12.小技巧12(流)
(经典水篇,看似很大篇,实际还是比较水的)(忽然感觉自己挺像水瓶的,到处灌水)
这篇我也挺喜欢的
主要是后面的存档pls版在一些游戏设置里起了很大忙
这个当板子看看就行
13.小技巧13(中文编码)
水肯定还是挺水的
(话说里面有个菜蛋找到没?)
这个唯一的作用是装X外带迷惑作用
比如这个
-50 -46 -54 -57 -75 -25 -60 -44
猜一下吧awa
14.小技巧14(多线程)
还是很不错的
至少这一篇没有水
(关于线程池,只要你电脑性能足够强,用不用都无所谓(而且优化其实不多))
给一下代码
(这个是有注释的,具体解释延迟一下)
(后面的板子是没注释+压行的)
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
namespace ThreadPool
{
#define MAX 100//维护线程数量,使其在可控范围内
typedef struct task{void(*function)(void*A);void*A;}task;//任务
struct Td//线程池结构体(任务队列)
{
task* taskQ;
int qmax,tsize,h,t;//容量,任务个数,队头,队尾
pthread_t mID;//管理者ID
pthread_t *uID;//工作线程ID
int Min,Max,Use,cuse,nuse;//最小线程数量,最大线程数量,正在使用(use),可以使用(can use),不可使用(can't use)
pthread_mutex_t lk,ulk;//锁整个的线程池,锁Use变量
pthread_cond_t F,E;//任务队列是不是满了,任务队列是不是空了
bool die;//销毁线程池?1:0
};
typedef struct Td Td;
Td *build(int a,int b,int sz);//创建线程池
int killtd(Td*nx);//销毁线程池
void td_add(Td*nx,void(*func)(void*),void*A);//添加任务
int get_b(Td*nx);//获取线程池中工作线程的个数
int get_c(Td*nx);//获取线程池中可使用的线程的个数
void*do_task(void*a);//做工作
void*control(void*a);//管理线程
void exit(Td*nx);//单个线程退出
Td* build(int a,int b,int sz)
{
Td*nx=(Td*)malloc(sizeof(Td));
do
{
if(nx==NULL){printf("线程创立失败...\n");break;}
nx->uID=(pthread_t*)malloc(sizeof(pthread_t)*b);
if(nx->uID==NULL){printf("使用线程id创立失败...\n");break;}
memset(nx->uID,0,sizeof(pthread_t)*b);
nx->Min=a;nx->Max=b;nx->Use=0;nx->cuse=a;nx->nuse=0;
if(pthread_mutex_init(&nx->lk,NULL)!=0||pthread_mutex_init(&nx->ulk,NULL)!=0||
pthread_cond_init(&nx->E,NULL)!=0||pthread_cond_init(&nx->F,NULL)!=0){printf("条件初始化失败...\n");break;}
nx->taskQ=(task*)malloc(sizeof(task)*sz);
nx->qmax=sz;
nx->tsize=nx->h=nx->t =nx->die=0;
pthread_create(&nx->mID,NULL,control,nx);//创建线程
for(int i=0;i<a;++i) pthread_create(&nx->uID[i],NULL,do_task,nx);
return nx;
}while(0);
if(nx&&nx->uID) free(nx->uID);//释放
if(nx&&nx->taskQ) free(nx->taskQ);
if(nx) free(nx);
return NULL;
}
int killtd(Td*nx)
{
if(nx==NULL) return -1;
nx->die=1;//关闭线程池
pthread_join(nx->mID,NULL);//阻塞回收管理者线程
for(int i=0;i<nx->cuse;++i) pthread_cond_signal(&nx->E);//解开阻塞的消费者线程
if(nx->taskQ) free(nx->taskQ);//释放
if(nx->uID) free(nx->uID);
pthread_mutex_destroy(&nx->lk);pthread_mutex_destroy(&nx->ulk);
pthread_cond_destroy(&nx->E);pthread_cond_destroy(&nx->F);
free(nx);nx=NULL;
return 0;
}
void td_add(Td*nx,void(*func)(void*),void*a)
{
pthread_mutex_lock(&nx->lk);
while(nx->tsize==nx->qmax&&!nx->die) pthread_cond_wait(&nx->F,&nx->lk);//阻塞生产者线程
if(nx->die){pthread_mutex_unlock(&nx->lk);return;}
nx->taskQ[nx->t].function=func;nx->taskQ[nx->t].A=a;nx->t=(nx->t+1)%nx->qmax;nx->tsize++;//添加任务
pthread_cond_signal(&nx->E);
pthread_mutex_unlock(&nx->lk);
}
int get_b(Td*nx)
{
pthread_mutex_lock(&nx->ulk);
int u=nx->Use;
pthread_mutex_unlock(&nx->ulk);
return u;
}
int get_c(Td*nx)
{
pthread_mutex_lock(&nx->lk);
int c=nx->cuse;
pthread_mutex_unlock(&nx->lk);
return c;
}
void*do_task(void* a)
{
Td*nx=(Td*)a;
while(1)
{
pthread_mutex_lock(&nx->lk);
while(nx->tsize==0&&!nx->die)//当前任务队列是否为空
{
pthread_cond_wait(&nx->E,&nx->lk);//阻塞工作线程
if(nx->nuse>0)//判断是不是要销毁线程
{
nx->nuse--;
if(nx->cuse>nx->Min)nx->cuse--,pthread_mutex_unlock(&nx->lk),exit(nx);
}
}
if(nx->die) pthread_mutex_unlock(&nx->lk),exit(nx);//判断线程池是否被关闭了
task t;//取出任务
t.function=nx->taskQ[nx->h].function,t.A=nx->taskQ[nx->h].A;
nx->h=(nx->h+1)%nx->qmax;//移动头指针
nx->tsize--;
pthread_cond_signal(&nx->F),pthread_mutex_unlock(&nx->lk);//解锁
printf("线程%lld运行中...\n", pthread_self());//输出
pthread_mutex_lock(&nx->ulk);
nx->Use++;
pthread_mutex_unlock(&nx->ulk);
t.function(t.A);
free(t.A);//释放
t.A=NULL;
printf("线程%lld完成任务...\n", pthread_self());
pthread_mutex_lock(&nx->ulk);
nx->Use--;
pthread_mutex_unlock(&nx->ulk);
}
return NULL;
}
void*control(void*a)
{
Td*nx=(Td*)a;
while(!nx->die)
{
Sleep(3000);//3s检查一次
pthread_mutex_lock(&nx->lk);//取出线程池中任务的数量和当前线程的数量
int sz=nx->tsize;
int cu=nx->cuse;
pthread_mutex_unlock(&nx->lk);
int Use=get_b(nx);//取出正在的线程的数量
//添加线程(任务的个数>存活的线程个数&&存活的线程数<最大线程数)
if(sz>cu&&cu<nx->Max)
{
pthread_mutex_lock(&nx->lk);
int c=0;
for(int i=0;i<nx->Max&&c<MAX&&nx->cuse<nx->Max;++i)
if(nx->uID[i]==0) pthread_create(&nx->uID[i], NULL,do_task,nx),c++,nx->cuse++;
pthread_mutex_unlock(&nx->lk);
}
//销毁线程(正在的线程*2<存活的线程数 && 存活的线程>最小线程数)
if(Use*2<cu&&cu>nx->Min)
{
pthread_mutex_lock(&nx->lk);
nx->nuse=MAX;
pthread_mutex_unlock(&nx->lk);
for(int i=0;i<MAX;++i) pthread_cond_signal(&nx->E);
}
}
return NULL;
}
void exit(Td*nx)
{
pthread_t id=pthread_self();
for(int i=0;i<nx->Max;++i)
if(nx->uID[i]==id){nx->uID[i]=0;printf("线程%lld正在退出...\n",id);break;}
pthread_exit(NULL);
}
void taskFunc(void*A)//函数内执行的任务
{
int b=*(int*)A;
Sleep(1000);
printf("线程%lld正在工作,num值为%d\n",pthread_self(),b);
}
}
using namespace ThreadPool;
int main()
{
Td*a=build(3,100,100);
for(int i=0;i<1000;++i)
{
int*b=(int*)malloc(sizeof(int));
*b=i+100;
td_add(a,taskFunc,b);
}
Sleep(3000);
killtd(a);
return 0;
}
ok,总结就完了
下面该到期望的
2.仰望
说句实话
这个系列改变了我很多
让我从颓废变得更加颓废
以后就这个样子了
每14篇+一篇总结
可能在我退役前都要一直写下去
(我的梦想是成为和胎神一样厉害的oier!!!)
(顺带做个预告,以后的可能基本是实例分析了,其中大部分是自己临时码的,不喜勿喷awa)
3.代码封装
1.线程池
namespace ThreadPool
{
#define MAX 100
typedef struct task{void(*function)(void*A);void*A;}task;
struct Td{task*taskQ;int qmax,tsize,h,t,Min,Max,Use,cuse,nuse;pthread_t mID,*uID;pthread_mutex_t lk,ulk;pthread_cond_t F,E;bool die;};
typedef struct Td Td;
Td *build(int a,int b,int sz);
int killtd(Td*nx);
void td_add(Td*nx,void(*func)(void*),void*A);
int get_b(Td*nx);
int get_c(Td*nx);
void*do_task(void*a);
void*control(void*a);
void exit(Td*nx);
Td* build(int a,int b,int sz){Td*nx=(Td*)malloc(sizeof(Td));do{if(nx==NULL){printf("线程创立失败...\n");break;}nx->uID=(pthread_t*)malloc(sizeof(pthread_t)*b);if(nx->uID==NULL){printf("使用线程id创立失败...\n");break;}memset(nx->uID,0,sizeof(pthread_t)*b);nx->Min=a;nx->Max=b;nx->Use=0;nx->cuse=a;nx->nuse=0;if(pthread_mutex_init(&nx->lk,NULL)!=0||pthread_mutex_init(&nx->ulk,NULL)!=0||pthread_cond_init(&nx->E,NULL)!=0||pthread_cond_init(&nx->F,NULL)!=0){printf("条件初始化失败...\n");break;}nx->taskQ=(task*)malloc(sizeof(task)*sz);nx->qmax=sz;nx->tsize=nx->h=nx->t =nx->die=0;pthread_create(&nx->mID,NULL,control,nx);for(int i=0;i<a;++i) pthread_create(&nx->uID[i],NULL,do_task,nx);return nx;}while(0);if(nx&&nx->uID) free(nx->uID);if(nx&&nx->taskQ) free(nx->taskQ);if(nx)free(nx);return NULL;}
int killtd(Td*nx){if(nx==NULL) return -1;nx->die=1;pthread_join(nx->mID,NULL);for(int i=0;i<nx->cuse;++i) pthread_cond_signal(&nx->E);if(nx->taskQ)free(nx->taskQ);if(nx->uID)free(nx->uID);pthread_mutex_destroy(&nx->lk);pthread_mutex_destroy(&nx->ulk);pthread_cond_destroy(&nx->E);pthread_cond_destroy(&nx->F);free(nx);nx=NULL;return 0;}
void td_add(Td*nx,void(*func)(void*),void*a){pthread_mutex_lock(&nx->lk);while(nx->tsize==nx->qmax&&!nx->die) pthread_cond_wait(&nx->F,&nx->lk);if(nx->die){pthread_mutex_unlock(&nx->lk);return;}nx->taskQ[nx->t].function=func;nx->taskQ[nx->t].A=a;nx->t=(nx->t+1)%nx->qmax;nx->tsize++;pthread_cond_signal(&nx->E);pthread_mutex_unlock(&nx->lk);}
int get_b(Td*nx){pthread_mutex_lock(&nx->ulk);int u=nx->Use;pthread_mutex_unlock(&nx->ulk);return u;}
int get_c(Td*nx){pthread_mutex_lock(&nx->lk);int c=nx->cuse;pthread_mutex_unlock(&nx->lk);return c;}
void*do_task(void* a){Td*nx=(Td*)a;while(1){pthread_mutex_lock(&nx->lk);while(nx->tsize==0&&!nx->die){pthread_cond_wait(&nx->E,&nx->lk);if(nx->nuse>0){nx->nuse--;if(nx->cuse>nx->Min)nx->cuse--,pthread_mutex_unlock(&nx->lk),exit(nx);}}if(nx->die) pthread_mutex_unlock(&nx->lk),exit(nx);task t;t.function=nx->taskQ[nx->h].function,t.A=nx->taskQ[nx->h].A;nx->h=(nx->h+1)%nx->qmax;nx->tsize--;pthread_cond_signal(&nx->F),pthread_mutex_unlock(&nx->lk);printf("线程%lld运行中...\n", pthread_self());pthread_mutex_lock(&nx->ulk);nx->Use++;pthread_mutex_unlock(&nx->ulk);t.function(t.A);free(t.A);t.A=NULL; printf("线程%lld完成任务...\n", pthread_self());pthread_mutex_lock(&nx->ulk);nx->Use--;pthread_mutex_unlock(&nx->ulk);}return NULL;}
void*control(void*a){Td*nx=(Td*)a;while(!nx->die){Sleep(3000);pthread_mutex_lock(&nx->lk);int sz=nx->tsize;int cu=nx->cuse;pthread_mutex_unlock(&nx->lk);int Use=get_b(nx);if(sz>cu&&cu<nx->Max){pthread_mutex_lock(&nx->lk);int c=0;for(int i=0;i<nx->Max&&c<MAX&&nx->cuse<nx->Max;++i)if(nx->uID[i]==0) pthread_create(&nx->uID[i], NULL,do_task,nx),c++,nx->cuse++;pthread_mutex_unlock(&nx->lk);}if(Use*2<cu&&cu>nx->Min){pthread_mutex_lock(&nx->lk);nx->nuse=MAX;pthread_mutex_unlock(&nx->lk);for(int i=0;i<MAX;++i) pthread_cond_signal(&nx->E);}}return NULL;}
void exit(Td*nx){pthread_t id=pthread_self();for(int i=0;i<nx->Max;++i)if(nx->uID[i]==id){nx->uID[i]=0;printf("线程%lld正在退出...\n",id);break;}pthread_exit(NULL);}
void taskFunc(void*A){int b=*(int*)A;Sleep(1000);printf("线程%lld正在工作,num值为%d\n",pthread_self(),b);}
}
using namespace ThreadPool;
2.页面初始化
namespace init
{
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000)?1:0)
#define sl(n) Sleep(n)
void gotoxy(int x,int y){COORD pos={(short)x,(short)y};HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOut,pos);return;}
void locate(int x,int y){COORD pos={(short)x,(short)y*2};HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOut,pos);return;}
void noedit(){HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);DWORD mode;GetConsoleMode(hStdin,&mode);mode&=~ENABLE_QUICK_EDIT_MODE;mode&=~ENABLE_INSERT_MODE;mode&=~ENABLE_MOUSE_INPUT;SetConsoleMode(hStdin,mode);}
void hide(){CONSOLE_CURSOR_INFO cur={1,0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);}
void show(){CONSOLE_CURSOR_INFO cur={1,1};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);}
}
using namespace init;
3.按钮
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
namespace init
{
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000)?1:0)
#define sl(n) Sleep(n)
void noedit(){HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);DWORD mode;GetConsoleMode(hStdin,&mode);mode&=~ENABLE_QUICK_EDIT_MODE;mode&=~ENABLE_INSERT_MODE;mode&=~ENABLE_MOUSE_INPUT;SetConsoleMode(hStdin,mode);}
void hide(){CONSOLE_CURSOR_INFO cur={1,0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);}
void show(){CONSOLE_CURSOR_INFO cur={1,1};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);}
}
using namespace init;
namespace Color
{
void color(int a)
{
if(a==0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(a==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN);
if(a==8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
void yanse(int ForgC,int BackC)
{
WORD wColor=((BackC&0x0F)<<4)+(ForgC&0x0F);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),wColor);
}
}
using namespace Color;
namespace Bt
{
struct button{int x,y,c,len;string name;};
button New(int X,int Y,int C,string N){button b;b.x=X,b.y=Y,b.c=C,b.name=N,b.len=N.size();return b;}
void gotoxy(int x,int y){COORD pos;pos.X=y*2,pos.Y=x;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);return;}
void get_pos(POINT &pt){HWND hwnd=GetForegroundWindow();GetCursorPos(&pt);ScreenToClient(hwnd,&pt);pt.y=pt.y/16,pt.x=pt.x/16;return;}
bool kd_button(button zzb){gotoxy(zzb.x,zzb.y),printf("%s",zzb.name.c_str());POINT pt;get_pos(pt);if(pt.y==zzb.x&&(pt.x>=zzb.y&&pt.x<=zzb.y+zzb.len/2)){color(zzb.c); gotoxy(zzb.x,zzb.y),printf("%s",zzb.name.c_str());color(0);if(kd(MOUSE_MOVED)) return 1;}return 0;}
}
using namespace Bt;
int main()
{
button b;
b=New(10,20,2,"zzb");//建立一个按钮
if(kd_button(b))//如果它按下
}
4.颜色
namespace Color
{
void color(int a)
{
/*亮白*/if(a==0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
/*蓝色*/if(a==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
/*绿色*/if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
/*紫色*/if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
/*红色*/if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
/*黄色*/if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
/*深蓝*/if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
/*金黄*/if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN);
/*灰白*/if(a==8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
void yanse(int ForgC,int BackC)
{
WORD wColor=((BackC&0x0F)<<4)+(ForgC&0x0F);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),wColor);
}
}
using namespace Color;
5.存读档
namespace stream
{
void cd(void)
{
FILE*fp=fopen("名字.txt","wb");
fprintf(fp,"%d",变量名);
fclose(fp);
}
void dd(void)
{
FILE*fp=fopen("名字.txt","rb");
if(fp!=NULL)
{
fscanf(fp,"%d",&变量名);
fclose(fp);
}
else{cd();printf("未找到存档,已新建");return;}
}
void fcd()
{
ofstream fout;
fout.open("路径+文件名",ios::out);
fout<<"zzb好帅!"<<endl;
fout.close();
}
void fdd()
{
ifstream fin;
fin.open("路径+文件名",ios::in);
if(!fin.is_open()) puts("cannot open the file");
if(!fin) puts("cannot open the file");
else
{
string k;
fin>>k;
cout<<k<<endl;
}
fin.close();
}
}
using namespace stream;