问题标题: MC 1.14

0
0
杨尹浩
杨尹浩
修练者
修练者

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <windows.h>
#include <conio.h>
#include <cstring>
#include <cmath>
using namespace std;

// ========== 全局常量 ==========
const int W = 35;
const int H = 18;
char map[H][W];
int growTimer[H][W] = { 0 };
const int GROW_TIME = 8;

const char GRASS = ' ';
const char WALL = '#';
const char DOOR = 'D';
const char STONE = 'S';
const char COAL = 'C';
const char IRON = 'I';
const char GOLD = 'G';
const char DIAMOND = 'M';
const char REDSTONE = 'R';
const char LAPIS = 'L';
const char ANCIENT_DEBRIS = 'B';
const char SAPLING = 'Y';
const char TRUNK = 'T';
const char LEAF = 'E';
const char BOX = 'U';
const char FURNACE = 'F';
const char PLAYER = 'O';
const char VILLAGER = 'V';
const char WATER = '~';
const char LAVA = '&';
const char OBSIDIAN = 'X';
const char MONSTER = 'Z';
const char PORTAL = '0';
const char PIGLIN = 'P';
const char NETHERRACK = 'N';
const char QUARTZ_ORE = 'Q';
const char GLOWSTONE = 'K';
const char RED_DUST = 'r';
const char LEVER = 'v';
const char DISPENSER = 'd';
const char WOOD_DOOR = 'm';
const char IRON_DOOR = 'n';
const char CRY_OBSIDIAN = 'x'; // 哭泣黑曜石(小写x区分)
const char GOLD_BLOCK = 'g';    // 金块

bool leverState[H][W] = { false };
bool doorOpen[H][W] = { false };
int arrowCd = 0;

int px, py;
int vx, vy;
int emerald = 80;
bool creatMode = false;
int playerHP = 20;
const int MAX_HP = 20;
bool isDead = false;

bool canFly = false;
bool isFlying = false;
int elytraDur = 431;
const int MAX_ELYTRA_DUR = 431;

struct Piglin {
    int x, y;
    bool exist;
} piglin[3];
const int PIGLIN_NUM = 3;

struct Monster {
    int x, y;
    int hp;
    int atk;
    bool exist;
} mon[5];
const int MON_NUM = 5;

string bag[40];
int bagCount = 0;

int woodPickDur = 60;
int stonePickDur = 130;
int ironPickDur = 250;
int diamondPickDur = 1561;
int netheritePickDur = 2031;

int swordLevel = 0;
string swordEnchant = "无附魔";
int pickLevel = 0;
string pickEnchant = "无附魔";
int headLevel = 0, chestLevel = 0, legLevel = 0, footLevel = 0;
string headEnchant = "无附魔", chestEnchant = "无附魔";
string legEnchant = "无附魔", footEnchant = "无附魔";

string headEquip = "无";
string chestEquip = "无";
string legEquip = "无";
string footEquip = "无";
int headDef = 0, chestDef = 0, legDef = 0, footDef = 0;
int headDur = 0, chestDur = 0, legDur = 0, footDur = 0;
int headMaxDur = 0, chestMaxDur = 0, legMaxDur = 0, footMaxDur = 0;

const int BOX_MAX = 10;
string boxItem[BOX_MAX];
int boxCnt = 0;
bool haveBox = false;

bool haveFurnace = false;
int furnaceFuel = 0;
int furnaceProgress = 0;
string furnaceIn = "";
string furnaceOut = "";

string allItem[] = {
    "石头","木头","树苗","煤炭","铁矿石","金矿石",
    "红石","青金石","钻石","远古残骸","铁锭","金锭",
    "下界合金锭","木镐","石镐","铁镐","钻石镐","下界合金镐",
    "铁头盔","铁胸甲","铁护腿","铁靴子",
    "钻石头盔","钻石胸甲","钻石护腿","钻石靴子",
    "下界合金头盔","下界合金胸甲","下界合金护腿","下界合金靴子",
    "面包","牛排","金苹果","火把","木棍",
    "箱子","熔炉","工作台","附魔台","铁剑","钻石剑",
    "水桶","岩浆桶","黑曜石","烟花","鞘翅",
    "红石粉","拉杆","弓","箭","发射器","木门","铁门",
    "线","燧石","羽毛","纸","火药","圆石","打火石","末影珍珠",
    "哭泣黑曜石","金块"
};
int itemNum = sizeof(allItem) / sizeof(allItem[0]);

// ========== 末地全局变量 ==========
const int WIDTH = 40;
const int HEIGHT = 25;
const int MAX_HEIGHT = 30;
int playerX = WIDTH / 2;
int playerY = HEIGHT / 2;
int playerH = 15;
const int MAX_RINGS = 100;
const int RING_GAP = 14;
const int LAND_WIDTH = 5;
bool flyState = false;
int elytraDur_end = 32;
const int elytraMaxDur_end = 32;
int paper = 20, gunpowder = 10, enchantBook = 4;
int fireworkRocket = 6;
struct FireWork { int x, y, life; char sym; } fire[12];

// ========== 末影龙 ==========
bool dragonExist = true;
int dragonHP = 300;
const int DRAGON_MAX_HP = 300;
int dragonAtk = 4;

// ========== 世界枚举 ==========
int worldNow = 0; // 0主世界 1地狱 2末地

// ========== 函数声明 ==========
void createNetherMap();
void initPiglins();
void createMap();
void initMonster();
void enterEnd();
void drawEnd();
void boomFire();
bool isSafeLand(int x, int y);
void dragonAI();
void generateRuinedPortalOverworld(int startX, int startY);
void generateRuinedPortalNether(int startX, int startY);

// ========== 物品** ==========
int countItem(string item) {
    int n = 0; for (int i = 0; i < bagCount; i++) if (bag[i] == item)n++; return n;
}
void addItem(string item) {
    if (bagCount < 40) bag[bagCount++] = item;
}
bool hasItem(string item) {
    return countItem(item) > 0;
}
void delItems(string item, int need) {
    int del = 0;
    for (int i = 0; i < bagCount && del < need; i++) {
        if (bag[i] == item) {
            for (int j = i; j < bagCount - 1; j++)bag[j] = bag[j + 1];
            bagCount--; del++; i--;
        }
    }
}
void dropItem(int id) {
    if (id < 1 || id > bagCount)return;
    for (int i = id - 1; i < bagCount - 1; i++)bag[i] = bag[i + 1];
    bagCount--;
}

// ========== 创造物品库 ==========
void openAllThings() {
    system("cls");
    cout << "======== 创造模式物品库 ========\n";
    for (int i = 0; i < itemNum; i++) {
        cout << i + 1 << "." << allItem[i] << "  ";
        if ((i + 1) % 6 == 0)cout << endl;
    }
    cout << "\n输入序号获取,0返回\n";
    int id; cin >> id;
    if (id >= 1 && id <= itemNum) {
        addItem(allItem[id - 1]);
        cout << "获得:" << allItem[id - 1] << endl;
    }
    system("pause");
}

// ========== 放置桶 ==========
void placeBucket() {
    int tx = px, ty = py + 1;
    if (ty >= H || map[ty][tx] != GRASS)return;
    if (hasItem("水桶")) {
        map[ty][tx] = WATER; delItems("水桶", 1);
    }
    else if (hasItem("岩浆桶")) {
        map[ty][tx] = LAVA; delItems("岩浆桶", 1);
    }
}

// ========== 放置黑曜石 ==========
void placeObsidian() {
    int tx = px, ty = py + 1;
    if (ty >= H) return;
    if ((map[ty][tx] == GRASS || map[ty][tx] == NETHERRACK) && hasItem("黑曜石")) {
        delItems("黑曜石", 1);
        map[ty][tx] = OBSIDIAN;
    }
}

// ========== 岩浆生成黑曜石 ==========
void rockGen() {
    char newMap[H][W];
    memcpy(newMap, map, sizeof(map));
    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            if (map[i][j] == LAVA) {
                bool nearWater = false;
                if (i - 1 >= 0 && map[i - 1][j] == WATER) nearWater = true;
                if (i + 1 < H && map[i + 1][j] == WATER) nearWater = true;
                if (j - 1 >= 0 && map[i][j - 1] == WATER) nearWater = true;
                if (j + 1 < W && map[i][j + 1] == WATER) nearWater = true;
                if (nearWater) {
                    newMap[i][j] = OBSIDIAN;
                }
            }
        }
    }
    memcpy(map, newMap, sizeof(map));
}

// ========== 传送门检测 ==========
void checkPortal() {
    if (map[py][px] == PORTAL) {
        system("cls"); cout << "传送中..."; Sleep(800);
        bool inNether = (map[H / 2][W / 2] == NETHERRACK);
        if (!inNether) {
            createNetherMap();
            initPiglins();
            px = W / 2; py = H / 2;
            worldNow = 1;
        }
        else {
            createMap();
            initMonster();
            px = 6; py = 3;
            worldNow = 0;
        }
    }
}

// ========== 激活地狱门 ==========
void activePortal() {
    int cx = px - 1;
    int cy = py - 2;
    bool ok = true;

    for (int i = 0; i < 4; i++)
        if (cy < 0 || cx + i >= W || map[cy][cx + i] != OBSIDIAN)
            ok = false;

    for (int i = 0; i < 4; i++)
        if (cy + 4 >= H || cx + i >= W || map[cy + 4][cx + i] != OBSIDIAN)
            ok = false;

    for (int i = 1; i <= 3; i++)
        if (cy + i >= H || map[cy + i][cx] != OBSIDIAN)
            ok = false;

    for (int i = 1; i <= 3; i++)
        if (cy + i >= H || cx + 3 >= W || map[cy + i][cx + 3] != OBSIDIAN)
            ok = false;

    for (int i = 1; i <= 3; i++)
        for (int j = 1; j <= 2; j++)
            if (cy + i >= H || cx + j >= W || map[cy + i][cx + j] != GRASS)
                ok = false;

    if (!ok || !hasItem("打火石")) {
        cout << "门框错误或缺少打火石!";
        Sleep(800);
        return;
    }

    for (int i = 1; i <= 3; i++)
        for (int j = 1; j <= 2; j++)
            map[cy + i][cx + j] = PORTAL;

    delItems("打火石", 1);
    cout << "传送门激活成功!";
    Sleep(800);
}

// ========== 生成主世界废弃传送门 ==========
void generateRuinedPortalOverworld(int startX, int startY) {
    // 基**框架(残缺4×5)
    for (int i = 0; i < 4; i++) map[startY][startX + i] = STONE;
    for (int i = 0; i < 4; i++) map[startY + 4][startX + i] = STONE;
    for (int i = 1; i <= 3; i++) map[startY + i][startX] = (rand()%3==0)?CRY_OBSIDIAN:OBSIDIAN;
    for (int i = 1; i <= 3; i++) map[startY + i][startX + 3] = (rand()%3==0)?CRY_OBSIDIAN:OBSIDIAN;
    // 随机残缺
    if (rand()%2==0) map[startY+1][startX+1] = GRASS;
    if (rand()%2==0) map[startY+2][startX+2] = GRASS;
    // 金块
    map[startY+1][startX+4] = GOLD_BLOCK;
    // 宝箱
    map[startY+3][startX+4] = BOX;
    // 战利品
    if (boxCnt < BOX_MAX) {
        int r = rand()%5;
        if (r==0) boxItem[boxCnt++] = "打火石";
        if (r==1) boxItem[boxCnt++] = "黑曜石";
        if (r==2) boxItem[boxCnt++] = "金锭";
        if (r==3) boxItem[boxCnt++] = "附魔书";
        if (r==4) boxItem[boxCnt++] = "金苹果";
    }
}

// ========== 生成地狱废弃传送门 ==========
void generateRuinedPortalNether(int startX, int startY) {
    // 黑石框架
    for (int i = 0; i < 4; i++) map[startY][startX + i] = NETHERRACK;
    for (int i = 0; i < 4; i++) map[startY + 4][startX + i] = NETHERRACK;
    for (int i = 1; i <= 3; i++) map[startY + i][startX] = (rand()%3==0)?CRY_OBSIDIAN:OBSIDIAN;
    for (int i = 1; i <= 3; i++) map[startY + i][startX + 3] = (rand()%3==0)?CRY_OBSIDIAN:OBSIDIAN;
    // 岩浆块
    if (rand()%3==0) map[startY+2][startX+1] = LAVA;
    // 金块
    map[startY+1][startX+4] = GOLD_BLOCK;
    // 宝箱
    map[startY+3][startX+4] = BOX;
}

// ========== 创建主世界地图 ==========
void createMap() {
    memset(leverState, 0, sizeof(leverState));
    memset(doorOpen, 0, sizeof(doorOpen));
    for (int i = 0; i < H; i++)
        for (int j = 0; j < W; j++)
            map[i][j] = GRASS, growTimer[i][j] = 0;
    // 初始小屋
    int x = 12, y = 4;
    map[y][x] = map[y][x + 1] = map[y][x + 2] = WALL;
    map[y + 1][x] = WALL; map[y + 1][x + 2] = WALL;
    map[y + 2][x] = WALL; map[y + 2][x + 1] = DOOR; map[y + 2][x + 2] = WALL;
    // 地形矿石
    for (int i = H / 2; i < H / 2 + 3; i++)
        for (int j = 0; j < W; j++) {
            int r = rand() % 10;
            if (r < 5)map[i][j] = STONE; else if (r == 5)map[i][j] = COAL;
        }
    for (int i = H / 2 + 3; i < H / 2 + 6; i++)
        for (int j = 0; j < W; j++) {
            int r = rand() % 10;
            if (r < 4)map[i][j] = STONE;
            else if (r == 4)map[i][j] = IRON;
            else if (r == 5)map[i][j] = GOLD;
        }
    for (int i = H / 2 + 6; i < H / 2 + 9; i++)
        for (int j = 0; j < W; j++) {
            int r = rand() % 12;
            if (r < 6)map[i][j] = STONE;
            else if (r == 6)map[i][j] = REDSTONE;
            else if (r == 7)map[i][j] = LAPIS;
        }
    for (int i = H / 2 + 9; i < H - 1; i++)
        for (int j = 0; j < W; j++) {
            int r = rand() % 10;
            if (r < 6)map[i][j] = STONE; else if (r == 6)map[i][j] = DIAMOND;
        }
    int last = H - 1;
    map[last][5] = ANCIENT_DEBRIS;
    map[last][15] = ANCIENT_DEBRIS;
    map[last][25] = ANCIENT_DEBRIS;
    // 生成废弃传送门(主世界随机位置)
    generateRuinedPortalOverworld(2, 8);
    generateRuinedPortalOverworld(28, 6);
}

// ========== 创建地狱地图 ==========
void createNetherMap() {
    memset(leverState, 0, sizeof(leverState));
    memset(doorOpen, 0, sizeof(doorOpen));
    for (int i = 0; i < H; i++)
        for (int j = 0; j < W; j++)
            map[i][j] = NETHERRACK;

    for (int i = H - 3; i < H; i++)
        for (int j = W / 2 - 4; j < W / 2 + 4; j++)
            map[i][j] = LAVA;

    for (int i = 2; i < H - 3; i++)
        for (int j = 0; j < W; j++)
            if (rand() % 8 == 0)map[i][j] = QUARTZ_ORE;

    for (int i = 0; i < 5; i++)
        for (int j = 0; j < W; j++)
            if (rand() % 12 == 0)map[i][j] = GLOWSTONE;

    map[3][5] = BOX;
    map[7][30] = BOX;
    map[12][17] = BOX;
    // 地狱废弃传送门
    generateRuinedPortalNether(5, 3);
    generateRuinedPortalNether(25, 10);
}

// ========== 初始化猪灵 ==========
void initPiglins() {
    for (int i = 0; i < PIGLIN_NUM; i++)piglin[i].exist = false;
    int sp = 0;
    for (int i = 0; i < PIGLIN_NUM && sp < 2; i++) {
        int x = rand() % W, y = rand() % H;
        if (map[y][x] == NETHERRACK) {
            piglin[i].x = x; piglin[i].y = y;
            piglin[i].exist = true; sp++;
        }
    }
}

// ========== 猪灵交易 ==========
void piglinTrade() {
    if (!hasItem("金锭")) {
        cout << "无金锭!";
        Sleep(500);
        return;
    }
    bool nearPiglin = false;
    for (int i = 0; i < PIGLIN_NUM; i++) {
        if (piglin[i].exist && abs(piglin[i].x - px) <= 1 && abs(piglin[i].y - py) <= 1) {
            nearPiglin = true;
            break;
        }
    }
    if (!nearPiglin) {
        cout << "附近无猪灵!";
        Sleep(500);
        return;
    }
    delItems("金锭", 1);
    int r = rand() % 6;
    string give;
    if (r == 0)give = "末影珍珠";
    else if (r == 1)give = "萤石粉";
    else if (r == 2)give = "下界石英";
    else if (r == 3)give = "哭泣的黑曜石";
    else if (r == 4)give = "火焰弹";
    else give = "黑曜石";
    addItem(give);
    cout << "交易成功:" << give;
    Sleep(800);
}

// ========== 初始化怪物 ==========
void initMonster() {
    for (int i = 0; i < MON_NUM; i++) {
        mon[i].exist = false; mon[i].hp = 8; mon[i].atk = 3;
    }
    int sp = 0;
    for (int i = 0; i < MON_NUM && sp < 3; i++) {
        int x = rand() % W, y = rand() % H;
        if (map[y][x] == GRASS && abs(x - px) > 2 && abs(y - py) > 2) {
            mon[i].x = x; mon[i].y = y; mon[i].exist = true; sp++;
        }
    }
}

// ========== 怪物AI ==========
void monsterAI() {
    if (creatMode)return;
    int def = headDef + chestDef + legDef + footDef;
    for (int i = 0; i < MON_NUM; i++) {
        if (!mon[i].exist)continue;
        int dx = 0, dy = 0;
        if (mon[i].x > px)dx = -1; else if (mon[i].x < px)dx = 1;
        if (mon[i].y > py)dy = -1; else if (mon[i].y < py)dy = 1;
        int nx = mon[i].x + dx, ny = mon[i].y + dy;
        if (nx >= 0 && nx < W && ny >= 0 && ny < H && map[ny][nx] == GRASS) {
            bool ok = true;
            for (int j = 0; j < MON_NUM; j++)if (mon[j].exist && mon[j].x == nx && mon[j].y == ny)ok = false;
            if (ok)mon[i].x = nx, mon[i].y = ny;
        }
        if (abs(mon[i].x - px) <= 1 && abs(mon[i].y - py) <= 1) {
            int h = mon[i].atk - def; if (h < 1)h = 1;
            h = h * 0.3; // 伤害降低70%
            playerHP -= h;
            if (!creatMode) {
                if (headDur > 0)headDur--;
                else if (chestDur > 0)chestDur--;
                else if (legDur > 0)legDur--;
                else if (footDur > 0)footDur--;
            }
            if (playerHP <= 0)isDead = true;
        }
    }
}

// ========== 攻击怪物 ==========
void hitMonster() {
    for (int i = 0; i < MON_NUM; i++) {
        if (!mon[i].exist)continue;
        if (abs(mon[i].x - px) <= 1 && abs(mon[i].y - py) <= 1) {
            mon[i].hp -= 2 + swordLevel;
            if (mon[i].hp <= 0) {
                mon[i].exist = false;
                addItem("木头");
            }
            break;
        }
    }
}

// ========== ** ==========
void respawn() {
    isDead = false; playerHP = MAX_HP; px = 6; py = 3;
    worldNow = 0;
    createMap();
    initMonster();
}

// ========== 显示生命条 ==========
void showHPBar() {
    cout << "生命: ";
    for (int i = 0; i < MAX_HP; i++)cout << (i < playerHP ? "#" : "-");
    cout << " " << playerHP << "/" << MAX_HP << endl;
}

// ========== 打开箱子 ==========
void openBox() {
    while (true) {
        system("cls");
        cout << "===== 箱子 =====\n";
        for (int i = 0; i < boxCnt; i++)cout << i + 1 << "." << boxItem[i] << endl;
        cout << "\n1.存入 2.取出 0.退出\n";
        int op; cin >> op; if (op == 0)break;
        if (op == 1) {
            if (boxCnt >= BOX_MAX) { cout << "箱子已满!"; Sleep(500); continue; }
            system("cls"); cout << "背包物品:\n";
            for (int i = 0; i < bagCount; i++)cout << i + 1 << "." << bag[i] << endl;
            int idx; cin >> idx; if (idx < 1 || idx > bagCount)continue;
            boxItem[boxCnt++] = bag[idx - 1]; dropItem(idx);
        }
        if (op == 2) {
            if (boxCnt == 0) { cout << "箱子为空!"; Sleep(500); continue; }
            int idx; cin >> idx; if (idx < 1 || idx > boxCnt)continue;
            addItem(boxItem[idx - 1]);
            for (int i = idx - 1; i < boxCnt - 1; i++)boxItem[i] = boxItem[i + 1];
            boxCnt--;
        }
    }
}

// ========== 放置箱子 ==========
void placeBox() {
    if (!hasItem("箱子"))return;
    int tx = px, ty = py + 1;
    if (ty >= H || !(map[ty][tx] == GRASS || map[ty][tx] == NETHERRACK))return;
    delItems("箱子", 1);
    map[ty][tx] = BOX;
}

// ========== 鞘翅界面 ==========
void openElytra() {
    system("cls");
    cout << "======== 鞘翅 ========\n";
    cout << "状态:" << (canFly ? "已装备" : "未装备") << endl;
    cout << "耐久:" << elytraDur << "/" << MAX_ELYTRA_DUR << endl;
    cout << "1.装备/卸下 0.返回\n";
    int op; cin >> op;
    if (op == 1) {
        if (elytraDur <= 0) { cout << "鞘翅已损坏!"; Sleep(500); return; }
        canFly = !canFly; isFlying = false;
    }
}

// ========== 使用烟花 ==========
void useFirework() {
    if (!hasItem("烟花")) { cout << "没有烟花!"; Sleep(300); return; }
    delItems("烟花", 1);
    if (canFly && isFlying) { py -= 2; if (py < 0)py = 0; }
    cout << "烟花升空加速!"; Sleep(300);
}

// ========== 盔甲界面 ==========
void showArmor() {
    system("cls");
    cout << "头盔:" << headEquip << " 防御+" << headDef << " 耐久" << headDur << "/" << headMaxDur << endl;
    cout << "胸甲:" << chestEquip << " 防御+" << chestDef << " 耐久" << chestDur << "/" << chestMaxDur << endl;
    cout << "护腿:" << legEquip << " 防御+" << legDef << " 耐久" << legDur << "/" << legMaxDur << endl;
    cout << "靴子:" << footEquip << " 防御+" << footDef << " 耐久" << footDur << "/" << footMaxDur << endl;
    cout << "\n1-12穿戴装备 0返回\n";
    int c; cin >> c;

    if (c >= 1 && c <= 12) {
        if (c == 1 && hasItem("铁头盔"))
        { headEquip = "铁头盔"; headDef = 2; headDur = 165; headMaxDur = 165; delItems("铁头盔", 1); }
        if (c == 2 && hasItem("铁胸甲"))
        { chestEquip = "铁胸甲"; chestDef = 6; chestDur = 240; chestMaxDur = 240; delItems("铁胸甲", 1); }
        if (c == 3 && hasItem("铁护腿"))
        { legEquip = "铁护腿"; legDef = 5; legDur = 225; headMaxDur = 225; delItems("铁护腿", 1); }
        if (c == 4 && hasItem("铁靴子"))
        { footEquip = "铁靴子"; footDef = 2; footDur = 195; footMaxDur = 195; delItems("铁靴子", 1); }
        if (c == 5 && hasItem("钻石头盔"))
        { headEquip = "钻石头盔"; headDef = 3; headDur = 363; headMaxDur = 363; delItems("钻石头盔", 1); }
        if (c == 6 && hasItem("钻石胸甲"))
        { chestEquip = "钻石胸甲"; chestDef = 8; chestDur = 528; chestMaxDur = 528; delItems("钻石胸甲", 1); }
        if (c == 7 && hasItem("钻石护腿"))
        { legEquip = "钻石护腿"; legDef = 6; legDur = 495; legMaxDur = 495; delItems("钻石护腿", 1); }
        if (c == 8 && hasItem("钻石靴子"))
        { footEquip = "钻石靴子"; footDef = 3; footDur = 429; footMaxDur = 429; delItems("钻石靴子", 1); }
        if (c == 9 && hasItem("下界合金头盔"))
        { headEquip = "下界合金头盔"; headDef = 4; headDur = 407; headMaxDur = 407; delItems("下界合金头盔", 1); }
        if (c == 10 && hasItem("下界合金胸甲"))
        { chestEquip = "下界合金胸甲"; chestDef = 9; chestDur = 592; chestMaxDur = 592; delItems("下界合金胸甲", 1); }
        if (c == 11 && hasItem("下界合金护腿"))
        { legEquip = "下界合金护腿"; legDef = 7; legDur = 555; legMaxDur = 555; delItems("下界合金护腿", 1); }
        if (c == 12 && hasItem("下界合金靴子"))
        { footEquip = "下界合金靴子"; footDef = 4; footDur = 481; footMaxDur = 481; delItems("下界合金靴子", 1); }
    }
    system("pause");
}

// ========== 背包界面 ==========
void showBag() {
    system("cls");
    cout << "======== 背包 ========\n";
    cout << "绿宝石:" << emerald << endl;
    for (int i = 0; i < bagCount; i++)cout << i + 1 << "." << bag[i] << endl;
    cout << "\n输入序号丢弃,0返回\n";
    int n; cin >> n; if (n != 0)dropItem(n);
}

// ========== 种树 ==========
void plantTree() {
    if (!hasItem("树苗"))return;
    int tx = px, ty = py + 1;
    if (ty >= H || map[ty][tx] != GRASS)return;
    delItems("树苗", 1);
    map[ty][tx] = SAPLING;
}

// ========== 树生长 ==========
void treeGrow() {
    for (int i = 0; i < H; i++)
        for (int j = 0; j < W; j++) {
            if (map[i][j] == SAPLING) {
                growTimer[i][j]++;
                if (growTimer[i][j] >= GROW_TIME) {
                    map[i][j] = TRUNK;
                    if (i - 1 >= 0)map[i - 1][j] = LEAF;
                    if (i - 2 >= 0)map[i - 2][j] = LEAF;
                    if (j - 1 >= 0)map[i - 1][j - 1] = LEAF;
                    if (j + 1 < W)map[i - 1][j + 1] = LEAF;
                }
            }
        }
}

// ========== 村民交易 ==========
void trade() {
    if (abs(px - vx) > 2 || abs(py - vy) > 2)return;
    system("cls");
    cout << "===== 村民交易 =====\n";
    cout << "14.烟花(3绿宝石) 15.鞘翅(20绿宝石) 16.末影珍珠(10绿宝石) 0返回\n";
    int c; cin >> c;
    if (c == 14 && emerald >= 3) { emerald -= 3; addItem("烟花"); }
    if (c == 15 && emerald >= 20) { emerald -= 20; addItem("鞘翅"); }
    if (c == 16 && emerald >= 10) { emerald -= 10; addItem("末影珍珠"); }
}

// ========== 挖矿 ==========
void mine() {
    int tx = px, ty = py + 1; if (ty >= H)return;
    char b = map[ty][tx];
    if (b == WATER || b == LAVA) { map[ty][tx] = GRASS; addItem(b == WATER ? "水桶" : "岩浆桶"); return; }
    if (b == LEAF) { map[ty][tx] = GRASS; if (rand() % 2 == 0)addItem("树苗"); return; }
    if (b == TRUNK) { map[ty][tx] = GRASS; addItem("木头"); return; }
    if (b == GRASS || b == WALL || b == DOOR || b == SAPLING || b == BOX || b == FURNACE
        || b == PORTAL || b == PIGLIN || b == NETHERRACK || b == LEVER || b == DISPENSER
        || b == WOOD_DOOR || b == IRON_DOOR || b == RED_DUST || b == GOLD_BLOCK || b == CRY_OBSIDIAN)return;

    bool ok = creatMode;
    if (!ok && b == OBSIDIAN) {
        ok = (hasItem("钻石镐") && diamondPickDur > 0) || (hasItem("下界合金镐") && netheritePickDur > 0);
        if (!ok) { cout << "需要钻石镐才能开采!"; Sleep(500); return; }
    }
    else if (!ok) {
        if ((b == STONE || b == COAL) && hasItem("木镐") && woodPickDur > 0)ok = true;
        if ((b == STONE || b == COAL || b == IRON || b == GOLD) && hasItem("石镐") && stonePickDur > 0)ok = true;
        if (b != DIAMOND && hasItem("铁镐") && ironPickDur > 0)ok = true;
        if (hasItem("钻石镐") && diamondPickDur > 0)ok = true;
        if (hasItem("下界合金镐") && netheritePickDur > 0)ok = true;
    }
    if (!ok)return;

    if (!creatMode) {
        if (hasItem("下界合金镐") && netheritePickDur > 0)netheritePickDur--;
        else if (hasItem("钻石镐") && diamondPickDur > 0)diamondPickDur--;
        else if (hasItem("铁镐") && ironPickDur > 0)ironPickDur--;
        else if (hasItem("石镐") && stonePickDur > 0)stonePickDur--;
        else if (hasItem("木镐") && woodPickDur > 0)woodPickDur--;
    }

    string d;
    if (b == STONE)d = "石头"; if (b == COAL)d = "煤炭"; if (b == IRON)d = "铁矿石";
    if (b == GOLD)d = "金矿石"; if (b == REDSTONE)d = "红石"; if (b == LAPIS)d = "青金石";
    if (b == DIAMOND)d = "钻石"; if (b == ANCIENT_DEBRIS)d = "远古残骸"; if (b == OBSIDIAN)d = "黑曜石";
    if (b == QUARTZ_ORE)d = "下界石英"; if (b == GLOWSTONE)d = "萤石粉";
    addItem(d);
    map[ty][tx] = GRASS;
}

// ========== 合成 ==========
void craft() {
    if (!hasItem("工作台")) { system("cls"); cout << "需要放置工作台!"; Sleep(600); return; }
    while (true) {
        system("cls");
        cout << "===== 合成面板 =====\n";
        cout << "25.烟花  26.红石粉  27.拉杆  28.弓  29.箭\n";
        cout << "30.发射器 31.木门 32.铁门  33.哭泣黑曜石 34.金块 0.退出\n";
        char ch; cin >> ch; if (ch == '0')break;
        int c = ch - '0'; bool ok = false;

        if (c == 25 && countItem("纸") >= 1 && countItem("火药") >= 1)
        { delItems("纸", 1); delItems("火药", 1); addItem("烟花"); ok = true; }
        if (c == 26 && countItem("红石") >= 1)
        { delItems("红石", 1); addItem("红石粉"); ok = true; }
        if (c == 27 && countItem("木棍") >= 1 && countItem("石头") >= 1)
        { delItems("木棍", 1); delItems("石头", 1); addItem("拉杆"); ok = true; }
        if (c == 28 && countItem("线") >= 3 && countItem("木棍") >= 3)
        { delItems("线", 3); delItems("木棍", 3); addItem("弓"); ok = true; }
        if (c == 29 && countItem("燧石") >= 1 && countItem("木棍") >= 1 && countItem("羽毛") >= 1)
        { delItems("燧石", 1); delItems("木棍", 1); delItems("羽毛", 1); addItem("箭"); ok = true; }
        if (c == 30 && countItem("石头") >= 7 && countItem("弓") >= 1 && countItem("红石") >= 1)
        { delItems("石头", 7); delItems("弓", 1); delItems("红石", 1); addItem("发射器"); ok = true; }
        if (c == 31 && countItem("木头") >= 6)
        { delItems("木头", 6); addItem("木门"); ok = true; }
        if (c == 32 && countItem("铁锭") >= 6)
        { delItems("铁锭", 6); addItem("铁门"); ok = true; }
        if (c == 33 && countItem("黑曜石") >= 1 && countItem("金锭") >= 1)
        { delItems("黑曜石", 1); delItems("金锭", 1); addItem("哭泣黑曜石"); ok = true; }
        if (c == 34 && countItem("金锭") >= 9)
        { delItems("金锭", 9); addItem("金块"); ok = true; }

        if (ok)cout << "合成成功!"; else cout << "材料不足!";
        Sleep(600);
    }
}

// ========== 红石逻辑 ==========
void redstoneLogic() {
    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            if (map[i][j] == LEVER && abs(i - py) <= 1 && abs(j - px) <= 1) {
                leverState[i][j] = !leverState[i][j];
                int dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };
                for (int d = 0; d < 4; d++) {
                    int ni = i + dir[d][0], nj = j + dir[d][1];
                    if (ni < 0 || ni >= H || nj < 0 || nj >= W)continue;
                    if (map[ni][nj] == WOOD_DOOR || map[ni][nj] == IRON_DOOR) {
                        doorOpen[ni][nj] = leverState[i][nj];
                    }
                }
            }
        }
    }
    if (arrowCd > 0)arrowCd--;
    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            if (map[i][j] == DISPENSER && arrowCd <= 0) {
                bool power = false;
                int dir[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };
                for (int d = 0; d < 4; d++) {
                    int ni = i + dir[d][0], nj = j + dir[d][1];
                    if (ni < 0 || ni >= H || nj < 0 || nj >= W)continue;
                    if (map[ni][nj] == RED_DUST || (map[ni][nj] == LEVER && leverState[ni][nj])) {
                        power = true; break;
                    }
                }
                if (power && hasItem("箭")) {
                    delItems("箭", 1);
                    arrowCd = 15;
                    for (int m = 0; m < MON_NUM; m++) {
                        if (mon[m].exist && abs(mon[m].x - j) <= 3 && abs(mon[m].y - i) <= 3) {
                            mon[m].hp -= 4;
                            if (mon[m].hp <= 0) {
                                mon[m].exist = false;
                                addItem("木头");
                            }
                            break;
                        }
                    }
                }
            }
        }
    }
}

// ========== 放置红石方块 ==========
void placeBlock() {
    int tx = px, ty = py + 1;
    if (ty >= H || !(map[ty][tx] == GRASS || map[ty][tx] == NETHERRACK))return;
    if (hasItem("红石粉")) { delItems("红石粉", 1); map[ty][tx] = RED_DUST; }
    else if (hasItem("拉杆")) { delItems("拉杆", 1); map[ty][tx] = LEVER; }
    else if (hasItem("发射器")) { delItems("发射器", 1); map[ty][tx] = DISPENSER; }
    else if (hasItem("木门")) { delItems("木门", 1); map[ty][tx] = WOOD_DOOR; }
    else if (hasItem("铁门")) { delItems("铁门", 1); map[ty][tx] = IRON_DOOR; }
    else if (hasItem("金块")) { delItems("金块", 1); map[ty][tx] = GOLD_BLOCK; }
    else if (hasItem("哭泣黑曜石")) { delItems("哭泣黑曜石", 1); map[ty][tx] = CRY_OBSIDIAN; }
}

// ====================== 末地功能 ======================
double getDist(int x, int y) {
    double cx = WIDTH / 2.0, cy = HEIGHT / 2.0;
    return sqrt(pow(x - cx, 2) + pow(y - cy, 2));
}

char getMapEnd(int x, int y) {
    double d = getDist(x, y);
    for (int r = 1; r <= MAX_RINGS; r++) {
        int mid = r * RING_GAP;
        if (d >= mid - LAND_WIDTH && d <= mid + LAND_WIDTH)
            return '#';
    }
    return ' ';
}

bool isSafeLand(int x, int y) {
    return getMapEnd(x, y) == '#';
}

void initFire() {
    srand(time(0));
    for (int i = 0; i < 12; i++) fire[i].life = 0;
}

void boomFire() {
    if (fireworkRocket <= 0)return;
    fireworkRocket--;
    playerH += 4;
    if (playerH > MAX_HEIGHT) playerH = MAX_HEIGHT;
    for (int i = 0; i < 12; i++) {
        fire[i].x = playerX + rand() % 7 - 3;
        fire[i].y = playerY + rand() % 7 - 3;
        fire[i].life = 8;
        fire[i].sym = '*';
    }
}

void enterEnd() {
    if (!hasItem("末影珍珠")) {
        cout << "需要末影珍珠!"; Sleep(800); return;
    }
    delItems("末影珍珠", 1);
    worldNow = 2;
    playerX = WIDTH / 2;
    playerY = HEIGHT / 2;
    playerH = 15;
    initFire();
}

void dragonAI() {
    if (!dragonExist || creatMode) return;
    if (rand() % 15 == 0) {
        playerHP -= (dragonAtk * 0.3); // 龙伤害也降低70%
        if (playerHP <= 0) isDead = true;
    }
}

void hitDragon() {
    if (!dragonExist) return;
    dragonHP -= 3 + swordLevel;
    if (dragonHP <= 0) {
        dragonExist = false;
        addItem("龙蛋");
    }
}

void drawEnd() {
    system("cls");
    for (int y = 0; y < HEIGHT; y++) {
        for (int x = 0; x < WIDTH; x++) {
            bool fd = 0;
            for (int i = 0; i < 12; i++)
                if (fire[i].life > 0 && fire[i].x == x && fire[i].y == y)
                { cout << fire[i].sym; fd = 1; break; }
            if (fd)continue;

            if (x == playerX && y == playerY) cout << (flyState ? "?" : "◎");
            else cout << getMapEnd(x, y);
        }
        cout << endl;
    }

    double dis = getDist(playerX, playerY);
    int ring = (int)(dis / RING_GAP) + 1;
    if (ring > MAX_RINGS) ring = MAX_RINGS;

    cout << "末地 第" << ring << "/100环 | 高度:" << playerH;
    if (isSafeLand(playerX, playerY)) cout << " [安全]"; else cout << " [危险]";
    cout << endl;

    if (dragonExist)
        cout << "末影龙 HP:" << dragonHP << "/" << DRAGON_MAX_HP << endl;

    cout << "鞘翅:" << elytraDur_end << "/" << elytraMaxDur_end << endl;
    cout << "WASD移动 空格飞行 F烟花 J打龙 ESC回主世界\n";
}

void draw() {
    if (worldNow == 2) { drawEnd(); return; }

    system("cls");
    for (int i = 0; i < H; i++) {
        for (int j = 0; j < W; j++) {
            bool drawMon = false;
            for (int k = 0; k < MON_NUM; k++)
                if (mon[k].exist && mon[k].x == j && mon[k].y == i) { cout << MONSTER; drawMon = true; break; }
            if (drawMon)continue;
            bool drawPig = false;
            for (int k = 0; k < PIGLIN_NUM; k++)
                if (piglin[k].exist && piglin[k].x == j && piglin[k].y == i) { cout << PIGLIN; drawPig = true; break; }
            if (drawPig)continue;
            if ((map[i][j] == WOOD_DOOR || map[i][j] == IRON_DOOR) && doorOpen[i][j]) {
                cout << GRASS; continue;
            }
            if (i == py && j == px)cout << PLAYER;
            else if (i == vy && j == vx)cout << VILLAGER;
            else cout << map[i][j];
        }
        cout << endl;
    }
    showHPBar();
    cout << "WASD移动 J攻击 K挖矿 M黑曜石 T传送门 Y猪灵交易\n";
    cout << "B背包 C合成 P鞘翅 空格烟花 O红石 L拉杆\n";
    cout << "E创造 G模式 U水桶 Q退出 N末地\n";
}

void move(int dx, int dy) {
    if (worldNow == 2) {
        playerX += dx;
        playerY += dy;
        if (playerX < 0) playerX = 0;
        if (playerX >= WIDTH) playerX = WIDTH - 1;
        if (playerY < 0) playerY = 0;
        if (playerY >= HEIGHT) playerY = HEIGHT - 1;
        return;
    }

    int nx = px + dx, ny = py + dy;
    char tar = map[ny][nx];
    if (tar == WALL || tar == LAVA)return;
    if ((tar == WOOD_DOOR || tar == IRON_DOOR) && !doorOpen[ny][nx])return;
    px = nx; py = ny;
    checkPortal();
}

int main() {
    srand((unsigned)time(NULL));
    createMap();
    initMonster();
    px = 6; py = 3; vx = 15; vy = 4;
    char cmd;
    while (true) {
        if (isDead) { respawn(); }
        if (worldNow == 0 || worldNow == 1) {
            rockGen(); treeGrow(); monsterAI(); redstoneLogic();
        }
        if (worldNow == 2) {
            dragonAI();
            if (!isSafeLand(playerX, playerY) && !flyState) playerH--;
            if (playerH <= 0) { isDead = true; }
        }

        draw();
        if (_kbhit()) {
            cmd = _getch();
            if (cmd == 'w')move(0, -1);
            if (cmd == 's')move(0, 1);
            if (cmd == 'a')move(-1, 0);
            if (cmd == 'd')move(1, 0);
            if (cmd == 'j') {
                if (worldNow == 2) hitDragon();
                else hitMonster();
            }
            if (cmd == 'k')mine();
            if (cmd == 'm')placeObsidian();
            if (cmd == 't')activePortal();
            if (cmd == 'y')piglinTrade();
            if (cmd == 'b')showBag();
            if (cmd == 'c')craft();
            if (cmd == 'p')openElytra();
            if (cmd == ' ') {
                if (worldNow == 2) boomFire();
                else useFirework();
            }
            if (cmd == 'o')placeBlock();
            if (cmd == 'l')redstoneLogic();
            if (cmd == 'g')creatMode = !creatMode;
            if (cmd == 'e')openAllThings();
            if (cmd == 'u')placeBucket();
            if (cmd == 'n')enterEnd();
            if (cmd == 27) {
                if (worldNow == 2) {
                    worldNow = 0;
                    createMap();
                    initMonster();
                }
            }
            if (cmd == 'q')break;
        }
        if (worldNow == 2 && flyState && elytraDur_end > 0) elytraDur_end--;
        Sleep(120);
    }
    return 0;
}

 

 

 

 

下一个版本是1.14.4大家希望我更新什么


0
0
0
我要回答