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