c++游戏小技巧15:前14篇总结

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;

3.后文

上一篇:c++游戏小技巧14:多线程+线程池(全网最全,c++)

下一篇:c++游戏小技巧16:实例1(地牢生成算法)

  • 23
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值