#include<iostream>
#include<windows.h>
#include<conio.h>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<fstream>
using namespace std;
bool near_(int P1,int P2){
if(P1==P2-1||P1==P2+1||P1==P2+120||P1==P2-120)return true;
return false;
}
struct Arrow{
int pos;
bool active,direction;
};
void saveGame(string game[],int P1,int P2,int P1_blood,int P2_blood,int P1_power,int P2_power,bool P1_cheating,bool P2_cheating,string P1_skin,string P2_skin,int P1_arrow_count,int P2_arrow_count,int P1_blood_first,int P2_blood_first){
ofstream fout("save.txt");
fout<<P1<<" "<<P2<<" "<<P1_blood<<" "<<P2_blood<<" "<<P1_power<<" "<<P2_power<<" "<<P1_cheating<<" "<<P2_cheating<<" "<<P1_skin<<" "<<P2_skin<<" "<<P1_arrow_count<<" "<<P2_arrow_count<<" "<<P1_blood_first<<" "<<P2_blood_first<<endl;
for(int i=0;i<3000;i++)fout<<game[i]<<endl;
fout.close();
}
void loadGame(string game[],int &P1,int &P2,int &P1_blood,int &P2_blood,int &P1_power,int &P2_power,bool &P1_cheating,bool &P2_cheating,string &P1_skin,string &P2_skin,int &P1_arrow_count,int &P2_arrow_count,int &P1_blood_first,int &P2_blood_first){
ifstream fin("save.txt");
if(!fin)return;
fin>>P1>>P2>>P1_blood>>P2_blood>>P1_power>>P2_power>>P1_cheating>>P2_cheating>>P1_skin>>P2_skin>>P1_arrow_count>>P2_arrow_count>>P1_blood_first>>P2_blood_first;
for(int i=0;i<3000;i++)fin>>game[i];
fin.close();
}
int main(){
system("title gf25002的双人版PVP(2026/3/1)");
string game[3000],P1_skin="1",P2_skin="2",command;
int P1=1500,P2=1530,P1_ender_pearl,P2_ender_pearl,P1_blood,P2_blood,P1_power=1,P2_power=1,P1_arrow_count=0,P2_arrow_count=0,P1_blood_first=20,P2_blood_first=20;
bool gameover=false,P1_cheating=false,P2_cheating=false,P1_ender_pearl_out=false,P2_ender_pearl_out=false,P1_enderpearling_dir=false,P2_enderpearling_dir=false,need_clear=false;
Arrow P1_arrows[25],P2_arrows[25];
for(int i=0;i<=2999;i++){
if(i%120==0||(i+1)%120==0)game[i]="|";
else if((i>0&&i<119)||(i>2880&&i<2999))game[i]="-";
else game[i]=" ";
}
while(1){
cout<<" 是否输入玩家初始血量?(不输入默认初始血量为20)\n (y/n)\n";
int choose=_getch();
if(choose=='y'||choose=='Y'){
cout<<" === 设置 ===\n 玩家一血量:";
cin>>P1_blood_first;
cout<<" 玩家二血量:";
cin>>P2_blood_first;
break;
}else if(choose=='n'||choose=='N')break;
else cout<<" 无效选择!\n"<<endl;
}
cout<<" (按任意键继续......)";
P1_blood=P1_blood_first,P2_blood=P2_blood_first;
while(!gameover){
if(P1_ender_pearl_out){
P1_ender_pearl+=(P1_enderpearling_dir?1:-1);
if(P1_ender_pearl%120==0||(P1_ender_pearl+1)%120==0||P1_ender_pearl<=119||P1_ender_pearl>=2880)P1_ender_pearl_out=false;
need_clear=true;
}
if(P2_ender_pearl_out){
P2_ender_pearl+=(P2_enderpearling_dir?1:-1);
if(P2_ender_pearl%120==0||(P2_ender_pearl+1)%120==0||P2_ender_pearl<=119||P2_ender_pearl>=2880)P2_ender_pearl_out=false;
need_clear=true;
}
for(int i=0;i<20;i++){
if(P1_arrows[i].active){
P1_arrows[i].pos+=(P1_arrows[i].direction?1:-1);
if(P1_arrows[i].pos%120==0||(P1_arrows[i].pos+1)%120==0||P1_arrows[i].pos<=119||P1_arrows[i].pos>=2880)P1_arrows[i].active=false;
else if(P1_arrows[i].pos==P2&&!P2_cheating)P2_blood-=2*P1_power,P1_arrows[i].active=false;
need_clear=true;
}
if(P2_arrows[i].active){
P2_arrows[i].pos+=(P2_arrows[i].direction?1:-1);
if(P2_arrows[i].pos%120==0||(P2_arrows[i].pos+1)%120==0||P2_arrows[i].pos<=119||P2_arrows[i].pos>=2880)P2_arrows[i].active=false;
else if(P2_arrows[i].pos==P1&&!P1_cheating)P1_blood-=2*P2_power,P2_arrows[i].active=false;
need_clear=true;
}
}
if(_kbhit()){
need_clear=true;
switch(_getch()){
case 'w':if(!(P1>=0&&P1<120)&&(P1!=P2+120||P1_cheating==true))P1-=120;break;
case 'a':if(!(P1%120==0)&&(P1!=P2+1||P1_cheating==true))P1--;if(P1_cheating==false)P1_skin="d";break;
case 's':if(!(P1>=2880&&P1<3000))if(P1!=P2-120||P1_cheating==true)P1+=120;break;
case 'd':if(!((P1+1)%120==0))if(P1!=P2-1||P1_cheating==true)P1++;if(P1_cheating==false)P1_skin="b";break;
case 'W':if(!(P1>=0&&P1<120)&&(P1!=P2+120||P1_cheating==true))P1-=120;break;
case 'A':if(!(P1%120==0)&&(P1!=P2+1||P1_cheating==true))P1--;if(P1_cheating==false)P1_skin="d";break;
case 'S':if(!(P1>=2880&&P1<3000))if(P1!=P2-120||P1_cheating==true)P1+=120;break;
case 'D':if(!((P1+1)%120==0))if(P1!=P2-1||P1_cheating==true)P1++;if(P1_cheating==false)P1_skin="b";break;
case 72:if(!(P2>=0&&P2<120))if(P2!=P1+120||P2_cheating==true)P2-=120;break;
case 75:if(!(P2%120==0))if(P2!=P1+1||P2_cheating==true)P2--;if(P2_cheating==false)P2_skin="a";break;
case 80:if(!(P2>=2880&&P2<3000))if(P2!=P1-120||P2_cheating==true)P2+=120;break;
case 77:if(!((P2+1)%120==0))if(P2!=P1-1||P2_cheating==true)P2++;if(P1_cheating==false)P2_skin="c";break;
case 'x':system("pause");break;
case 'q':if(near_(P1,P2)==true)P2_blood-=P1_power;break;
case 'X':system("pause");break;
case 'Q':if(near_(P1,P2)==true)P2_blood-=P1_power;break;
case '1':if(near_(P1,P2)==true)P1_blood-=P2_power;break;
case '/':cout<<"/";getline(cin,command);if(command=="kill P1"||command=="KILL P1")P1_blood=0,cout<<endl<<"玩家一被\"刻意的游戏设计\"击败了";else if(command=="kill P2"||command=="KILL P2")P2_blood=0,cout<<endl<<"玩家二被\"刻意的游戏设计\"击败了";else if(command=="cheatmode P1"||command=="CHEATMODE P1"){P1_cheating=!P1_cheating,P1_skin=P1_cheating?"p":"?";cout<<endl<<"已给予 玩家一 开挂权限"<<(P1_cheating?"ON":"OFF");}else if(command=="cheatmode P2"||command=="CHEATMODE P2"){P2_cheating=!P2_cheating,P2_skin=P2_cheating?"q":"?";cout<<endl<<"已给予 玩家二 开挂权限"<<(P2_cheating?"ON":"OFF");}else if(command=="reset"||command=="RESET")P1_blood=P2_blood=20,P1_power=P2_power=1,cout<<endl<<"已重置玩家血量与伤害!";else if(command=="help"||command=="HELP")cout<<"\ncommand help:\n1. WIN command format (/win player)\n2.MOREBLOOD command:format (/moreblood player)\n3.CHEATMODE command:format (/cheatmode player)\n4.RESET command:format (/reset)\n5.EFFECT command:format (/effect give player power)\n";else if(command=="effect give P1 power"||command=="EFFECT P1 power"){P1_power++,cout<<"玩家一伤害提升至"<<P1_power<<"!"<<endl;}else if(command=="effect give P2 power"||command=="EFFECT P2 power"){P2_power++,cout<<"玩家二伤害提升至"<<P2_power<<"!"<<endl;}else if(command=="effect give @a power"||command=="EFFECT @a power"){P1_power++,P2_power++,cout<<"所有玩家伤害提升!(P1:"<<P1_power<<" P2:"<<P2_power<<")"<<endl;}else if(command=="save"||command=="SAVE"){saveGame(game,P1,P2,P1_blood,P2_blood,P1_power,P2_power,P1_cheating,P2_cheating,P1_skin,P2_skin,P1_arrow_count,P2_arrow_count,P1_blood_first,P2_blood_first);cout<<"游戏已保存!"<<endl;}else if(command=="load"||command=="LOAD"){loadGame(game,P1,P2,P1_blood,P2_blood,P1_power,P2_power,P1_cheating,P2_cheating,P1_skin,P2_skin,P1_arrow_count,P2_arrow_count,P1_blood_first,P2_blood_first);cout<<"游戏已开启上一次存档!请按任意键开始游玩!(玩完了别忘了用/save哦!)"<<endl;}else if(command=="set"){cout<<" === 设置 ===\n 玩家一血量:";cin>>P1_blood_first;cout<<" 玩家二血量:";cin>>P2_blood_first;cout<<" 玩家一力量:";cin>>P1_power;cout<<" 玩家二力量:";cin>>P2_power;}else if(command=="tp P1 P2"||command=="TP P1 P2")P1=P2;else if(command=="tp P2 P1"||command=="TP P2 P1")P2=P1;else cout<<endl<<"未知指令:"<<command;cout<<endl<<"(按任意键继续......)";_getch();break;
case 'e':if(!P1_ender_pearl_out){P1_ender_pearl=(P1_skin=="b"?P1+1:P1-1);P1_ender_pearl_out=true;P1_enderpearling_dir=(P1_skin=="b");}break;
case 'r':if(P1_ender_pearl_out==true)P1=P1_ender_pearl,P1_ender_pearl_out=false;break;
case 'E':if(!P1_ender_pearl_out){P1_ender_pearl=(P1_skin=="b"?P1+1:P1-1);P1_ender_pearl_out=true;P1_enderpearling_dir=(P1_skin=="b");}break;
case 'R':if(P1_ender_pearl_out==true)P1=P1_ender_pearl,P1_ender_pearl_out=false;break;
case '2':if(!P2_ender_pearl_out){P2_ender_pearl=(P2_skin=="c"?P2+1:P2-1);P2_ender_pearl_out=true;P2_enderpearling_dir=(P2_skin=="c");}break;
case '3':if(P2_ender_pearl_out==true)P2=P2_ender_pearl,P2_ender_pearl_out=false;break;
case 'f':case 'F':if(P1_arrow_count<20){P1_arrows[P1_arrow_count].pos=P1+(P1_skin=="b"?1:-1);P1_arrows[P1_arrow_count].active=true;P1_arrows[P1_arrow_count].direction=(P1_skin=="b");P1_arrow_count++;}break;
case '4':if(P2_arrow_count<20){P2_arrows[P2_arrow_count].pos=P2+(P2_skin=="c"?1:-1);P2_arrows[P2_arrow_count].active=true;P2_arrows[P2_arrow_count].direction=(P2_skin=="c");P2_arrow_count++;}break;
}
}
if(need_clear){
system("cls");
need_clear=false;
for(int i=0;i<=2999;i++){
if(i%120==0||(i+1)%120==0||(i>0&&i<119)||(i>2880&&i<2999))cout<<game[i];
else if(i==P1)cout<<P1_skin;
else if(i==P2)cout<<P2_skin;
else if(P1_ender_pearl_out&&i==P1_ender_pearl)cout<<"θ";
else if(P2_ender_pearl_out&&i==P2_ender_pearl)cout<<"Ω";
else if((P1_ender_pearl_out&&i==P1_ender_pearl+1)||(P2_ender_pearl_out&&i==P2_ender_pearl+1))cout<<"";
else{
bool is_arrow=false;
for(int j=0;j<20;j++){
if(P1_arrows[j].active&&i==P1_arrows[j].pos){
cout<<(P1_arrows[j].direction?"→":"←");
is_arrow=true;
break;
}
if(P2_arrows[j].active&&i==P2_arrows[j].pos){
cout<<(P2_arrows[j].direction?"→":"←");
is_arrow=true;
break;
}
}
if(!is_arrow)cout<<" ";
}
}
cout<<"\n玩家一信息:血量:"<<P1_blood<<"/"<<P1_blood_first<<",伤害:"<<P1_power<<",箭矢剩余数量:"<<(20-P1_arrow_count)<<"支\n玩家二信息:血量:"<<P2_blood<<"/"<<P2_blood_first<<",伤害:"<<P2_power<<",剩余箭矢数量:"<<(20-P2_arrow_count)<<"支"<<endl;
}
if(P1_blood<=0&&!P1_cheating){
cout<<"\n玩家二胜利!\n(按任意键结束游戏......)";
_getch();
Sleep(500);
gameover=true;
}
if(P2_blood<=0&&!P2_cheating){
cout<<"\n玩家一胜利!\n(按任意键结束游戏......)";
_getch();
Sleep(500);
gameover=true;
}
Sleep(30);
}
}