C++【生存游戲】開發:荒島往事 第一期

字幕君已上線......

副字幕君已上線......

計數君已上線......

?( )?......

Doge智能系統已上線......

Doge:嗨嗨我又來了!

觀眾們......已上線!!!!!

OK LET`S GO!

前言(閑扯兩分半)

最近迷上了生存游戲"坤坤島"想要手搓一個,(注意:手搓這個詞很重要)

所以我在Scratch上試了一個,結果發現:代碼越來越多,BUG越來越多!

好吧......我又把目光放到了C嘎嘎上

:)

準備工作

?1、Red Panda Dev C++ Maker【3.0自創黑客版】? ? ? ?這是下載鏈接
?2、音樂:Liudiam.mp3、Click.wav? ? ? ? 這個需要自己準備

Doge:Liudiam.mp3是比較長的輕音樂,可循環播放,是用于主菜單的,Click是選擇音效,很短

?3、一張SetConsoleTextAttribute色表:

不熟悉Maker_Game/Console.h頭文件的,可以查看這篇文章:文章傳送門??????

本期目標:制作出主界面和大概的劇情

以及托盤圖標


首先,一個標標準準的荒島生存游戲需要有什么?無非就是主界面,各種地形,打怪,各種武器工具,各種劇情等等。所以,我們先從主界面開始制作。

開始制作

? ? ? ? 1、包含頭文件

? ? ? ? 首先,這是一個控制臺程序,所以直接使用我的萬能游戲頭文件Maker_Game的Console.h:

#include <Maker_Game/Console.h>
using namespace console_game;

? ? ? ? 2、編寫函數

? ? ? ? 然后,我們可以定義一個結構體GAME,用來存放游戲函數。

? ? ? ? ? ? ? ? 主菜單函數

? ? ? ? ? ? ? ? 我們命名這個函數名字叫做MainMeum

? ? ? ? ? ? ? ? 首先,稍微設置一下標題和窗口的樣子:

HideCursor();
ModeWindow(120, 30);
Art_Title("荒島往事 Alpha V1.0.3");
Art_Windows(1);

? ? ? ? ? ? ? ? 然后,我們需要繪制背景,有沙灘,有椰子樹,有藍天。

//繪制天空
color(63);
PrintSpace(30, 119);// 繪制沙灘
color(238);
gotoxy(27, 0);
PrintSpace(3, 119);
//黃238 白255//繪制太陽
color(255);
gotoxy(3, 100);
cout << "        ";
gotoxy(4, 100);
cout << "        ";
gotoxy(5, 100);
cout << "        ";
gotoxy(6, 100);
cout << "        ";// 繪制棕櫚樹
gotoxy(19, 8);
color(34);
printf("  ");
gotoxy(19, 16);
color(34);
printf("  ");
gotoxy(20, 10);
color(34);
printf("  ");
gotoxy(20, 14);
color(34);
printf("  ");
gotoxy(21, 12);
color(34);
printf("  ");
gotoxy(22, 12);
color(102);
printf("  ");
gotoxy(23, 12);
color(102);
printf("  ");
gotoxy(24, 12);
color(102);
printf("  ");
gotoxy(25, 12);
color(102);
printf("  ");
gotoxy(26, 12);
color(102);
printf("  ");
gotoxy(22, 10);
color(34);
printf("      ");
gotoxy(23, 8);
color(34);
printf("  ");
gotoxy(23, 16);
color(34);
printf("  ");

? ? ? ? ? ? ? ? 然后需要打印出來標題和選項。在這里,我想使用上下鍵選擇,空格鍵確定:

color(63);
gotoxy(13, 56);
printf("荒島往事");
while (press != ' ') {if (startchange == 1) {gotoxy(15, 55);printf("[開始游戲]");gotoxy(17, 55);printf(" 設置游戲 ");gotoxy(19, 55);printf(" 退出游戲 ");}if (startchange == 2) {gotoxy(15, 55);printf(" 開始游戲 ");gotoxy(17, 55);printf("[設置游戲]");gotoxy(19, 55);printf(" 退出游戲 ");}if (startchange == 3) {gotoxy(15, 55);printf(" 開始游戲 ");gotoxy(17, 55);printf(" 設置游戲 ");gotoxy(19, 55);printf("[退出游戲]");}press = getch();if (press == Down)if (startchange != 3)startchange++;elsestartchange = 1;if (press == Up)if (startchange != 1)startchange--;elsestartchange = 3;music.SendMusic("Click.mp3");Sleep(100);
}
if (startchange == 1) {Start();Sleep(10000);
} else if (startchange == 3)exit(0);

? ? ? ? ? ? ? ? 音樂函數

? ? ? ? ? ? ? ? 游戲可以添加一些音樂,但是直接調用music.h函數,會發現報錯了:getch重了,所以還是自己再寫一遍叭:(漸漸發現Maker_Game也不是很萬能)

struct MciMusic {void SendMusic(LPCSTR musicname) {char Code[10] = "play ";strcat(Code, musicname);mciSendString(Code, N, 0, N);}void PauseMusic(LPCSTR musicname) {char Code[10] = "pause ";strcat(Code, musicname);mciSendString(Code, N, 0, N);}void ResumeMusic(LPCSTR musicname) {char Code[10] = "resume ";strcat(Code, musicname);mciSendString(Code, N, 0, N);}void CloseMusic(LPCSTR musicname) {char Code[10] = "close ";strcat(Code, musicname);mciSendString(Code, N, 0, N);}
};MciMusic music;

? ? ? ? ? ? ? ? 劇情函數

? ? ? ? ? ? ? ? 我一共寫了兩個劇情,所以分兩個函數。還有一個是把他們結合在一起的。

? ? ? ? ? ? ? ? 但是,我需要定義一個劇情結構體、一個Isay(玩家說話)函數和一個SlowSay函數

? ? ? ? ? ? ? ? 網友:不是Maker_Game里面自帶SlowSay嗎,為什么還要自己寫QAQ

? ? ? ? ? ? ? ? 啊,最近我發現這個SlowSay用不了!(漸漸發現Maker_Game也不是很萬能*2)所以還是自己寫一個叭:

? ? ? ? ? ? ? ? 劇情結構體:

struct outtext{char text[100000];int t;
};//內容想怎么寫怎么寫outtext text[20] = {" ", 0,"在一片浩瀚無垠的蔚藍大海上,陽光如同碎金般灑落在波光粼粼的水面上。你正愜意地乘坐著豪華游輪,享受著這美好的海上旅程。\n", 25,"然而,突如其來的風暴打破了這份寧靜,巨大的海浪如同巨獸般吞噬著一切。游輪在狂風巨浪中劇烈搖晃,發出令人膽寒的嘎吱聲。\n\n船身被海浪一次次沖擊,最終不堪重負,開始解體。你在混亂中被卷入了洶涌的大海,冰冷的海水瞬間將你包圍......\n", 20,"在奮力掙扎了不知多久后,你幸運又不幸地成為了這場災難中唯一的幸存者,漂流到了一座荒無人煙的島嶼上。當你拖著疲憊不堪的身體爬上沙灘,看著眼前陌生而又荒蕪的景象,心中充滿了恐懼與無助,但求生的本能卻在此時開始悄然覺醒......\n", 30,"請鍵入你的用戶名: ", 20,"醒醒......\n", 50,"我在哪里?......\n", 30,"Prew......我居然活下來了!\n", 30,"呼......\n", 30,"真累哈......\n", 40,"好了,是時候考慮活下去的問題了......\n", 40
};

????????????????Isay函數:

void Isay()
{cout << PlayerName << ": ";
}

? ? ? ? ? ? ? ? SlowPrint函數(為了不和SlowSay函數重復而報錯,所以我換了一個名字):

void slowprint(outtext tet)
{for(int i = 0; i <= strlen(tet.text) - 1; i++){Beep(3000, 20);printf("%c",tet.text[i]);_sleep(tet.t);}		
}

? ? ? ? ? ? ? ? 劇情一函數

void Story1() {color(15);gotoxy(0, 0);slowprint(text[1]);Sleep(1000);color(10);Pause();Cls();color(15);slowprint(text[2]);Sleep(1000);color(10);Pause();Cls();color(15);slowprint(text[3]);Sleep(1000);color(10);Pause();Cls();Sleep(3000);
}

? ? ? ? ? ? ? ? 劇情二函數

void Story2() {Sleep(5000);slowprint(text[5]);Sleep(2000);slowprint(text[5]);Sleep(2000);Cls();syscolor("8f");Sleep(1000);syscolor("7f");Sleep(1000);syscolor("f0");Sleep(3000);Isay();slowprint(text[6]);Sleep(3000);Isay();slowprint(text[7]);Sleep(3000);Isay();slowprint(text[8]);Sleep(3000);Isay();slowprint(text[9]);Sleep(3000);Isay();slowprint(text[10]);Sleep(6000);
}

? ? ? ? 3、托盤圖標

????????這個簡單,但需要使用另一個文件:

#include <windows.h>
#include <shellapi.h>
#include <string>
#include <cstring>
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <string>// 禁用安全函數警告(若編譯器支持)
#define _CRT_SECURE_NO_WARNINGS// 定義托盤圖標消息
#define WM_TRAYICON (WM_USER + 1)bool IsProcessRunning(const std::string& processName) {// 創建系統進程快照HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapshot == INVALID_HANDLE_VALUE) {return false;}// 用于存儲進程信息的結構體PROCESSENTRY32 pe32;pe32.dwSize = sizeof(PROCESSENTRY32);// 獲取第一個進程信息if (!Process32First(hSnapshot, &pe32)) {CloseHandle(hSnapshot);return false;}// 遍歷所有進程bool found = false;do {// 將進程名稱轉換為小寫進行比較(不區分大小寫)std::string currentProcess = pe32.szExeFile;for (char& c : currentProcess) {c = std::tolower(c);}std::string targetProcess = processName;for (char& c : targetProcess) {c = std::tolower(c);}if (currentProcess.find(targetProcess) != std::string::npos) {found = true;break;}} while (Process32Next(hSnapshot, &pe32));// 關閉快照句柄CloseHandle(hSnapshot);return found;
}// 打開瀏覽器訪問微信支付頁面
void open_payment_page(const std::string& pay_url) {std::string command = "start " + pay_url;  // Windows系統// 對于Linux系統:system(("xdg-open " + pay_url).c_str());// 對于macOS系統:system(("open " + pay_url).c_str());system(command.c_str());
}// 窗口過程函數,處理托盤消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_TRAYICON:// 處理托盤圖標事件switch (LOWORD(lParam)) {case WM_RBUTTONUP: {// 創建右鍵菜單HMENU hMenu = CreatePopupMenu();AppendMenu(hMenu, MF_STRING, 1, "打開");AppendMenu(hMenu, MF_STRING, 2, "退出");// 獲取鼠標位置POINT pt;GetCursorPos(&pt);// 顯示菜單SetForegroundWindow(hwnd);TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL);DestroyMenu(hMenu);break;}case WM_LBUTTONDBLCLK:// 雙擊處理//MessageBox(hwnd, "托盤圖標被雙擊!", "提示", MB_OK);if(IsProcessRunning("main.exe") == 0)system("start main.exe");break;}return 0;case WM_COMMAND:// 處理菜單項點擊switch (LOWORD(wParam)) {case 1:if(IsProcessRunning("main.exe") == 0)system("start main.exe");//MessageBox(hwnd, "打開功能已觸發!", "提示", MB_OK);break;case 2:// 退出程序前移除托盤圖標NOTIFYICONDATA nid = {.cbSize = sizeof(NOTIFYICONDATA),.hWnd = hwnd,.uID = 1,.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP,.uCallbackMessage = WM_TRAYICON,.hIcon = NULL,.szTip = {0},.dwState = 0,.dwStateMask = 0,.szInfo = {0},.uTimeout = 0,.szInfoTitle = {0},.dwInfoFlags = 0};Shell_NotifyIcon(NIM_DELETE, &nid);PostQuitMessage(0);break;}return 0;case WM_DESTROY:// 窗口銷毀時移除托盤圖標NOTIFYICONDATA nid = {.cbSize = sizeof(NOTIFYICONDATA),.hWnd = hwnd,.uID = 1,.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP,.uCallbackMessage = WM_TRAYICON,.hIcon = NULL,.szTip = {0},.dwState = 0,.dwStateMask = 0,.szInfo = {0},.uTimeout = 0,.szInfoTitle = {0},.dwInfoFlags = 0};Shell_NotifyIcon(NIM_DELETE, &nid);PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, uMsg, wParam, lParam);
}// 在托盤創建圖標的函數
bool CreateSystemTrayIcon(HWND hwnd, const std::string& tooltip) {NOTIFYICONDATA nid = {.cbSize = sizeof(NOTIFYICONDATA),.hWnd = hwnd,.uID = 1,.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP,.uCallbackMessage = WM_TRAYICON,.szTip = {0}};// 加載圖標HICON hIcon = (HICON)LoadImage(NULL, "Opener.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);if (!hIcon) {DWORD error = GetLastError();char buffer[256];sprintf(buffer, "圖標加載失敗!錯誤代碼: %lu", error);MessageBox(hwnd, buffer, "錯誤", MB_ICONERROR);hIcon = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);}nid.hIcon = hIcon;strncpy(nid.szTip, tooltip.c_str(), sizeof(nid.szTip) - 1);// 添加托盤圖標并返回結果return Shell_NotifyIcon(NIM_ADD, &nid) != FALSE;
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int /*nCmdShow*/) {system("start main.exe");// 注冊窗口類(按正確順序初始化)WNDCLASS wc = {.style = 0,.lpfnWndProc = WindowProc,.cbClsExtra = 0,.cbWndExtra = 0,.hInstance = hInstance,.hIcon = NULL,.hCursor = LoadCursor(NULL, IDC_ARROW),.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1),.lpszMenuName = NULL,.lpszClassName = "TrayAppClass"};RegisterClass(&wc);// 創建隱藏窗口HWND hwnd = CreateWindow(wc.lpszClassName, "Tray Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, hInstance, NULL);if (!hwnd) return 1;// 創建托盤圖標if (!CreateSystemTrayIcon(hwnd, "荒島往事")) {MessageBox(hwnd, "創建托盤圖標失敗!", "錯誤", MB_ICONERROR);return 1;}// 隱藏窗口ShowWindow(hwnd, SW_HIDE);// 消息循環MSG msg = {0};while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return (int)msg.wParam;
}

完整代碼

? ? ? ? game.cpp

#include <windows.h>
#include <shellapi.h>
#include <string>
#include <cstring>
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>
#include <string>// 禁用安全函數警告(若編譯器支持)
#define _CRT_SECURE_NO_WARNINGS// 定義托盤圖標消息
#define WM_TRAYICON (WM_USER + 1)bool IsProcessRunning(const std::string& processName) {// 創建系統進程快照HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapshot == INVALID_HANDLE_VALUE) {return false;}// 用于存儲進程信息的結構體PROCESSENTRY32 pe32;pe32.dwSize = sizeof(PROCESSENTRY32);// 獲取第一個進程信息if (!Process32First(hSnapshot, &pe32)) {CloseHandle(hSnapshot);return false;}// 遍歷所有進程bool found = false;do {// 將進程名稱轉換為小寫進行比較(不區分大小寫)std::string currentProcess = pe32.szExeFile;for (char& c : currentProcess) {c = std::tolower(c);}std::string targetProcess = processName;for (char& c : targetProcess) {c = std::tolower(c);}if (currentProcess.find(targetProcess) != std::string::npos) {found = true;break;}} while (Process32Next(hSnapshot, &pe32));// 關閉快照句柄CloseHandle(hSnapshot);return found;
}// 打開瀏覽器訪問微信支付頁面
void open_payment_page(const std::string& pay_url) {std::string command = "start " + pay_url;  // Windows系統// 對于Linux系統:system(("xdg-open " + pay_url).c_str());// 對于macOS系統:system(("open " + pay_url).c_str());system(command.c_str());
}// 窗口過程函數,處理托盤消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg) {case WM_TRAYICON:// 處理托盤圖標事件switch (LOWORD(lParam)) {case WM_RBUTTONUP: {// 創建右鍵菜單HMENU hMenu = CreatePopupMenu();AppendMenu(hMenu, MF_STRING, 1, "打開");AppendMenu(hMenu, MF_STRING, 2, "退出");// 獲取鼠標位置POINT pt;GetCursorPos(&pt);// 顯示菜單SetForegroundWindow(hwnd);TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL);DestroyMenu(hMenu);break;}case WM_LBUTTONDBLCLK:// 雙擊處理//MessageBox(hwnd, "托盤圖標被雙擊!", "提示", MB_OK);if(IsProcessRunning("main.exe") == 0)system("start main.exe");break;}return 0;case WM_COMMAND:// 處理菜單項點擊switch (LOWORD(wParam)) {case 1:if(IsProcessRunning("main.exe") == 0)system("start main.exe");//MessageBox(hwnd, "打開功能已觸發!", "提示", MB_OK);break;case 2:// 退出程序前移除托盤圖標NOTIFYICONDATA nid = {.cbSize = sizeof(NOTIFYICONDATA),.hWnd = hwnd,.uID = 1,.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP,.uCallbackMessage = WM_TRAYICON,.hIcon = NULL,.szTip = {0},.dwState = 0,.dwStateMask = 0,.szInfo = {0},.uTimeout = 0,.szInfoTitle = {0},.dwInfoFlags = 0};Shell_NotifyIcon(NIM_DELETE, &nid);PostQuitMessage(0);break;}return 0;case WM_DESTROY:// 窗口銷毀時移除托盤圖標NOTIFYICONDATA nid = {.cbSize = sizeof(NOTIFYICONDATA),.hWnd = hwnd,.uID = 1,.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP,.uCallbackMessage = WM_TRAYICON,.hIcon = NULL,.szTip = {0},.dwState = 0,.dwStateMask = 0,.szInfo = {0},.uTimeout = 0,.szInfoTitle = {0},.dwInfoFlags = 0};Shell_NotifyIcon(NIM_DELETE, &nid);PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, uMsg, wParam, lParam);
}// 在托盤創建圖標的函數
bool CreateSystemTrayIcon(HWND hwnd, const std::string& tooltip) {NOTIFYICONDATA nid = {.cbSize = sizeof(NOTIFYICONDATA),.hWnd = hwnd,.uID = 1,.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP,.uCallbackMessage = WM_TRAYICON,.szTip = {0}};// 加載圖標HICON hIcon = (HICON)LoadImage(NULL, "Opener.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);if (!hIcon) {DWORD error = GetLastError();char buffer[256];sprintf(buffer, "圖標加載失敗!錯誤代碼: %lu", error);MessageBox(hwnd, buffer, "錯誤", MB_ICONERROR);hIcon = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);}nid.hIcon = hIcon;strncpy(nid.szTip, tooltip.c_str(), sizeof(nid.szTip) - 1);// 添加托盤圖標并返回結果return Shell_NotifyIcon(NIM_ADD, &nid) != FALSE;
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPSTR /*lpCmdLine*/, int /*nCmdShow*/) {system("start main.exe");// 注冊窗口類(按正確順序初始化)WNDCLASS wc = {.style = 0,.lpfnWndProc = WindowProc,.cbClsExtra = 0,.cbWndExtra = 0,.hInstance = hInstance,.hIcon = NULL,.hCursor = LoadCursor(NULL, IDC_ARROW),.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1),.lpszMenuName = NULL,.lpszClassName = "TrayAppClass"};RegisterClass(&wc);// 創建隱藏窗口HWND hwnd = CreateWindow(wc.lpszClassName, "Tray Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, hInstance, NULL);if (!hwnd) return 1;// 創建托盤圖標if (!CreateSystemTrayIcon(hwnd, "荒島往事")) {MessageBox(hwnd, "創建托盤圖標失敗!", "錯誤", MB_ICONERROR);return 1;}// 隱藏窗口ShowWindow(hwnd, SW_HIDE);// 消息循環MSG msg = {0};while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return (int)msg.wParam;
}

? ? ? ? main.cpp

#include <Maker_Game/Console.h>
#define N NULL
using namespace console_game;//x:行, y:列
char press = '1';
int startchange = 1;
int things[1000];struct outtext{char text[100000];int t;
};outtext text[20] = {" ", 0,"在一片浩瀚無垠的蔚藍大海上,陽光如同碎金般灑落在波光粼粼的水面上。你正愜意地乘坐著豪華游輪,享受著這美好的海上旅程。\n", 25,"然而,突如其來的風暴打破了這份寧靜,巨大的海浪如同巨獸般吞噬著一切。游輪在狂風巨浪中劇烈搖晃,發出令人膽寒的嘎吱聲。\n\n船身被海浪一次次沖擊,最終不堪重負,開始解體。你在混亂中被卷入了洶涌的大海,冰冷的海水瞬間將你包圍......\n", 20,"在奮力掙扎了不知多久后,你幸運又不幸地成為了這場災難中唯一的幸存者,漂流到了一座荒無人煙的島嶼上。當你拖著疲憊不堪的身體爬上沙灘,看著眼前陌生而又荒蕪的景象,心中充滿了恐懼與無助,但求生的本能卻在此時開始悄然覺醒......\n", 30,"請鍵入你的用戶名: ", 20,"醒醒......\n", 50,"我在哪里?......\n", 30,"Prew......我居然活下來了!\n", 30,"呼......\n", 30,"真累哈......\n", 40,"好了,是時候考慮活下去的問題了......\n", 40
};struct MciMusic {void SendMusic(LPCSTR musicname) {char Code[10] = "play ";strcat(Code, musicname);mciSendString(Code, N, 0, N);}void PauseMusic(LPCSTR musicname) {char Code[10] = "pause ";strcat(Code, musicname);mciSendString(Code, N, 0, N);}void ResumeMusic(LPCSTR musicname) {char Code[10] = "resume ";strcat(Code, musicname);mciSendString(Code, N, 0, N);}void CloseMusic(LPCSTR musicname) {char Code[10] = "close ";strcat(Code, musicname);mciSendString(Code, N, 0, N);}
};MciMusic music;string PlayerName;struct GAME {void Story1(){color(15);gotoxy(0, 0);slowprint(text[1]);Sleep(1000);color(10);Pause();Cls();color(15);slowprint(text[2]);Sleep(1000);color(10);Pause();Cls();color(15);slowprint(text[3]);Sleep(1000);color(10);Pause();Cls();Sleep(3000);		}void Story2(){Sleep(5000);slowprint(text[5]);Sleep(2000);slowprint(text[5]);Sleep(2000);Cls();syscolor("8f");Sleep(1000);syscolor("7f");Sleep(1000);syscolor("f0");Sleep(3000);Isay();slowprint(text[6]);Sleep(3000);Isay();slowprint(text[7]);Sleep(3000);Isay();slowprint(text[8]);Sleep(3000);Isay();slowprint(text[9]);Sleep(3000);Isay();slowprint(text[10]);Sleep(6000);}void slowprint(outtext tet){for(int i = 0; i <= strlen(tet.text) - 1; i++){Beep(3000, 20);printf("%c",tet.text[i]);_sleep(tet.t);}		}void Isay(){cout << PlayerName << ": ";}void Start() {syscolor("7f");Sleep(100);syscolor("87");Sleep(100);syscolor("08");Sleep(100);Cls();color(15);Sleep(1000);music.CloseMusic("Liudiam.mp3");Story1();color(15);slowprint(text[4]);cin >> PlayerName;Cls();Story2();Cls();}void MainMeum() {Run();HideCursor();ModeWindow(120, 30);Art_Title("荒島往事 Alpha V1.0.3");Art_Windows(1);color(63);PrintSpace(30, 119);music.SendMusic("Liudiam.mp3");// 繪制沙灘color(238);gotoxy(27, 0);PrintSpace(3, 119);//黃238 白255//繪制太陽color(255);gotoxy(3, 100);cout << "        ";	gotoxy(4, 100);cout << "        ";	gotoxy(5, 100);cout << "        ";	gotoxy(6, 100);cout << "        ";	// 繪制棕櫚樹gotoxy(19, 8);color(34);printf("  ");gotoxy(19, 16);color(34);printf("  ");gotoxy(20, 10);color(34);printf("  ");gotoxy(20, 14);color(34);printf("  ");gotoxy(21, 12);color(34);printf("  ");gotoxy(22, 12);color(102);printf("  ");gotoxy(23, 12);color(102);printf("  ");gotoxy(24, 12);color(102);printf("  ");gotoxy(25, 12);color(102);printf("  ");gotoxy(26, 12);color(102);printf("  ");gotoxy(22, 10);color(34);printf("      ");gotoxy(23, 8);color(34);printf("  ");gotoxy(23, 16);color(34);printf("  ");color(63);gotoxy(13, 56);printf("荒島往事");while (press != ' ') {if (startchange == 1) {gotoxy(15, 55);printf("[開始游戲]");gotoxy(17, 55);printf(" 設置游戲 ");gotoxy(19, 55);printf(" 退出游戲 ");}if (startchange == 2) {gotoxy(15, 55);printf(" 開始游戲 ");gotoxy(17, 55);printf("[設置游戲]");gotoxy(19, 55);printf(" 退出游戲 ");}if (startchange == 3) {gotoxy(15, 55);printf(" 開始游戲 ");gotoxy(17, 55);printf(" 設置游戲 ");gotoxy(19, 55);printf("[退出游戲]");}press = getch();if (press == Down)if (startchange != 3)startchange++;elsestartchange = 1;if (press == Up)if (startchange != 1)startchange--;elsestartchange = 3;music.SendMusic("Click.mp3");Sleep(100);}if (startchange == 1) {Start();Sleep(10000);} else if (startchange == 3)exit(0);return;}void Make_Text(string same, string name) {ofstream outfile(same, ios::out);if (!outfile) {cerr << "open error" << endl;}outfile << name;outfile.close();}void Hide() {HWND s;s = FindWindow("ConsoleWindowClass", NULL);//找到當前窗口句柄if (s) {ShowOwnedPopups(s, SW_HIDE);//顯示或隱藏由指定窗口所有的全部彈出式窗口ShowWindow(s, SW_HIDE);//隱藏窗口}}BOOL IsOsWin7OrAbove() {OSVERSIONINFOEX osInfo = {0};osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);osInfo.dwMajorVersion = 6;osInfo.dwMinorVersion = 1;DWORDLONG conditionMask = 0;VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_EQUAL);VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_EQUAL);return VerifyVersionInfo(&osInfo,VER_MAJORVERSION | VER_MINORVERSION,conditionMask) != 0;}void PrintSpace(int H, int L) {for (int i = 1; i <= H; i++) {for (int j = 1; j <= L; j++)cout << " ";cout << endl;}}void Run() {BOOL CanRun = IsOsWin7OrAbove();if (CanRun == FALSE) {Hide();MessageBox(NULL, "很遺憾!\n此產品不支持當前系統版本!\n(僅支持 Windows 7)\n", "荒島往事.exe 運行錯誤!", MB_ICONERROR | MB_OK);exit(0);}}void GameRun() {MainMeum();return;}
};GAME game;int main(void) {srand((unsigned)time(NULL));game.GameRun();return 0;
}

Doge:別急著走啊,按下Ctrl + D有驚喜呀~

Doge:點個贊吧這個方塊里面有四個字,你可以看出是什么嗎?

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

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

相關文章

k8s強制刪除podpvpvc和nsnamespace

k8s如何強制刪除pod&pv&pvc和ns&namespace方法 namespace、pod、pv、pvc全部處于“Terminating”狀態時&#xff0c;此時的該名稱空間下的所有控制器都已經被刪除了&#xff0c;之所以出現pod、pvc、pv、ns無法刪除&#xff0c;那是因為kubelet 阻塞&#xff0c;有…

Python基礎--4--Python常用代碼示例

1、文件讀寫操作&#xff08;常用于日志處理、數據導入導出&#xff09; 1、代碼示例 &#xff08;1&#xff09;讀取文本文件內容 with open("data.txt", "r", encoding"utf-8") as f:content f.read()print(content)&#xff08;2&#xf…

單項循環鏈表及帶頭指針的鏈表

單項循環鏈表及其帶頭指針的鏈表 對于鏈表我們要仔細深入的學習它&#xff0c;為何呢&#xff0c;因為他是我們在后面學習非線性數據結構的基礎&#xff0c;像后面的樹&#xff0c;圖等結構都是由鏈表演變出來的&#xff0c;所以我們這篇博客繼續探究鏈表 帶頭指針的鏈表 我…

八股文——JAVA基礎:解釋下什么是面向對象?面向對象和面向過程的區別

面向對象和面向過程是編程的不同思想&#xff1a; 面向過程如c語言的編程形式&#xff0c;在編程時定義的是一個方法&#xff0c;然后后續執行只需要關注這個方法的作用&#xff0c;而不會將方法進行抽象&#xff0c;也就是只關注程序執行的過程細節。 面向對象如java&#x…

SuperMap iServer 關閉數據目錄(datacatalog)、地圖打印(webprinting)等服務

背景 漏洞掃描發現有部分低危 web 漏洞&#xff0c;項目又暫未使用數據目錄服務&#xff0c;所以最簡單的方案是直接關閉服務。 查閱文檔發現處理自動化服務可以修改webapps\iserver\WEB-INF\iserver-geoprocessing.xml 的 enable 屬性為 false 關閉&#xff0c;機器學習服務…

PyTorch 張量(Tensors)全面指南:從基礎到實戰

文章目錄 什么是張量&#xff1f;張量初始化方法1. 直接從數據創建2. 從 NumPy 數組轉換3. 基于現有張量創建4. 使用隨機值或常量 張量屬性張量操作設備轉移索引和切片連接張量算術運算單元素張量轉換 原地操作&#xff08;In-place Operations&#xff09;PyTorch 與 NumPy 互…

Maven是什么?

Maven是一個流行的Java項目管理和構建工具&#xff0c;主要用于自動化項目構建、依賴管理和項目文檔生成等工作。以下是對它的簡單介紹&#xff1a; 核心功能 依賴管理&#xff1a;自動管理項目所需的第三方庫&#xff08;如JAR包&#xff09;&#xff0c;通過在配置文件中聲…

etcd教程-快速入門使用(截圖實操)集群搭建 + 原理解釋

大家好&#xff0c;我是此林。 etcd 是一個高可用的鍵值對存儲系統&#xff0c;常用于分布式系統中保存配置、服務發現和協調信息。它是 CNCF 旗下的項目之一&#xff0c;也是 Kubernetes 的核心組件之一&#xff0c;用來存儲集群狀態。 可以說&#xff0c;云原生場景下經常使…

OpenSSL 混合加密

openssl 中文網&#xff1a; https://www.openssl.net.cn/ 目錄 對稱加密特點常見算法案例&#xff08;使用 AES&#xff09; 非對稱加密特點常見算法案例&#xff08;使用 RSA&#xff09; 混合加密場景加密&#xff08;使用 AES&#xff09;解密 總結 對稱加密 特點 加密和解…

AI驅動的DevOps運維與云服務部署自動化

引言 當前&#xff0c;云計算和DevOps實踐讓開發者能夠管理成百上千臺服務器和容器&#xff0c;但隨之而來的運維復雜度也急劇提升。運維工程師經常需要部署多環境應用、維護大規模云主機、排查集群故障等任務。這些任務不僅涉及繁瑣的腳本編寫和命令行操作&#xff0c;還需要對…

Spring Boot動態數據源切換:優雅實現多數據源管理

在復雜的企業應用中&#xff0c;多數據源管理是常見需求。本文將介紹如何基于Spring Boot實現優雅的動態數據源切換方案&#xff0c;通過自定義注解和AOP實現透明化切換。 核心設計思路 通過三層結構實現數據源動態路由&#xff1a; 1. 注解層&#xff1a;聲明式標記數據源 2…

如何挑選一款1588PTP時鐘同步服務器?

在當今數字化程度極高的時代&#xff0c;高精度時間同步對于眾多關鍵領域的高效、穩定運行起著決定性作用。PTP&#xff08;精確時間協議&#xff09;時鐘作為實現高精度時間同步的核心設備&#xff0c;其性能優劣直接關乎系統整體表現。挑選一款合適的 ptp網絡同步時鐘&#x…

Harmony狀態管理 @Local和@Param

深入理解ArkUI中的Param與Local裝飾器 引言 在ArkUI的狀態管理系統中&#xff0c;Param和Local是兩個核心裝飾器&#xff0c;它們分別用于處理組件間的數據傳遞和組件內部狀態管理。本文將詳細介紹這兩個裝飾器的使用場景、特性差異以及最佳實踐。 Param裝飾器&#xff1a;組…

物聯網攝像頭模塊的應用場景

一、智慧城市治理 ?智能交通優化? ?動態信號控制?&#xff1a;杭州部署20萬物聯網攝像頭&#xff0c;實時分析車流密度并聯動1200個紅綠燈&#xff0c;早高峰通行效率提升40%。 ?違規行為識別?&#xff1a;搭載GB/T28181協議的攝像頭AI抓拍交通違章&#xff0c;車牌識…

k8s Ingress、Service配置各樣例大全

目錄 壹、k8s Ingress 樣例大全&#x1f527; 一、基礎路由與 TLS 終止&#x1f504; 二、高級路由控制1. **URL 重寫**&#xff08;適用后端服務路徑與入口路徑不一致&#xff09;2. **多路徑路由到不同服務** &#x1f6a6; 三、流量治理策略1. **金絲雀發布&#xff08;灰度…

領域驅動設計(DDD)【10】之DDD戰術模式:工廠模式與表意接口模式

文章目錄 引言&#xff1a;DDD戰術模式的重要性一、DDD中的工廠模式1.1 工廠模式的核心概念1.2 工廠模式的三種實現方式1.2.1 簡單工廠方法1.2.2 工廠類1.2.3 抽象工廠模式 1.3 工廠模式的適用場景1.4 實際案例&#xff1a;電商訂單系統 二、表意接口模式2.1 表意接口2.2 表意接…

鴻蒙ArkTS---登錄邏輯,數據持久化,ArkUI,網絡請求等基礎內容記錄

該內容是在【博學谷】學習過程中的代碼記錄&#xff0c;如有任何問題請與作者聯系。 也歡迎同在學習鴻蒙開發的小伙伴的留言&#xff0c;一同學習&#xff0c;一同進步。 功能實現&#xff08;只記錄代碼&#xff0c;沒有相關配置&#xff0c;跑不起來&#xff09;&#xff…

沒有公網ip可以實現跨網p2p互通嗎?內網讓公網直連訪問常用工具

沒有公網IP的情況下仍然可以實現P2P通信&#xff0c;但需要借助NAT穿透技術或類似nat123同端口映射等第三方工具實現內網穿透?。???? 一、什么是P2P通信&#xff1f; P2P網絡&#xff08;Peer-to-Peer Network&#xff09;是一種去中心化的網絡架構&#xff0c;其中每個…

云服務器安裝寶塔面板(BT Panel)

安裝寶塔面板&#xff08;BT Panel&#xff09;是很多服務器管理員常用的操作&#xff0c;尤其適合用于管理網站、數據庫、FTP等。以下是基于 Linux 系統&#xff08;推薦 CentOS 或 Ubuntu&#xff09;的寶塔面板安裝步驟。 安裝前準備 云服務器一臺 可以訂購服務器 海外云主…

mongoose解析http字段值

最近在使用mongoose開發嵌入式web后端時&#xff0c;會遇到要解析js前端發送過來的http消息&#xff0c;比如傳遞用戶名&#xff0c;密碼過來&#xff0c;后端要解析出來并判斷是否登錄成功。 前端http有兩種組裝字段的方式。 第一種是 $.ajax({url: /upgradePackage,method: P…