C++2d我的世界V1.4
源代码
#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; //airblock[1].appe = "██";block[1].color = 8; //stoneblock[2].appe = " ̄";block[2].color = 47; //grassblock[3].appe = " ";block[3].color = 111; //dirtblock[4].appe="||";block[4].color=96;//woodblock[5].appe = "◆◆";block[5].color = 14; // coal_oreblock[6].appe = "◆◆";block[6].color = 8; // iron_oreblock[7].appe = "==";block[7].color = 1; //bedrockblock[8].appe = "◆◆";block[8].color = 15; // gold_oreblock[9].appe = "◆◆";block[9].color = 11; // diamond_oreblock[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/10int 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% |
美丽的设置页面
下次一定
物品栏,流畅度
可能
实体,物品栏,快捷栏