簡易版2D我的世界C++程序(有點BUG,但是可以玩!!!)

1、按空格鍵來切換模式(挖掘模式和放置模式),一律用鼠標右鍵來操作!!!?2、按數字1和2鍵來切換放置的方塊(1是草,2是木),樹葉不能放置!!! 3、樹木生成時可能有點BUG。 4、在操作時位置會有點偏移,請見諒。 5、地圖默認大小為20*20,可以自己修改。(第15行和第16行) 6、本程序應該會持續更新

更新日志:

4月25日: 1、更新了新方塊“石”,按數字3鍵切換(沒錯,樹葉依然不可以放置) 2、石頭會生成在草方塊下面,會生成5層。 3、更改了地圖的大小,為25*18。 4、操作偏移的bug依然存在(改了好幾次,結果改的更離譜了)

#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
#include <windows.h>// 定義方塊類型
typedef int BlockType;// 定義方塊名稱
const std::string BLOCK_NAMES[] = { "", "草", "木", "葉", "石" };// 定義世界的大小
const int WORLD_WIDTH = 25;
const int WORLD_HEIGHT = 18;// 定義世界地圖
class World {
private:std::vector<std::vector<BlockType> > blocks;public:World() {blocks.resize(WORLD_HEIGHT);for (int y = 0; y < WORLD_HEIGHT; ++y) {blocks[y].resize(WORLD_WIDTH, 0);}generateTerrain();generateTrees();}// 生成簡單地形void generateTerrain() {srand(static_cast<unsigned int>(time(NULL)));for (int x = 0; x < WORLD_WIDTH; ++x) {int height = rand() % 3 + 1;// 生成石頭for (int y = WORLD_HEIGHT - 1; y >= WORLD_HEIGHT - 5; --y) {blocks[y][x] = 4;}// 生成草for (int y = WORLD_HEIGHT - 6; y >= WORLD_HEIGHT - 6 - height + 1; --y) {blocks[y][x] = 1;}}}// 生成樹木void generateTrees() {for (int x = 0; x < WORLD_WIDTH; x += 5) { // 每隔 5 個方塊嘗試生成樹木if (rand() % 2 == 0) { // 50% 的概率生成樹木int baseY = WORLD_HEIGHT - 7; // 從可能的最上層草方塊開始找while (baseY >= 0 && blocks[baseY][x] != 1) baseY--; // 找到最上層的草方塊if (baseY > 0) {int treeHeight = rand() % 3 + 3; // 樹高 3 - 5// 生成樹干for (int i = 0; i < treeHeight; ++i) {if (baseY - i >= 0) {blocks[baseY - i][x] = 2;}}// 生成樹葉int leafTop = baseY - treeHeight;for (int dy = -1; dy <= 1; ++dy) {for (int dx = -1; dx <= 1; ++dx) {if (leafTop + dy >= 0 && x + dx >= 0 && x + dx < WORLD_WIDTH) {blocks[leafTop + dy][x + dx] = 3;}}}}}}}// 放置方塊void placeBlock(int x, int y, BlockType block) {if (x >= 0 && x < WORLD_WIDTH && y >= 0 && y < WORLD_HEIGHT) {blocks[y][x] = block;}}// 挖掘方塊void digBlock(int x, int y) {if (x >= 0 && x < WORLD_WIDTH && y >= 0 && y < WORLD_HEIGHT) {blocks[y][x] = 0;}}// 查看方塊BlockType getBlock(int x, int y) {if (x >= 0 && x < WORLD_WIDTH && y >= 0 && y < WORLD_HEIGHT) {return blocks[y][x];}return 0;}// 顯示世界void display(HANDLE hOut) {COORD coord = { 0, 0 };SetConsoleCursorPosition(hOut, coord);for (int y = 0; y < WORLD_HEIGHT; ++y) {for (int x = 0; x < WORLD_WIDTH; ++x) {std::string blockName = BLOCK_NAMES[blocks[y][x]];if (blockName.empty()) {std::cout << "  ";} else {std::cout << blockName;if (blockName.length() == 1) {std::cout << " ";}}std::cout << " "; // 方塊之間添加一個空格}std::cout << std::endl;}}
};// 獲取鼠標點擊的坐標并轉換為地圖坐標
void getMouseCoordinates(int& x, int& y) {POINT cursorPos;GetCursorPos(&cursorPos);HWND consoleWindow = GetConsoleWindow();RECT consoleRect;GetWindowRect(consoleWindow, &consoleRect);// 修正鼠標坐標轉換,確保準確對應方塊x = (cursorPos.x - consoleRect.left) / 25;y = (cursorPos.y - consoleRect.top) / 20;if (x < 0) x = 0;if (x >= WORLD_WIDTH) x = WORLD_WIDTH - 1;if (y < 0) y = 0;if (y >= WORLD_HEIGHT) y = WORLD_HEIGHT - 1;
}int main() {World world;BlockType currentBlock = 1;  // 初始方塊類型為草bool rightButtonDown = false;bool key1Down = false;bool key2Down = false;bool key3Down = false;bool spaceDown = false;bool isDigging = false;  // 初始為放置模式HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);while (true) {// 雙緩沖技術:先移動光標到屏幕左上角world.display(hOut);std::cout << "當前選擇的方塊:" << BLOCK_NAMES[currentBlock] << std::endl;std::cout << "當前模式:" << (isDigging ? "挖掘" : "放置") << std::endl;// 檢測空格鍵切換模式if ((GetAsyncKeyState(VK_SPACE) & 0x8000) && !spaceDown) {isDigging = !isDigging;spaceDown = true;} else if (!(GetAsyncKeyState(VK_SPACE) & 0x8000)) {spaceDown = false;}// 檢測鼠標右鍵if ((GetAsyncKeyState(VK_RBUTTON) & 0x8000) && !rightButtonDown) {int x, y;getMouseCoordinates(x, y);if (isDigging) {world.digBlock(x, y);} else {world.placeBlock(x, y, currentBlock);}rightButtonDown = true;} else if (!(GetAsyncKeyState(VK_RBUTTON) & 0x8000)) {rightButtonDown = false;}// 檢測數字 1 鍵if ((GetAsyncKeyState(0x31) & 0x8000) && !key1Down) {currentBlock = 1;key1Down = true;} else if (!(GetAsyncKeyState(0x31) & 0x8000)) {key1Down = false;}// 檢測數字 2 鍵if ((GetAsyncKeyState(0x32) & 0x8000) && !key2Down) {currentBlock = 2;key2Down = true;} else if (!(GetAsyncKeyState(0x32) & 0x8000)) {key2Down = false;}// 檢測數字 3 鍵if ((GetAsyncKeyState(0x33) & 0x8000) && !key3Down) {currentBlock = 4;key3Down = true;} else if (!(GetAsyncKeyState(0x33) & 0x8000)) {key3Down = false;}if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) {  // 按下 ESC 鍵退出break;}Sleep(50);}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/77398.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77398.shtml
英文地址,請注明出處:http://en.pswp.cn/web/77398.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu使用dify源碼安裝部署教程+避坑指南

很多人,包括我在最初使用dify的時候都習慣使用docker來部署安裝環境,但在二次開發使用過程中,我們可能希望使用源碼來安裝,那么這篇文章我將給大家分享如何在ubuntu系統下使用源碼安裝,并提供大家遇到的疑難雜癥如下: dify安裝使用過程中報錯:/console/api/workspaces/…

java知識體系結構導航

很全&#xff1a;java知識體系結構 個人筆記鏈接 開發工具IDEA IDEA 插件推薦清單 IDEA快捷鍵大全 Java基礎難點 基礎知識_java動態代理 基礎知識_java反射機制 基礎知識-java流steam 基礎知識-java集合collection Spring 01.Spring 框架的演化&#xff1a;從 XML 配置到…

RabbitMQ 的專業術語

術語定義示例/說明生產者&#xff08;Producer&#xff09;發送消息到 RabbitMQ 的客戶端應用程序。日志系統將錯誤信息發送到 RabbitMQ。消費者&#xff08;Consumer&#xff09;從 RabbitMQ 隊列中接收并處理消息的客戶端應用程序。一個訂單處理服務從隊列中讀取消息并更新數…

mac安裝vm虛擬機安裝包

因為mac安裝虛擬機時&#xff0c;發現下載過程變得不太一樣&#xff0c;會比較麻煩。所以決定發一下我已經下載的安裝包&#xff0c;個人用戶使用免費&#xff0c;商業版請自行去官網下載&#xff01; 百度網盤下載鏈接 百度網盤 請輸入提取碼 提取碼:d4rc

LLama Factory從入門到放棄

目錄 簡介 安裝 LLama Factory界面介紹 數據格式要求 微調訓練 今天在這里介紹一種常用的大模型微調框架——LLama Factory。 簡介 LLama Factory 是一個高效的界面化大語言模型微調工具庫&#xff0c;支持多種參數高效微調技術&#xff0c;提供簡潔接口和豐富示例&#…

如何借助全球動態IP實現多平臺賬號的批量注冊?

無論是社交網絡、在線購物平臺還是專業應用軟件&#xff0c;賬號的創建和使用都是必不可少的。然而&#xff0c;在面對不同平臺各自的注冊限制和策略時&#xff0c;如何高效、安全且合法地進行賬號批量注冊成為了亟待解決的問題。本文將探討全球動態IP在這一過程中的作用及其如…

django admin 添加自定義頁面

在Django中&#xff0c;你可以通過多種方式向Django Admin添加自定義頁面。以下是一些常見的方法&#xff1a; 方法1&#xff1a;使用ModelAdmin的get_urls()方法 如果你只是想添加一個簡單的頁面來展示信息&#xff0c;你可以在你的ModelAdmin類中重寫get_urls()方法。 from…

Docker容器持久化

引言 Docker 容器作為一種輕量級、可移植的虛擬化技術&#xff0c;廣泛應用于開發、測試和生產環境中。然而&#xff0c;容器天生是短暫的&#xff0c;意味著它們在生命周期結束后會被銷毀&#xff0c;而其中的數據也會隨之丟失。為了確保容器中的數據能夠持久化&#xff0c;我…

ShaderToy學習筆記 02.圓

1. 畫圓 1.1. 圓的方程 圓的方程是&#xff1a;(x^2 y^2 r^2)&#xff0c;其中(r)是圓的半徑。 我們可以使用 desmos 來驗證一下。 輸入 x^2 y^2 -10&#xff0c;即可得到圓。 類似下圖 1.2. 畫圓的方式 畫圓&#xff1a;使用圓的方程&#xff0c;判斷每個像素點是否在圓…

一文詳解卷積神經網絡中的卷積層和池化層原理 !!

文章目錄 前言 一、卷積核大小&#xff08;Kernel Size&#xff09; 1. 卷積核大小的作用 2. 常見的卷積核大小 3. 選擇卷積核大小的原則 二、步長&#xff08;Stride&#xff09; 1. Stride的作用 三、填充&#xff08;Padding&#xff09; 1. 填充的作用 四、通道數&#xff…

云+AI雙輪驅動,亞馬遜云科技加速中國企業出海新浪潮

導讀&#xff1a;全球化就是本地化 作者 | 小葳 圖片來源 | 攝圖 近年來&#xff0c;中國企業出海步伐不斷加快&#xff0c;“不出海&#xff0c;就出局”成為很多企業的共識。 據沙利文統計&#xff0c;2024年上半年&#xff0c;超過2000家中國上市企業布局海外市場&#xff…

C語言HashTable基本理解

文章目錄 一、哈希表概念1. 哈希表的基本概念2. 哈希表的核心組件2.1 哈希函數2.2 沖突處理&#xff08;哈希碰撞&#xff09; 3.哈希表的三種結構(1) 數組作為哈希表示例&#xff1a; 2. Set&#xff08;集合&#xff09;示例&#xff1a;查找數組中的重復元素1. Set 基礎概念…

【緩存與數據庫結合最終方案】偽從技術

實現偽從技術&#xff1a;基于Binlog的Following表變更監聽與緩存更新 技術方案概述 要實現一個專門消費者服務作為Following表的偽從&#xff0c;訂閱binlog并在數據變更時更新緩存&#xff0c;可以采用以下技術方案&#xff1a; 主要組件 MySQL Binlog監聽&#xff1a;使…

《100天精通Python——基礎篇 2025 第3天:變量與數據類型全面解析,掌握Python核心語法》

目錄 一、Python變量的定義和使用二、Python整數類型&#xff08;int&#xff09;詳解三、Python小數/浮點數&#xff08;float&#xff09;類型詳解四、Python復數類型(complex)詳解---了解五、Python字符串詳解(包含長字符串和原始字符串)5.1 處理字符串中的引號5.2 字符串的…

【前后端分離項目】Vue+Springboot+MySQL

文章目錄 1.安裝 Node.js2.配置 Node.js 環境3.安裝 Node.js 國內鏡像4.創建 Vue 項目5.運行 Vue 項目6.訪問 Vue 項目7.創建 Spring Boot 項目8.運行 Spring Boot 項目9.訪問 Spring Boot 項目10.實現 Vue 與 Spring Boot 聯動11.安裝 axios12.編寫請求13.調用函數請求接口14.…

線性代數(一些別的應該關注的點)

一、矩陣 矩陣運算&#xff1a;線性變換 縮放、平移、旋轉 無所不能的矩陣 - 三維圖形變換_嗶哩嗶哩_bilibili

01Redis快速入門(nosql、安裝redis、客戶端、命令及類型、java客戶端、序列化)

Redis的常見命令和客戶端使用 1.初識Redis Redis是一種鍵值型的NoSql數據庫&#xff0c;這里有兩個關鍵字&#xff1a; 鍵值型 NoSql 其中鍵值型&#xff0c;是指Redis中存儲的數據都是以key、value對的形式存儲&#xff0c;而value的形式多種多樣&#xff0c;可以是字符串…

AI編程:[體驗]從 0 到 1 開發一個項目的初體驗

一、開發信息 開發時間&#xff1a;1.5-2天工具使用&#xff1a; 不熟練&#xff0c;開發本項目前1天&#xff0c;才簡單使用了Cursor的功能 功能復雜度&#xff1a; 開發的功能相對簡單。頁面&#xff1a;2個&#xff0c;登錄頁面&#xff0c;個人中心頁面功能&#xff1a;5個…

LeetCode-392 判斷子序列

給定字符串 s 和 t &#xff0c;判斷 s 是否為 t 的子序列。 字符串的一個子序列是原始字符串刪除一些&#xff08;也可以不刪除&#xff09;字符而不改變剩余字符相對位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一個子序列&#…

Linux 系統監控大師:Glances 工具詳解助力自動化

看圖猜詩&#xff0c;你有任何想法都可以在評論區留言哦~ 摘要 Glances 是一款基于 Python 開發的跨平臺系統監控工具&#xff0c;集成了 CPU、內存、磁盤、網絡、進程等核心指標的實時監控能力&#xff0c;并支持命令行、Web界面、客戶端-服務器模式等多種使用場景。其輕量級…