源代码
#include<bits/stdc++.h>
#include <conio.h>
//#include<winsock.h>//联机可能会用到
#include <windows.h>
#include <time.h>
#define key(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
int world[301][601];
int grass[601];
int x, y;
int seed;
int fps = 100, render = 10;
void _color(int a) {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
/* 1 深蓝色
2 深绿色
3 深青色
4 深红色
5 深粉色
i 黄色
7 深白色
8 灰色
9 浅蓝色
10 浅绿色
11 浅青色
12 浅红色
13 浅粉色
14 浅黄色
15 浅白色
背景
1~15 黑色
16~31 深蓝色
32~47 深绿色
48~63 深青色
64~79 深红色
'S'~95 深粉色
96~111 深黄色
112~127 深白色
128~143 灰色
144~159 浅蓝色
160~1'A' 浅绿色
176~191 浅青色
192~207 浅红色
208~223 浅粉色
224~239 浅黄色
240~255 浅白色
*/
}
struct item {
int color;//颜色
string appe;//外观
} block[1000];
void init() { //方块初始化,根据MC原版方块id设置
block[0].appe = " ";
block[0].color = 144; //air
block[1].appe = "██";
block[1].color = 8; //stone
block[2].appe = " ̄";
block[2].color = 47; //grass
block[3].appe = " ";
block[3].color = 111; //dirt
block[4].appe="||";
block[4].color=96;//wood
block[5].appe = "◆◆";
block[5].color = 14; // coal_ore
block[6].appe = "◆◆";
block[6].color = 8; // iron_ore
block[7].appe = "==";
block[7].color = 1; //bedrock
block[8].appe = "◆◆";
block[8].color = 15; // gold_ore
block[9].appe = "◆◆";
block[9].color = 11; // diamond_ore
block[18].appe="▓▓";
block[18].color=10;//leaf
}
int ran(int x) { //随机数激活种子
int a = 50;
for (int i = 1; i <= x; i++) {
a = rand();
}
return a;
}
void print(int id) { //输出方块
_color(block[id].color);
printf("%s", block[id].appe.c_str());
}
void spawn_tree(int x){//树
int height=ran(x)%3+4;
int treesize=1+(ran(x)%4);
int i,j;
if(grass[x]-2*treesize-height-1>=0){
for(i=1;i<=height;i++){
world[grass[x]-i][x]=4;
}
for(i=grass[x]-2*treesize-height-1;i<grass[x]-height;i++){
for(j=x-treesize;j<=x+treesize;j++){
world[i][j]=18;
}
}
}
}
void maps() { //地图初始化
int i, j;
int k;
grass[1] = ran(seed) % 15 + 20;
for (k = 2; k <= 600; k++) { //随机地形
if (ran(seed + k - 1) % 3 == 0)grass[k] = grass[k - 1] + 1;
else if (ran(seed + k - 1) % 3 == 1)grass[k] = grass[k - 1] - 1;
else grass[k] = grass[k - 1];
}
for (j = 1; j <= 600; j++) {
for (i = 1; i < grass[j]; i++) {
world[i][j] = 0;
}
for (i = grass[j]; i <= grass[j]; i++) {
world[i][j] = 2;
}
for (i = grass[j] + 1; i <= grass[j] + 10; i++) {
world[i][j] = 3;
}
for (i = grass[j] + 11; i <= 299; i++) {
world[i][j] = 1;
}
for (i = 300; i <= 300; i++) {
world[i][j] = 7;
}
}
// 矿洞生成(矿物只生成在矿洞壁上)
for (int cave = 0; cave < 40; cave++) {
int cave_x = ran(seed + cave * 100) % 600 + 1;
int cave_y = ran(seed + cave * 200) % 100 + grass[cave_x] + 15;
int cave_size = ran(seed + cave * 300) % 10 + 5;
// 先挖出矿洞(不生成矿物)
for (int i = -cave_size; i <= cave_size; i++) {
for (int j = -cave_size; j <= cave_size; j++) {
if (i*i + j*j <= cave_size*cave_size) {
int nx = cave_x + i;
int ny = cave_y + j;
if (nx >= 1 && nx <= 600 && ny >= 1 && ny <= 300) {
if (world[ny][nx] == 1) { // 只替换石头
world[ny][nx] = 0;
}
}
}
}
}
// 然后在矿洞壁上生成矿物(修正版)
for (int i = -cave_size; i <= cave_size; i++) {
for (int j = -cave_size; j <= cave_size; j++) {
if (i*i + j*j <= cave_size*cave_size) {
int nx = cave_x + i;
int ny = cave_y + j;
if (nx >= 1 && nx <= 600 && ny >= 1 && ny <= 300) {
// 检查是否是矿洞壁(当前是空气且周围有石头)
if (world[ny][nx] == 0) {
// 检查4个方向是否有石头
for (int dir = 0; dir < 4; dir++) {
int dir_x = nx + (dir==0?1:(dir==1?-1:0));
int dir_y = ny + (dir==2?1:(dir==3?-1:0));
if (dir_x >= 1 && dir_x <= 600 && dir_y >= 1 && dir_y <= 300) {
if (world[dir_y][dir_x] == 1) { // 相邻有石头
if (ran(ny * nx + seed + dir) % 10 == 0) { // 提高生成概率到1/10
int ore_type = ran(ny * nx + seed + dir) % 100;
if (ore_type < 60) world[dir_y][dir_x] = 5; // 煤矿
else if (ore_type < 85) world[dir_y][dir_x] = 6; // 铁矿
else if (ore_type < 95) world[dir_y][dir_x] = 8; // 金矿
else world[dir_y][dir_x] = 9; // 钻石矿
break; // 每个空气方块只生成一个矿物
}
}
}
}
}
}
}
}
}
}
for(i=7;i<=593;i++){
if(ran(grass[i])%11==8){
spawn_tree(i);
}
}
}
void screen() {
int i, j;
for (i = y - render; i < y + render; i++) {
for (j = x - render; j <= x + render; j++) {
if (i <= 0 || i > 300 || j <= 0 || j > 600) {
print(0);
} else if (i != y || j != x)print(world[i][j]);
else {
_color(11);
printf("[]");
}
}
_color(1);
printf("\n");
}
_color(14);
printf("POS X%d Y%d", x - 300, 300 - y);
}
void setting() {
int op = 1, ch = 1;
int newfps = fps, newrender = render;
while (1) {
system("cls");
_color(15);
printf("###Settings###\n");
if (key('W') && op > 1)op--;
if (key('S') && op < 4)op++;
if (op == 1) {
_color(9);
printf(">Frame rate");
if (newfps == 200)ch = 1;
else if (newfps == 100)ch = 2;
else if (newfps == 18)ch = 3;
if (key('A') && ch > 1)ch--;
if (key('D') && ch < 3)ch++;
if (ch == 1) {
printf("[5fps]");
newfps = 200;
} else {
printf(" 5fps ");
}
if (ch == 2) {
printf("[10fps]");
newfps = 100;
} else {
printf(" 10fps ");
}
if (ch == 3) {
printf("[50fps]\n");
newfps = 18;
} else {
printf(" 50fps \n");
}
} else {
_color(15);
printf("Frame rate\n");
}
if (op == 2) {
_color(9);
printf(">Render Distance");
if (newrender == 5)ch = 1;
else if (newrender == 10)ch = 2;
else if (newrender == 15)ch = 3;
if (key('A') && ch > 1)ch--;
if (key('D') && ch < 3)ch++;
if (ch == 1) {
printf("[5px]");
newrender = 5;
} else {
printf(" 5px ");
}
if (ch == 2) {
printf("[10px]");
newrender = 10;
} else {
printf(" 10px ");
}
if (ch == 3) {
printf("[15px]\n");
newrender = 15;
} else {
printf(" 15px \n");
}
} else {
_color(15);
printf("Render Distance\n");
}
if (op == 3) {
_color(9);
printf(">Done\n");
if (key('D')) {
fps = newfps;
render = newrender;
break;
}
} else {
_color(15);
printf("Done\n");
}
if (op == 4) {
_color(9);
printf(">Cancel\n");
if (key('D'))break;
} else {
_color(15);
printf("Cancel\n");
}
_sleep(200);
}
}
int main() {
x = 300;
system("title Paper Minecraft");
printf("Seed(1-10000):\n");
scanf("%d", &seed);
printf("加载中...\n");
seed = fabs(seed % 10001);
init();
maps();
y = grass[300] - 1;
while (1) {
screen();
if (key('W')) y--;
if (key('S')) y++;
if (key('A')) x--;
if (key('D')) x++;
if (x > 600) x = 600;
if (x < 1) x = 1;
if (y > 300) y = 300;
if (y < 1) y = 1;
if (key('X')) world[y][x] = 0;
if (key('1')) world[y][x] = 2;
if (key('2')) world[y][x] = 3;
if (key('3')) world[y][x] = 1;
if (key('4')) world[y][x] = 7;
if (key('P')) {
system("cls");
setting();
}
_sleep(fps);
system("cls");
}
return 0;
}
矿洞更新
\ | 颜色 | 概率 |
煤矿 | 黑不溜秋 | 60% |
铁矿 | 银灰色金属光泽 | 25% |
金矿 | 金黄色金属光泽 | 10% |
钻石矿 | 你一定知道碳单质颜色的(浅蓝透明) | 5% |
美丽的设置页面
下次一定
物品栏,流畅度
可能
实体,物品栏,快捷栏