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++;
		else
			startchange = 1;
	if (press == Up)
		if (startchange != 1)
			startchange--;
		else
			startchange = 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++;
				else
					startchange = 1;
			if (press == Up)
				if (startchange != 1)
					startchange--;
				else
					startchange = 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:点个赞吧这个方块里面有四个字,你可以看出是什么吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐星空Maker

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值