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;
}
}