问题标题: SUPERCRAFT正式版已发布!

0
0
已解决
陈俊霖
陈俊霖
新手天翼
新手天翼

GUCRAFT被我改成SUPERCRAFT啦

现在谁帮我做个合成功能?

我送TA200豆!

还有UI和注释(毕竟我的代码很乱,给我加注释的人我也会重金赏他的)

陈俊霖在2022-10-05 18:54:12追加了内容

/*
0=黑色
1=蓝色
2=绿色
3=湖蓝色
4=红色
5=紫色
6=**
7=白色
8=灰色
9=淡蓝色
A=淡绿色
B=淡浅绿色
C=淡红色
D=淡紫色
E=淡黄
F=亮白色
*/

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <time.h>
#include <windows.h>
#include <pthread.h>
#include <conio.h>
#include <vector>

using namespace std;
int gold=6;
int diamond=1;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE), hsout;
HWND hwnd = GetConsoleWindow();

//基**操作函数
void gotoxy(short x, short y) { //移动光标函数
    COORD coord = {x, y};
    SetConsoleCursorPosition(hout, coord);
}
void cursor(bool visible) { //控制光标函数
    CONSOLE_CURSOR_INFO CursorInfo;
    GetConsoleCursorInfo(hout, &CursorInfo);
    CursorInfo.bVisible = visible;
    SetConsoleCursorInfo(hout, &CursorInfo);
}
void color(int ForgC, int BackC) { //设置颜色函数
    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
    SetConsoleTextAttribute(hout, wColor);
}
WORD get_font(int ForgC, int BackC) { //获取字体颜色参数
    return ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
}
void color(int ForgC) {
    WORD wColor;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if (GetConsoleScreenBufferInfo(hout, &csbi)) {
        wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
        SetConsoleTextAttribute(hout, wColor);
    }
}
void nofastedit() { //关闭快速编辑
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hStdin, &mode);
    mode &= ~ENABLE_QUICK_EDIT_MODE;
    mode &= ~ENABLE_INSERT_MODE;
    mode &= ~ENABLE_MOUSE_INPUT;
    SetConsoleMode(hStdin, mode);
}
COORD home_coord = {0, 0};
DWORD written;
void write(const char *str, int ssize) { //快速渲染
    WriteConsoleOutputCharacterA(hout, str, ssize, home_coord, &written);
}
void writefont(const WORD *font, int fsize) { //快速渲染颜色信息
    WriteConsoleOutputAttribute(hout, font, fsize, home_coord, &written);
}
bool keydown(int key) { //判断键状态
    return GetAsyncKeyState(key);
}
int setfontsize(int x, int y) { //设置字体大小
    CONSOLE_FONT_INFOEX cfi;
    GetCurrentConsoleFontEx(hout, FALSE, &cfi);
    cfi.cbSize = sizeof(cfi);
    cfi.nFont = 0;
    cfi.dwFontSize.X = x;
    cfi.dwFontSize.Y = y;
    cfi.FontFamily = FF_DONTCARE;
    cfi.FontWeight = 400;
    wcscpy(cfi.FaceName, L"NSimSun");
    return SetCurrentConsoleFontEx(hout, TRUE, &cfi);
}
int rand(int a, int b) { //rand()随机数
    return (rand() % (b - a + 1)) + a;
}
void swrite(string str) { //输出到设置缓冲区
    WriteConsoleA(hsout, str.c_str(), str.size(), NULL, NULL);
}
bool access(string name) { //判断文件是否存在
    ifstream f(name.c_str());
    return f.good();
}
int nozero(int k) {
    if (k < 0) {
        return 0;
    } else {
        return k;
    }
}
bool jianzao;
//常量
int blocks[1000][10][10] = {
    {
        //0:air(空气)
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
    },
    {
        //1:grass_block(草方块)
        {2, 10, 2, 10, 2, 10, 2, 10, 2, 10},
        {10, 2, 10, 2, 10, 2, 10, 2, 10, 2},
        {2, 6, 2, 6, 2, 6, 2, 6, 2, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6}
    },
    {
        //2:dirt(泥土)
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6}
    },
    {
        //3:stone(石头)
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
    },
    {
        //4:none(基岩)
        {0, 8, 0, 8, 0, 8, 0, 8, 0, 8},
        {8, 0, 8, 0, 8, 0, 8, 0, 8, 0},
        {0, 8, 0, 8, 0, 8, 0, 8, 0, 8},
        {8, 0, 8, 0, 8, 0, 8, 0, 8, 0},
        {0, 8, 0, 8, 0, 8, 0, 8, 0, 8},
        {8, 0, 8, 0, 8, 0, 8, 0, 8, 0},
        {0, 8, 0, 8, 0, 8, 0, 8, 0, 8},
        {8, 0, 8, 0, 8, 0, 8, 0, 8, 0},
        {0, 8, 0, 8, 0, 8, 0, 8, 0, 8},
        {8, 0, 8, 0, 8, 0, 8, 0, 8, 0},
    },
    {
        //5:water(水)
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9}
    },
    {
        //6:木头
        {4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
        {4, 0, 0, 0, 0, 0, 0, 0, 0, 4},
        {4, 4, 4, 4, 4, 4, 4, 4, 0, 4},
        {4, 0, 0, 0, 0, 0, 0, 4, 0, 4},
        {4, 0, 4, 4, 4, 4, 0, 4, 0, 4},
        {4, 0, 4, 4, 0, 0, 0, 4, 0, 4},
        {4, 0, 4, 4, 4, 4, 4, 4, 0, 4},
        {4, 0, 4, 4, 4, 4, 4, 4, 0, 4},
        {4, 0, 0, 0, 0, 0, 0, 0, 0, 4},
        {4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
    }
    ,
    {
        //7:叶子
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    },{
            //8:iron(石头)
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,8, 8, 7,7, 8, 8, 8},
            {8, 8, 7, 7, 8, 8, 8, 8, 8, 8},
            {7, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,8, 7, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 7, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 7, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
        },{
            //9:diamond(石头)
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,8, 8, diamond,diamond, 8, 8, 8},
            {8, 8, diamond, diamond, 8, 8, 8, 8, 8, 8},
            {diamond, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,8, diamond, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, diamond, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, diamond, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
        },{
            //10:gold
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,8, 8, gold,gold, 8, 8, 8},
            {8, 8, gold, gold, 8, 8, 8, 8, 8, 8},
            {gold, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,8, gold, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, gold, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, gold, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},

        }
};
int nums[10][10][5]{
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,0,0,0,7},
    {7,0,7,7,7},
    {7,0,7,7,7},
    {7,0,7,7,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,0,7,7,7},
    {7,0,7,7,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,0,7,7,7},
    {7,0,7,7,7},
    {7,0,0,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    }
};
int player[20][10] = {
    {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
    {15, 15, 0, 0, 0, 0, 0, 0, 15, 15},
    {15, 15, 0, 0, 0, 0, 0, 0, 15, 15},
    {15, 15, 14, 14, 0, 0, 0, 0, 15, 15},
    {15, 15, 14, 14, 14, 14, 0, 0, 15, 15},
    {15, 15, 14, 14, 14, 14, 14, 14, 15, 15},
    {15, 15, 14, 14, 14, 14, 14, 14, 15, 15},
    {15, 15, 15, 3, 3, 3, 3, 15, 15, 15},
    {15, 15, 15, 3, 3, 3, 3, 15, 15, 15},
    {6, 3, 3, 3, 3, 3, 3, 15, 15, 15},
    {6, 3, 3, 3, 3, 3, 3, 15, 15, 15},
    {15, 15, 15, 3, 3, 3, 3, 15, 15, 15},
    {15, 15, 15, 3, 3, 3, 3, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 3, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 1, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 1, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 1, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 1, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 1, 15, 15, 15},
    {15, 15, 15, 8, 8, 8, 8, 15, 15, 15},
};
ofstream wlog("log.txt"); //日志输出
struct obj{
    int id,num;
};
vector<obj>bag;
int pointer1,pointer2;
//程序函数
int WDOUBLE = 0;
void hello() { //首次运行设置
    nofastedit();
    cursor(false);
    SetConsoleActiveScreenBuffer(hsout);
    swrite("你好,欢迎使用SUPERCRAFT。\n");
    swrite("在开始之前,我们需要进行一些设置。\n");
    swrite("[按任意键继续]");
    getch();
    system("cls");
    swrite("在显示的两个正方形中,选择较为规整的一个\n");
    swrite("[按任意键继续]");
    getch();
    system("cls");
    SetConsoleActiveScreenBuffer(hout);
    setfontsize(4, 4);
    for (int i = 1; i <= 10; i++) {
        WORD w[1005];
        int pos = 0;
        COORD coord = {1, i};
        for (int j = 1; j <= 10; j++) {
            w[pos++] = get_font(15, 15);
        }
        WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
    }
    for (int i = 1; i <= 10; i++) {
        WORD w[1005];
        int pos = 0;
        COORD coord = {13, i};
        for (int j = 1; j <= 10; j++) {
            w[pos++] = get_font(15, 15);
            w[pos++] = get_font(15, 15);
        }
        WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
    }
    getch();
    system("cls");
    SetConsoleActiveScreenBuffer(hsout);
    swrite("哪一个正方形是最规整的?\n");
    swrite("1.左边的  2.右边的");
reinput:
    int ipt = getch();
    if (ipt == '1') {
        WDOUBLE = 0;
    } else if (ipt == '2') {
        WDOUBLE = 1;
    } else {
        goto reinput;
    }
    system("cls");
    swrite("按+/-调整窗口大小,F键确定\n");
    swrite("请保持白色方块为正方形\n[按任意键继续]");
    getch();
    SetConsoleActiveScreenBuffer(hout);
    if (WDOUBLE == 0) {
        system("mode con:cols=200 lines=100");
    } else {
        system("mode con:cols=400 lines=100");
    }
    if (WDOUBLE == 0) {
        for (int i = 1; i <= 10; i++) {
            WORD w[1005];
            int pos = 0;
            COORD coord = {1, i};
            for (int j = 1; j <= 10; j++) {
                w[pos++] = get_font(15, 15);
            }
            WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
        }
    } else {
        for (int i = 1; i <= 10; i++) {
            WORD w[1005];
            int pos = 0;
            COORD coord = {1, i};
            for (int j = 1; j <= 10; j++) {
                w[pos++] = get_font(15, 15);
                w[pos++] = get_font(15, 15);
            }
            WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
        }
    }
    int sizes = 4;
    while (1) {
        int ipt = getch();
        if (ipt == '+' || ipt == '=') {
            sizes++;
            setfontsize(sizes, sizes);
            if (WDOUBLE == 0) {
                system("mode con:cols=200 lines=100");
            } else {
                system("mode con:cols=400 lines=100");
            }
        }
        if (ipt == '-' || ipt == '_') {
            sizes--;
            if (sizes < 1) {
                sizes = 1;
            }
            setfontsize(sizes, sizes);
            if (WDOUBLE == 0) {
                system("mode con:cols=200 lines=100");
            } else {
                system("mode con:cols=400 lines=100");
            }
        }
        if (WDOUBLE == 0) {
            for (int i = 1; i <= 10; i++) {
                WORD w[1005];
                int pos = 0;
                COORD coord = {1, i};
                for (int j = 1; j <= 10; j++) {
                    w[pos++] = get_font(15, 15);
                }
                WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
            }
        } else {
            for (int i = 1; i <= 10; i++) {
                WORD w[1005];
                int pos = 0;
                COORD coord = {1, i};
                for (int j = 1; j <= 10; j++) {
                    w[pos++] = get_font(15, 15);
                    w[pos++] = get_font(15, 15);
                }
                WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
            }
        }
        if (ipt == 'f' || ipt == 'F') {
            break;
        }
    }
    SetConsoleActiveScreenBuffer(hsout);
    system("cls");
    ofstream sout("sets");
    sout << WDOUBLE << " " << sizes;
    sout.close();
    swrite("谢谢!\n设置已保存,以后将不会出现此窗口。\n");
    swrite("如果对此次设定不满意,可以删除sets文件以重新设置\n[按任意键继续]");
    getch();
    SetConsoleActiveScreenBuffer(hout);
}
void console() { //设置控制台
    system("title GUCRAFT");
    system("chcp 936");
    system("cls");
    hsout = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 1, NULL);
    if (access("sets")) { //存在
        nofastedit(); //关闭快速输入
        cursor(false); //关闭光标显示
        ifstream sin("sets");
        int sizes;
        sin >> WDOUBLE >> sizes; //读入设置
        sin.close();
        setfontsize(sizes, sizes);
        if (WDOUBLE == 0) {
            system("mode con:cols=200 lines=120");
        } else {
            system("mode con:cols=400 lines=120");
        }
    } else {
        hello(); //向导
    }
}
int output[201][121]; //输出缓存
void sendprint() { //绘制控制台
    WORD col[24005] = {};
    int pos = 0;
    //将二维数组存储到一维内
    for (int i = 1; i <= 120; i++) {
        for (int j = 1; j <= 200; j++) {
            col[pos] = get_font(output[j][i], output[j][i]);
            pos++;
        }
    }
    writefont(col, 24000);
}
void sendprint_double() { //绘制控制台
    WORD col[48005] = {};
    int pos = 0;
    //将二维数组存储到一维内
    for (int i = 1; i <= 120; i++) {
        for (int j = 1; j <= 200; j++) {
            col[pos] = get_font(output[j][i], output[j][i]);
            pos++;
            col[pos] = get_font(output[j][i], output[j][i]);
            pos++;
        }
    }
    writefont(col, 48000);
}
bool unlight[5005][256];
int world[5005][256]; //世界
int X = 25000, Y = 1280, LR = 0, FPS = 60; //玩家位置
int dx[4]{0,0,-1,1},dy[4]{1,-1,0,0};
bool check_block_unlight(int m){
    return m==3||m==4||m==8||m==9||m==10;
}
bool check_light(int x,int y){
    for(int i=0;i<=3;i++){
        if(unlight[x+dx[i]][y+dy[i]]==0&&!check_block_unlight(
        world[x+dx[i]][y+dy[i]])){
            return 1;
        }
    }
    return 0;
}
void render() { //软件渲染器
    int x_left = X / 10 - 9, x_right = (X % 10 == 0) ? (X / 10 + 10) : (X / 10 + 11); //计算需要渲染的左边线和右边线
    int y_left = (Y % 10 == 0) ? (Y / 10 - 5) : (Y / 10 - 6), y_right = Y / 10 + 5; //计算需要渲染的上边线和下边线
    int x_more = X % 10, y_more = Y % 10; //计算多出的部分
    int x_pos = 1, y_pos = 1; //渲染位置计算
    //渲染世界
    for (int i = x_left; i <= x_right; i++) {
        y_pos = 1;
        for (int j = y_right; j >= y_left; j--) {
            for (int p_i = 0; p_i < 10; p_i++) {
                for (int p_j = 0; p_j < 10; p_j++) {
                    if (x_pos + p_i - x_more < 0 || x_pos + p_i - x_more > 200 || y_pos - p_j + y_more < 0 || y_pos - p_j + y_more > 100) {
                        continue; //如果越界则跳过
                    }
                    if(check_light(i,j)){
                    unlight[i][j]=0;
                    output[x_pos + p_i - x_more][y_pos - p_j + y_more] = blocks[world[i][j]][9 - p_j][p_i];
                    }else
                    output[x_pos + p_i - x_more][y_pos - p_j + y_more]=0;
                }
            }
            y_pos += 10;
        }
        x_pos += 10;
    }
    //渲染玩家
    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 20; j++) {
            if (LR == 0) {
                if (player[j][i] != 15) {
                    output[91 + i][36 + j] = player[j][i];
                }
            } else {
                if (player[j][9 - i] != 15) {
                    output[91 + i][36 + j] = player[j][9 - i];
                }
            }
        }
    }
    int colour=(jianzao?9:12);
    for(int i=0;i+pointer2*20<bag.size();i++){
        for(int j=0;j<5;j++){
            for(int k=0;k<10;k++){
                if(pointer1!=i)
                    output[i*10+1+j][111+k]=nums[bag[i
                    +pointer2*20].num%100/10][k][j];
                else
                    output[i*10+1+j][111+k]=((nums[bag[i+
                    pointer2*20].num%100/10][k][j]==0)?colour:7);
            }
        }
        for(int j=0;j<5;j++){
            for(int k=0;k<10;k++){
                if(pointer1!=i)
                    output[i*10+6+j][111+k]=nums[bag[i+
                    pointer2*20].num%10][k][j];
                else
                    output[i*10+6+j][111+k]=((nums[bag[i+
                    pointer2*20].num%10][k][j]==0)?colour:7);
            }
        }
    }
    for(int i=0;i+pointer2*20<bag.size();i++){
        for(int j=0;j<10;j++){
            for(int k=0;k<10;k++){
                output[i*10+1+j][101+k]=blocks[bag[i+pointer2*20].id][k][j];
            }
        }
    }
    for(int i=bag.size()-pointer2*20;i<=20&&i>0;i++){
        for(int j=0;j<10;j++){
            for(int k=0;k<20;k++){
                output[i*10+1+j][101+k]=0;
            }
        }
    }
}
void dfs_dong(int st,int x,int y){
    if(x<=2||y<=2||x>=4900||world[x][y]==0||st==0){
        return ;
    }
    world[x][y]=0;
    for(int i=0;i<3;i++){
        if(rand(1,3)>1){
            dfs_dong(st-1,x+dx[i],y+dy[i]);
        }
    }
}
void generation(int seed) {
    //生成种子
    if (seed == -1) {
        srand(time(0));
        srand(rand() + time(0));
        seed = rand();
    }
    srand(seed);
    //生成空气
    for (int i = 0; i < 5000; i++) {
        for (int j = 1; j < 256; j++) {
            world[i][j] = 0;
        }
    }
    //生成基本地形
    int grass = rand(50, 80);
    int higher = rand(1, 3);
    int trend = 1, stop_sum = 1;
    bool biome = rand(0, 1);
    int tree;
    for (int i = 0; i < 5000; i++) {
        world[i][0] = 4; //基岩
        
        for (int j = 1; j < grass - 3; j++) {
            unlight[i][j]=1;
            if(i<80||i>4920){
                world[i][j]=4;
                continue;
            }
            if(j==14){
                if(rand(1,14)==1){
                    world[i][j]=9;
                    continue;
                }
            }
            if(rand(1,1000)==1){
                dfs_dong(rand(3,5),i-1,j);
            }
            if(rand(1,6000)==1){
                dfs_dong(rand(12,15),i-1,j);
            }
            if(rand(1,20000)==1){
                dfs_dong(rand(20,30),i-1,j);
            }
            if(rand(1,30)!=1){
                world[i][j]=3;
            }else if(rand(1,5)!=1){
                world[i][j]=8;
            }else if(rand(1,5)==3&&j<20){
                world[i][j]=9;
            }else{
                world[i][j]=10;
            }
        }
        for (int j = grass - 3; j < grass; j++) {
            world[i][j] = 2; //泥土
        }
        world[i][grass] = 1;
        if(tree==0&&(world[i][grass]!=5&&grass>63))
            tree=int(!rand(0,20))*5;
        else
            tree=0;
        if(tree!=0&&i>100&&i<4900){
            for(int j=grass+1;j<grass+tree;j++){
                world[i][j]=6;
                if(j==grass+tree-1){
                    for(int k=-2;k<=2;k++){
                        if(world[i+k][j]==0){
                            world[i+k][j]=7;
                        }
                    }
                    for(int k=-2;k<=2;k++){
                        if(world[i+k][j+1]==0){
                            world[i+k][j+1]=7;
                        }
                    }
                    for(int k=-1;k<=1;k++){
                        if(world[i+k][j+2]==0){
                            world[i+k][j+2]=7;
                        }
                    }
                }
            }
        }
        
        if (biome) { //生成下一个草方块高度
            if (rand(0, 7) == 3) {
                grass += trend;
                stop_sum = 1;
            } else {
                stop_sum++;
            }
        } else {
            if (rand(0, nozero(3 - stop_sum)) == 0) {
                grass += trend * higher;
                stop_sum = 1;
            } else {
                stop_sum++;
            }
        }
        //随机更新高度
        if (rand(0, 1) == 1) {
            higher++;
        } else {
            higher--;
        }
        if (rand(0, 40) == 10) {
            trend *= -1;
        }
        if (rand(0, 100) == 50) {
            biome = !biome;
        }
        //限制范围
        if (grass > 120) {
            grass = 120;
        }
        if (grass < 40) {
            grass = 40;
        }
        if (higher > 2) {
            higher = 2;
        }
        if (higher < 1) {
            higher = 1;
        }
        if(grass<=55){
            if(rand(1,3)==3){
                trend=1;
            }
        }
        
    }
}
void *printmain(void *arg) {
    clock_t st, tmp;
    int sum = 0, fps = -1;
    char t[1005];
    st = clock();
    while (1) {
        render(); //软件渲染
        if (WDOUBLE == 0) { //发送渲染
            sendprint();
        } else {
            sendprint_double();
        }
        sum++; //记录渲染个数
        sprintf(t, "SUPERCRAFT (X:%.1f,Y:%.1f,FPS:%d)", X * 1.0 / 10.0, Y * 1.0 / 10.0, fps); //输出FPS,坐标
        tmp = clock();
        if (tmp - st >= 1000) { //计算FPS
            fps = sum / ((tmp - st) / 1000.0);
            sum = 0;
            st = tmp;
        }
        SetConsoleTitleA(t); //输出FPS
    }
}
bool canin(int x) { //判断人能否进入方块
    return x == 0 || x == 5||x==6||x==7;
}
bool _canin(int x,int y){
    return canin(world[x/10][y/10]);
}

int main() {
    console(); //控制台设置
    pthread_create(NULL, NULL, printmain, NULL); //创建渲染线程
    generation(-1); //生成世界
    int jumps = 0;
    int cnt[129]{0};
    while (1) { //主循环:游戏刻
        {//行动部分
            if (keydown('A') &&_canin(X-1,Y-4)&&_canin(X-1,Y+6)) {
                X--; //向左走
                LR = 0;
            }
            if (keydown('D') && _canin(X+10,Y-4)&&_canin(X+10,Y+6)) {
                X++; //向右走
                LR = 1;
            }
            if (keydown('W') && !_canin(X ,Y - 6)) {
                jumps = 18; //跳跃(判断)
            }

            if(jumps>0||_canin(X,Y-5)&&_canin(X+9,Y-5)){
                if(jumps>0)
                    for(int i=1;i<=jumps/6;Y++,i++){
                        if(!(_canin(X,Y+14)&&_canin(X+9,Y+14))){
                            Y-=3;
                            jumps=0;
                            break;
                        }
                    }
                else{
                    for(int i=1;i<=jumps/-6;Y--,i++){
                        if(!(_canin(X,Y-5)&&_canin(X+9,Y-5))){
                            Y++;
                            break;
                        }
                    }
                }
                while(!(_canin(X,Y-5)&&_canin(X+9,Y-5))){
                    Y++;
                }
                jumps--;
            } else     {
                jumps=0;
            }
        }
        {//背包测试
            if (keydown('O') ) {
                cnt['o']++;

            }
            if (keydown('P') ) {
                cnt['p']++;

            }

            if(cnt['p']%8==7){
                pointer1++;
                cnt['p']++;
                if(pointer1>19){
                    pointer1=0;
                    pointer2++;
                    if(pointer2*20>=bag.size()){
                        pointer2=0;
                        pointer1=0;
                    }
                }
            }
            if(cnt['o']%8==7){
                cnt['o']++;
                pointer1--;
                if(pointer1<0){
                    pointer1=19;
                    pointer2--;
                    if(pointer2<0){
                        pointer2=0;
                    }
                }
            }
        }
        {//挖掘测试
            bool flag=0;
            int*m;
            if(keydown(' ')){
                cnt[' ']++;
                if(cnt[' ']%9==8)
                    jianzao=!jianzao;
            }
            if(keydown('H')){
                cnt['h']++;
                if(cnt['h']%5==2){
                    m=&world[(X+15)/10][Y/10];
                    flag=1;
                }
            }
            if(keydown('Y')){
                cnt['y']++;
                if(cnt['y']%5==2){
            
                m=&world[(X+15)/10][(Y+10)/10];    flag=1;}
            }
            if(keydown('F')){
                cnt['f']++;
                if(cnt['f']%5==2){

                m=&world[(X-5)/10][Y/10];flag=1;}
            }
              if(keydown('R')){
                  cnt['r']++;
                if(cnt['r']%5==2){

                m=&world[(X-5)/10][(Y+10)/10];flag=1;}
            }
            if(keydown('T')){
                cnt['t']++;
                if(cnt['t']%5==2)
                   if(LR==0){
                    m=&world[X/10][(Y+20)/10];
                    flag=1;
                }else{
                    m=&world[(X+9)/10][(Y+20)/10];
                    flag=1;
                }
            }
            if(keydown('G')){
                cnt['g']++;
                if(cnt['g']%5==2)
                if(LR==0){
                    m=&world[X/10][(Y-10)/10];
                    flag=1;
                }else{
                    m=&world[(X+9)/10][(Y-10)/10];
                    flag=1;
                }
            }
            if(flag==1){
                int&k=*m;
                if(k!=0&&k!=4&&!jianzao){
                    for(int i=0;i<bag.size();i++){
                        if(bag[i].id==k){
                            bag[i].num++;
                            goto gt;
                        }
                    }
                    bag.push_back({k,1});
                    gt:;
                    k=0;
                }else if(k==0&&jianzao){
                    int p1=pointer1,p2=pointer2;
                    if(bag.size()>p2*20+p1){
                        k=bag[p2*20+p1].id;
                        bag[p2*20+p1].num--;
                        if(bag[p2*20+p1].num==0){
                            bag.erase(bag.begin()+p2*20+p1);
                        }
                    }
                }
            }
            
        }
        Sleep(10);
    }
    return 0;
}

陈俊霖在2022-10-05 18:55:51追加了内容

我的很多注释不能当真!

陈俊霖在2022-10-05 19:07:33追加了内容

按RFTGYH进行挖掘or建造,按AWD移动,OP移动物品栏光标,空格选择挖掘or建造,蓝色表示建造中,红色表示挖掘中

陈俊霖在2022-10-06 09:26:09追加了内容

我顶,我顶,我顶顶顶

陈俊霖在2022-10-06 09:27:06追加了内容

ding

陈俊霖在2022-10-06 10:16:16追加了内容

顶顶顶顶顶

陈俊霖在2022-10-06 12:01:57追加了内容

好消息:我的合成快做好了!

陈俊霖在2022-10-11 20:28:55追加了内容

/*
0=黑色
1=蓝色
2=绿色
3=湖蓝色
4=红色
5=紫色
6=**
7=白色
8=灰色
9=淡蓝色
A=淡绿色
B=淡浅绿色
C=淡红色
D=淡紫色
E=淡黄
F=亮白色
*/

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <time.h>
#include <windows.h>
#include <pthread.h>
#include <conio.h>
#include <vector>
#include <map>

using namespace std;
int gold=6;
int diamond=1;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE), hsout;
HWND hwnd = GetConsoleWindow();
string xs;
//基**操作函数
void gotoxy(short x, short y) { //移动光标函数
    COORD coord = {x, y};
    SetConsoleCursorPosition(hout, coord);
}
void cursor(bool visible) { //控制光标函数
    CONSOLE_CURSOR_INFO CursorInfo;
    GetConsoleCursorInfo(hout, &CursorInfo);
    CursorInfo.bVisible = visible;
    SetConsoleCursorInfo(hout, &CursorInfo);
}
void color(int ForgC, int BackC) { //设置颜色函数
    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
    SetConsoleTextAttribute(hout, wColor);
}
void generation(int);
WORD get_font(int ForgC, int BackC) { //获取字体颜色参数
    return ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
}
void color(int ForgC) {
    WORD wColor;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if (GetConsoleScreenBufferInfo(hout, &csbi)) {
        wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
        SetConsoleTextAttribute(hout, wColor);
    }
}
void nofastedit() { //关闭快速编辑
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;
    GetConsoleMode(hStdin, &mode);
    mode &= ~ENABLE_QUICK_EDIT_MODE;
    mode &= ~ENABLE_INSERT_MODE;
    mode &= ~ENABLE_MOUSE_INPUT;
    SetConsoleMode(hStdin, mode);
}
COORD home_coord = {0, 0};
DWORD written;
void write(const char *str, int ssize) { //快速渲染
    WriteConsoleOutputCharacterA(hout, str, ssize, home_coord, &written);
}
void writefont(const WORD *font, int fsize) { //快速渲染颜色信息
    WriteConsoleOutputAttribute(hout, font, fsize, home_coord, &written);
}
bool keydown(int key) { //判断键状态
    return GetAsyncKeyState(key);
}
int setfontsize(int x, int y) { //设置字体大小
    CONSOLE_FONT_INFOEX cfi;
    GetCurrentConsoleFontEx(hout, FALSE, &cfi);
    cfi.cbSize = sizeof(cfi);
    cfi.nFont = 0;
    cfi.dwFontSize.X = x;
    cfi.dwFontSize.Y = y;
    cfi.FontFamily = FF_DONTCARE;
    cfi.FontWeight = 400;
    wcscpy(cfi.FaceName, L"NSimSun");
    return SetCurrentConsoleFontEx(hout, TRUE, &cfi);
}
int rand(int a, int b) { //rand()随机数
    return (rand() % (b - a + 1)) + a;
}
void swrite(string str) { //输出到设置缓冲区
    WriteConsoleA(hsout, str.c_str(), str.size(), NULL, NULL);
}
bool access(string name) { //判断文件是否存在
    ifstream f(name.c_str());
    return f.good();
}
int nozero(int k) {
    if (k < 0) {
        return 0;
    } else {
        return k;
    }
}
bool jianzao;
//常量
int blocks[1000][10][10] = {
    {
        //0:air(空气)
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
        {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
    },
    {
        //1:grass_block(草方块)
        {2, 10, 2, 10, 2, 10, 2, 10, 2, 10},
        {10, 2, 10, 2, 10, 2, 10, 2, 10, 2},
        {2, 6, 2, 6, 2, 6, 2, 6, 2, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6}
    },
    {
        //2:dirt(泥土)
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6},
        {6, 6, 6, 6, 6, 6, 6, 6, 6, 6}
    },
    {
        //3:stone(石头)
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
        {8, 8, 8, 8, 8, 8, 8, 8, 8, 8},
    },
    {
        //4:none(基岩)
        {0, 8, 0, 8, 0, 8, 0, 8, 0, 8},
        {8, 0, 8, 0, 8, 0, 8, 0, 8, 0},
        {0, 8, 0, 8, 0, 8, 0, 8, 0, 8},
        {8, 0, 8, 0, 8, 0, 8, 0, 8, 0},
        {0, 8, 0, 8, 0, 8, 0, 8, 0, 8},
        {8, 0, 8, 0, 8, 0, 8, 0, 8, 0},
        {0, 8, 0, 8, 0, 8, 0, 8, 0, 8},
        {8, 0, 8, 0, 8, 0, 8, 0, 8, 0},
        {0, 8, 0, 8, 0, 8, 0, 8, 0, 8},
        {8, 0, 8, 0, 8, 0, 8, 0, 8, 0},
    },
    {
        //5:water(水)
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9},
        {9, 9, 9, 9, 9, 9, 9, 9, 9, 9}
    },
    {
        //6:木头
        {4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
        {4, 0, 0, 0, 0, 0, 0, 0, 0, 4},
        {4, 4, 4, 4, 4, 4, 4, 4, 0, 4},
        {4, 0, 0, 0, 0, 0, 0, 4, 0, 4},
        {4, 0, 4, 4, 4, 4, 0, 4, 0, 4},
        {4, 0, 4, 4, 0, 0, 0, 4, 0, 4},
        {4, 0, 4, 4, 4, 4, 4, 4, 0, 4},
        {4, 0, 4, 4, 4, 4, 4, 4, 0, 4},
        {4, 0, 0, 0, 0, 0, 0, 0, 0, 4},
        {4, 4, 4, 4, 4, 4, 4, 4, 4, 4},
    }
    ,
    {
        //7:叶子
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
        {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
    }
    ,{
            //8:iron
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,8, 8, 7,7, 8, 8, 8},
            {8, 8, 7, 7, 8, 8, 8, 8, 8, 8},
            {7, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,8, 7, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 7, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 7, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
        }
        ,{
            //9:diamond
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,8, 8, diamond,diamond, 8, 8, 8},
            {8, 8, diamond, diamond, 8, 8, 8, 8, 8, 8},
            {diamond, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,8, diamond, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, diamond, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, diamond, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
        }
        ,{
            //10:gold
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,8, 8, gold,gold, 8, 8, 8},
            {8, 8, gold, gold, 8, 8, 8, 8, 8, 8},
            {gold, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,8, gold, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, gold, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, gold, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},

        },
        {//11、木板
        {14,14,0,14,14,14,0,14,14,14},
        {14,14,0,14,14,14,0,14,14,14},
        {14,14,0,14,14,14,0,14,14,14},
        {14,14,0,14,14,14,0,14,14,14},
        {14,14,0,14,14,14,0,14,14,14},
        {14,14,0,14,14,14,0,14,14,14},
        {14,14,0,14,14,14,0,14,14,14},
        {14,14,0,14,14,14,0,14,14,14},
        {14,14,0,14,14,14,0,14,14,14},
        {14,14,0,14,14,14,0,14,14,14},
        },{//12、工作台
        {15,15,15,15,15,15,15,15,15,15},
        {0,0,0,0,0,0,0,0,0,0},
        {0,14,14,14,14,14,14,14,14,0},
        {0,0,0,0,0,0,0,0,0,0},
        {15,0,14,0,15,15,0,14,0,15},
        {15,0,14,0,15,15,0,14,0,15},
        {15,0,14,0,15,15,0,14,0,15},
        {15,0,14,0,15,15,0,14,0,15},
        {15,0,14,0,15,15,0,14,0,15},
        {15,0,0,0,15,15,0,0,0,15},
        }
        ,{
            //13:煤炭
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,8, 8, 0,0, 8, 8, 8},
            {8, 8, 0, 0, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,8, 0, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 0, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 0, 8, 8, 8},
            {8, 8,    8,    8, 8, 8, 8, 8, 8, 8},
        },{
            //14:钻块
            {0, 0,    0,    0, 0, 0, 0, 0, 0, 0},
            {0, 1,    1,    1, 1, 1, 1, 1, 1, 0},
            {0, 1,    1,    1, 1, 1, 1, 1, 1, 0},
            {0, 1,    1,    1, 1, 1, 1, 1, 1, 0},
            {0, 1,    1,    1, 1, 1, 1, 1, 1, 0},
            {0, 1,    1,    1, 1, 1, 1, 1, 1, 0},
            {0, 1,    1,    1, 1, 1, 1, 1, 1, 0},
            {0, 1,    1,    1, 1, 1, 1, 1, 1, 0},
            {0, 1,    1,    1, 1, 1, 1, 1, 1, 0},
            {0, 0,    0,    0, 0, 0, 0, 0, 0, 0}
        }
        ,{
            //15:熔炉
            {0, 0,0,0, 0, 0, 0, 0, 0, 0},
            {0, 8,8,8, 8, 8, 8, 8, 8, 0},
            {0, 8,8,8, 8, 8, 8, 8, 8, 0},
            {0, 8,8,8, 8, 8, 8, 8, 8, 0},
            {0, 0,0,0, 0, 0, 0, 0, 0, 0},
            {0, 8,8,8, 8, 8, 8, 8, 8, 0},
            {0, 8,8,0, 0, 0, 0, 8, 8, 0},
            {0, 8,8,0, 8, 8,0, 8, 8, 0},
            {0, 8,8,0, 8, 8, 0, 8, 8, 0},
            {0, 0,0,0, 0, 0, 0, 0,0, 0}
        },{
            //16:铁锭
            {15,15,15,15,15,15,15,15,15,15},
            {15,15,15,15,15,15,15,15,15,15},
            { 0, 0, 0, 0, 0, 0, 0, 0,15,15},
            { 0, 0, 7, 7, 7, 7, 7, 7, 0,15},
            { 0, 7, 0, 0, 0, 0, 0, 0, 0, 0},
            {15, 0, 0, 7, 7, 7, 7, 7, 7, 0},
            {15,15, 0, 0, 0, 0, 0, 0, 0, 0},
            {15,15,15,15,15,15,15,15,15,15},
            {15,15,15,15,15,15,15,15,15,15},
            {15,15,15,15,15,15,15,15,15,15}
        },{
            //17:金锭
            {15,15,15,15,15,15,15,15,15,15},
            {15,15,15,15,15,15,15,15,15,15},
            { 0, 0, 0, 0, 0, 0, 0, 0,15,15},
            { 0, 0, 6, 6, 6, 6, 6, 6, 0,15},
            { 0, 6, 0, 0, 0, 0, 0, 0, 0, 0},
            {15, 0, 0, 6, 6, 6, 6, 6, 6, 0},
            {15,15, 0, 0, 0, 0, 0, 0, 0, 0},
            {15,15,15,15,15,15,15,15,15,15},
            {15,15,15,15,15,15,15,15,15,15},
            {15,15,15,15,15,15,15,15,15,15}
        },{
            //18:铁块
            {0, 0,    0,    0, 0, 0, 0, 0, 0, 0},
            {0, 7,    7,    7, 7, 7, 7, 7, 7, 0},
            {0, 7,    7,    7, 7, 7, 7, 7, 7, 0},
            {0, 7,    7,    7, 7, 7, 7, 7, 7, 0},
            {0, 7,    7,    7, 7, 7, 7, 7, 7, 0},
            {0, 7,    7,    7, 7, 7, 7, 7, 7, 0},
            {0, 7,    7,    7, 7, 7, 7, 7, 7, 0},
            {0, 7,    7,    7, 7, 7, 7, 7, 7, 0},
            {0, 7,    7,    7, 7, 7, 7, 7, 7, 0},
            {0, 0,    0,    0, 0, 0, 0, 0, 0, 0}
        },{
            //19:金块
            {0, 0,    0,    0, 0, 0, 0, 0, 0, 0},
            {0, 6,    6,    6, 6, 6, 6, 6, 6, 0},
            {0, 6,    6,    6, 6, 6, 6, 6, 6, 0},
            {0, 6,    6,    6, 6, 6, 6, 6, 6, 0},
            {0, 6,    6,    6, 6, 6, 6, 6, 6, 0},
            {0, 6,    6,    6, 6, 6, 6, 6, 6, 0},
            {0, 6,    6,    6, 6, 6, 6, 6, 6, 0},
            {0, 6,    6,    6, 6, 6, 6, 6, 6, 0},
            {0, 6,    6,    6, 6, 6, 6, 6, 6, 0},
            {0, 0,    0,    0, 0, 0, 0, 0, 0, 0}
        }

};
int pLus[10][10]{
{15,15,15,15,0,0,15,15,15,15},
{15,15,15,15,0,0,15,15,15,15},
{15,15,15,15,0,0,15,15,15,15},
{15,15,15,15,0,0,15,15,15,15},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{15,15,15,15,0,0,15,15,15,15},
{15,15,15,15,0,0,15,15,15,15},
{15,15,15,15,0,0,15,15,15,15},
{15,15,15,15,0,0,15,15,15,15}
};
int eq[10][10]{
{15,15,15,15,15,15,15,15,15,15},
{15,15,15,15,15,15,15,15,15,15},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{15,15,15,15,15,15,15,15,15,15},
{15,15,15,15,15,15,15,15,15,15},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{15,15,15,15,15,15,15,15,15,15},
{15,15,15,15,15,15,15,15,15,15}
};
int good[10][10]{
{15,15,15,15,15,15,15,15,15,15},
{15,15,15,15,15,15,15,15,15,2},
{15,15,15,15,15,15,15,15,2,15},
{15,15,15,15,15,15,15,2,15,15},
{15,15,15,15,15,15,2,15,15,15},
{15,2,15,15,15,2,15,15,15,15},
{15,15,2,15,2,15,15,15,15,15},
{15,15,15,2,15,15,15,15,15,15},
{15,15,15,15,15,15,15,15,15,15},
{15,15,15,15,15,15,15,15,15,15}
};
int bad[10][10]{
{15,15,15,15,15,15,15,15,15,15},
{15,15,15,15,15,15,15,15,15,15},
{15,15,4,15,15,15,4,15,15,15},
{15,15,15,4,15,4,15,15,15,15},
{15,15,15,15,4,15,15,15,15,15},
{15,15,15,4,15,4,15,15,15,15},
{15,15,4,15,15,15,4,15,15,15},
{15,15,15,15,15,15,15,15,15,15},
{15,15,15,15,15,15,15,15,15,15},
{15,15,15,15,15,15,15,15,15,15}
};
int nums[10][10][5]{
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,0,0,0,7},
    {7,0,7,7,7},
    {7,0,7,7,7},
    {7,0,7,7,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,0,7,7,7},
    {7,0,7,7,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,0,7,7,7},
    {7,0,7,7,7},
    {7,0,0,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    },
    {
    {7,7,7,7,7},
    {7,0,0,0,7},
    {7,0,7,0,7},
    {7,0,7,0,7},
    {7,0,0,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,7,7,0,7},
    {7,0,0,0,7},
    {7,7,7,7,7}
    }
};
int player[20][10] = {
    {15, 15, 15, 15, 15, 15, 15, 15, 15, 15},
    {15, 15, 0, 0, 0, 0, 0, 0, 15, 15},
    {15, 15, 0, 0, 0, 0, 0, 0, 15, 15},
    {15, 15, 14, 14, 0, 0, 0, 0, 15, 15},
    {15, 15, 14, 14, 14, 14, 0, 0, 15, 15},
    {15, 15, 14, 14, 14, 14, 14, 14, 15, 15},
    {15, 15, 14, 14, 14, 14, 14, 14, 15, 15},
    {15, 15, 15, 3, 3, 3, 3, 15, 15, 15},
    {15, 15, 15, 3, 3, 3, 3, 15, 15, 15},
    {6, 3, 3, 3, 3, 3, 3, 15, 15, 15},
    {6, 3, 3, 3, 3, 3, 3, 15, 15, 15},
    {15, 15, 15, 3, 3, 3, 3, 15, 15, 15},
    {15, 15, 15, 3, 3, 3, 3, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 3, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 1, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 1, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 1, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 1, 15, 15, 15},
    {15, 15, 15, 1, 1, 1, 1, 15, 15, 15},
    {15, 15, 15, 8, 8, 8, 8, 15, 15, 15},
};
ofstream wlog("log.txt"); //日志输出
struct obj{
    int id,num;
};
vector<obj>bag;
int pointer1,pointer2,pointer3;
//程序函数
int WDOUBLE = 0;
void hello() { //首次运行设置
    nofastedit();
    cursor(false);
    SetConsoleActiveScreenBuffer(hsout);
    swrite("你好,欢迎使用SUPERCRAFT。\n");
    swrite("在开始之前,我们需要进行一些设置。\n");
    swrite("[按任意键继续]");
    getch();
    system("cls");
    swrite("在显示的两个正方形中,选择较为规整的一个\n");
    swrite("[按任意键继续]");
    getch();
    system("cls");
    SetConsoleActiveScreenBuffer(hout);
    setfontsize(4, 4);
    for (int i = 1; i <= 10; i++) {
        WORD w[1005];
        int pos = 0;
        COORD coord = {1, i};
        for (int j = 1; j <= 10; j++) {
            w[pos++] = get_font(15, 15);
        }
        WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
    }
    for (int i = 1; i <= 10; i++) {
        WORD w[1005];
        int pos = 0;
        COORD coord = {13, i};
        for (int j = 1; j <= 10; j++) {
            w[pos++] = get_font(15, 15);
            w[pos++] = get_font(15, 15);
        }
        WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
    }
    getch();
    system("cls");
    SetConsoleActiveScreenBuffer(hsout);
    swrite("哪一个正方形是最规整的?\n");
    swrite("1.左边的  2.右边的");
reinput:
    int ipt = getch();
    if (ipt == '1') {
        WDOUBLE = 0;
    } else if (ipt == '2') {
        WDOUBLE = 1;
    } else {
        goto reinput;
    }
    system("cls");
    swrite("按+/-调整窗口大小,F键确定\n");
    swrite("请保持白色方块为正方形\n[按任意键继续]");
    getch();
    SetConsoleActiveScreenBuffer(hout);
    if (WDOUBLE == 0) {
        system("mode con:cols=200 lines=100");
    } else {
        system("mode con:cols=400 lines=100");
    }
    if (WDOUBLE == 0) {
        for (int i = 1; i <= 10; i++) {
            WORD w[1005];
            int pos = 0;
            COORD coord = {1, i};
            for (int j = 1; j <= 10; j++) {
                w[pos++] = get_font(4, 4);
            }
            WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
        }
    } else {
        for (int i = 1; i <= 10; i++) {
            WORD w[1005];
            int pos = 0;
            COORD coord = {1, i};
            for (int j = 1; j <= 10; j++) {
                w[pos++] = get_font(4,4);
                w[pos++] = get_font(4, 4);
            }
            WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
        }
    }
    int sizes = 4;
    while (1) {
        int ipt = getch();
        if (ipt == '+' || ipt == '=') {
            sizes++;
            setfontsize(sizes, sizes);
            if (WDOUBLE == 0) {
                system("mode con:cols=200 lines=100");
            } else {
                system("mode con:cols=400 lines=100");
            }
        }
        if (ipt == '-' || ipt == '_') {
            sizes--;
            if (sizes < 1) {
                sizes = 1;
            }
            setfontsize(sizes, sizes);
            if (WDOUBLE == 0) {
                system("mode con:cols=200 lines=100");
            } else {
                system("mode con:cols=400 lines=100");
            }
        }
        if (WDOUBLE == 0) {
            for (int i = 1; i <= 10; i++) {
                WORD w[1005];
                int pos = 0;
                COORD coord = {1, i};
                for (int j = 1; j <= 10; j++) {
                    w[pos++] = get_font(15, 15);
                }
                WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
            }
        } else {
            for (int i = 1; i <= 10; i++) {
                WORD w[1005];
                int pos = 0;
                COORD coord = {1, i};
                for (int j = 1; j <= 10; j++) {
                    w[pos++] = get_font(15, 15);
                    w[pos++] = get_font(15, 15);
                }
                WriteConsoleOutputAttribute(hout, w, pos, coord, &written);
            }
        }
        if (ipt == 'f' || ipt == 'F') {
            break;
        }
    }
    SetConsoleActiveScreenBuffer(hsout);
    system("cls");
    ofstream sout("sets");
    sout << WDOUBLE << " " << sizes;
    sout.close();
    swrite("谢谢!\n设置已保存,以后将不会出现此窗口。\n");
    swrite("如果对此次设定不满意,可以删除sets文件以重新设置\n[按任意键继续]");
    getch();
    SetConsoleActiveScreenBuffer(hout);
}

int world[5005][256];
int X = 25000, Y = 1280, LR = 0, FPS = 60; //玩家位置


int output[201][121]; //输出缓存

void sendprint() { //绘制控制台
    WORD col[24005] = {};
    int pos = 0;
    //将二维数组存储到一维内
    for (int i = 1; i <= 120; i++) {
        for (int j = 1; j <= 200; j++) {
            col[pos] = get_font(output[j][i], output[j][i]);
            pos++;
        }
    }
    writefont(col, 24000);
}
bool unLight[5005][256];
void sendprint_double() { //绘制控制台
    WORD col[48005] = {};
    int pos = 0;
    //将二维数组存储到一维内
    for (int i = 1; i <= 120; i++) {
        for (int j = 1; j <= 200; j++) {
            col[pos] = get_font(output[j][i], output[j][i]);
            pos++;
            col[pos] = get_font(output[j][i], output[j][i]);
            pos++;
        }
    }
    writefont(col, 48000);
}
 //世界

int dx[4]{0,0,-1,1},dy[4]{1,-1,0,0};
map<int,bool>unblock;
struct craft{
    int num1,id1,num2,id2,num3,id3,num4,id4;
};
vector<craft>crafta,craftb,craftc;
int mode=0;
void init();
void render_block(int y,int x,int id){
    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
            output[x+i][y+j]=blocks[id][j][i];
        }
    }
}
void render_plus(int y,int x,int black=0,int white=15){
    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
            output[x+i][y+j]=(pLus[j][i]?white:black);
        }
    }
}
void render_eq(int y,int x,int black=0,int white=15){
    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
            output[x+i][y+j]=(eq[j][i]?white:black);
        }
    }
}
void render_number(int y,int x,int num,int black=0,int
white=15){
    for(int i=0;i<5;i++){
        for(int j=0;j<10;j++){
            int k=nums[num/10][j][i];
            output[x+i][y+j]=(k?white:black);
        }
    }
    for(int i=0;i<5;i++){
        for(int j=0;j<10;j++){
            int k=nums[num%10][j][i];
            output[x+i+5][y+j]=(k?white:black);
        }
    }
}
void render_good(int y,int x){
    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
            output[x+i][y+j]=good[j][i];
        }
    }
}
void render_bad(int y,int x){
    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
            output[x+i][y+j]=bad[j][i];
        }
    }
}
bool check(craft a){
    int s1=0,s2=0,s3=0;
    for(int i=0;i<bag.size();i++){
        if(bag[i].id==a.id1){
            s1+=bag[i].num;
        }
        if(bag[i].id==a.id2){
            s2+=bag[i].num;
        }
        if(bag[i].id==a.id3){
            s3+=bag[i].num;
        }
    }
    if((s1>=a.num1||a.id1==0)&&(s2>=a.num2||a.id2==0)&&(
    s3>=a.num3||a.id3==0)){
        return 1;
    }
    return 0;
}
void Craft(craft cr){
    int s1=cr.num1,s2=cr.num2,s3=cr.num3;
    for(int i=0;i<bag.size();i++){
        if(bag[i].id==cr.id1&&s1!=0){
            if(bag[i].num>=s1){
                bag[i].num-=s1;
            }else{
                s1-=bag[i].num;
                bag[i].num=0;
            }
        }
        if(bag[i].id==cr.id2&&s2!=0){
            if(bag[i].num>=s2){
                bag[i].num-=s2;
            }else{
                s2-=bag[i].num;
                bag[i].num=0;
            }
        }
        if(bag[i].id==cr.id3&&s3!=0){
            if(bag[i].num>=s3){
                bag[i].num-=s3;
            }else{
                s3-=bag[i].num;
                bag[i].num=0;
            }
        }
    }
    for(int i=0;i<bag.size();i++){
        if(bag[i].num==0){
            bag.erase(bag.begin()+i);
            i--;
        }
    }
    obj o;
    o.num=cr.num4;
    o.id=cr.id4;
    for(int i=0;i<bag.size();i++){
        if(o.id==bag[i].id){
            bag[i].num+=o.num;
            return;
        }
    }
    bag.push_back(o);
}
bool check_block_unlight(int m){
    return m==3||m==4||m==8||m==9||m==10||m==13;
}
bool check_light(int x,int y){
    for(int i=0;i<=3;i++){
        if(unLight[x+dx[i]][y+dy[i]]==0&&!check_block_unlight(
        world[x+dx[i]][y+dy[i]])){
            return 1;
        }
    }
    return 0;
}
void console() { //设置控制台
    system("title SUPERCRAFT");
    system("chcp 936");
    system("cls");
    hsout = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 1, NULL);
    if (!access("sets")) { //不存在
        hello();
    }
    cout<<"请输入存档名:(输入none重新建档)";
    cin>>xs;
    if(xs=="none"){
        cout<<"请输入档名:"
        ;cin>>xs;
        generation(-1);

    }else{
        ifstream sin(xs.c_str());
        for(int i=1;i<=5000;i++){
            for(int j=1;j<=256;j++){
                sin>>world[i][j];
            }
        }
        for(int i=1;i<=5000;i++){
            for(int j=1;j<=256;j++){
                int x;
                sin>>unLight[i][j];//=bool(x);
            }
        }
        sin>>X>>Y;
        int t,t2;
        while(sin>>t>>t2){
            bag.push_back({t,t2});
        }
    }
    nofastedit(); //关闭快速输入
    cursor(false); //关闭光标显示
    ifstream sin("sets");
    int sizes;
    sin >> WDOUBLE >> sizes; //读入设置
    sin.close();
    setfontsize(sizes, sizes);
    if (WDOUBLE == 0) {
        system("mode con:cols=200 lines=120");
    } else {
        system("mode con:cols=400 lines=120");
    }
}
void render() { //软件渲染器
    if(mode==0){
        int x_left = X / 10 - 9,
        x_right = (X % 10 == 0) ? (X / 10 + 10) :
         (X / 10 + 11); //计算需要渲染的左边线和右边线
        int y_left = (Y % 10 == 0) ? (Y / 10 - 5) :
         (Y / 10 - 6), y_right = Y / 10 + 5; //计算需要渲染的上边线和下边线
        int x_more = X % 10, y_more = Y % 10; //计算多出的部分
        int x_pos = 1, y_pos = 1; //渲染位置计算
        //渲染世界
        for (int i = x_left; i <= x_right; i++) {
            y_pos = 1;
            for (int j = y_right; j >= y_left; j--) {
                for (int p_i = 0; p_i < 10; p_i++) {
                    for (int p_j = 0; p_j < 10; p_j++) {
                        if (x_pos + p_i - x_more < 0 ||
                        x_pos + p_i - x_more > 200 ||
                         y_pos - p_j + y_more < 0 ||
                         y_pos - p_j + y_more > 100) {
                            continue; //如果越界则跳过
                        }
                        if(check_light(i,j)){
                        unLight[i][j]=0;
                        output[x_pos + p_i - x_more][y_pos - p_j
                         + y_more] = blocks[world[i][j]][9 - p_j
                         ][p_i];
                        }else
                        output[x_pos + p_i - x_more][y_pos - p_j
                         + y_more]=0;
                    }
                }
                y_pos += 10;
            }
            x_pos += 10;
        }
        //渲染玩家
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 20; j++) {
                if (LR == 0) {
                    if (player[j][i] != 15) {
                        output[91 + i][36 + j] = player[j][i];
                    }
                } else {
                    if (player[j][9 - i] != 15) {
                        output[91 + i][36 + j] = player[j][9 - i];
                    }
                }
            }
        }
    }
    else if(mode==1){
        for(int i=1;i<=200;i++){
            for(int j=1;j<=100;j++){
                output[i][j]=15;
            }
        }
        for(int i=pointer3;i<crafta.size()&&i<pointer3+10;i++){
            int k=i-pointer3;
            render_number(k*11+1,0,crafta[i].num1);
            render_block(k*11+1,10,crafta[i].id1);
            render_plus(k*11+1,20);
            render_number(k*11+1,30,crafta[i].num2);
            render_block(k*11+1,40,crafta[i].id2);
            render_plus(k*11+1,50);
            render_number(k*11+1,60,crafta[i].num3);
            render_block(k*11+1,70,crafta[i].id3);
            render_eq(k*11+1,80);
            render_number(k*11+1,90,crafta[i].num4);
            render_block(k*11+1,100,crafta[i].id4);
            if(check(crafta[i])){
                render_good(k*11+1,120);
            }else{
                render_bad(k*11+1,120);
            }
        }
    }else if(mode==2){
        for(int i=1;i<=200;i++){
            for(int j=1;j<=100;j++){
                output[i][j]=15;
            }
        }
        for(int i=pointer3;i<craftb.size()&&i<pointer3+10;i++){
            int k=i-pointer3;
            render_number(k*11+1,0,craftb[i].num1);
            render_block(k*11+1,10,craftb[i].id1);
            render_plus(k*11+1,20);
            render_number(k*11+1,30,craftb[i].num2);
            render_block(k*11+1,40,craftb[i].id2);
            render_plus(k*11+1,50);
            render_number(k*11+1,60,craftb[i].num3);
            render_block(k*11+1,70,craftb[i].id3);
            render_eq(k*11+1,80);
            render_number(k*11+1,90,craftb[i].num4);
            render_block(k*11+1,100,craftb[i].id4);
            if(check(craftb[i])){
                render_good(k*11+1,120);
            }else{
                render_bad(k*11+1,120);
            }
        }
    }else if(mode==3){
        for(int i=1;i<=200;i++){
            for(int j=1;j<=100;j++){
                output[i][j]=15;
            }
        }
        for(int i=pointer3;i<craftc.size()&&i<pointer3+10;i++){
            int k=i-pointer3;
            render_number(k*11+1,0,craftc[i].num1);
            render_block(k*11+1,10,craftc[i].id1);
            render_plus(k*11+1,20);
            render_number(k*11+1,30,craftc[i].num2);
            render_block(k*11+1,40,craftc[i].id2);
            render_plus(k*11+1,50);
            render_number(k*11+1,60,craftc[i].num3);
            render_block(k*11+1,70,craftc[i].id3);
            render_eq(k*11+1,80);
            render_number(k*11+1,90,craftc[i].num4);
            render_block(k*11+1,100,craftc[i].id4);
            if(check(craftc[i])){
                render_good(k*11+1,120);
            }else{
                render_bad(k*11+1,120);
            }
        }
    }
    int colour=(jianzao?9:12);
    for(int i=0;i+pointer2*20<bag.size();i++){
        for(int j=0;j<5;j++){
            for(int k=0;k<10;k++){
                if(pointer1!=i)
                    output[i*10+1+j][111+k]=nums[bag[i
                    +pointer2*20].num%100/10][k][j];
                else
                    output[i*10+1+j][111+k]=((nums[bag[i+
                    pointer2*20].num%100/10][k][j]==0)?colour:7);
            }
        }
        for(int j=0;j<5;j++){
            for(int k=0;k<10;k++){
                if(pointer1!=i)
                    output[i*10+6+j][111+k]=nums[bag[i+
                    pointer2*20].num%10][k][j];
                else
                    output[i*10+6+j][111+k]=((nums[bag[i+
                    pointer2*20].num%10][k][j]==0)?colour:7);
            }
        }
    }
    for(int i=0;i+pointer2*20<bag.size();i++){
        for(int j=0;j<10;j++){
            for(int k=0;k<10;k++){
                output[i*10+1+j][101+k]=blocks[bag[i+pointer2*20
                ].id][k][j];
            }
        }
    }
    for(int i=max((int)bag.size()-pointer2*20,0);i<=20;i++){
        for(int j=0;j<10;j++){
            for(int k=0;k<20;k++){
                output[i*10+1+j][101+k]=0;
            }
        }
    }
}
void dfs_dong(int st,int x,int y){
    if(x<=2||y<=2||x>=4900||world[x][y]==0||st==0){
        return ;
    }
    world[x][y]=0;
    for(int i=0;i<3;i++){
        if(rand(1,3)>1){
            dfs_dong(st-1,x+dx[i],y+dy[i]);
        }
    }
}
void generation(int seed) {
    //生成种子
    if (seed == -1) {
        srand(time(0));
        srand(rand() + time(0));
        seed = rand();
    }
    srand(seed);
    //生成空气
    for (int i = 0; i < 5000; i++) {
        for (int j = 1; j < 256; j++) {
            world[i][j] = 0;
        }
    }
    //生成基本地形
    int grass = rand(50, 80);
    int higher = rand(1, 3);
    int trend = 1, stop_sum = 1;
    bool biome = rand(0, 1);
    int tree;
    for (int i = 0; i < 5000; i++) {
        world[i][0] = 4; //基岩
        
        for (int j = 1; j < grass - 3; j++) {
            unLight[i][j]=1;
            if(i<80||i>4920){
                world[i][j]=4;
                continue;
            }
            if(j==14){
                if(rand(1,14)==1){
                    world[i][j]=9;
                    continue;
                }
            }
            if(rand(1,1000)==1){
                dfs_dong(rand(3,5),i-1,j);
            }
            if(rand(1,6000)==1){
                dfs_dong(rand(12,15),i-1,j);
            }
            if(rand(1,20000)==1){
                dfs_dong(rand(20,30),i-1,j);
            }
            if(rand(1,30)!=1){
                world[i][j]=3;
            }else if(rand(1,5)!=1){
                world[i][j]=8+rand(0,1)*5;
            }else if(rand(1,5)==3&&j<20){
                world[i][j]=9;
            }else{
                world[i][j]=10;
            }
        }
        for (int j = grass - 3; j < grass; j++) {
            world[i][j] = 2; //泥土
        }
        world[i][grass] = 1;
        if(tree==0&&(world[i][grass]!=5&&grass>63))
            tree=int(!rand(0,20))*5;
        else
            tree=0;
        if(tree!=0&&i>100&&i<4900){
            for(int j=grass+1;j<grass+tree;j++){
                world[i][j]=6;
                if(j==grass+tree-1){
                    for(int k=-2;k<=2;k++){
                        if(world[i+k][j]==0){
                            world[i+k][j]=7;
                        }
                    }
                    for(int k=-2;k<=2;k++){
                        if(world[i+k][j+1]==0){
                            world[i+k][j+1]=7;
                        }
                    }
                    for(int k=-1;k<=1;k++){
                        if(world[i+k][j+2]==0){
                            world[i+k][j+2]=7;
                        }
                    }
                }
            }
        }
        
        if (biome) { //生成下一个草方块高度
            if (rand(0, 7) == 3) {
                grass += trend;
                stop_sum = 1;
            } else {
                stop_sum++;
            }
        } else {
            if (rand(0, nozero(3 - stop_sum)) == 0) {
                grass += trend * higher;
                stop_sum = 1;
            } else {
                stop_sum++;
            }
        }
        //随机更新高度
        if (rand(0, 1) == 1) {
            higher++;
        } else {
            higher--;
        }
        if (rand(0, 40) == 10) {
            trend *= -1;
        }
        if (rand(0, 100) == 50) {
            biome = !biome;
        }
        //限制范围
        if (grass > 120) {
            grass = 120;
        }
        if (grass < 40) {
            grass = 40;
        }
        if (higher > 2) {
            higher = 2;
        }
        if (higher < 1) {
            higher = 1;
        }
        if(grass<=55){
            if(rand(1,3)==3){
                trend=1;
            }
        }
        
    }
}
void *printmain(void *arg) {
    clock_t st, tmp;
    int sum = 0, fps = -1;
    char t[1005];
    st = clock();
    while (1) {
        render(); //软件渲染
        if (WDOUBLE == 0) { //发送渲染
            sendprint();
        } else {
            sendprint_double();
        }
        sum++; //记录渲染个数
        sprintf(t, "SUPERCRAFT (X:%.1f,Y:%.1f,FPS:%d)", X * 1.0 / 10.0, Y * 1.0 / 10.0, fps); //输出FPS,坐标
        tmp = clock();
        if (tmp - st >= 1000) { //计算FPS
            fps = sum / ((tmp - st) / 1000.0);
            sum = 0;
            st = tmp;
        }
        SetConsoleTitleA(t); //输出FPS
    }
}
bool canin(int x) { //判断人能否进入方块
    return x == 0 || x == 5||x==6||x==7;
}
bool _canin(int x,int y){
    return canin(world[x/10][y/10]);
}
void inita(){
    craft now_craft;
    now_craft.id1=6;    now_craft.num1=1;
    now_craft.id2=0;    now_craft.num2=0;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=11;    now_craft.num4=4;
    crafta.push_back(now_craft);
    
    now_craft.id1=11;    now_craft.num1=4;
    now_craft.id2=0;    now_craft.num2=0;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=12;    now_craft.num4=1;
    crafta.push_back(now_craft);
}
void initb(){
    craft now_craft;
    now_craft.id1=6;    now_craft.num1=1;
    now_craft.id2=0;    now_craft.num2=0;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=11;    now_craft.num4=4;
    craftb.push_back(now_craft);

    now_craft.id1=11;    now_craft.num1=4;
    now_craft.id2=0;    now_craft.num2=0;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=12;    now_craft.num4=1;
    craftb.push_back(now_craft);
    
    now_craft.id1=9;    now_craft.num1=9;
    now_craft.id2=0;    now_craft.num2=0;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=14;    now_craft.num4=1;
    craftb.push_back(now_craft);
    
    now_craft.id1=3;    now_craft.num1=8;
    now_craft.id2=0;    now_craft.num2=0;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=15;    now_craft.num4=1;
    craftb.push_back(now_craft);
    
    now_craft.id1=16;    now_craft.num1=9;
    now_craft.id2=0;    now_craft.num2=0;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=18;    now_craft.num4=1;
    craftb.push_back(now_craft);
    
    now_craft.id1=17;    now_craft.num1=9;
    now_craft.id2=0;    now_craft.num2=0;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=19;    now_craft.num4=1;
    craftb.push_back(now_craft);
}
void initc(){
    craft now_craft;
    now_craft.id1=8;    now_craft.num1=1;
    now_craft.id2=11;    now_craft.num2=1;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=16;    now_craft.num4=1;
    craftc.push_back(now_craft);
    
    now_craft.id1=10;    now_craft.num1=1;
    now_craft.id2=11;    now_craft.num2=1;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=17;    now_craft.num4=1;
    craftc.push_back(now_craft);
    
    now_craft.id1=8;    now_craft.num1=6;
    now_craft.id2=13;    now_craft.num2=1;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=16;    now_craft.num4=6;
    craftc.push_back(now_craft);
    
    now_craft.id1=10;    now_craft.num1=6;
    now_craft.id2=13;    now_craft.num2=1;
    now_craft.id3=0;    now_craft.num3=0;
    now_craft.id4=17;    now_craft.num4=6;
    craftc.push_back(now_craft);
}
int main() {
    inita();
    initb();
    initc();
    console(); //控制台设置
    pthread_create(NULL, NULL, printmain, NULL); //创建渲染线程
    //生成世界
    int jumps = 0;
    int cnt[129]{0};
    while (1) { //主循环:游戏刻
        if(mode==0){//世界部分
            {//行动部分
                if (keydown('A') &&_canin(X-1,Y-4)&&_canin(X-1,Y+6)) {
                    X--; //向左走
                    LR = 0;
                }
                if (keydown('D') && _canin(X+10,Y-4)&&_canin(X+10,Y+6)) {
                    X++; //向右走
                    LR = 1;
                }
                if (keydown('W') &&!(_canin(X,Y-6)&&_canin(X+9,Y-6))) {
                    jumps = 18; //跳跃(判断)
                }

                if(jumps>0||_canin(X,Y-5)&&_canin(X+9,Y-5)){
                    if(jumps>0)
                        for(int i=1;i<=jumps/6;Y++,i++){
                            if(!(_canin(X,Y+14)&&_canin(X+9,Y+14))){
                                Y-=3;
                                jumps=0;
                                break;
                            }
                        }
                    else{
                        for(int i=1;i<=jumps/-6;Y--,i++){
                            if(!(_canin(X,Y-5)&&_canin(X+9,Y-5))){
                                Y++;
                                break;
                            }
                        }
                    }
                    while(!(_canin(X,Y-5)&&_canin(X+9,Y-5))){
                        Y++;
                    }
                    jumps--;
                } else     {
                    jumps=0;
                }
            }
            {//挖掘测试
                bool flag=0;
                int*m;
                if(keydown(' ')){
                    cnt[' ']++;
                    if(cnt[' ']%9==8)
                        jianzao=!jianzao;
                }
                if(keydown('H')){
                    cnt['h']++;
                    if(cnt['h']%5==2){
                        m=&world[(X+15)/10][Y/10];
                        flag=1;
                    }
                }
                if(keydown('Y')){
                    cnt['y']++;
                    if(cnt['y']%5==2){

                    m=&world[(X+15)/10][(Y+10)/10];    flag=1;}
                }
                if(keydown('F')){
                    cnt['f']++;
                    if(cnt['f']%5==2){

                    m=&world[(X-5)/10][Y/10];flag=1;}
                }
                  if(keydown('R')){
                      cnt['r']++;
                    if(cnt['r']%5==2){

                    m=&world[(X-5)/10][(Y+10)/10];flag=1;}
                }
                if(keydown('T')){
                    cnt['t']++;
                    if(cnt['t']%5==2)
                       if(LR==0){
                        m=&world[X/10][(Y+20)/10];
                        flag=1;
                    }else{
                        m=&world[(X+9)/10][(Y+20)/10];
                        flag=1;
                    }
                }
                if(keydown('G')){
                    cnt['g']++;
                    if(cnt['g']%5==2)
                    if(LR==0){
                        m=&world[X/10][(Y-10)/10];
                        flag=1;
                    }else{
                        m=&world[(X+9)/10][(Y-10)/10];
                        flag=1;
                    }
                }
                if(flag==1){
                    int&k=*m;
                    if(k!=0&&k!=4&&!jianzao){
                        for(int i=0;i<bag.size();i++){
                            if(bag[i].id==k){
                                bag[i].num++;
                                goto gt;
                            }
                        }
                        bag.push_back({k,1});
                        gt:;
                        k=0;
                    }else if(k==0&&jianzao){
                        int p1=pointer1,p2=pointer2;
                        if(bag.size()>p2*20+p1){
                            k=bag[p2*20+p1].id;
                            bag[p2*20+p1].num--;
                            if(bag[p2*20+p1].num==0){
                                bag.erase(bag.begin()+p2*20+p1);
                            }
                        }
                    }
                }

            }
            if(keydown('E')){
                cnt['e']++;
                if(cnt['e']%7==6){
                    cnt['e']=0;
                    if(bag[pointer1+pointer2*20].id!=12&&
                    bag[pointer1+pointer2*20].id!=15){
                        pointer3=0;
                        mode=1;
                    }else if(bag[pointer1+pointer2*20].id==12){
                        pointer3=0;
                        mode=2;
                    }else if(bag[pointer1+pointer2*20].id==15){
                        pointer3=0;
                        mode=3;
                    }
                }
            }
        }
        else if(mode==1){//合成部分
            if(keydown('E')){
                cnt['e']++;
                if(cnt['e']%7==6){
                    cnt['e']=0;
                    mode=0;
                }
            }
            if(keydown(' ')){
                cnt[' ']++;
                    if(cnt[' ']%9==8){
                        if(check(crafta[pointer3])){
                            Craft(crafta[pointer3]);
                        }
                    }
            }
            if(keydown('I')){
                cnt['i']++;
                    if(cnt['i']%9==8){
                        pointer3--;
                        if(pointer3<0){
                            pointer3=0;
                        }
                    }
            }
            if(keydown('K')){
                cnt['k']++;
                    if(cnt['k']%9==8){
                        pointer3++;
                        if(pointer3>=crafta.size()){
                            pointer3=crafta.size()-1;
                        }
                    }
            }
        }
        else if(mode==2){//合成部分2
            if(keydown('E')){
                cnt['e']++;
                if(cnt['e']%7==6){
                    cnt['e']=0;
                    mode=0;
                }
            }
            if(keydown(' ')){
                cnt[' ']++;
                    if(cnt[' ']%9==8){
                        if(check(craftb[pointer3])){
                            Craft(craftb[pointer3]);
                        }
                    }
            }
            if(keydown('I')){
                cnt['i']++;
                    if(cnt['i']%9==8){
                        pointer3--;
                        if(pointer3<0){
                            pointer3=0;
                        }
                    }
            }
            if(keydown('K')){
                cnt['k']++;
                    if(cnt['k']%9==8){
                        pointer3++;
                        if(pointer3>=craftb.size()){
                            pointer3=craftb.size()-1;
                        }
                    }
            }
        }else if(mode==3){//合成部分3
            if(keydown('E')){
                cnt['e']++;
                if(cnt['e']%7==6){
                    cnt['e']=0;
                    mode=0;
                }
            }
            if(keydown(' ')){
                cnt[' ']++;
                    if(cnt[' ']%9==8){
                        if(check(craftc[pointer3])){
                            Craft(craftc[pointer3]);
                        }
                    }
            }
            if(keydown('I')){
                cnt['i']++;
                    if(cnt['i']%9==8){
                        pointer3--;
                        if(pointer3<0){
                            pointer3=0;
                        }
                    }
            }
            if(keydown('K')){
                cnt['k']++;
                    if(cnt['k']%9==8){
                        pointer3++;
                        if(pointer3>=craftc.size()){
                            pointer3=craftc.size()-1;
                        }
                    }
            }
        }
        {//背包测试
            if (keydown('O') ) {
                cnt['o']++;

            }
            if (keydown('P') ) {
                cnt['p']++;

            }

            if(cnt['p']%8==7){
                pointer1++;
                cnt['p']++;
                if(pointer1>19){
                    pointer1=0;
                    pointer2++;
                    if(pointer2*20>=bag.size()){
                        pointer2=0;
                        pointer1=0;
                    }
                }
            }
            if(cnt['o']%8==7){
                cnt['o']++;
                pointer1--;
                if(pointer1<0){
                    pointer1=19;
                    pointer2--;
                    if(pointer2<0){
                        pointer2=0;
                    }
                }
            }
        }
        if(keydown('Z')){
            ofstream fout(xs.c_str());
            for(int i=1;i<=5000;i++){
                for(int j=1;j<=256;j++){
                    fout<<world[i][j]<<" ";
                }
            }
            for(int i=1;i<=5000;i++){
                for(int j=1;j<=256;j++){
                    fout<<unLight[i][j]<<" ";
                }
            }
            fout<<X<<" "<<Y<<" ";
            for(int i=0;i<bag.size();i++){
                fout<<bag[i].id<<" "<<bag[i].num<<" ";
            }
            return 0;
        }
        Sleep(10);
    }
    return 0;
}


0
已采纳
薛乘志
薛乘志
初级启示者
初级启示者

不是,为什么我一挖方块就崩了...

0
0
0
0
0
0
0
0
熊潇然
熊潇然
初级启示者
初级启示者

你这个可以去问 @沙宸安 

0
0
包涵宇
包涵宇
中级天翼
中级天翼

你们的游戏太高级了,只能用深入浅出的一些简单知识和大佬们比一比了。。。

说实话,我连背景音乐都不会插。。。

0
0
我要回答