2
已解决
@沙宸安
使用Win32API直接修改屏幕缓冲区,效率N倍
不好用API改的部分(几乎)全部改为了printf()
并添加了FPS显示部分代码(不过可能没用,因为现在的玩家移动速度惊人,是个BUG,不要直接删去:
if (clock() - ti >= 1000) {
sprintf(tit, "XACRAFT 3.1 FPS:%d", int(pr_sum * 1.0 / ((clock() - ti) * 1.0 / 1000.0)));
pr_sum = 0;
ti = clock();
SetConsoleTitleA(tit);
}

在我家电脑上FPS高达62(也许可以考虑把一个方块改成8个格子了)
防屏蔽词链接:https://pastebin.ubuntu.com/p/QHyHFd2NXb/
int cun(int com) {
while (kd(char(13)));
xuanze = 1;
color(255);
cls();
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTitleA("XACRAFT 3.1 FPS:null");
char tit[1005] = {};
clock_t ti = clock();
int pr_sum = 0;
while (!kd('P')) {
cls();
tims[com] += 1;
if (tims[com] >= 10000) {
days[com]++;
tims[com] = 0;
}
if (tims[com] <= 5500) chuancan = 240;
else if (tims[com] <= 6000) chuancan = 224;
else if (tims[com] <= 9500) chuancan = 0;
else chuancan = 224;
if (tims[com] % 100 == 0) {
jb += (1 + days[com]);
emc += 1;
}
if (clock() - ti >= 1000) {
sprintf(tit, "XACRAFT 3.1 FPS:%d", int(pr_sum * 1.0 / ((clock() - ti) * 1.0 / 1000.0)));
pr_sum = 0;
ti = clock();
SetConsoleTitleA(tit);
}
int lines = 0;
for (i = x[com] + 10; i >= x[com] - 10; i--) {
char out[1005] = {};
WORD col[1005] = {};
char tmp[1005];
int pos = 0;
for (j = y[com] - 19; j <= y[com] + 19; j++) {
if (i == -1 || j < 0 || j > 2048) {
col[pos] = col[pos + 1] = 15;
sprintf(tmp, "▓");
out[pos] = tmp[0];
out[pos + 1] = tmp[1];
pos += 2;
//color(15);
//printf("▓");
} else if (i != x[com] || j != y[com]) {
if (bl[a[com][1][i][j]].hylink != 0) {
if (bl[a[com][1][i][j]].hylink == 1) {
col[pos] = col[pos + 1] = chuancan + bl[a[com][1][i][j]].cor;
out[pos] = bl[a[com][1][i][j]].ape[0];
out[pos + 1] = bl[a[com][1][i][j]].ape[1];
pos += 2;
}
//centerlink(a[com][1][i][j]);
} else {
col[pos] = col[pos + 1] = bl[a[com][1][i][j]].cor;
out[pos] = bl[a[com][1][i][j]].ape[0];
out[pos + 1] = bl[a[com][1][i][j]].ape[1];
pos += 2;
}
//print(a[com][1][i][j]);
} else {
col[pos] = col[pos + 1] = sehao;
out[pos] = pfd[0];
out[pos + 1] = pfd[1];
pos += 2;
//ppf(sehao);
}
}
COORD coord = {0, lines++};
DWORD writ;
WriteConsoleOutputCharacterA(hOut, out, pos, coord, &writ);
WriteConsoleOutputAttribute(hOut, col, pos, coord, &writ);
}
for (int i = 0; i <= 20; i++) {
printf("\n");
}
if (x[com] <= 1) {
x[com] = 1;
}
if (x[com] > 256) {
x[com] = 256;
}
if (y[com] < 0) {
y[com] = 0;
}
if (y[com] > 2048) {
y[com] = 2048;
}
color(15);
printf(">>状态栏 坐标: x:%d y:%d ", x[com], y[com]);
color(15);
printf(" 当前:");
if (kn) {
color(12);
printf("**");
} else {
color(10);
printf("建造");
}
color(15);
printf("模式(J切换) P-保存并退出 \n");
color(7);
int i, l, w;
string str = " " + wri(hand[com][xuanze].ui) + " \n";
w = 80;
l = str.length();
for (i = 0; i < (w - l) / 2; i++)
printf(" ");
printf(str.c_str());
color(7);
printf("\t\t\t ");
for (i = 1; i <= 9; i++) {
color(7);
if (hand[com][i].num != 0) {
print(hand[com][i].ui);
} else {
printf("□");
}
}
color(7);
printf(" \n\t\t\t ");
for (i = 1; i <= 9; i++) {
if (i == xuanze) color(11);
else color(7);
if (hand[com][i].num != 0) {
if (hand[com][i].num <= 64) printf("%02d", hand[com][i].num);
else if (hand[com][i].num < 100) printf("%d+", hand[com][i].num % 100 / 10);
else if (hand[com][i].num < 1000) printf("%d*", hand[com][i].num % 1000 / 100);
else printf("%d^", hand[com][i].num % 10000 / 1000);
} else {
printf("--");
}
}
printf(" ");
//Sleep(100);
if (cmmd == '/') {
cls();
color(12);
Line("命令");
bool flag = 0;
while (comd != "esc") {
color(7);
cout << "/";
cin >> comd;
if (comd == "tp") {
cout << "/tp @s ";
cin >> i >> j;
flag = 1;
x[com] = i;
y[com] = j;
comd = "esc";
}
if (!flag) {
color(12);
cout << ">>语法错误" << endl;
color(7);
}
}
comd = "?";
}
if (kd('E')) {
while (kd('E')) {
}
packback(com);
Sleep(100);
}
if (kd('W') && a[com][1][x[com] - 1][y[com]] != 0) {
if ((a[com][1][x[com] + 1][y[com]] == 0) && (a[com][1][x[com] + 2][y[com]] == 0) && (a[com][1][x[com] + 3][y[com]] == 0)) {
x[com] += 4;
} else if ((a[com][1][x[com] + 1][y[com]] == 0) && (a[com][1][x[com] + 2][y[com]] == 0) && (a[com][1][x[com] + 3][y[com]] != 0)) {
x[com] += 3;
} else if ((a[com][1][x[com] + 1][y[com]] == 0) && (a[com][1][x[com] + 2][y[com]] != 0)) {
x[com] += 2;
}
}
//if(cmmd=='S' || cmmd=='s') x[com]--;
if (a[com][1][x[com] - 1][y[com]] == 0) {
Sleep(20);
x[com]--;
}
if (kd('A')) {
if (a[com][1][x[com]][y[com] - 1] == 0 && a[com][1][x[com] - 1][y[com] - 1] == 0) {
x[com]--;
y[com]--;
} else if (a[com][1][x[com]][y[com] - 1] == 0 && a[com][1][x[com] - 1][y[com] - 1] != 0) {
y[com]--;
} else if (a[com][1][x[com]][y[com] - 1] != 0 && a[com][1][x[com] + 1][y[com] - 1] == 0 && a[com][1][x[com] + 1][y[com]] == 0) {
x[com]++;
y[com]--;
}
} //y[com]--;
if (kd('D')) {
if (a[com][1][x[com]][y[com] + 1] == 0 && a[com][1][x[com] - 1][y[com] + 1] == 0) {
x[com]--;
y[com]++;
} else if (a[com][1][x[com]][y[com] + 1] == 0 && a[com][1][x[com] - 1][y[com] + 1] != 0) {
y[com]++;
} else if (a[com][1][x[com]][y[com] + 1] != 0 && a[com][1][x[com] + 1][y[com] + 1] == 0 && a[com][1][x[com] + 1][y[com]] == 0) {
x[com]++;
y[com]++;
}
} //y[com]++;
if (kd('J')) {
kn = !kn;
while (kd('J')) {
}
}
if (kd('1')) xuanze = 1;
if (kd('2')) xuanze = 2;
if (kd('3')) xuanze = 3;
if (kd('4')) xuanze = 4;
if (kd('5')) xuanze = 5;
if (kd('6')) xuanze = 6;
if (kd('7')) xuanze = 7;
if (kd('8')) xuanze = 8;
if (kd('9')) xuanze = 9;
if (kd('Q') && a[com][1][x[com] + 1][y[com]] == 0 && /*a[com][1][x[com]-1][y[com]]!=0 &&*/ hand[com][xuanze].num != 0) {
x[com]++;
pt(com, 1, x[com] - 1, y[com], true);
}
if (kn) {
if (kd('Y')) {
//hand[com][a[com][1][x[com]+1][y[com]-1]]++;
//a[com][1][x[com]+1][y[com]-1]=0;
pt(com, 1, x[com] + 1, y[com] - 1, false);
}
if (kd('U')) {
//hand[com][a[com][1][x[com]+1][y[com]]]++;
//a[com][1][x[com]+1][y[com]]=0;
pt(com, 1, x[com] + 1, y[com], false);
}
if (kd('I')) {
//hand[com][a[com][1][x[com]+1][y[com]+1]]++;
//a[com][1][x[com]+1][y[com]+1]=0;
pt(com, 1, x[com] + 1, y[com] + 1, false);
}
if (kd('H')) {
//hand[com][a[com][1][x[com]][y[com]-1]]++;
//a[com][1][x[com]][y[com]-1]=0;
pt(com, 1, x[com], y[com] - 1, false);
}
if (kd('K')) {
//hand[com][a[com][1][x[com]][y[com]+1]]++;
//a[com][1][x[com]][y[com]+1]=0;
pt(com, 1, x[com], y[com] + 1, false);
}
if (kd('B')) {
//hand[com][a[com][1][x[com]-1][y[com]-1]]++;
//a[com][1][x[com]-1][y[com]-1]=0;
pt(com, 1, x[com] - 1, y[com] - 1, false);
}
if (kd('N')) {
//hand[com][a[com][1][x[com]-1][y[com]]]++;
//a[com][1][x[com]-1][y[com]]=0;
pt(com, 1, x[com] - 1, y[com], false);
}
if (kd('M')) {
//hand[com][a[com][1][x[com]-1][y[com]+1]]++;
//a[com][1][x[com]-1][y[com]+1]=0;
pt(com, 1, x[com] - 1, y[com] + 1, false);
}
}
if (!kn) {
if (kd('Y')) {
//hand[com][a[com][1][x[com]+1][y[com]-1]]++;
//a[com][1][x[com]+1][y[com]-1]=0;
pt(com, 1, x[com] + 1, y[com] - 1, true);
}
if (kd('U')) {
//hand[com][a[com][1][x[com]+1][y[com]]]++;
//a[com][1][x[com]+1][y[com]]=0;
pt(com, 1, x[com] + 1, y[com], true);
}
if (kd('I')) {
//hand[com][a[com][1][x[com]+1][y[com]+1]]++;
//a[com][1][x[com]+1][y[com]+1]=0;
pt(com, 1, x[com] + 1, y[com] + 1, true);
}
if (kd('H')) {
//hand[com][a[com][1][x[com]][y[com]-1]]++;
//a[com][1][x[com]][y[com]-1]=0;
pt(com, 1, x[com], y[com] - 1, true);
}
if (kd('K')) {
//hand[com][a[com][1][x[com]][y[com]+1]]++;
//a[com][1][x[com]][y[com]+1]=0;
pt(com, 1, x[com], y[com] + 1, true);
}
if (kd('B')) {
//hand[com][a[com][1][x[com]-1][y[com]-1]]++;
//a[com][1][x[com]-1][y[com]-1]=0;
pt(com, 1, x[com] - 1, y[com] - 1, true);
}
if (kd('N')) {
//hand[com][a[com][1][x[com]-1][y[com]]]++;
//a[com][1][x[com]-1][y[com]]=0;
pt(com, 1, x[com] - 1, y[com], true);
}
if (kd('M')) {
//hand[com][a[com][1][x[com]-1][y[com]+1]]++;
//a[com][1][x[com]-1][y[com]+1]=0;
pt(com, 1, x[com] - 1, y[com] + 1, true);
}
}
color(7);
pr_sum++;
}
while (kd('P'));
cmmd = '?';
while (cmmd != 'P' && cmmd != 'p') {
cmmd = getch();
}
cmmd = '?';
return 0;
}
薛乘志在2021-12-29 21:04:34追加了内容
@沙宸安
还有,我最近有了一个新的地形生成器思路,等我有时间来把思路发一下
