代码编辑器1.9.0

news2024/11/28 4:49:44

多线程!!!

#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <fstream>
#include <conio.h>
#include <stdio.h>
#include <string>
#include <atomic>
#include <time.h>
#include <mutex>
#include <map>

#pragma comment(lib,"ws2_32.lib")

#define FASTEST

#define pass
#define PASS
#define UP                                      72
#define DOWN                                    80
#define LEFT                                    75
#define RIGHT                                   77
#define H                                       29
#define W                                       114
#define BUFLEN                                  256

#define FASTCODE                                ((1 << 16) | (8 << 9) | (0))
#define TITLE                                   "title FastCode 1.9.0"

#define helps "\
<h,H,?>                                         \n\
<s,S>                                           \n\
<q,Q>                                           \n\
<!>                                             \n\
<o,O>                                           \n\
<r,R,:>                                         \n\
<t,T,^>                                         \n\
<y,Y,@>     num                                 \n\
<x,X>       num                                 \n\
<b,B,<>     str                                 \n\
<f,F,>>     str                                 \n\
<e,E,->     num                                 \n\
<{>         num,begin,step                      \n\
<\">        num,begin,step                      \n\
<\'>        num,begin,step                      \n\
<l,L,|>     num,begin,step,+ str                \n\
<l,L,|>     num,begin,step,- num                \n\
</>                                             \n\
<k,K>       str                                 \n\
<p,P>       str,color                           \n\
<w,W,$>     \n command                          \n\
<c,C,=>                                         \n\
<v,V,~>                                         \n\
<m,M,%>     str1,str2                           \n\
<d,D,;>     str                                 \n\
Ctrl + A                                        \n\
Ctrl + B                                        \n\
Ctrl + D                                        \n\
Ctrl + E                                        \n\
Ctrl + F                                        \n\
Ctrl + L                                        \n\
Ctrl + O                                        \n\
Ctrl + R                                        \n\
Ctrl + S                                        \n\
Ctrl + T                                        \n\
Ctrl + U                                        \n\
Ctrl + W                                        \n\
Ctrl + Back                                     \n\
Ctrl + Enter                                    \n\
F1                                              \n\
F2                                              \n\
F3                                              \n\
F4                                              \n\
F5                                              \n\
F6                                              \n\
A ~ Z                                           \n\
Delete                                          \n\
Enter                                           \n\
Back                                            \n\
Tab                                             \n\
Esc                                             \n\
"

#ifndef min
#define min(a, b) ({                                                            \
    typeof(a) x = (a);                                                          \
    typeof(b) y = (b);                                                          \
    x < y ? x : y;                                                              \
})
#endif

#ifndef max
#define max(a, b) ({                                                            \
    typeof(a) x = (a);                                                          \
    typeof(b) y = (b);                                                          \
    x > y ? x : y;                                                              \
})
#endif

#define color(tc)                                                               \
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), tc)

#define gotoxy(xx, yy)                                                          \
    do{                                                                         \
        COORD position = {xx, yy};                                              \
        SetConsoleCursorPosition (                                              \
            GetStdHandle (STD_OUTPUT_HANDLE),                                   \
            position                                                            \
        );                                                                      \
    }while(false)

typedef signed char                             int8;
typedef signed short                            int16;
typedef signed long                             int32;
typedef signed long long                        int64;
typedef unsigned char                           uint8;
typedef unsigned short                          uint16;
typedef unsigned long                           uint32;
typedef unsigned long long                      uint64;
typedef unsigned char                           byte_t;
typedef unsigned short                          word_t;
typedef unsigned long                           iterator;
typedef void*                                   pointer_t;

template <typename type> class vector {
    public:
        type* p;
        size_t Len;
        size_t Size;
        vector () {
            p = NULL;
            Len = 0;
            Size = 0;
        }
        ~vector () {
            delete[] p;
        }
        size_t size () {
            return Size;
        }
        size_t len () {
            return Len;
        }
        void exp () {
            Len = (Len << 1) + 1;
            if (p == NULL) {
                p = new type [ Len ];
            } else {
                type *tp = new type [ Len ];
                for (size_t it = 0; it < Size; it++)
                    tp[ it ] = p[ it ];
                delete[] p;
                p = tp;
            }
            return;
        }
        void exp (size_t ts) {
            while (ts >= Len)
                exp ();
            return;
        }
        type& operator [] (size_t it) {
            if (it >= Len)
                exp (it);
            return p[ it ];
        }
        type at (size_t it) {
            if (it >= Len)
                exp (it);
            return p[ it ];
        }
        void push_back (type& x) {
            if (Size == Len)
                exp ();
            p[ Size++ ] = x;
            return;
        }
        void push_back (type&& x) {
            if (Size == Len)
                exp ();
            p[ Size++ ] = x;
            return;
        }
        void push_back (vector <type>& vc) {
            for (size_t i = 0; i < vc.size(); i++)
                push_back (vc[i]);
            return;
        }
        void pop_back () {
            if (Size > 0)
                Size--;
            return;
        }
        void pop_back (size_t ts) {
            if (Size >= ts)
                Size -= ts;
            else
                Size = 0;
            return;
        }
        void insert (size_t it, type& x) {
            if (Size == Len) exp ();
            for (size_t it_t = Size; it_t > it; it_t--)
                p[ it_t ] = p[it_t - 1];
            p[ it ] = x;
            Size++;
            return;
        }
        void insert (size_t it, type&& x) {
            if (Size == Len)
                exp ();
            for (size_t it_t = Size; it_t > it; it_t--)
                p[ it_t ] = p[it_t - 1];
            p[ it ] = x;
            Size++;
            return;
        }
        void erase (size_t it) {
            Size--;
            for (size_t it_t = it; it_t < Size; it_t++)
                p[ it_t ] = p[it_t + 1];
            return;
        }
        void reverse () {
            for (size_t it = 0; it < (Size >> 1); it++) {
                type tt = p[ it ];
                p[ it ] = p[Size - it - 1];
                p[Size - it - 1] = tt;
            }
            return;
        }
        void operator ++ () {
            if (Size == Len)
                exp ();
            Size++;
            return;
        }
        void operator ++ (int) {
            if (Size == Len)
                exp ();
            Size++;
            return;
        }
        void operator += (type& x) {
            if (Size == Len)
                exp ();
            p[ Size++ ] = x;
            return;
        }
        void operator += (type&& x) {
            if (Size == Len)
                exp ();
            p[ Size++ ] = x;
            return;
        }
        void operator += (vector <type>& vc) {
            for (size_t i = 0; i < vc.size(); i++)
                push_back (vc[i]);
            return;
        }
        void operator -- () {
            if (Size > 0)
                Size--;
            return;
        }
        void operator -- (int) {
            if (Size > 0)
                Size--;
            return;
        }
        void operator -= (size_t ts) {
            if (Size >= ts)
                Size -= ts;
            else Size = 0;
            return;
        }
        void operator = (vector <type>& vc) {
            for (size_t i = 0; i < vc.size(); i++)
                push_back (vc[i]);
            return;
        }
};

template <typename type> struct node {
    type v;
    node <type>* pre;
    node <type>* next;
    node () {
        pre = next = NULL;
    }
};
template <typename type> class list {
    public:
        node <type>* head;
        node <type>* tail;
        list () {
            head = new node <type>;
            tail = new node <type>;
            head -> next = tail;
            tail -> pre = head;
        }
        ~list () {
            node <type>* fn = head;
            node <type>* sn = head;
            while (fn !=NULL) {
                sn = sn -> next;
                delete fn;
                fn = sn;
            }
        }
        node <type>* begin () {
            return head;
        }
        node <type>* end () {
            return tail;
        }
        void push_back (type& x) {
            node <type>* tn = new node <type>;
            tn -> v = x;
            tn -> pre = tail -> pre;
            tn -> next = tail;
            tail -> pre -> next = tn;
            tail -> pre = tn;
            return;
        }
        void push_back (type&& x) {
            node <type>* tn = new node <type>;
            tn -> v = x;
            tn -> pre = tail -> pre;
            tn -> next = tail;
            tail -> pre -> next = tn;
            tail -> pre = tn;
            return;
        }
        void push_back (list <type>& tl) {
            node <type>* tn = tl.begin();
            tn = tn -> next;
            while (tn != tl.end()) {
                push_back(tn -> v);
                tn = tn -> next;
            }
            return;
        }
        void pop_back () {
            node <type>* tn = tail -> pre;
            if (tn != head) {
                tail -> pre = tn -> pre;
                tn -> pre -> next = tail;
                delete tn;
            }
            return;
        }
        void insert (node <type>* in, type& x) {
            node <type>* tn = new node <type>;
            tn -> v = x;
            tn -> pre = in;
            tn -> next = in -> next;
            in -> next -> pre = tn;
            in -> next = tn;
            return;
        }
        void insert (node <type>* in, type&& x) {
            node <type>* tn = new node <type>;
            tn -> v = x;
            tn -> pre = in;
            tn -> next = in -> next;
            in -> next -> pre = tn;
            in -> next = tn;
            return;
        }
        void erase (node <type>* en) {
            node <type>* tn = en -> next;
            if (tn != tail) {
                en -> next = tn -> next;
                tn -> next -> pre = en;
                delete tn;
            }
            return;
        }
        void operator += (type& x) {
            node <type>* tn = new node <type>;
            tn -> v = x;
            tn -> pre = tail -> pre;
            tn -> next = tail;
            tail -> pre -> next = tn;
            tail -> pre = tn;
            return;
        }
        void operator += (type&& x) {
            node <type>* tn = new node <type>;
            tn -> v = x;
            tn -> pre = tail -> pre;
            tn -> next = tail;
            tail -> pre -> next = tn;
            tail -> pre = tn;
            return;
        }
        void operator += (list <type>& tl) {
            node <type>* tn = tl.begin();
            tn = tn -> next;
            while (tn != tl.end()) {
                push_back(tn -> v);
                tn = tn -> next;
            }
            return;
        }
        void operator -- () {
            node <type>* tn = tail -> pre;
            if (tn != head) {
                tail -> pre = tn -> pre;
                tn -> pre -> next = tail;
                delete tn;
            }
            return;
        }
        void operator = (list <type>& tl) {
            node <type>* tn = tl.begin();
            tn = tn -> next;
            while (tn != tl.end()) {
                push_back(tn -> v);
                tn = tn -> next;
            }
            return;
        }
};

class server {
    public:
        int                         error;
        int                         address_length;
        WORD                        wVersionRequested;
        SOCKET                      socket_server;
        SOCKET                      socket_client;
        WSADATA                     wsaData;
        SOCKADDR_IN                 server_address;
        SOCKADDR_IN                 client_address;
        int init (int port = 5000) {
            wVersionRequested = MAKEWORD(2, 2);
            error = WSAStartup(wVersionRequested, &wsaData);
            if (error != 0) {
                printf(
                    "Cant initiates use of the Winsock DLL by a process!\n"
                );
                return 1;
            }
            if (
                LOBYTE(wsaData.wVersion) != 2 ||
                HIBYTE(wsaData.wVersion) != 2
            ) {
                printf("could not find a usable WinSock DLL!\n");
                WSACleanup();
                return 1;
            }
            server_address.sin_family = AF_INET;
            server_address.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
            server_address.sin_port = htons(port);
            socket_server = socket  (
                                AF_INET,
                                SOCK_STREAM,
                                IPPROTO_TCP
                            );
            if (INVALID_SOCKET == socket_server) {
                printf(
                    "socket function failed with error: %ld\n",
                    WSAGetLastError()
                );
                WSACleanup();
                return 1;
            }
            if (
                SOCKET_ERROR == 
                bind(
                    socket_server,
                    (SOCKADDR *)&server_address,
                    sizeof(server_address)
                )
            ) {
                printf(
                    "bind failed with error %u\n",
                    WSAGetLastError()
                );
                closesocket(socket_server);
                WSACleanup();
                return 1;
            }
            if (SOCKET_ERROR == listen(socket_server, 1))
                printf(
                    "listen function failed with error: %d\n",
                    WSAGetLastError()
                );
            address_length = sizeof(client_address);
            socket_client = accept(
                                socket_server,
                                (SOCKADDR *)&client_address,
                                &address_length
                            );
            if (INVALID_SOCKET == socket_client)
                printf(
                    "accept failed with error: %ld\n",
                    WSAGetLastError()
                );
            return 0;
        }
        int recv (char* buf, int len, int flags = 0) {
            int ret = ::recv(socket_client, buf, len, flags);
            if (ret <= 0) {
                if (ret == 0) {
                    printf("Connection closed\n");
                } else {
                    printf (
                        "recv failed: %d\n",
                        WSAGetLastError()
                    );
                    closesocket(socket_client);
                    closesocket(socket_server);
                    WSACleanup();
                }
            }
            return ret;
        }
        int send (char* buf, int len, int flags = 0) {
            int ret = ::send (socket_client, buf, len, flags);
            if (SOCKET_ERROR == ret) {
                printf(
                    "send failed with error: %d\n",
                    WSAGetLastError()
                );
                closesocket(socket_client);
                closesocket(socket_server);
                WSACleanup();
            }
            return ret;
        }
        int close () {
            if (SOCKET_ERROR == closesocket(socket_client)) {
                printf(
                    "closesocket function failed with error %d\n",
                    WSAGetLastError()
                );
                WSACleanup();
                return 1;
            }
            if (SOCKET_ERROR == closesocket(socket_server)) {
                printf(
                    "closesocket function failed with error %d\n",
                    WSAGetLastError()
                );
                WSACleanup();
                return 1;
            }
            WSACleanup();
            return 0;
        }
};

class client {
    public:
    WSADATA wsaData;
    SOCKET clientSocket;
    sockaddr_in serverAddr;
    int bytesSent;
    int init (
        const char* addr = "127.0.0.1", int port = 5000
    ) {
        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
            printf("Failed to initialize winsock.\n");
            return 1;
        }
        clientSocket = socket(AF_INET, SOCK_STREAM, 0);
        if (clientSocket == INVALID_SOCKET) {
            printf("Failed to create socket.\n");
            WSACleanup();
            return 1;
        }
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_addr.s_addr = inet_addr(addr);
        serverAddr.sin_port = htons(port);
        if (
            connect(
                clientSocket,
                (sockaddr*)&serverAddr,
                sizeof(serverAddr)
            ) == SOCKET_ERROR
        ) {
            printf("Failed to connect to server.\n");
            closesocket(clientSocket);
            WSACleanup();
            return 1;
        }
        return 0;
    }
    int recv (char* buf, int len, int flags = 0) {
        int ret = ::recv(clientSocket, buf, len, flags);
        if (ret <= 0) {
            if (ret == 0) {
                printf("Connection closed\n");
                return 1;
            } else {
                printf(
                    "recv failed: %d\n",
                    WSAGetLastError()
                );
                closesocket(clientSocket);
                WSACleanup();
                return 1;
            }
        }
        return 0;
    }
    int send (char* buf, int len, int flags = 0) {
        bytesSent = ::send(clientSocket, buf, len, 0);
        if (bytesSent == SOCKET_ERROR) {
            printf("Failed to send data to server.\n");
            closesocket(clientSocket);
            WSACleanup();
            return 1;
        }
        return 0;
    }
    int close () {
        closesocket(clientSocket);
        WSACleanup();
        return 0;
    }
};

namespace snake {
    #define X 23
    #define Y 40
    #define MAXLEN 75
    #define MINTIME 75
    unsigned int snake[MAXLEN][2];
    unsigned int len;
    unsigned int lastt[2];
    unsigned int score;
    unsigned int max_score;
    unsigned int way;
    double wait;
    int input;
    unsigned int food[2];
    bool empty = true;
    void welcome    ();
    void init       ();
    void drawmap    ();
    void drawsnake  ();
    void move       ();
    void clt        ();
    void getin      ();
    void putfood    ();
    void eatfood    ();
    bool gameover   ();
    int start       ();
    #undef X
    #undef Y
    #undef MAXLEN
    #undef MINTIME
}

struct Pos {
    char                                        ch;
    byte_t                                      cl;
};

list <vector <char> >                           doc;
node <vector <char> >*                          ty;
iterator                                        tx;
node <vector <char> >*                          py;
iterator                                        px;
long                                            cnt;
bool                                            lock;
bool                                            edit;
size_t                                          lines;

char                                            name[BUFLEN];
char                                            exen[BUFLEN];
char                                            path[BUFLEN];
bool                                            isat[256];
Pos                                             preout[H][W];
Pos                                             thisout[H][W];

std::map <std::string, byte_t>   keyword;

std::atomic <signed char>                       sig;

void whelp          ();
void rpath          ();
void rdocu          (int argc, char* argv);
void init           (int argc, char** argv);
void save           ();
void doccopy        (const char* from, const char* to);
void cppcopy        (const char* to);
void output         (LPVOID id);
bool cfn            (int ch);
bool cctrl          (int ch);
bool ccom           (int ch);
void input          (LPVOID id);

int main (int argc, char** argv) {
    try {
        DWORD input_id;
        DWORD output_id;
        HANDLE input_handle;
        HANDLE output_handle;
        system (TITLE);
        system ("mode con lines=31 cols=120");
        CONSOLE_CURSOR_INFO cursor_info = {1, 0};
        SetConsoleCursorInfo (
            GetStdHandle (STD_OUTPUT_HANDLE),
            &cursor_info
        );
        color (15);
        whelp ();
        rpath ();
        init (argc, argv);
        input_handle = (HANDLE)::CreateThread (NULL, 0,
            (LPTHREAD_START_ROUTINE)input, (LPVOID)&input_id,
            0, &input_id
        );
        output_handle = (HANDLE)::CreateThread (NULL, 0,
            (LPTHREAD_START_ROUTINE)output, (LPVOID)&output_id,
            0, &output_id
        );
        while (sig != -1) {
            ;
        }
    }
    catch (...) {
        printf ("异常产生!\n");
        throw ;
    }
    system ("pause");
    return 0;
}

inline __attribute__ ((always_inline))
void whelp () {
    FILE* fp = fopen ("FCDOC\\help.txt", "w");
    fprintf (fp, helps);
    fclose (fp);
    return;
}
inline __attribute__ ((always_inline))
void rpath () {
    FILE*                                       fp = fopen ("FCDOC\\path.txt", "r");
    system ("cls");
    if (fp == NULL) {
        printf ("编译器路径:");
        gets (path);
        FILE*                                   sf = fopen ("path.txt", "w");
        fprintf (sf, "%s", path);
        fclose (sf);
    } else {
        fscanf (fp, "%s", path);
    }
    fclose (fp);
}
inline __attribute__ ((always_inline))
void rdocu (int argc, char* argv) {
    int                                         ch;
    size_t                                      sum;
    size_t                                      pre;
    vector <char>                               tv;
    FILE*                                       fp = fopen (argv, "r");
    iterator                                    nt = strlen (argv) - 1;
    system ("cls");
    printf ("读取中...\n\n");
    #ifndef FASTEST
    color (136);
    printf ("                                                                ");
    color (15);
    #endif
    for (; nt > 0; nt--) { 
        if (argv[nt - 1] == '\\')
            break;
    }
    if (argc != 1) {
        for (iterator it = 0; argv[nt] != '\0'; it++) {
            name[it]                            = argv[nt];
            nt++;
        }
    }
    fseek (fp, 0, 2);
    sum                                         = ftell (fp);
    fseek (fp, 0, 0);
    ch                                          = fgetc (fp);
    pre                                         = 0;
    while (ch != EOF) {
        if (ch == 10) {
            node <vector <char> >* tn           = new node <vector <char> >;
            for (iterator it = 0; it < tv.size(); it++) {
                tn -> v.push_back (tv[it]);
            }
            tn -> pre                           = doc.tail -> pre;
            tn -> next                          = doc.tail;
            doc.tail -> pre -> next             = tn;
            doc.tail -> pre                     = tn;
            while (tv.size () != 0) {
                tv.pop_back ();
            }
        } else if (ch == 9) {
            do {
                tv                              += ' ';
            } while (tv.size () % 4 != 0);
        } else {
            tv                                  += ch;
        }
#ifndef FASTEST
        gotoxy (0, 1);
        printf ("%d / %d", ftell (fp), sum);
        gotoxy (0, 2);
        size_t                                  temp = ftell (fp) * 64 / sum;
        if (temp != pre) {
            pre                                 = temp;
            color (170);
            for (iterator it = 0; it < temp; it++) {
                printf (" ");
            }
            color (15);
        }
#endif
        ch                                      = fgetc(fp);
    }
    if (tv.size () != 0) {
        node <vector <char> >*                  tn = new node <vector <char> >;
        for (iterator it = 0; it < tv.size(); it++)
            tn -> v.push_back (tv[it]);
        tn -> pre                               = doc.tail -> pre;
        tn -> next                              = doc.tail;
        doc.tail -> pre -> next                 = tn;
        doc.tail -> pre                         = tn;
    }
    fclose (fp);
    Sleep (500);
    return;
}
inline __attribute__ ((always_inline))
void init (int argc, char** argv) {
    system ("cls");
    printf ("初始化...\n");
    if (argc != 1) {
        rdocu (argc, argv[1]);
    } else {
        system ("cls");
        printf ("文件名:");
        gets (name);
        FILE*                                   fp = fopen (name, "r");
        if (fp) {
            fclose (fp);
            rdocu (argc, name);
        } else {
            vector <char>                       tv;
            doc                                 += tv;
        }
    }
    iterator it = 0;
    for (; name[it] != '.' && name[it] != '\0'; it++) {
        exen[it] = name[it];
    }
    exen[it++] = '.';
    exen[it++] = 'e';
    exen[it++] = 'x';
    exen[it++] = 'e';
    exen[it++] = '\0';
    char                                        ts[W];
    sprintf (ts, "title %s", name);
    system (ts);
    ty                                          = doc.begin () -> next;
    tx                                          = 0;
    py                                          = doc.begin () -> next;
    px                                          = 0;
    lock                                        = true;
    sig                                         = 1;
    for (iterator yi = 0; yi < H - 1; yi++) {
        for (iterator xi = 0; xi < W - 7; xi++) {
            preout[yi][xi].cl                   = 15;
            preout[yi][xi].ch                   = ' ';
        }   
    }
    for (iterator yi = 0; yi < H - 1; yi++) {
        for (iterator xi = 0; xi < W - 7; xi++) {
            thisout[yi][xi].cl                  = 15;
            thisout[yi][xi].ch                  = ' ';
        }   
    }
    isat['~']                                   = true;
    isat['!']                                   = true;
    isat['%']                                   = true;
    isat['^']                                   = true;
    isat['&']                                   = true;
    isat['*']                                   = true;
    isat['(']                                   = true;
    isat[')']                                   = true;
    isat['-']                                   = true;
    isat['+']                                   = true;
    isat['=']                                   = true;
    isat['{']                                   = true;
    isat['}']                                   = true;
    isat['[']                                   = true;
    isat[']']                                   = true;
    isat['|']                                   = true;
    isat[':']                                   = true;
    isat[';']                                   = true;
    isat['<']                                   = true;
    isat['>']                                   = true;
    isat[',']                                   = true;
    isat['.']                                   = true;
    isat['?']                                   = true;
    isat['/']                                   = true;
    keyword["alignas"]                          = 11;
    keyword["alignof"]                          = 11;
    keyword["and"]                              = 11;
    keyword["and_eq"]                           = 11;
    keyword["asm"]                              = 11;
    keyword["auto"]                             = 11;
    keyword["bitand"]                           = 11;
    keyword["bitor"]                            = 11;
    keyword["bool"]                             = 11;
    keyword["break"]                            = 11;
    keyword["case"]                             = 11;
    keyword["catch"]                            = 11;
    keyword["char"]                             = 11;
    keyword["char16_t"]                         = 11;
    keyword["char32_t"]                         = 11;
    keyword["class"]                            = 11;
    keyword["compl"]                            = 11;
    keyword["const"]                            = 11;
    keyword["constexpr"]                        = 11;
    keyword["const_cast"]                       = 11;
    keyword["continue"]                         = 11;
    keyword["decltype"]                         = 11;
    keyword["default"]                          = 11;
    keyword["delete"]                           = 11;
    keyword["do"]                               = 11;
    keyword["double"]                           = 11;
    keyword["dynamic_cast"]                     = 11;
    keyword["else"]                             = 11;
    keyword["enum"]                             = 11;
    keyword["explicit"]                         = 11;
    keyword["export"]                           = 11;
    keyword["extern"]                           = 11;
    keyword["false"]                            = 11;
    keyword["float"]                            = 11;
    keyword["for"]                              = 11;
    keyword["friend"]                           = 11;
    keyword["goto"]                             = 11;
    keyword["if"]                               = 11;
    keyword["inline"]                           = 11;
    keyword["int"]                              = 11;
    keyword["long"]                             = 11;
    keyword["mutable"]                          = 11;
    keyword["namespace"]                        = 11;
    keyword["new"]                              = 11;
    keyword["noexcept"]                         = 11;
    keyword["not"]                              = 11;
    keyword["not_eq"]                           = 11;
    keyword["nullptr"]                          = 11;
    keyword["operator"]                         = 11;
    keyword["or"]                               = 11;
    keyword["or_eq"]                            = 11;
    keyword["private"]                          = 11;
    keyword["protected"]                        = 11;
    keyword["public"]                           = 11;
    keyword["register"]                         = 11;
    keyword["reinterpret_cast"]                 = 11;
    keyword["return"]                           = 11;
    keyword["short"]                            = 11;
    keyword["signed"]                           = 11;
    keyword["sizeof"]                           = 11;
    keyword["static"]                           = 11;
    keyword["static_assert"]                    = 11;
    keyword["static_cast"]                      = 11;
    keyword["struct"]                           = 11;
    keyword["switch"]                           = 11;
    keyword["template"]                         = 11;
    keyword["this"]                             = 11;
    keyword["thread_local"]                     = 11;
    keyword["throw"]                            = 11;
    keyword["true"]                             = 11;
    keyword["try"]                              = 11;
    keyword["typedef"]                          = 11;
    keyword["typeid"]                           = 11;
    keyword["typeof"]                           = 11;
    keyword["typename"]                         = 11;
    keyword["union"]                            = 11;
    keyword["unsigned"]                         = 11;
    keyword["using"]                            = 11;
    keyword["virtual"]                          = 11;
    keyword["void"]                             = 11;
    keyword["volatile"]                         = 11;
    keyword["wchar_t"]                          = 11;
    keyword["while"]                            = 11;
    keyword["xor"]                              = 11;
    keyword["xor_eq"]                           = 11;
    system ("cls");
    return;
}
inline __attribute__ ((always_inline))
void save () {
    edit                                        = false;
    char                                        calls[BUFLEN];
    sprintf (calls, "title %s", name);
    system (calls);
    FILE*                                       fp = fopen(name, "w");
    node <vector <char> >*                      sp = doc.begin () -> next;
    while (sp != doc.end ()) {
        for (iterator it = 0; it < sp -> v.size(); it++)
            fputc (sp -> v[it], fp);
        fputc ('\n', fp);
        sp                                      = sp -> next;
    }
    fclose(fp);
    return;
}
inline __attribute__ ((always_inline))
void doccopy (const char* from, const char* to) {
    FILE*                                       fp = fopen (from, "r");
    if (fp == NULL) {
        printf ("打开失败!\n");
        return;
    }
    FILE*                                       tp = fopen (to, "w");
    char                                        ch;
    ch                                          = fgetc (fp);
    while (ch != EOF) {
        fputc (ch, tp);
        ch                                      = fgetc (fp);
    }
    fclose (fp);
    fclose (tp);
    printf ("成功!\n");
    return;
}
inline __attribute__ ((always_inline))
void cppcopy (const char* to) {
    FILE*                                       fp = fopen (name, "r");
    FILE*                                       tp = fopen (to, "w");
    char                                        ch;
    ch                                          = fgetc (fp);
    while (ch != EOF) {
        fputc (ch, tp);
        ch                                      = fgetc (fp);
    }
    fclose (fp);
    fclose (tp);
    printf ("成功!\n");
    return;
}
inline __attribute__ ((always_inline))
void output (LPVOID id) {
    std::mutex                                  mlock;
    while (true) {
        while (true) {
            if (sig == 1) {
                sig                             = 0;
                break;
            } else if (sig == -1) {
                return;
            }
        }
        node <vector <char> >* pt               = py;
        mlock.lock ();
        node <vector <char> >* end              = doc.end ();
        mlock.unlock ();
        bool                                    special = false;
        bool                                    isinc   = false;
        bool                                    isstr   = false;
        bool                                    isch    = false;
        bool                                    isnum   = false;
        for (iterator yy = 0; yy < H - 1 && pt != end; yy++) {
            byte_t                              cl;
            iterator                            xx;
            std::string                         ks;
            if (!special) {
                isinc                           = false;
                isstr                           = false;
                isch                            = false;
                isnum                           = false;
            }
            for (xx = 0; xx < W - 7 && xx + px < pt -> v.size (); xx++) {
                char                            putch = pt -> v.at(xx + px);
                if ((!isinc) && (!isstr) && (!isch)) {
                    if (
                        (putch >= 'A' && putch <= 'Z') ||
                        (putch >= 'a' && putch <= 'z') ||
                        (putch >= '0' && putch <= '9') ||
                        (putch == '_')
                    ) {
                        ks                      += putch;
                    } else {
                        mlock.lock ();
                        if (keyword[ks] != 0) {
                            for (iterator it = 0; it < ks.size(); it++) {
                                if (pt == ty && xx + px - ks.size() + it == tx)
                                    thisout[yy][xx + px - ks.size() + it].cl = 240;
                                else
                                    thisout[yy][xx + px - ks.size() + it].cl = keyword[ks];
                            }
                        }
                        mlock.unlock ();
                        ks                      = "";
                    }
                } else {
                    ks                          = "";
                }
                if (putch == ' ' || isat[(int)putch] == true || xx + px == 0) {
                    isnum                           = true;
                } else if(putch < '0' || putch > '9') {
                    isnum                       = false;
                }
                if ((!isstr) && (!isch)  && (isinc || putch == '#'))  {
                    cl                          = 10;
                    isinc                       = true;
                } else if ((!isinc) && (!isch)  && (isstr || putch == '\"')) {
                    cl                          = 11;
                    if (pt -> v[xx + px] == '\"' && !special)
                        isstr                   = !isstr;
                } else if ((!isinc) && (!isstr) && (isch  || putch == '\'')) {
                    cl                          = 14;
                    if (pt -> v[xx + px] == '\'' && !special)
                        isch                    = !isch;
                } else if (
                    (!isinc) && (!isstr) && (!isch) && (isnum) &&
                    (putch >= '0' && putch <= '9')
                ) {
                    cl                          = 11;
                } else if (isat[(int)putch] == true) {
                    cl                          = 9;
                } else {
                    cl                          = 15;
                }
                if (pt == ty && xx + px == tx) {
                    cl                          = 240;
                }
                thisout[yy][xx].cl              = cl;
                thisout[yy][xx].ch              = putch;
                if (putch == '\\' && !special) {
                    special                     = true;
                } else {
                    special                     = false;
                }
            }
            cl                                  = 15;
            if (pt == ty && tx == pt -> v.size ()) {
                cl                              = 240;
            }
            thisout[yy][xx].cl                  = cl;
            thisout[yy][xx].ch                  = ' ';
            pt                                  = pt -> next;
        }
        pt                                      = py;
        mlock.lock ();
        gotoxy (0, 0);
        for (iterator yy = 0; yy < H - 1 && pt != end; yy++) {
            color (15);
            printf ("%4d ", (int)(lines + yy));
            for (iterator xx = 0; xx < W - 6; xx++) {
                if (
                    thisout[yy][xx].ch != preout[yy][xx].ch ||
                    thisout[yy][xx].cl != preout[yy][xx].cl
                ) {
                    gotoxy ((short)(xx + 5), (short)yy);
                    color (thisout[yy][xx].cl);
                    printf ("%c", thisout[yy][xx].ch);  
                }
            }
            color (12);
            gotoxy ((short)(W - 2), (short)yy);
            if (pt -> v.size() > W - 8) {
                printf (" > ");
            } else {
                printf ("   ");
            }
            printf ("\n");
            pt                                      = pt -> next;
        }
        color (15);
        printf ("%114c", ' ');
        memcpy (preout, thisout, sizeof (preout));
        mlock.unlock ();
        for (iterator yi = 0; yi < H - 1; yi++) {
            for (iterator xi = 0; xi < W - 7; xi++) {
                thisout[yi][xi].cl                  = 15;
                thisout[yi][xi].ch                  = ' ';
            }   
        }
    }
    return;
}
inline __attribute__ ((always_inline))
bool cfn (int ch) {
    if (ch == 0) {
        char                                    prt[W + 7];
        memset(prt, '\b', sizeof(prt));
        prt[W + 6] = '\0';
        printf("%s", prt);
        ch                                      = getch ();
        switch (ch) {
            case 59: {
                printf (helps);
                system ("pause");
                break;
            }
            case 60: {
                save ();
                char                            calls[BUFLEN];
                sprintf (
                    calls, "%s %s -o %s -Ofast -m32 -std=gnu++14 -lwsock32",
                    path, name, exen
                );
                printf("%s\n", calls);
                system (calls);
                sprintf (calls, "start %s", exen);
                system (calls);
                system ("pause");
                break;
            }
            case 61: {
                save ();
                char                            calls[BUFLEN];
                sprintf (
                    calls, "%s %s -o %s -Ofast -m32 -std=gnu++14 -lwsock32",
                    path, name, exen
                );
                printf("%s\n", calls);
                system (calls);
                sprintf (calls, "%s", exen);
                system (calls);
                system ("pause");
                break;
            }
            case 62: {
                save ();
                char                            calls[BUFLEN];
                sprintf (
                    calls, "%s %s -o %s -Ofast -m32 -std=gnu++14 -lwsock32",
                    path, name, exen
                );
                printf("%s\n", calls);
                system (calls);
                system ("pause");
                break;
            }
            case 63: {
                char                            calls[BUFLEN];
                sprintf (calls, "start %s", exen);
                system (calls);
                system ("pause");
                break;
            }
            case 64: {
                char                            calls[BUFLEN];
                sprintf (calls, "%s", exen);
                system (calls);
                system ("pause");
                break;
            }
            case 65: {
                save ();
                system (name);
                system ("pause");
                break;
            }
            default:
                break;
        }
        for (iterator yi = 0; yi < H - 1; yi++) {
            for (iterator xi = 0; xi < W - 7; xi++) {
                preout[yi][xi].cl               = 15;
                preout[yi][xi].ch               = ' ';
            }   
        }
        system ("cls");
        return true;
    }
    return false;
}
inline __attribute__ ((always_inline))
bool cctrl (int ch) {
    if (ch == 1) {
        ty -> v.insert (tx, 'a');
        tx++;
        ty -> v.insert (tx, 'u');
        tx++;           ty -> v.insert (tx, 't');
        tx++;
        ty -> v.insert (tx, 'o');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 2) {
        ty -> v.insert (tx, 'b');
        tx++;
        ty -> v.insert (tx, 'o');
        tx++;
        ty -> v.insert (tx, 'o');
        tx++;
        ty -> v.insert (tx, 'l');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 4) {
        ty -> v.insert (tx, 'd');
        tx++;
        ty -> v.insert (tx, 'o');
        tx++;
        ty -> v.insert (tx, 'u');
        tx++;
        ty -> v.insert (tx, 'b');
        tx++;
        ty -> v.insert (tx, 'l');
        tx++;
        ty -> v.insert (tx, 'e');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 5) {
        ty -> v.insert (tx, 'e');
        tx++;
        ty -> v.insert (tx, 'x');
        tx++;
        ty -> v.insert (tx, 't');
        tx++;
        ty -> v.insert (tx, 'e');
        tx++;
        ty -> v.insert (tx, 'r');
        tx++;
        ty -> v.insert (tx, 'n');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 6) {
        ty -> v.insert (tx, 'f');
        tx++;
        ty -> v.insert (tx, 'l');
        tx++;
        ty -> v.insert (tx, 'o');
        tx++;
        ty -> v.insert (tx, 'a');
        tx++;
        ty -> v.insert (tx, 't');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 12) {
        ty -> v.insert (tx, 'l');
        tx++;
        ty -> v.insert (tx, 'o');
        tx++;
        ty -> v.insert (tx, 'n');
        tx++;
        ty -> v.insert (tx, 'g');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 15) {
        ty -> v.insert (tx, 'o');
        tx++;
        ty -> v.insert (tx, 'p');
        tx++;
        ty -> v.insert (tx, 'e');
        tx++;
        ty -> v.insert (tx, 'r');
        tx++;
        ty -> v.insert (tx, 'a');
        tx++;
        ty -> v.insert (tx, 't');
        tx++;
        ty -> v.insert (tx, 'o');
        tx++;
        ty -> v.insert (tx, 'r');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 18) {
        ty -> v.insert (tx, 'r');
        tx++;
        ty -> v.insert (tx, 'e');
        tx++;
        ty -> v.insert (tx, 'g');
        tx++;
        ty -> v.insert (tx, 'i');
        tx++;
        ty -> v.insert (tx, 's');
        tx++;
        ty -> v.insert (tx, 't');
        tx++;
        ty -> v.insert (tx, 'e');
        tx++;
        ty -> v.insert (tx, 'r');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 19) {
        ty -> v.insert (tx, 's');
        tx++;
        ty -> v.insert (tx, 'i');
        tx++;
        ty -> v.insert (tx, 'g');
        tx++;
        ty -> v.insert (tx, 'n');
        tx++;
        ty -> v.insert (tx, 'e');
        tx++;
        ty -> v.insert (tx, 'd');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 20) {
        ty -> v.insert (tx, 't');
        tx++;
        ty -> v.insert (tx, 'e');
        tx++;
        ty -> v.insert (tx, 'm');
        tx++;
        ty -> v.insert (tx, 'p');
        tx++;
        ty -> v.insert (tx, 'l');
        tx++;
        ty -> v.insert (tx, 'a');
        tx++;
        ty -> v.insert (tx, 't');
        tx++;
        ty -> v.insert (tx, 'e');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 21) {
        ty -> v.insert (tx, 'u');
        tx++;
        ty -> v.insert (tx, 'n');
        tx++;
        ty -> v.insert (tx, 's');
        tx++;
        ty -> v.insert (tx, 'i');
        tx++;
        ty -> v.insert (tx, 'g');
        tx++;
        ty -> v.insert (tx, 'n');
        tx++;
        ty -> v.insert (tx, 'e');
        tx++;
        ty -> v.insert (tx, 'd');
        tx++;
        ty -> v.insert (tx, ' ');
        tx++;
        return true;
    } else if (ch == 23) {
        tx = ty -> v.size();
        return true;
    }
    return false;
}
inline __attribute__ ((always_inline))
bool ccom (int ch) {
    if (ch == 10) {
        char                                    prt[W + 7];
        memset(prt, '\b', sizeof(prt));
        prt[W + 6]                              = '\0';
        printf("%sFastCode:>  ", prt);
        ch                                      = getchar ();
        switch (ch) {
            case 'h':
            case 'H':
            case '?': {
                printf (helps);
                system ("pause");
                edit                            = false;
                break;
            }
            case 's':
            case 'S': {
                save ();
                break;
            }
            case 'q':
            case 'Q': {
                save ();
                sig                             = -1;
                exit (0);
            }
            case '!': {
                sig                             = -1;
                exit (0);
            }
            case 'o':
            case 'O': {
                save ();
                char                            calls[BUFLEN];
                sprintf (
                    calls, "%s %s -o %s -Ofast -m32 -std=gnu++14 -lwsock32",
                    path, name, exen
                );
                printf("%s\n", calls);
                system (calls);
                sprintf (calls, "start %s", exen);
                system (calls);
                system ("pause");
                break;
            }
            case 'r':
            case 'R':
            case ':': {
                save ();
                char                            calls[BUFLEN];
                sprintf (
                    calls, "%s %s -o %s -Ofast -m32 -std=gnu++14 -lwsock32",
                    path, name, exen
                );
                printf("%s\n", calls);
                system (calls);
                sprintf (calls, "%s", exen);
                system (calls);
                system ("pause");
                break;
            }
            case 't':
            case 'T':
            case '^': {
                tx                              = 0;
                cnt                             = 0;
                lines                           = 0;
                ty                              = doc.begin () -> next;
                py                              = doc.begin () -> next;
                edit                            = false;
                break;
            }
            case 'y':
            case 'Y':
            case '@': {
                unsigned int    linenum;
                scanf ("%d", &linenum);
                tx                              = 0;
                cnt                             = 0;
                lines                           = 0;
                ty                              = doc.begin () -> next;
                py                              = doc.begin () -> next;
                for (iterator it = 0; it < linenum; it++) {
                    if (ty -> next != doc.end ()) {
                        ty                      = ty -> next;
                        py                      = py -> next;
                        lines++;
                    }
                }
                edit                            = false;
                break;
            }
            case 'x':
            case 'X': {
                unsigned int                    colnum;
                scanf ("%d", &colnum);
                tx                              = colnum;
                if (tx < 0) {
                    tx                          = 0;
                }
                if (tx > ty -> v.size()) {
                    tx                          = ty -> v.size();
                }
                edit                            = false;
                break;
            }
            case 'b':
            case 'B':
            case '<': {
                edit                            = false;
                int                             len;
                bool                            okk;
                char                            word[BUFLEN];
                getchar ();
                gets (word);
                len                             = strlen(word);
                while (ty -> pre != doc.begin()) {
                    tx                          = 0;
                    ty                          = ty -> pre;
                    cnt--;
                    for (; (signed int)tx < (signed int)ty -> v.size() - len; tx++) {
                        okk                     = true;
                        for (iterator it = 0; it < len; it++) {
                            if (word[it] != ty -> v[tx + it]) {
                                okk             = false;
                                break;
                            }
                        }
                        if (okk) {
                            goto                FL_END;
                        }
                    }
                }
                break;
FL_END:
                break;
            }
            case 'f':
            case 'F':
            case '>': {
                edit                            = false;
                int                             len;
                bool                            okk;
                char                            word[BUFLEN];
                getchar ();
                gets (word);
                len                             = strlen(word);
                while (ty -> next != doc.end()) {
                    tx                          = 0;
                    ty                          = ty -> next;
                    cnt++;
                    for (; (signed int)tx < (signed int)ty -> v.size() - len; tx++) {
                        okk = true;
                        for (iterator it = 0; it < len; it++) {
                            if (word[it] != ty -> v[tx + it]) {
                                okk             = false;
                                break; 
                            }
                        }
                        if (okk) {
                            goto                FR_END;
                        }
                    }
                }
                break;
FR_END:
                break;
            }
            case 'e':
            case 'E':
            case '-': {
                int                             num;
                scanf ("%d", &num);
                for (iterator it = 0; it < num; it++) {
                    if (tx > 0) {
                        tx--;
                        ty -> v.erase (tx);
                    }
                }
                break;
            }
            case '{': {
                int                             num;
                int                             step;
                int                             begin;
                char                            word[BUFLEN];
                scanf ("%d,%d,%d", &num, &begin, &step);
                for (iterator it = 0; it < num; it++) {
                    sprintf (word, "%d", it * step + begin);
                    for (iterator i = 0; word[i] != '\0'; i++) {
                        ty -> v.insert (tx, word[i]);
                        tx++;
                    }
                    ty -> v.insert (tx, ',');
                    tx++;
                    ty -> v.insert (tx, ' ');
                    tx++;
                }
                break;
            }
            case '\'': {
                int                             num;
                int                             step;
                char                            begin;
                scanf ("%d,%c,%d", &num, &begin, &step);
                for (iterator it = 0; it < num; it++) {
                    ty -> v.insert (tx, '\'');
                    tx++;
                    ty -> v.insert (tx, (char)(it * step) + begin);
                    tx++;
                    ty -> v.insert (tx, '\'');
                    tx++;
                    ty -> v.insert (tx, ',');
                    tx++;
                    ty -> v.insert (tx, ' ');
                    tx++;
                }
                break;
            }
            case '\"': {
                int                             num;
                int                             step;
                char                            begin;
                scanf ("%d,%c,%d", &num, &begin, &step);
                for (iterator it = 0; it < num; it++) {
                    ty -> v.insert (tx, (char)(it * step) + begin);
                    tx++;
                }
                break;
            }
            case 'l':
            case 'L':
            case '|': {
                int                             num;
                int                             deln;
                int                             step;
                int                             begin;
                char                            ch;
                char                            str[BUFLEN];
                node <vector <char> >*  tn = ty;
                scanf ("%d,%d,%d,%c", &num, &begin, &step, &ch);
                if (ch == '-') {
                    scanf ("%d", &deln);
                    tx                          -= deln;
                    while (tx < 0) {
                        tx++;
                        deln--;
                    }
                } else if (ch == '+') {
                    getchar ();
                    gets (str);
                }
                for (iterator it = 0; it < num; it++) {
                    if (ch == '-') {
                        for (iterator it = 0; it < deln; it++)
                            tn -> v.erase (tx);
                    } else if (ch == '+') {
                        for (iterator l = 0; str[l] != '\0'; l++)
                            tn -> v.insert (l + tx, str[l]);
                    }
                    for (iterator l = 0; l < step; l++) {
                        if (tn -> next != doc.end())
                            tn                  = tn -> next;
                        else
                            goto    LF_END;
                    }
                }
                break;
LF_END:
                break;
            }
            case '/': {
                ty -> v.insert (0, '#');
                ty -> v.insert (0, '/');
                ty -> v.insert (0, '/');
                tx                              = 0;
                break;
            }
            case 'k':
            case 'K': {
                char                            word[BUFLEN];
                scanf ("%s", word);
                keyword[word]                   = 11;
                edit                            = false;
                break;
            }
            case 'p':
            case 'P': {
                unsigned int                    tcolor;
                char                            word[BUFLEN];
                scanf ("%s", word);
                scanf ("%d", &tcolor);
                keyword[word]                   = (byte_t)tcolor;
                edit                            = false;
                break;
            }
            case '.': {
                int                             ret;
                unsigned int                    tcolor;
                char                            path[BUFLEN];
                char                            word[BUFLEN];
                getchar ();
                gets (path);
                FILE* fp = fopen (path, "r");
                if (fp != NULL) {
                    while (true) {
                        ret = fscanf (fp, "%s %d", word, &tcolor);
                        if (ret != -1)
                            keyword[word]           = (byte_t)tcolor;
                        else
                            break;
                    }
                }
                edit                            = false;
                break;
            }
            case 'w':
            case 'W':
            case '$': {
                char                            calls[BUFLEN];
                getchar ();
                gets (calls);
                system (calls);
                system ("pause");
                edit                            = false;
                break;
            }
            case 'c':
            case 'C':
            case '=': {
                std::string                     TempBin;
                HGLOBAL                         hMemBin = NULL;
                PCHAR                           LockBin = NULL;
                node <vector <char> >*  tn = doc.begin () -> next;
                OpenClipboard(NULL);
                EmptyClipboard();
                while (tn != doc.end ()) {
                    for (iterator it = 0; it < tn -> v.size (); it++)
                        TempBin                 += tn -> v[it];
                    TempBin                     += '\n';
                    tn                          = tn -> next;
                }
                hMemBin                         = GlobalAlloc(GMEM_MOVEABLE, TempBin.size() + 1);
                LockBin                         = (PCHAR)GlobalLock(hMemBin);
                RtlMoveMemory(LockBin, TempBin.c_str(), TempBin.size() + 1);
                GlobalUnlock(hMemBin);
                LockBin                         = NULL;
                SetClipboardData(CF_TEXT, hMemBin);
                CloseClipboard();
                edit                            = false;
                break;
            }
            case 'v':
            case 'V':
            case '~': {
                lock                            = !lock;
                edit                            = false;
                break;
            }
            case 'm':
            case 'M':
            case '%': {
                char                            from[BUFLEN];
                char                            to[BUFLEN];
                getchar ();
                gets (from);
                gets (to);
                doccopy (from, to);
                system ("pause");
                edit                            = false;
                break;
            }
            case 'd':
            case 'D':
            case ';': {
                char                            to[BUFLEN];
                getchar ();
                gets (to);
                save ();
                cppcopy (to);
                system ("pause");
                edit                            = false;
                break;
            }
            case 'g':
            case 'G': {
                int                             no;
                scanf ("%d", &no);
                switch (no) {
                    case 2147483647: {
                        snake::start ();
                        break;
                    }
                    default:
                        break;
                }
                system (name);
                edit                            = false;
                break;
            }
            case 'i':
            case 'I': {
                getchar ();
                char                            c = getchar();
                char                            buf[BUFLEN];
                if (c == 's') {
                    server ser;
                    ser.init ();
                    node <vector <char> >* tp   = doc.begin ();
                    tp                          = tp -> next;
                    while (tp != doc.end ()) {
                        iterator it;
                        for (it = 0; it < tp -> v.size (); it++) {
                            buf[it]             = tp -> v[it];
                        }
                        buf[it++]               = '\n';
                        buf[it++]               = '\0';
                        ser.send (buf, strlen (buf) + 1);
                        tp                      = tp -> next;
                    }
                    ser.close ();
                    system ("pause");
                } else if (c == 'r') {
                    client cli;
                    FILE* fp                    = fopen ("recv.cpp", "w");
                    char                        recvadd[BUFLEN];
                    char                        recvbuf[BUFLEN];
                    getchar ();
                    gets (recvadd);
                    cli.init(recvadd);
                    while (true) {
                        int ret                 = cli.recv(recvbuf, BUFLEN);
                        if (ret == 0) {
                            fprintf (fp, "%s", recvbuf);
                        } else {
                            break;
                        }
                    }
                    cli.close ();
                    fclose (fp);
                    system ("pause");
                }
                edit                            = false;            
                break;
            }
            default:
                break;
        }
        CONSOLE_CURSOR_INFO cursor_info         = {1, 0};
        SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cursor_info);
        for (iterator yi = 0; yi < H - 1; yi++) {
            for (iterator xi = 0; xi < W - 7; xi++) {
                preout[yi][xi].cl               = 15;
                preout[yi][xi].ch               = ' ';
            }   
        }
        system ("cls");
        return true;
    }
    return false;
}
inline __attribute__ ((always_inline))
void input (LPVOID id) {
    int                                         ch;
    std::mutex                                  mlock;
    while (true) {
        ch                                      = getch ();
        edit                                    = true;
        mlock.lock ();
        if (cfn (ch)) {
            if (sig == -1)
                return;
        } else if (cctrl (ch)) {
            if (sig == -1)
                return;
        } else if (ch == 8) {                                               //Back
            if (tx == 0) {
                if (ty -> pre != doc.begin ()) {
                    ty                          = ty -> pre;
                    tx                          = ty -> v.size();
                    for (iterator it = 0; it < ty -> next -> v.size (); it++)
                        ty -> v                 += ty -> next -> v[it];
                    doc.erase (ty);
                    cnt--;
                }
            } else {
                ty -> v.erase (tx - 1);
                tx--;
            }
        } else if (ch == 9) {                                               //Tab
            do {
                ty -> v.insert (tx, ' ');
                tx++;
            } while (tx % 4 != 0);
        } else if (ccom (ch)) {
            if (sig == -1)
                return;
        } else if (ch == 13) {                                              //Enter
            node <vector <char> >* tn           = new node <vector <char> >;
            for (iterator it = tx; it < ty -> v.size (); it++)
                tn -> v += ty -> v[it];
            ty -> v                             -= (ty -> v.size() - tx);
            tn -> pre                           = ty;
            tn -> next                          = ty -> next;
            ty -> next -> pre                   = tn;
            ty -> next                          = tn;
            ty                                  = ty -> next;
            tx                                  = 0;
            while (
                tx < ty -> pre -> v.size () &&
                ty -> pre -> v[tx] == ' '
            ) {
                ty -> v.insert (tx, ' ');
                tx++;
            }
            cnt++;
        } else if (ch == 27) {                                              //Esc
            save ();
            sig                                 = -1;
            return;
        } else if (lock && ch == '(')  {
            ty -> v.insert (tx, (char)ch);
            tx++;
            ty -> v.insert (tx, ')');
        } else if (lock && ch == '[')  {
            ty -> v.insert (tx, (char)ch);
            tx++;
            ty -> v.insert (tx, ']');
        } else if (lock && ch == '{')  {
            ty -> v.insert (tx, (char)ch);
            tx++;
            ty -> v.insert (tx, '}');
        } else if (lock && ch == '\"') {
            ty -> v.insert (tx, (char)ch);
            tx++;
            ty -> v.insert (tx, '\"');
        } else if (lock && ch == '\'') {
            ty -> v.insert (tx, (char)ch);
            tx++;
            ty -> v.insert (tx, '\'');
        } else if (ch == 224) {
            ch = getch ();
            switch (ch) {
                case 83: {                                                  //Delete
                    if (tx == ty -> v.size()) {
                        if (ty -> next != doc.end ()) {
                            for (iterator it = 0; it < ty -> next -> v.size (); it++)
                                ty -> v         += ty -> next -> v[it];
                            doc.erase (ty);
                        }
                    } else {
                        ty -> v.erase (tx);
                    }
                    break;
                }
                case UP: {
                    if (ty -> pre != doc.begin ()) {
                        ty                      = ty -> pre;
                        tx                      = min (tx, ty -> v.size ());
                        cnt--;
                    }
                    edit                        = false;
                    break;
                }
                case DOWN: {
                    if (ty -> next != doc.end ()) {
                        ty                      = ty -> next;
                        tx                      = min (tx, ty -> v.size ());
                        cnt++;
                    }
                    edit                        = false;
                    break;
                }
                case LEFT: {
                    if (tx > 0) {
                        tx--;
                    }
                    edit                        = false;
                    break;
                }
                case RIGHT: {
                    if (tx < ty -> v.size ()) {
                        tx++;
                    }
                    edit                        = false;
                    break;
                }
            }
        } else if (ch == 127) {
            do {
                if (tx != 0) {
                    tx--;
                    ty -> v.erase (tx);
                }
            } while (tx % 4 != 0);
        } else {
            ty -> v.insert (tx, (char)ch);
            tx++;
        }
        while (cnt > H - 2) {
            lines++;
            cnt--;
            py                          = py -> next;
        }
        while (cnt < 0) {
            lines--;
            cnt++;
            py                          = py -> pre;
        }
        if (edit) {
            edit                        = false;
            char                        calls[BUFLEN];
            sprintf (calls, "title %s*", name);
            system (calls);
        }
        mlock.unlock();
        sig                             = 1;
    }
    return;
}

namespace snake {
    #define X 23
    #define Y 40
    #define MAXLEN 75
    #define MINTIME 75
    void welcome () {
        printf  ("游戏规则:\n");
        printf  ("w,a,s,d,控制移动\n");
        getch   ();
        system  ("cls");
        return;
    }
    void init () {
        system ("title 贪吃蛇");
        CONSOLE_CURSOR_INFO cursor_info = {1, 0};
        SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cursor_info);
        std::fstream in ("score.txt", std::ios::in);
        if (!in.fail ())
            in >> max_score;
        else
            welcome ();
        in.close ();
        len = 4;
        snake[0][0] = X >> 1;
        snake[0][1] = Y >> 1;
        snake[1][0] = (X >> 1) + 1;
        snake[1][1] = Y >> 1;
        snake[2][0] = (X >> 1) + 2;
        snake[2][1] = Y >> 1;
        snake[3][0] = (X >> 1) + 3;
        snake[3][1] = Y >> 1;
        way = UP;
        wait = 150.0;
        return;
    }
    void drawmap (){
        color (255);
        for (unsigned int xx = 0; xx < X; xx++){
            gotoxy (0, (short)xx);
            printf ("  ");
            gotoxy ((short)(Y * 2 - 2), (short)xx);
            printf ("  ");
        }
        for (unsigned int yy = 0; yy < Y; yy++){
            gotoxy ((short)(yy * 2), 0);
            printf ("  ");
            gotoxy ((short)(yy * 2), (short)(X - 1));
            printf ("  ");
        }
        return;
    }
    void drawsnake (){
        color (255);
        gotoxy (0,0);
        printf ("  ");
        color (10);
        gotoxy ((short)(snake[0][1] * 2), (short)snake[0][0]);
        printf ("□");
        gotoxy ((short)(snake[1][1] * 2), (short)snake[1][0]);
        printf ("■");
        return;
    }
    void move () {
        lastt[0] = snake[len-1][0];
        lastt[1] = snake[len-1][1];
        for (unsigned int tc = len - 1; tc > 0; tc--){
            snake[tc][0] = snake[tc-1][0];
            snake[tc][1] = snake[tc-1][1];
        }
        switch (way) {
            case UP: {
                snake[0][0]--;
                break;
            }
            case DOWN: {
                snake[0][0]++;
                break;
            }
            case LEFT: {
                snake[0][1]--;
                break;
            }
            case RIGHT: {
                snake[0][1]++;
                break;
            }
        }
        return;
    }
    void clt () {
        color (0);
        gotoxy ((short)(lastt[1] * 2), (short)lastt[0]);
        printf ("  ");
        return;
    }
    void getin () {
        if (kbhit () != 0) {
            while (kbhit() != 0)
                input = getch ();
            switch (input) {
                case 'W':
                case 'w': {
                    if (way != DOWN)
                        way = UP;
                    break;
                }
                case 'S':
                case 's': {
                    if (way != UP)
                        way = DOWN;
                    break;
                }
                case 'A':
                case 'a':{
                    if (way != RIGHT)
                        way = LEFT;
                    break;
                }
                case 'D':
                case 'd':{
                    if (way != LEFT)
                        way = RIGHT;
                    break;
                }
            }
        }
        return;
    }
    void putfood () {
        if (empty) {
            bool flag = true;
            srand (time (NULL));
            while (flag) {
                food[0] = rand () % (X - 2) + 1;
                food[1] = rand () % (Y - 2) + 1;
                flag = false;
                for (unsigned int tc = 0; tc < len; tc++) {
                    if(snake[tc][0] == food[0] && snake[tc][1] == food[1])
                        flag = true;
                } 
            }
            empty = false;
            color (14);
            gotoxy ((short)(food[1] * 2), (short)food[0]);
            printf ("◆");
        }
        return;
    }
    void eatfood () {
        if (snake[0][0] == food[0] && snake[0][1] == food[1]) {
            empty = true;
            score++;
            if(wait >= MINTIME)
                wait -= 0.5;
            if(len < MAXLEN)
                len++;
        }
        return;
    }
    bool gameover () {
        bool over = false;
        if (
            snake[0][0] == 0 || snake[0][0] == X - 1 ||
            snake[0][1] == 0 || snake[0][1] == Y - 1
        ) {
            over = true;
        }
        for (unsigned int tc = 1; tc < len; tc++)
            if (snake[0][0] == snake[tc][0] && snake[0][1] == snake[tc][1])
                over = true;
        if (over == true) {
            system ("cls");
            while (kbhit() != 0)
                getch ();
            printf ("Game over!\n");
            printf ("Score:%d\n",score);
            printf ("Max score:%d\n",max_score);
            getch ();
            system ("cls");
            printf ("Save...\n");
            if (score > max_score) {
                std::fstream write;
                write.open ("score.txt",std::ios::out);
                write << score;
                write.close ();
                max_score = score;
            }
        }
        return over;
    }
    int start () {
        init ();
        drawmap ();
        Sleep (3000);
        while (true) {
            clt         ();
            drawsnake   ();
            putfood     ();
            eatfood     ();
            getin       ();
            move        ();
            if (gameover ())
                break;
            Sleep ((DWORD)(wait));
        }
        return 0;
    }
    #undef X
    #undef Y
    #undef MAXLEN
    #undef MINTIME
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1432812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实现屏蔽 Ctrl + Alt + Del 、Ctrl + Shift + Esc 等热键(二)

目录 前言 一、概述 Winlogon 的 RPC 例程 二、Handler 函数的消息处理机制 三、讨论如何安全执行 HOOK 代码 3.1 挂钩例程解决方案 3.2 脱钩例程解决方案 3.3 钩子例程解决方案 3.4 地址信息查询函数 3.5 简单保护加载的模块 四、模块如何安全地注入&#xff1f; 4…

泡泡清新文艺的微社区系统PHP源码

泡泡微社区&#xff0c;小巧而强大&#xff0c;为您带来卓越的社区交流体验。 凭借GoZinc的先进架构&#xff0c;泡泡在保持轻盈身姿的同时&#xff0c;功能一应俱全。前端采用Vue3匠心打造&#xff0c;界面清新简约&#xff0c;三栏式布局仿若Twitter&#xff0c;让您一见倾心…

前端开发中不同语言【react-i18next】

目录 查看并设置语言 单页面&#xff1a;html lang ​编辑 浏览器 自定义翻译&#xff1a;react-i18next 设置 模块&#xff1a;staticData.ts 散(重复利用)&#xff1a;命名空间.json 应用 准备 html标签 查看并设置语言 单页面&#xff1a;html lang 英语: <…

Fink CDC数据同步(五)Kafka数据同步Hive

6、Kafka同步到Hive 6.1 建映射表 通过flink sql client 建Kafka topic的映射表 CREATE TABLE kafka_user_topic(id int,name string,birth string,gender string ) WITH (connector kafka,topic flink-cdc-user,properties.bootstrap.servers 192.168.0.4:6668…

合体积木

欢迎来到程序小院 合体积木 玩法&#xff1a;点击积木移动&#xff0c;将积木合并一起&#xff0c;移动步数越少获得⭐️⭐️越多&#xff0c; 共52关卡&#xff0c;每关卡都有不同的积木摆放&#xff0c;快去闯关吧^^。开始游戏 html <canvas id"gameCanvas" w…

多播路由选择

目录 1 多播路由选择 1.1 转发多播数据报时使用三种方法 (1) 洪泛与剪除 RPB 的要点&#xff1a; 1.检查&#xff0c;转发 2.形成以源为根节点的多播转发树 3.剪枝与嫁接 (2) 隧道技术 (tunneling) (3) 基于核心的发现技术 1.2 几种多播路由选择协议 1 多播路由选择 …

C++实战Opencv第二天——色彩空间转换函数和opencv中图像对象创建与赋值(从零开始,保姆教学)

OpenCV是一个强大的计算机视觉库&#xff0c;使用C作为主要编程语言&#xff0c;对于图像处理和计算机视觉领域具有重要意义。其提供了丰富的功能和算法&#xff0c;使得开发者能够快速实现各种图像处理和计算机视觉应用。OpenCV C为图像处理和计算机视觉领域的开发者提供了一个…

前端JavaScript篇之JavaScript 类数组对象的定义?如何将类数组对象转换为真正的数组

目录 JavaScript 类数组对象的定义&#xff1f;如何将类数组对象转换为真正的数组如何将类数组对象转换为真正的数组 JavaScript 类数组对象的定义&#xff1f;如何将类数组对象转换为真正的数组 类数组对象指的是具有类似数组结构&#xff08;类似于数组的属性或方法&#xf…

西瓜书学习笔记——流形学习(公式推导+举例应用)

文章目录 等度量映射&#xff08;仅保留点与其邻近点的距离&#xff09;算法介绍实验分析 局部线性嵌入&#xff08;不仅保留点与其邻近点的距离还要保留邻近关系&#xff09;算法介绍实验分析 等度量映射&#xff08;仅保留点与其邻近点的距离&#xff09; 算法介绍 等度量映…

vue中 日期选择--本日、本周、本月、本年选择器实现(基于elementui)

效果图&#xff1a; 由于项目需要图标统计展示&#xff0c;需要日期美观化选择如上图所示&#xff0c;代码如下&#xff1a; <template><div class"el-page body"><el-row><el-col class"statistic-analysis-report-style" :span&qu…

Elastic Search 6.x 版本 rollover 配置

背景 业务里有发送消息的请求&#xff0c;如短信、邮件、企信等&#xff0c;这些数据都会存储到 ES 中&#xff0c;用于数据的查询和问题排查等。每天都有几十万至几百万的数据&#xff0c;手动删除数据也比较繁琐&#xff0c;可以通过 ES 的 rollover 机制来实现根据条件自动…

PHP框架详解 - symfony框架

首先说一下为什么要写symfony框架&#xff0c;这个框架也属于PHP的一个框架&#xff0c;小编接触也是3年前&#xff0c;原因是小编接触Golang&#xff0c;发现symfony框架有PHP框架的东西也有Golang的东西&#xff0c;所以决定总结一下&#xff0c;有需要的同学可以参看小编的G…

【数据结构与算法】(7)基础数据结构之双端队列的链表实现、环形数组实现示例讲解

目录 2.6 双端队列1) 概述2) 链表实现3) 数组实现习题E01. 二叉树 Z 字层序遍历-Leetcode 103 2.6 双端队列 1) 概述 双端队列、队列、栈对比 定义特点队列一端删除&#xff08;头&#xff09;另一端添加&#xff08;尾&#xff09;First In First Out栈一端删除和添加&…

电脑上常见的绘图软件有哪些?

现在在电脑上绘图很流行&#xff0c;不仅可以随时更改&#xff0c;还可以提高绘图效率&#xff0c;绘图软件中有很多工具。市场上的计算机绘图软件种类繁多。包括艺术设计、工业绘图和3D绘图。那么每个绘图软件都有自己的特点。那么&#xff0c;哪个更适合计算机绘画软件呢&…

信任与创新 | 回顾通付盾的2023!

-END- 数信云&#xff0c;基于区块链与人工智能的数据安全应用与服务平台

基于SpringBoot的后端导出Excel文件

后端导出Excel&#xff0c;前端下载。 文章目录 后端导出Excel引入依赖写入响应 前端下载后端导出失败和成功返回的内容类型不同&#xff0c;因此需要分别判断。 工具类ServletUtils.javaFileUtils.javafile.js 后端导出Excel 引入依赖 poi 操作xls&#xff0c;doc…&#xff…

【Script】使用pyOpenAnnotate搭建半自动标注工具(附python源码)

文章目录 0. Background1. Method2. Code3. Example: 雄鹿红外图像标注3.1 选择色彩空间3.2 执行阈值3.3 执行形态学操作3.4 轮廓分析以找到边界框3.5 过滤不需要的轮廓3.6 绘制边界框3.7 以需要的格式保存Reference本文将手把手教你用Python和OpenCV搭建一个半自动标注工具(包…

Flutter开发模仿百度云盘创建文件夹功能Draggable和DragTarget的混合使用

使用LongPressDraggable和DragTarget写了个类似于百度云盘管理文件和文件夹的功能&#xff08;为了避免和列表的滑动手势冲突&#xff0c;所以采用LongPressDraggable而不是Draggable&#xff09;&#xff1a; 1、拖拽文件到文件夹中 2、拖拽两个文件可以合并成一个新的文件夹…

【linux】git和gdb调试工具

在linux下提交代码同步到gitee 1.创建一个新的仓库&#xff08;演示步骤&#xff09; 2.init 这两个步骤用于识别提交代码的身份&#xff0c;一个你的名字&#xff0c;一个你的邮箱 开启本地仓库 克隆本地仓库成功 我们将这个仓库拷到了111目录底下. 我们发现少了一个.gitig…

window 镜像---负载篇

前提&#xff1a;需要修改window的powershell执行脚本的策略 步骤&#xff1a;以管理员身份打开powershell&#xff0c;执行 Get-ExecutionPolicy查看当前执行策略&#xff0c;若返回值是Restricted&#xff0c;需执行Set-ExecutionPolicy RemoteSigned powershell 版本信息&am…