专栏文章
今天我们来打我的世界(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 条评论,欢迎与作者交流。
正在加载评论...