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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…