狂野飙猫

· · 科技·工程

狂野飙猫

12/14:使用了三角函数对猫咪的移动方式进行了优化


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

#define ce cout<<endl;
#define cp system("cls");
#define sl Sleep(1000);
#define cutcl ;Sleep(15);cout
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
POINT p;//CSDN抄的
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//CSDN抄的
HWND h=GetForegroundWindow();//CSDN抄的
CONSOLE_FONT_INFO consoleCurrentFont;//CSDN抄的
using namespace std;
struct chr{
    char c;
    short f,b;
};
int fmap[237][61];
chr bp[237][61]; 
int maosx,maosy,myx=235,myy=58;
int imap[237][61];

double catx=118,caty=29/*,catprevx,catprevy*/;
int catmot=1,catstat=0,tim=500;
double cmleng,cmsin,cmcos,catxspd=0,catyspd=0,spdfac,catspd;
/*
 ^ ^     /
(OwO) __-
 //==\\
原来字符猫可以这么可爱吗? 
*/
void catrunleft(int tm){
    int cx=(int)catx,cy=(int)caty;
    bp[cx][cy].c=')';
    bp[cx-1][cy].c='O';
    bp[cx-2][cy].c='w';
    bp[cx-3][cy].c='O';
    bp[cx-4][cy].c='(';
    bp[cx+2][cy].c='_';
    bp[cx+3][cy].c='_';
    bp[cx+4][cy].c='-';

    bp[cx-1][cy-1].c='^';
    bp[cx-3][cy-1].c='^';
    bp[cx+5][cy-1].c='/';
    bp[cx][cy+1].c='=';
    bp[cx-1][cy+1].c='=';
    if(tm==1||tm==2){
        bp[cx+2][cy+1].c='\\';
        bp[cx+1][cy+1].c='\\';
        bp[cx-2][cy+1].c='/';
        bp[cx-3][cy+1].c='/';
    }
    if(tm==3||tm==4){
        bp[cx-2][cy+1].c='/';
        bp[cx-1][cy+1].c='\\';
        bp[cx+2][cy+1].c='/';
        bp[cx+3][cy+1].c='\\';
        bp[cx+1][cy+1].c='=';
    }
    if(tm==5||tm==6){
        bp[cx+2][cy+1].c='/';
        bp[cx+1][cy+1].c='/';
        bp[cx-2][cy+1].c='\\';
        bp[cx-3][cy+1].c='\\';
    }
}
void catrunright(int tm){
    int cx=(int)catx,cy=(int)caty;
    bp[cx][cy].c='(';
    bp[cx+1][cy].c='O';
    bp[cx+2][cy].c='w';
    bp[cx+3][cy].c='O';
    bp[cx+4][cy].c=')';
    bp[cx-2][cy].c='_';
    bp[cx-3][cy].c='_';
    bp[cx-4][cy].c='-';

    bp[cx+1][cy-1].c='^';
    bp[cx+3][cy-1].c='^';
    bp[cx-5][cy-1].c='\\';

    bp[cx][cy+1].c='=';
    bp[cx+1][cy+1].c='=';
    if(tm==1||tm==2){
        bp[cx-2][cy+1].c='/';
        bp[cx-1][cy+1].c='/';
        bp[cx+2][cy+1].c='\\';
        bp[cx+3][cy+1].c='\\';
    }
    if(tm==3||tm==4){
        bp[cx+2][cy+1].c='\\';
        bp[cx+1][cy+1].c='/';
        bp[cx-2][cy+1].c='\\';
        bp[cx-3][cy+1].c='/';
        bp[cx-1][cy+1].c='=';
    }
    if(tm==5||tm==6){
        bp[cx-2][cy+1].c='\\';
        bp[cx-1][cy+1].c='\\';
        bp[cx+2][cy+1].c='/';
        bp[cx+3][cy+1].c='/';
    }
}
/*
void catmirl(){
    bp[catprevx][catprevy].c='=';
    bp[catprevx-1][catprevy].c='=';
    bp[catprevx-2][catprevy].c='=';
    bp[catprevx-3][catprevy].c='=';
    bp[catprevx-4][catprevy].c='=';
    bp[catprevx+2][catprevy].c='=';
    bp[catprevx+3][catprevy].c='=';
    bp[catprevx+4][catprevy].c='=';

    bp[catprevx-1][catprevy-1].c='=';
    bp[catprevx-3][catprevy-1].c='=';
    bp[catprevx+5][catprevy-1].c='=';
    bp[catprevx][catprevy+1].c='=';
    bp[catprevx-1][catprevy+1].c='=';
    bp[catprevx+2][catprevy+1].c='=';
    bp[catprevx+1][catprevy+1].c='=';
    bp[catprevx-2][catprevy+1].c='=';
    bp[catprevx-3][catprevy+1].c='=';

}
void catmirr(){
    bp[catprevx][catprevy].c='=';
    bp[catprevx+1][catprevy].c='=';
    bp[catprevx+2][catprevy].c='=';
    bp[catprevx+3][catprevy].c='=';
    bp[catprevx+4][catprevy].c='=';
    bp[catprevx-2][catprevy].c='=';
    bp[catprevx-3][catprevy].c='=';
    bp[catprevx-4][catprevy].c='=';

    bp[catprevx+1][catprevy-1].c='=';
    bp[catprevx+3][catprevy-1].c='=';
    bp[catprevx-5][catprevy-1].c='=';

    bp[catprevx][catprevy+1].c='=';
    bp[catprevx+1][catprevy+1].c='=';
        bp[catprevx-2][catprevy+1].c='=';
        bp[catprevx-1][catprevy+1].c='=';
        bp[catprevx+2][catprevy+1].c='=';
        bp[catprevx+3][catprevy+1].c='=';
}*/
void gotoxy(short x, short y) {
    COORD pos = {x,y};
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
    SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}
void pchr(char s,int color,int back_color){
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | back_color*16 |FOREGROUND_INTENSITY | color);
    cout<<s;
    SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | 7);
}
void pch(char s,int color,int back_color){
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    //SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | color);
    cout<<s;
    //SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | 7);
}
void pmap(){
    for(int j=0;j<59;j++){
        gotoxy(0,j);
        for(int i=0;i<237;i++) {
            pch(bp[i][j].c,bp[i][j].f,bp[i][j].b);
            bp[i][j].c=' ';
            bp[i][j].f=0;
        }
        cout<<endl;
    }
}
int exam(){
    int flag=0;
    POINT p;
    while(1){
        pmap();
        GetCursorPos(&p);
        ScreenToClient(h,&p);               //获取鼠标在窗口上的位置
        GetCurrentConsoleFont(hOutput, FALSE, &consoleCurrentFont); //获取字体信息
        maosx=p.x/=consoleCurrentFont.dwFontSize.X;
        maosy=p.y/=consoleCurrentFont.dwFontSize.Y;
        bp[maosx][maosy].c='+';
        bp[maosx][maosy-1].c='A';
        bp[maosx][maosy+1].c='v';
        bp[maosx+2][maosy].c=')';
        bp[maosx-2][maosy].c='(';

        cmleng=sqrt(abs(pow(catx-maosx,2)+pow(caty-maosy,2)));
        cmsin=abs((double)(caty-maosy)/cmleng);
        cmcos=abs((double)(catx-maosx)/cmleng);

        catspd=sqrt(catxspd*catxspd+catyspd*catyspd);
        //spdfac=min((double)0.3,(double)1/catspd);
        spdfac=min((double)1,(double)0.28/catspd);

    if(catx>maosx){
        catrunleft(catmot);
        catxspd-=cmcos*spdfac;
        if(catxspd>0) catxspd-=cmcos*spdfac;
        }
    else if(catx<maosx){
        catrunright(catmot);
        catxspd+=cmcos*spdfac;
        if(catxspd<0) catxspd+=cmcos*spdfac;
        }
        if(caty>maosy){
        catyspd-=cmsin*spdfac/2;
        if(catyspd>0) catyspd-=cmsin*spdfac/2;
        }
    else if(caty<maosy){
        catyspd+=cmsin*spdfac/2;
        if(catyspd<0) catyspd+=cmsin*spdfac/2;
        }
        /*catprevx=catx;
        catprevy=caty;*/

        catx+=catxspd;
        caty+=catyspd;
        if(catxspd>4) catxspd=4;
        if(catyspd>8) catyspd=8;
        if(catxspd<-4) catxspd=-4;
        if(catyspd<-8) catyspd=-8;
        if(catx<5){
            catx=5;
            catxspd=0;
        }
        if(catx>232){
            catx=232;
            catxspd=0;
        }
        if(caty<2){
            caty=5;
            catyspd=0;
        }
        if(caty>57){
            caty=57;
            catyspd=0;
        }

        catmot++;
        if(sqrt((double)catxspd*(double)catyspd)>=5) catmot++;
        if(catmot==7||catmot==8) catmot-=6;
        if((int)catx==maosx&&(int)caty==maosy){
            flag=1;
        }
        if(flag==1) break;
        Sleep(10);
    }
    cout<<"YOU DIED!";
}
int main(){
    /*spl[1]=1;
    mhlt=100;
    mdmg=10;
    mreg=2;
    mdfd=0;*/
  ios::sync_with_stdio(0);
  cin.tie(0); cout.tie(0);
    exam();
    return 0;
}