【c++小游戏】谁与争锋1.0.3.0

1.0.2.1版本【c++小游戏】谁与争锋1.0.2.1_杨某一辰的博客-CSDN博客

1.0.2.2版本【c++小游戏】谁与争锋1.0.2.2_L('ω')┘脏脏包└('ω')」的博客-CSDN博客

本次更新经过作者同意,放心食用

更新内容:

缩减代码(结束)
优化角色信息输出(结束)
更新日志(结束)
新角色设定(未开始) 
更新控制台信息(结束) 
修改谁死谁赢的bug(结束) 
修改血量为负的bug(结束)
优化地图输出(即改为char数组输出,方便后期优化)(结束) 

#include<conio.h>
#include<stdio.h>
#include<windows.h>
#include<bits/stdc++.h>

#define chang 47
#define kuan  15
#define kd(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
#define sys system
#define cls system("cls")
#define pause sys("pause")
#define ent printf("\n")
 
using namespace std;

bool vip=0;
int mod;//模式 
//string shenying="关";//很明显了,声音 
//game 设置 
int hp,hp2,att,att2,bh,bh2,i,le,le2,liani,hai,hi;
int ti/*停顿时间*/;
bool winter1,zhou,lian,yin1,yin2;
int Yi,y2i;
int x1,Y,x2,y2;
RECT Rect,rectDesktop;//窗口移动参数 
char dt[500][500];

double juli(double,double,double,double);//距离
void centerwindow(RECT &,RECT &);//移动窗口至正中 
void hide();//隐藏光标 
void color(int);//改颜色 
void print(int);//选角色
void change(int,int&,int&,int&);//更新角色
void gotoxy(int,int);//清屏
void putt();//输出角色信息 
void prinf(int);//开始界面
void dt_init();//地图初始化 
void prinft();//输出界面 
void zheng(int&,int&,int,int,int,int,int,int,int&,int&,int&,int&,int&,int&,bool&,bool&,bool&,int&,int&,int&,int);
bool game_std();//std游戏 
void game();//游戏 
 
double juli(double x1,double Y,double x2,double y2)
{
	int lsbl=pow(max(x1,x2)-min(x1,x2),2)+pow(max(Y,y2)-min(Y,y2),2);
	return sqrt(lsbl);
}
 
void centerwindow(RECT &rect, RECT &desktop)
{//使窗口移动到桌面居中位置 
	int width,height,dtWidth,dtHeight;
	bool bSuccess=false;
	HWND hwnd = GetDesktopWindow();
	GetWindowRect(hwnd,&desktop); 
	dtWidth=desktop.right-desktop.left;
	dtHeight=desktop.bottom-desktop.top;
	
	hwnd = GetForegroundWindow(); 
	GetWindowRect(hwnd,&rect); 
	width=rect.right-rect.left;
	height=rect.bottom-rect.top;
 
	bSuccess=MoveWindow(hwnd,(dtWidth-width)/2,(dtHeight-height)/2,width,height,true); 
	GetWindowRect(hwnd,&rect); 
	return ;
}
 
void init()
{
	hp=hp2=att=att2=0;
	x1=Y=5,x2=y2=6;
	bh=bh2=i=le=le2=liani=hai=hi=zhou=lian=yin1=yin2=0,Yi=0,y2i=0;
}
 
void hide()
{
	CONSOLE_CURSOR_INFO cur={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cur);
}
 
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);
/*土黄色or金黄色*/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 prin(string s,int a,int t)
{
	int l=s.size();
	color(a);
	for(int i=0;i<l;i++) cout<<s[i],Sleep(t);
	color(0);
}
 
void print(int tt)
{
	prin("1.剑士 hp:100 att:7 \n1技能:劈砍\n\n",5,tt);
	prin("2.咒术师 hp:75 att:10 \n1技能:诅咒\n",5,tt);ent;
	prin("3.链魂者 hp:75 att:7 \n1技能:链魂 \n2技能:魂破(使用1技能后再用一次发动)\n",5,tt);ent;
	prin("4.忍者 hp:65 att:10 \n1技能:斩 \n2技能:隐身(被动)",5,tt);ent;
	prin("5.次非 hp:95 att:7 \n1技能:寒极\n",5,tt);ent;
}
 
void change(int idx,int &bhh,int &hpp,int &attt)
{
	if(mod==2) {hpp=75,attt=5,bhh=-114514;return;}
	system("mode con cols=30 lines=20");
	cls;
	print(idx==1?ti:0);
	printf("玩家%d: ",idx);
	in:cin>>bhh;
	switch(bhh)
	{
		case 1: hpp=100,attt=7;break;
		case 2: hpp=75,attt=10;break;
		case 3: hpp=75,attt=7;break;
		case 4: hpp=65,attt=10;break;
		case 5: hpp=95,attt=7;break;
		default:
			goto in;break;
	}
}
 
void gotoxy(int x,int y)//覆盖清屏 ,从指定行列覆盖
{
	COORD pos={(short)x,(short)y};
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
	return ;
}
 
void putt(int idx,int hpp,int attt,int bhh,int lee,int x,int y)
{
	gotoxy(x,y);
	printf("玩家%d:    \n",idx);
	gotoxy(x,y+1);
	printf("hp= %d     \n",hpp);
	gotoxy(x,y+2);
	printf("att=%d     \n",attt);
	gotoxy(x,y+3);
	printf("英雄:");
	switch(bhh)
	{
		case 1:puts("剑士");break;
		case 2:puts("咒术师");break;
		case 3:puts("链魂师");break;
		case 4:puts("忍者");break;
		case 5:puts("次非");break;
		case -114514:puts("无");break;
		default:break;
	}
	gotoxy(x,y+4);
	printf("技能:"); 
	switch(bhh)
	{
		case 1:puts("劈砍");break;
		case 2:puts("诅咒");break;
		case 3:puts("1技能:链魂 2技能:魂破");break;
		case 4:puts("1技能:斩 2技能:隐身");break;
		case 5:puts("技能:寒极");break;
		case -114514:puts("无");break;
		default:break;
	}
	gotoxy(x,y+5);
	if(lee) puts("冷却中");
	else puts("        ");
} 
 
void prinf(int tt)
{
	if(vip) {prin("您是尊贵的VIP用户\n",4,tt);}
	gotoxy(2,1);
	prin("谁与争锋1.0.0.2版\n",0,tt);
	gotoxy(0,3);
	prin("1.开始游戏(建议先调速度)",0,tt);
	gotoxy(7,4);
	prin("2.游戏详情",0,tt);
	gotoxy(7,5);
	prin("3.作者的话",0,tt);
	gotoxy(8,6);
	prin("4.公告",0,tt);
	gotoxy(8,7);
	prin("5.设置",0,tt);
	return;
}

void dt_init()
{
	memset(dt,' ',sizeof dt);
	for(int i=0;i<=chang;i++) dt[0][i]=dt[kuan+2][i]='-';
	for(int i=1;i<=kuan+1;i++) dt[i][chang]=dt[i][0]='|';
	return ;
}

void prinft()
{
	for(int i=0;i<=kuan+2;i++)
	{
		for(int j=0;j<=chang+2;j++) cout<<dt[i][j];
		cout<<"\n";
	}
	gotoxy(x1,Y);
	!yin1?(lian?printf("!"):printf("1")):printf(" ");
	gotoxy(x2,y2);
	!yin2?(lian?printf("@"):printf("2")):printf(" ");
	return ;
} 
 
void zheng(int &xx1,int &Yy,int up,int left,int right,int down,int jn1,int jn2,int &bhh,int &lee,int &attt,
		   int &xx2,int &yy2,int &hpp2,bool &zhouu,bool &liann,bool &yinn1,int &Yii,int &lee2,int &haai,
		   int idx) 
{
	//'W'87 'S'83 'A'65 'D'68 '1'0x31
	if(kd(up))    xx1--,xx1<0?xx1=0:xx1=xx1;
	if(kd(down))  xx1++,xx1>kuan?xx1=kuan:xx1=xx1;
	if(kd(left))  Yy--,Yy<1?Yy=1:Yy=Yy;
	if(kd(right)) Yy++,Yy>chang-1?Yy=chang-1:Yy=Yy; 
	if(kd(jn1)&&mod!=2)
	{
		switch(bhh)
		{
			case 1:
				if(!lee)
				{
					if(juli(xx1,Yy,xx2,yy2)<=5)
					{
						hpp2-=25;
						if(juli(xx1,Yy,xx2,yy2)<=3) hpp2-=25;
					}
					lee=time((NULL));
				}
				break;
			case 2:
				if(!lee)
				{
					zhouu=1;
					lee=time(NULL);
				}
				break;
			case 3:
				if(liann) liann=0,hpp2-=30,lee=time(NULL);
				else
					if(!lee) liann=1,lee=time(NULL),Sleep(500);
				break;
			case 4:
				if(!lee)
				{
					cls;
					xx1=xx2,Yy=yy2;
					yinn1=1,Yii=0;
					hpp2-=(hpp2/4);
					gotoxy(60,15);
					color(4);
					printf("斩!");
					color(0);
					Sleep(1000);
					cls;
					lee2=time(0);
					lee=time(0);
				}
				break;
			case 5:
				if(!lee)
				{
					lee2=time(0)+20;
					lee=time(0);
					haai=idx;
					cls;
					gotoxy(60,15);
					prin("风萧萧兮易水寒,壮士一去兮不复还!",1,100);
					Sleep(1000);
					cls;
				}
				break;
			default: break;
		}
	}
	if(kd(jn2))
	{
		if(juli(xx1,Yy,xx2,yy2)<=5||(liann&&bhh==3)) hpp2-=attt;
		yinn1=0;
	}
}
 
bool game_std()
{
	cls;
	init();
	dt_init();
	change(1,bh,hp,att);
	change(2,bh2,hp2,att2);
	system("mode con cols=54 lines=29");
	cls;
	while(1)
	{
		if(hp<=0||hp2<=0)
		{/*胜负*/
			if(hp<=0) winter1=0;
			else winter1=1;
			break;
		}
		/*正常*/
		if(zhou) i++;
		if(i>=15)
		{
			if(bh==2) hp2-=30;
			else hp-=30;
			i=0;
			zhou=0;
		}
		if(lian) liani++;
		if(liani>=100) lian=0,liani=0;
		if(bh==4)
		{
			if(Yi>=300) Yi=0,yin1=!yin1;
			else Yi++;
		}
		if(bh2==4)
		{
			if(y2i>=300) y2i=0,yin2=!yin2;
			else y2i++;
		}
		if(hai)
		{
			if(hi>=60) hai=hi=0;
			else hi++;
		}
		if(le)
			if(time(NULL)-le>=20) le=0;
		if(le2)
			if(time(NULL)-le2>=20) le2=0;
		
		prinft();
		
		putt(1,hp,att,bh,le,0,21);ent;
		putt(2,hp2,att2,bh2,le2,27,21);
		//'W'87 'S'83 'A'65 'D'68 '1'0x31
		zheng(x1,Y,'W','A','D','S','1','Q',bh,le,att,x2,y2,hp2,zhou,lian,yin1,Yi,le2,hai,2);
		end1:zheng(x2,y2,VK_UP,VK_LEFT,VK_RIGHT,VK_DOWN,VK_NUMPAD1,VK_NUMPAD0,bh2,le2,att2,x1,Y,hp,zhou,lian,yin2,y2i,le,hai,1);
		if(hai==1) goto end1;
		if(hai==2) goto end2;
//		if(shenying=="开") Beep(1046,100); 
		end2:gotoxy(0,0);//cls;
		Sleep(5*3); 
	}
	Sleep(1000);
	return winter1;
}/*1.wasd赢 0.↑↓←→赢*/

void game()
{
	cls;
	cerr<<"模式:\n";
	cerr<<"1.标准\n";
	cerr<<"2.无技能\n";
	cin>>mod;
	if(game_std()) cls,prin("玩家1获胜!!!\n",4,ti);
	else cls,prin("玩家2获胜!!!\n",4,ti);
	Sleep(2000);
	pause;
}
 
int main()
{
	system("mode con cols=24 lines=10");
	centerwindow(Rect,rectDesktop);
	ti=10; 
	hide();
	string peise="黑白";
//	youxi();
//	prinf(40);
	while(1)
	{
		system("mode con cols=24 lines=10");
		prinf(0);
		getch();
		if(kd('1')||kd(VK_NUMPAD1))
		{
			game();
		}
		if(kd('2')||kd(VK_NUMPAD2))
		{
//			system("mode con cols= lines="); 
			cls;
			Sleep(500);
			prin("开始制作日期:2023.7.20\n",5,ti);
			prin("结束日期:2023.7.20\n",5,ti);
			prin("版本:1.1.2.3\n",5,ti);
			prin("作者:杨某一辰\n",5,ti);
			prin("     脏脏包\n",5,ti);
			pause;
			cls;
			prin("玩家1:wasd移动\nq射击\n1放技能\n",5,ti);
			prin("玩家2↑←↓→:移动\n数字0射击\n数字1放技能\n",5,ti);
			pause;
		}
		if(kd('3')||kd(VK_NUMPAD3))
		{
			cls;
			Sleep(500);
			prin("希望大家玩的开心!\n",5,ti);
			prin("作者:杨某一辰\n",5,ti);
			prin("     脏脏包\n",5,ti);
			prin("1.进入作者主页 0.返回\n",5,ti);
			prin("2.进入ZZB主页 0.返回\n",5,ti);
			int lsbl_kd_3;
			cin>>lsbl_kd_3;
			if(lsbl_kd_3==1) sys("start https://blog.csdn.net/langhat?type=lately");
			if(lsbl_kd_3==2) sys("start https://blog.csdn.net/weixin_57427186");
		}
		if(kd('4')||kd(VK_NUMPAD4))
		{
			cls;
			system("mode con cols=75 lines=20");
			prin("版本1.0.0.0(2023.7.11-2023.7.12)\n",0,ti);
			prin("无公告\n",0,ti);
			prin("版本1.0.0.1(2023.7.14)\n",0,ti);
			prin("更新主界面:公告,设置;更新 新角色:链魂师\n链魂师和咒术师一局只有一个人能用!!!(不然会出BUG!)\n",0,ti);
			prin("版本1.0.2.0(2023.7.18)\n",0,ti);
			prin("更新角色:忍者!本次是大更新!更新了一点玩法!\n",0,ti);
			prin("预告:1.0.2.1(?):\n",0,ti);
			prin("更新角色:? !这是一个近战类型的角色!可以冰冻别人!目前在设置栏可以调是否开启\n",0,ti);
			prin("版本1.0.2.1(2023.7.19):\n",0,ti);
			prin("更新角色:次非!这是一个近战类型的角色!可以冰冻别人!\n更新了一个新模式!\n在这感谢脏脏包指出了程序中的Bug!\n",0,ti);
			prin("版本1.0.2.2(2023.7.20 ZZB编):\n",0,ti);
			prin("新模式暂时下架(主要是分开更新),优化主页面,更新颜色,修复角色bug,优化代码,增加停顿时间\n",0,ti);
			prin("版本1.0.2.3(2023.7.20):\n",0,ti);
			prin("水更+1\n",0,ti);
            prin("版本1.0.3.0(2023.7.20-2023.7.21 ZZB编):\n",0,ti);
            prin("缩减代码,优化角色信息输出,更新控制台信息,修改谁死谁赢的bug,修改血量为负的bug,优化地图输出\n",0,ti);
			pause;
		}
		if(kd('5')||kd(VK_NUMPAD5))
		{
			cls;
//			Sleep(500);
			cout<<"1.配色:"<<peise<<"\n";
//			cout<<"2.声音:"<<shenying<<"\n";
			cout<<"2.声音(未完善)\n";
			cout<<"3.VIP设置\n";
			cout<<"4.内测开启"<<endl;
			cout<<"5.速度"<<endl;
			cout<<"6.控制台信息"<<endl;
			int lsbl_kd5;
			cin>>lsbl_kd5;
			switch(lsbl_kd5)
			{
				case 1:
				{
					cls;
					cout<<"当前配色:"<<peise<<"\n";
					cout<<"1.黑白 2.白黑 3.自定义\n";
					cin>>lsbl_kd5;
					switch(lsbl_kd5)
					{
						case 1:
							sys("color 0f");
							peise="黑白";
							break;
						case 2:
							sys("color f0");
							peise="白黑";
							break;
						case 3:
							{
								cls;
								char th1,th2;
								bool th1b=0,th2b=0;
								cout<<"0=黑色 8=灰色\n1=蓝色 9=淡蓝色\n2=绿色 A=淡绿色\n3=浅绿色 B=淡浅绿色\n4=红色 C=淡红色";
								cout<<"\n5=紫色 D=淡紫色\n6=黄色 E=淡黄色\n7=白色 F=亮白色(大写!)\n";
								cout<<"背景色:";
								cin>>lsbl_kd5;
								if(lsbl_kd5>='A'&&lsbl_kd5<='F') th1=lsbl_kd5,th1b=1;
								cout<<"前景色:";
								int lsbl_kd5_case3;
								cin>>lsbl_kd5_case3;
								if(lsbl_kd5_case3>='A'&&lsbl_kd5_case3<='F') th2=lsbl_kd5_case3,th2b=1;
								char str[12]{};
								if(th1b)
								{
									if(th2b) sprintf(str,"color %c%c",th1,th2);
									else sprintf(str,"color %c%d",th1,lsbl_kd5_case3);
								}
								else
								{
									if(th2b) sprintf(str,"color %d%c",lsbl_kd5,th2);
									else sprintf(str,"color %d%d",lsbl_kd5,lsbl_kd5_case3);
								}
								sys(str);
								peise="自定义";
								break;
							}
						default: break;
					}
					break;
				}/*
				case 2:
				{
					cout<<"声音:"<<shenying<<endl;
					cout<<"(y/n)";
					char ch=getch();
					if(ch=='y'||ch=='Y') shenying="开";
					else shenying="关";
					break;
				}*/
				case 3:
				{
					string name;
					cout<<"你的名字:";
					cin>>name;
					if(name=="杨某一辰"||name=="留在记忆里的一抹残影"||name=="脏脏包")
					{
						cout<<"您已开启VIP\n";
						vip=1;
					}
					break;
				}
				case 4:
					prin("已开启!",3,200);
					Sleep(1000);
					break;
				case 5:
					cls;
					while(1)
					{
						gotoxy(0,0);
						cout<<"当前速度:"<<ti<<"    ";
						cout<<"\n1加速,2减速,3返回";
						if(kd(VK_NUMPAD3)||kd('3')) break;
						if(kd(VK_NUMPAD1)||kd('1')) --ti;
						if(kd(VK_NUMPAD2)||kd('2')) ti++;
						if(ti<0) ti=0;
						if(ti>100) ti=100;
						Sleep(20);
					}
				case 6:
				{
					cls;
					prin("即将导出当前控制台信息\n",5,ti*2);
					pause;
					cls;
					int width,height; 
					RECT rect;
					HWND hwnd=GetDesktopWindow();
					GetWindowRect(hwnd,&rect);     
					width=rect.right-rect.left;
					height=rect.bottom-rect.top;
					prin("屏幕分辨率:",0,ti*2);
					printf("%d*%d\n",width,height);
					HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);  
					CONSOLE_SCREEN_BUFFER_INFO bInfo;	
					GetConsoleScreenBufferInfo(hConsole, &bInfo);
					prin("控制台屏幕缓存区大小:\n",0,ti*2);
					printf("%d行 %d列\n\n",bInfo.dwSize.Y,bInfo.dwSize.X);
					prin("控制台最大显示尺寸:\n",0,ti*2);
					printf("%d行 %d列\n",bInfo.dwMaximumWindowSize.Y,bInfo.dwMaximumWindowSize.X);
					pause;
					system("mode con cols=72 lines=30");
					char s[256]="";
					rect=(RECT){0,0,0,0};
					int i=0,dtWidth=0,dtHeight=0;
					hwnd=GetDesktopWindow();
					hwnd=GetNextWindow(hwnd,GW_CHILD);
					prin("当前运行程序:\n",0,ti*2);
					Sleep(200);
					while(hwnd!=NULL)
					{
						GetWindowText(hwnd,s,sizeof(s));
						if(IsWindowVisible(hwnd)&&strlen(s)>0) cout<<++i<<":"<<s<<endl,Sleep(100);
						hwnd=GetNextWindow(hwnd,GW_HWNDNEXT);
					}
					pause;
					break;
				}
				default: break;
			}
		}
		cls;
	}
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值