C++2d我的世界V1.4

发布于:2025-07-03 ⋅ 阅读:(13) ⋅ 点赞:(0)

源代码

#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%

美丽的设置页面


下次一定

物品栏,流畅度


可能

实体,物品栏,快捷栏


网站公告

今日签到

点亮在社区的每一天
去签到