专栏文章

今天我们来打我的世界(C++版)

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipwcj9c
此快照首次捕获于
2025/12/03 19:01
3 个月前
此快照最后确认于
2025/12/03 19:01
3 个月前
查看原文
#include //用C++写一个简易版我的世界的代码,只用C++内部库。要有较多的功能,不要那么卡 #include <conio.h> #include <windows.h> #include #include #include #include
using namespace std;
// 游戏常量 const int WIDTH = 60; const int HEIGHT = 30; const int VIEW_RADIUS = 8; const int INVENTORY_SIZE = 5;
// 方块类型 enum BlockType { AIR, GRASS, STONE, WATER, SAND, WOOD, LEAVES, NUM_BLOCKS };
// 方块属性 struct Block { char symbol; string color; bool solid; bool fallable; };
// 方块属性配置 const Block BLOCK_DATA[] = { {' ', "\033[0m", false, false}, // AIR {'*', "\033[32m", true, false}, // GRASS {'#', "\033[37m", true, false}, // STONE {'~', "\033[36m", false, true}, // WATER {'%', "\033[33m", true, true}, // SAND {'H', "\033[31m", true, false}, // WOOD {'&', "\033[92m", false, false} // LEAVES };
// 游戏状态 BlockType world[HEIGHT][WIDTH]; int playerX = WIDTH/2; int playerY = HEIGHT/2; int health = 100; int gameTime = 0; int selectedSlot = 0; map<BlockType, int> inventory; bool isNight = false;
struct Entity { int x, y; char type; // 'Z':僵尸 'C':鸡 int health; }; vector entities;
// 生成世界 void generateWorld() { srand(time(0)); for(int y=0; y<HEIGHT; y++) { for(int x=0; x<WIDTH; x++) { if(y > HEIGHT/2 + rand()%4) { world[y][x] = STONE; } else if(y == HEIGHT/2) { world[y][x] = GRASS; } else if(y < HEIGHT/2 - 5) { world[y][x] = (rand()%100 < 30) ? WATER : AIR; } else { world[y][x] = AIR; }
CPP
        // 生成树木
        if(y == HEIGHT/2 && rand()%100 < 3 && x > 10 && x < WIDTH-10) {
            int height = 3 + rand()%3;
            for(int ty=y-1; ty>=y-height; ty--) world[ty][x] = WOOD;
            for(int tx=x-2; tx<=x+2; tx++)
                for(int ty=y-height-2; ty<=y-height; ty++)
                    if(tx>=0 && tx<WIDTH && ty>=0)
                        world[ty][tx] = LEAVES;
        }
    }
}

// 初始化物品栏
inventory[GRASS] = 99;
inventory[STONE] = 10;
inventory[WOOD] = 5;
inventory[SAND] = 20;
}
// 物理更新 void updatePhysics() { // 沙子/水下落 for(int y=HEIGHT-2; y>=0; y--) { for(int x=0; x<WIDTH; x++) { BlockType bt = world[y][x]; if(BLOCK_DATA[bt].fallable) { if(world[y+1][x] == AIR) { world[y+1][x] = bt; world[y][x] = AIR; } else if(world[y+1][x] == WATER && bt == SAND) { swap(world[y][x], world[y+1][x]); } } } } }
// 生成生物 void spawnEntities() { if(gameTime%100 == 0) { if(entities.size() < 5 && rand()%100 < (isNight ? 30 : 10)) { Entity e; e.x = playerX + (rand()%20 -10); e.y = playerY + (rand()%10 -5); e.type = (rand()%100 < 80) ? 'Z' : 'C'; e.health = (e.type == 'Z') ? 20 : 5; if(e.x >=0 && e.x < WIDTH && e.y >=0 && e.y < HEIGHT) entities.push_back(e); } } }
// 实体AI void updateEntities() { for(auto& e : entities) { // 僵尸追逐玩家 if(e.type == 'Z' && !isNight) continue;
CPP
    int dx = playerX - e.x;
    int dy = playerY - e.y;
    
    if(abs(dx)+abs(dy) < 5) { // 攻击玩家
        health -= 2;
    } else if(rand()%100 < 40) {
        e.x += (dx>0) ? 1 : (dx<0) ? -1 : 0;
        e.y += (dy>0) ? 1 : (dy<0) ? -1 : 0;
    }
}
}
// 渲染界面 void render() { system("cls");
CPP
// 绘制视野范围
for(int y = playerY - VIEW_RADIUS; y <= playerY + VIEW_RADIUS; y++) {
    for(int x = playerX - VIEW_RADIUS; x <= playerX + VIEW_RADIUS; x++) {
        // 昼夜效果
        if(isNight && (abs(x-playerX) + abs(y-playerY)) > VIEW_RADIUS/2) {
            cout << "\033[34m"; // 暗蓝色调
        }
        
        if(x == playerX && y == playerY) {
            cout << "\033[33m@\033[0m";
        } else if(x >=0 && x < WIDTH && y >=0 && y < HEIGHT) {
            Block b = BLOCK_DATA[world[y][x]];
            cout << b.color << b.symbol << "\033[0m";
        } else {
            cout << "\033[34m~\033[0m"; // 边界水域
        }
    }
    cout << endl;
}

// 状态栏
cout << "生命: [";
for(int i=0; i<10; i++) cout << (health>i*10 ? "■" : " ");
cout << "] 时间: " << gameTime/10 << " 昼夜: " << (isNight?"夜晚":"白天");

// 物品栏
cout << "\n物品栏:";
auto it = inventory.begin();
for(int i=0; i<INVENTORY_SIZE; i++) {
    if(it == inventory.end()) {
        cout << " [空]";
        continue;
    }
    string color = BLOCK_DATA[it->first].color;
    cout << (i==selectedSlot ? ">" : " ") 
         << color << it->first << "x" << it->second << "\033[0m ";
    ++it;
}
}
// 玩家操作 void handleInput() { if(_kbhit()) { char c = _getch(); switch(tolower(c)) { case 'w': playerY--; break; case 's': playerY++; break; case 'a': playerX--; break; case 'd': playerX++; break; case ' ': { // 破坏方块 int tx = playerX, ty = playerY; if(world[ty][tx] != AIR) { inventory[world[ty][tx]]++; world[ty][tx] = AIR; } break; } case 'e': { // 放置方块 auto it = inventory.begin(); for(int i=0; i<selectedSlot; i++) ++it; if(it != inventory.end() && it->second >0) { world[playerY][playerX] = it->first; inventory[it->first]--; } break; } case 'q': selectedSlot = (selectedSlot +1) % INVENTORY_SIZE; break; } } }
int main() { generateWorld(); while(health > 0) { gameTime++; isNight = (gameTime/100)%2;
CPP
    updatePhysics();
    spawnEntities();
    updateEntities();
    handleInput();
    render();
    
    Sleep(50);
}
cout << "\n游戏结束!\n";
return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...