问题标题: **

0
0
干秣然
干秣然
初级守护
初级守护

改与https://wenda.kuding.cn/questions/30424/   @叶苗卿 

#include <graphics.h>
#include <conio.h>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
#include <string>
#include <stack>
#include <ctime>
#include <vector>
using namespace std;

// ============ 全局变量 ============
int money = 100;
int t = 0;
int tt = -1;
int v = 0;
int d = 0;

// 窗口尺寸
const int WIN_W = 900;
const int WIN_H = 650;
const int LINE_H = 28;
const int MARGIN_X = 30;
const int MARGIN_Y = 30;

// 消息缓冲区(替代 cout)
vector<string> g_messages;
int g_scrollOffset = 0; // 已**动的行数

// 输入相关
string g_inputBuffer;
bool g_waitingInput = false;
string g_inputPrompt;
bool g_inputDone = false;
string g_inputResult;

// ============ 图形辅助函数 ============
void initWindow()
{
    initgraph(WIN_W, WIN_H);
    setbkcolor(RGB(20, 20, 30));
    cleardevice();
    settextcolor(RGB(220, 220, 220));
    setbkmode(TRANSPARENT);
    settext**(20, 0, _T("Consolas"));
}

// 输出一行文字到消息缓冲区
void print(const string& s)
{
    g_messages.push_back(s);
    // 自动**到底部
    int maxLines = (WIN_H - MARGIN_Y * 2 - 60) / LINE_H;
    if ((int)g_messages.size() > maxLines)
        g_scrollOffset = (int)g_messages.size() - maxLines;
    else
        g_scrollOffset = 0;
}

void printLine()
{
    print("");
}

// 重绘所有消息
void redraw()
{
    cleardevice();
    // 标题
    settextcolor(RGB(255, 215, 0));
    settext**(24, 0, _T("Consolas"));
    outtextxy(MARGIN_X, 8, _T("*** 游戏 ***"));
    settext**(20, 0, _T("Consolas"));

    // 状态栏
    settextcolor(RGB(120, 220, 120));
    char status[256];
    sprintf(status, "金钱: $%d    天数: %d    ", money, t);
    outtextxy(WIN_W - 380, 10, status);

    if (tt != -1)
    {
        char debt[128];
        sprintf(debt, "还款日: 第%d天  欠款: $%d", tt, 2 * v);
        settextcolor(RGB(255, 100, 100));
        outtextxy(WIN_W - 380, 35, debt);
    }

    // 分隔线
    setlinecolor(RGB(80, 80, 100));
    line(MARGIN_X, 55, WIN_W - MARGIN_X, 55);

    // 绘制消息
    int maxLines = (WIN_H - MARGIN_Y * 2 - 60) / LINE_H;
    int startY = 70;
    int end = min((int)g_messages.size(), g_scrollOffset + maxLines);
    for (int i = g_scrollOffset; i < end; i++)
    {
        // 根据内容着色
        string& s = g_messages[i];
        if (s.find("破产") != string::npos || s.find("不能") != string::npos)
            settextcolor(RGB(255, 80, 80));
        else if (s.find("发财") != string::npos || s.find("获得") != string::npos)
            settextcolor(RGB(80, 255, 80));
        else if (s.find("警告") != string::npos)
            settextcolor(RGB(255, 200, 0));
        else
            settextcolor(RGB(220, 220, 220));

        outtextxy(MARGIN_X, startY + (i - g_scrollOffset) * LINE_H, s.c_str());
    }

    // 绘制输入框
    if (g_waitingInput)
    {
        int boxY = WIN_H - 70;
        setfillcolor(RGB(40, 40, 55));
        solidrectangle(MARGIN_X, boxY, WIN_W - MARGIN_X, boxY + 40);
        setlinecolor(RGB(100, 100, 150));
        rectangle(MARGIN_X, boxY, WIN_W - MARGIN_X, boxY + 40);

        settextcolor(RGB(255, 255, 100));
        // 提示
        outtextxy(MARGIN_X + 10, boxY + 10, g_inputPrompt.c_str());
        // 用户输入
        settextcolor(RGB(255, 255, 255));
        int promptW = textwidth(g_inputPrompt.c_str());
        outtextxy(MARGIN_X + 10 + promptW + 5, boxY + 10, g_inputBuffer.c_str());

        // 光标闪烁
        static int blink = 0;
        if ((blink++ / 20) % 2 == 0)
        {
            int cx = MARGIN_X + 10 + promptW + 5 + textwidth(g_inputBuffer.c_str());
            setlinecolor(RGB(255, 255, 255));
            line(cx, boxY + 8, cx, boxY + 32);
        }
    }
    FlushBatchDraw();
}

// 等待用户输入一行(替代 cin >> string)
string waitInput(const string& prompt)
{
    g_inputPrompt = prompt;
    g_inputBuffer = "";
    g_waitingInput = true;
    g_inputDone = false;
    g_inputResult = "";

    BeginBatchDraw();
    while (!g_inputDone)
    {
        // 处理消息
        ExMessage msg;
        while (peekmessage(&msg, EX_KEY | EX_CHAR | EX_MOUSE))
        {
            if (msg.message == WM_CHAR)
            {
                if (msg.ch == '\r') // 回车
                {
                    g_inputResult = g_inputBuffer;
                    g_inputDone = true;
                }
                else if (msg.ch == '\b') // 退格
                {
                    if (!g_inputBuffer.empty())
                        g_inputBuffer.pop_back();
                }
                else if (msg.ch >= 32 && msg.ch < 127)
                {
                    g_inputBuffer += (char)msg.ch;
                }
            }
        }
        redraw();
        Sleep(30);
    }
    g_waitingInput = false;
    EndBatchDraw();
    print(prompt + g_inputResult);
    return g_inputResult;
}

// 等待输入整数(替代 cin >> int),无效输入返回默认值
int waitInt(const string& prompt)
{
    string s = waitInput(prompt);
    // 过滤:只保留数字和负号
    string num;
    for (size_t i = 0; i < s.size(); i++)
    {
        if ((s[i] >= '0' && s[i] <= '9') || (i == 0 && s[i] == '-'))
            num += s[i];
        else
            break;
    }
    if (num.empty() || num == "-") return 0;
    return atoi(num.c_str());
}

// 等待按键(替代 system("pause"))
void waitKey()
{
    print("[按任意键继续...]");
    BeginBatchDraw();
    redraw();
    EndBatchDraw();
    // 清空消息队列
    while (_kbhit()) _getch();
    _getch();
}

// ============ 游戏逻辑 ============
void borrow()
{
    if (tt != -1)
    {
        print("你现在不能借钱");
        return;
    }
    int vv = waitInt("你要借多少钱? ");
    if (d == 1 || d == 2)
    {
        while (vv > 1000)
        {
            print("你不能借这么多钱!");
            vv = waitInt("你要借多少钱? ");
        }
    }
    else
    {
        while (vv > 100)
        {
            print("你不能借这么多钱!");
            vv = waitInt("你要借多少钱? ");
        }
    }
    if (vv < 0) vv = 0;
    v = vv;
    money += v;
    char buf[128];
    sprintf(buf, "10天以后你要还 %d 美元", 2 * v);
    print(buf);
}

bool pay()
{
    char buf[128];
    sprintf(buf, "你现在要还 %d", 2 * v);
    print(buf);
    money -= 2 * v;
    tt = -1;
    v = 0;
    if (money <= 0) return false;
    else return true;
}

int main()
{
    initWindow();
    BeginBatchDraw();
    redraw();
    EndBatchDraw();

    print("欢迎来到**游戏!");
    printLine();
    print("**:在游戏内请勿使用小数、负数、英文字母、特殊字符(游戏中另说明除外),");
    print("否则后果自负。");
    printLine();
    print("请选择难度(输入序号即可):");
    print("1:入门 2:简单 3:普通 4:中等 5:困难");

    // 输入难度
    while (true)
    {
        d = waitInt("请输入难度序号(1-5): ");
        if (d >= 1 && d <= 5) break;
        print("没有这个选项,请重新选择(1-5)。");
    }

    char buf[256];
    sprintf(buf, "已选择难度: %d", d);
    print(buf);
    printLine();

    bool flag = true;
    srand((unsigned)time(0));
    int n = 0, p = 0;

    if (d == 1)
    {
        print("每张** 购入价为1美元,出售价为5美元,有五个奖项");
        print("小奖:10美元");
        print("**:20美元");
        print("大奖:100美元");
        print("巨额奖金:1,000美元");
        print("杰克壶:10,000美元");
        print("你有100美元,当你赚了超过10,000美元,你就发财了。");
        print("但如果你失去了所有的钱,你破产了。");
        print("你可能想借钱(最多1,000美元),如果你想,按0。");
        print("请记住,当你借了十天以后。你必须偿还两倍,");
        print("你想买**还是卖**?(buy/sell)");
    }
    else if (d == 2)
    {
        print("每张** 购入价为2美元,出售价为3美元,有五个奖项");
        print("小奖:5美元");
        print("**:20美元");
        print("大奖:100美元");
        print("巨额奖金:1,000美元");
        print("杰克壶:10,000美元");
        print("你有100美元,当你赚了超过10,000美元,你就发财了。");
        print("但如果你失去了所有的钱,你破产了。");
        print("你可能想借钱(最多1,000美元),如果你想,请按0。");
        print("请记住,当你借了十天以后。你必须偿还两倍,");
        print("你想买**还是卖**?(buy/sell)");
    }
    else if (d == 3)
    {
        print("每张** 售价2美元,有五个奖项");
        print("小奖:5美元");
        print("**:20美元");
        print("大奖:100美元");
        print("巨额奖金:1,000美元");
        print("杰克壶:10,000美元");
        print("你有100美元,当你赚了超过10,000美元,你就发财了。");
        print("但如果你失去了所有的钱,你破产了。");
        print("你可能想借钱(最多100美元),如果你想,请按0。");
        print("请记住,当你借了十天以后。你必须偿还两倍,");
        print("你想买**还是卖**?(buy/sell)");
    }
    else if (d == 4)
    {
        print("每张** 售价3美元,有五个奖项");
        print("小奖:5美元");
        print("**:20美元");
        print("大奖:100美元");
        print("巨额奖金:1,000美元");
        print("杰克壶:10,000美元");
        print("你有100美元,当你赚了超过100,000美元,你就发财了。");
        print("但如果你失去了所有的钱,你破产了。");
        print("你可能想借钱(最多100美元),如果你想,请按0。");
        print("请记住,当你借了七天以后。你必须偿还两倍,");
        print("你想买**还是卖**?(buy/sell)");
    }
    else if (d == 5)
    {
        print("每张** 购入价为5美元,出售价为2美元,有五个奖项");
        print("小奖:5美元");
        print("**:20美元");
        print("大奖:100美元");
        print("巨额奖金:1,000美元");
        print("杰克壶:5,000美元");
        print("你有100美元,当你赚了超过100,000美元,你就发财了。");
        print("但如果你失去了所有的钱,你就破产了。");
        print("你可能想借钱(最多100美元),如果你想,请按0。");
        print("请记住,当你借了五天以后。你必须偿还两倍,");
        print("你想买**还是卖**?(buy/sell)");
    }

    string c = waitInput("请输入(buy/sell): ");

    // ============ 买票分支 ============
    if (!c.empty() && (c[0] == 'b' || c[0] == 'B'))
    {
        while (money > 0)
        {
            if (d == 1 || d == 2 || d == 3)
            {
                if (money >= 10000)
                {
                    print("你发财了! ");
                    sprintf(buf, "你花了 %d 天", t);
                    print(buf);
                    waitKey();
                    closegraph();
                    return 0;
                }
            }
            if (d == 4 || d == 5)
            {
                if (money >= 100000)
                {
                    print("你发财了! ");
                    sprintf(buf, "你花了 %d 天", t);
                    print(buf);
                    waitKey();
                    closegraph();
                    return 0;
                }
            }
            t++;
            sprintf(buf, "你有$%d", money);
            print(buf);
            n = waitInt("你要买几张票? ");

            if (n == 0)
            {
                if (d == 4)
                {
                    borrow();
                    tt = t + 7;
                }
                else if (d == 5)
                {
                    borrow();
                    tt = t + 5;
                }
                else
                {
                    borrow();
                    tt = t + 10;
                }
            }
            if (t == tt)
            {
                flag = pay();
            }
            if (t == tt - 1)
                print("[警告]你必须在明天还钱!");
            if (flag == false)
            {
                print("你不能偿还你借的钱!");
                print("你破产了。");
                sprintf(buf, "你生存了 %d 天。", t);
                print(buf);
                waitKey();
                closegraph();
                return 0;
            }
            flag = true;
            if (n < 0)
            {
                print("因为你违反规则,所以**强制停止了你的游戏");
                waitKey();
                closegraph();
                return 0;
            }

            if (d == 1) money = money - n;
            if (d == 2 || d == 3) money = money - n * 2;
            if (d == 4) money = money - n * 3;
            if (d == 5) money = money - n * 5;

            if (money < 0)
            {
                print("你破产了。");
                sprintf(buf, "你生存了 %d 天", t);
                print(buf);
                waitKey();
                closegraph();
                return 0;
            }

            for (int i = 0; i < n; i++)
            {
                p = rand() % 12000;
                if (p == 0)
                {
                    int q = rand() % 4;
                    if (q == 1)
                    {
                        print("你获得了杰克壶!");
                        if (d == 5) money += 5000;
                        else money += 10000;
                    }
                }
                else if (p >= 1 && p <= 8)
                {
                    int g = rand() % 2;
                    if (g == 0)
                    {
                        print("你获得了巨额奖金! ");
                        money += 1000;
                    }
                }
                else if (p >= 9 && p <= 99)
                {
                    print("你获得了大奖!");
                    money += 100;
                }
                else if ((p >= 100 && p <= 399) || (p > 1500 && p <= 1600))
                {
                    print("你获得了中间奖!");
                    money += 20;
                }
                else if (p >= 400 && p <= 1500)
                {
                    print("你获得了小奖!");
                    if (d == 1) money += 10;
                    else money += 5;
                }
            }
            if (money <= 0)
            {
                print("你破产了。");
                sprintf(buf, "你生存了 %d 天。", t);
                print(buf);
                waitKey();
                closegraph();
                return 0;
            }
        }
    }

    // ============ 卖票分支 ============
    if (!c.empty() && (c[0] == 's' || c[0] == 'S'))
    {
        if (d == 1)
        {
            sprintf(buf, "你有$%d", money);
            print(buf);
            print("你必须付25美元买一个商店。 ");
            print("你只能卖同样数量的票作为你的钱。 ");
            money -= 25;
        }
        if (d == 2)
        {
            sprintf(buf, "你有$%d", money);
            print(buf);
            print("你必须付35美元买一个商店。 ");
            print("你只能卖同样数量的票作为你的钱。 ");
            money -= 35;
        }
        if (d == 3 || d == 4)
        {
            sprintf(buf, "你有$%d", money);
            print(buf);
            print("你必须付50美元买一个商店。 ");
            print("你只能卖同样数量的票作为你的钱。 ");
            money -= 50;
        }
        if (d == 5)
        {
            sprintf(buf, "你有$%d", money);
            print(buf);
            print("你必须付60美元买一个商店。 ");
            print("你只能卖同样数量的票作为你的钱。 ");
            money -= 60;
        }
        sprintf(buf, "你有$%d", money);
        print(buf);

        while (money > 0)
        {
            if (d == 1 || d == 2 || d == 3)
            {
                if (money >= 10000)
                {
                    if (d == 4 || d == 5)
                    {
                        if (money >= 100000)
                        {
                            print("你发财了!");
                            sprintf(buf, "你花了%d天。", t);
                            print(buf);
                            waitKey();
                            closegraph();
                            return 0;
                        }
                    }
                }
            }
            t++;
            sprintf(buf, "你有$%d", money);
            print(buf);
            n = waitInt("你要卖几张票? ");

            if (n == 0)
            {
                borrow();
                tt = t + 10;
            }
            if (t == tt) flag = pay();
            if (flag == false)
            {
                print("你不能偿还你借的钱。");
                print("你破产了!");
                sprintf(buf, "你生存了 %d 天。", t);
                print(buf);
                waitKey();
                closegraph();
                return 0;
            }
            if (n < 0 || n > money)
            {
                print("注意");
                print("你破产了!");
                sprintf(buf, "你生存了 %d 天", t);
                print(buf);
                waitKey();
                closegraph();
                return 0;
            }

            if (d == 1) money = money + n * 5;
            else if (d == 2) money = money + n * 3;
            else money = money + n * 2;

            if (money < 0)
            {
                print("你破产了!");
                sprintf(buf, "你生存了 %d 天", t);
                print(buf);
                waitKey();
                closegraph();
                return 0;
            }

            for (int i = 0; i < n; i++)
            {
                p = rand() % 12000;
                if (p == 0)
                {
                    int y = rand() % 4;
                    if (y == 1)
                    {
                        print("你失去了杰克壶!");
                        if (d == 5) money -= 5000;
                        else money -= 10000;
                    }
                }
                else if (p >= 1 && p <= 8)
                {
                    print("你失去了巨额奖金!");
                    money -= 1000;
                }
                else if (p >= 15 && p <= 50)
                {
                    print("你失去了大奖!");
                    money -= 100;
                }
                else if (p >= 61 && p <= 360)
                {
                    print("你失去了**!");
                    money -= 20;
                }
                else if (p >= 401 && p <= 1500)
                {
                    print("你失去了小奖!");
                    money -= 5;
                }
            }
        }
    }

    if (money <= 0)
    {
        print("你破产了。");
        sprintf(buf, "你生存了 %d 天。", t);
        print(buf);
        waitKey();
    }

    closegraph();
    return 0;
}

干秣然在2026-10-15 19:37:37追加了内容

好了

#include <windows.h>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <ctime>
using namespace std;

// ============ 全局变量 ============
int money = 100;
int t = 0;
int tt = -1;
int v = 0;
int d = 0;

vector<wstring> g_messages;
int g_scrollOffset = 0;

wstring g_inputBuffer;
bool g_waitingInput = false;
wstring g_inputPrompt;
bool g_inputDone = false;
wstring g_inputResult;

HWND g_hwnd = NULL;
HFONT g_font = NULL;
HFONT g_fontTitle = NULL;

const int WIN_W = 900;
const int WIN_H = 650;
const int LINE_H = 24;
const int MARGIN_X = 20;
const int MARGIN_Y = 70;

// ============ 工具函数 ============
wstring toW(const string& s)
{
    if (s.empty()) return L"";
    int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), -1, NULL, 0);
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), -1, buf, len);
    wstring r(buf);
    delete[] buf;
    return r;
}

void print(const wstring& s)
{
    g_messages.push_back(s);
    int maxLines = (WIN_H - MARGIN_Y - 90) / LINE_H;
    if ((int)g_messages.size() > maxLines)
        g_scrollOffset = (int)g_messages.size() - maxLines;
    else
        g_scrollOffset = 0;
    if (g_hwnd) InvalidateRect(g_hwnd, NULL, TRUE);
}

void print(const string& s) { print(toW(s)); }
void printLine() { print(L""); }

// ============ 绘制 ============
void OnPaint(HDC hdc)
{
    HDC memDC = CreateCompatibleDC(hdc);
    HBITMAP memBmp = CreateCompatibleBitmap(hdc, WIN_W, WIN_H);
    HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, memBmp);

    HBRUSH bgBrush = CreateSolidBrush(RGB(20, 20, 30));
    RECT rc = { 0, 0, WIN_W, WIN_H };
    FillRect(memDC, &rc, bgBrush);
    DeleteObject(bgBrush);

    SetBkMode(memDC, TRANSPARENT);

    SelectObject(memDC, g_fontTitle);
    SetTextColor(memDC, RGB(255, 215, 0));
    TextOutW(memDC, 20, 10, L"*** \u6e38\u620f ***", 10);

    SelectObject(memDC, g_font);
    SetTextColor(memDC, RGB(120, 220, 120));
    wchar_t status[256];
    swprintf(status, 256, L"\u91d1\u94b1: $%d    \u5929\u6570: %d", money, t);
    TextOutW(memDC, WIN_W - 380, 15, status, (int)wcslen(status));

    if (tt != -1)
    {
        SetTextColor(memDC, RGB(255, 100, 100));
        swprintf(status, 256,
                 L"\u8fd8\u6b3e\u65e5: \u7b2c%d\u5929  \u6b20\u6b3e: $%d",
                 tt, 2 * v);
        TextOutW(memDC, WIN_W - 380, 40, status, (int)wcslen(status));
    }

    HPEN pen = CreatePen(PS_SOLID, 1, RGB(80, 80, 100));
    HPEN oldPen = (HPEN)SelectObject(memDC, pen);
    MoveToEx(memDC, 20, 62, NULL);
    LineTo(memDC, WIN_W - 20, 62);
    SelectObject(memDC, oldPen);
    DeleteObject(pen);

    int maxLines = (WIN_H - MARGIN_Y - 90) / LINE_H;
    int end = min((int)g_messages.size(), g_scrollOffset + maxLines);
    for (int i = g_scrollOffset; i < end; i++)
    {
        const wstring& s = g_messages[i];
        if (s.find(L"\u7834\u4ea7") != wstring::npos ||
            s.find(L"\u4e0d\u80fd") != wstring::npos)
            SetTextColor(memDC, RGB(255, 80, 80));
        else if (s.find(L"\u53d1\u8d22") != wstring::npos ||
                 s.find(L"\u83b7\u5f97") != wstring::npos)
            SetTextColor(memDC, RGB(80, 255, 80));
        else if (s.find(L"\u8b66\u544a") != wstring::npos)
            SetTextColor(memDC, RGB(255, 200, 0));
        else
            SetTextColor(memDC, RGB(220, 220, 220));

        TextOutW(memDC, MARGIN_X, MARGIN_Y + (i - g_scrollOffset) * LINE_H,
                 s.c_str(), (int)s.size());
    }

    if (g_waitingInput)
    {
        int boxY = WIN_H - 60;
        HBRUSH inBrush = CreateSolidBrush(RGB(40, 40, 55));
        RECT inRc = { MARGIN_X, boxY, WIN_W - MARGIN_X, boxY + 40 };
        FillRect(memDC, &inRc, inBrush);
        DeleteObject(inBrush);

        HPEN inPen = CreatePen(PS_SOLID, 1, RGB(100, 100, 150));
        HPEN op = (HPEN)SelectObject(memDC, inPen);
        HBRUSH ob = (HBRUSH)SelectObject(memDC, GetStockObject(NULL_BRUSH));
        Rectangle(memDC, MARGIN_X, boxY, WIN_W - MARGIN_X, boxY + 40);
        SelectObject(memDC, op);
        SelectObject(memDC, ob);
        DeleteObject(inPen);

        SetTextColor(memDC, RGB(255, 255, 100));
        TextOutW(memDC, MARGIN_X + 10, boxY + 10,
                 g_inputPrompt.c_str(), (int)g_inputPrompt.size());

        SIZE sz;
        GetTextExtentPoint32W(memDC, g_inputPrompt.c_str(),
                              (int)g_inputPrompt.size(), &sz);
        SetTextColor(memDC, RGB(255, 255, 255));
        TextOutW(memDC, MARGIN_X + 15 + sz.cx, boxY + 10,
                 g_inputBuffer.c_str(), (int)g_inputBuffer.size());

        static int blink = 0;
        if ((blink++ / 15) % 2 == 0)
        {
            SIZE sz2;
            GetTextExtentPoint32W(memDC, g_inputBuffer.c_str(),
                                  (int)g_inputBuffer.size(), &sz2);
            int cx = MARGIN_X + 15 + sz.cx + sz2.cx;
            HPEN cP = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
            HPEN ocp = (HPEN)SelectObject(memDC, cP);
            MoveToEx(memDC, cx, boxY + 8, NULL);
            LineTo(memDC, cx, boxY + 32);
            SelectObject(memDC, ocp);
            DeleteObject(cP);
        }
    }

    BitBlt(hdc, 0, 0, WIN_W, WIN_H, memDC, 0, 0, SRCCOPY);
    SelectObject(memDC, oldBmp);
    DeleteObject(memBmp);
    DeleteDC(memDC);
}

// ============ 输入 ============
wstring waitInput(const wstring& prompt)
{
    g_inputPrompt = prompt;
    g_inputBuffer = L"";
    g_waitingInput = true;
    g_inputDone = false;
    g_inputResult = L"";

    if (g_hwnd) InvalidateRect(g_hwnd, NULL, TRUE);

    MSG msg;
    while (!g_inputDone)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            Sleep(20);
            if (g_hwnd) InvalidateRect(g_hwnd, NULL, FALSE);
        }
    }
    g_waitingInput = false;
    print(prompt + g_inputResult);
    return g_inputResult;
}

int waitInt(const wstring& prompt)
{
    wstring s = waitInput(prompt);
    wstring num;
    for (size_t i = 0; i < s.size(); i++)
    {
        if ((s[i] >= L'0' && s[i] <= L'9') || (i == 0 && s[i] == L'-'))
            num += s[i];
        else
            break;
    }
    if (num.empty() || num == L"-") return 0;
    return _wtoi(num.c_str());
}

void waitKey()
{
    print(L"[\u6309\u4efb\u610f\u952e\u7ee7\u7eed...]");
    if (g_hwnd) InvalidateRect(g_hwnd, NULL, TRUE);

    while (true)
    {
        MSG msg;
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_KEYDOWN || msg.message == WM_LBUTTONDOWN)
                break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
            Sleep(20);
    }
}

// ============ 游戏逻辑 ============
void borrow()
{
    if (tt != -1)
    {
        print(L"\u4f60\u73b0\u5728\u4e0d\u80fd\u501f\u94b1");
        return;
    }
    int vv = waitInt(L"\u4f60\u8981\u501f\u591a\u5c11\u94b1\uff1f ");
    if (d == 1 || d == 2)
    {
        while (vv > 1000)
        {
            print(L"\u4f60\u4e0d\u80fd\u501f\u8fd9\u4e48\u591a\u94b1\uff01");
            vv = waitInt(L"\u4f60\u8981\u501f\u591a\u5c11\u94b1\uff1f ");
        }
    }
    else
    {
        while (vv > 100)
        {
            print(L"\u4f60\u4e0d\u80fd\u501f\u8fd9\u4e48\u591a\u94b1\uff01");
            vv = waitInt(L"\u4f60\u8981\u501f\u591a\u5c11\u94b1\uff1f ");
        }
    }
    if (vv < 0) vv = 0;
    v = vv;
    money += v;
    wchar_t buf[128];
    swprintf(buf, 128,
             L"10\u5929\u4ee5\u540e\u4f60\u8981\u8fd8 %d \u7f8e\u5143", 2 * v);
    print(buf);
}

bool pay()
{
    wchar_t buf[128];
    swprintf(buf, 128, L"\u4f60\u73b0\u5728\u8981\u8fd8 %d", 2 * v);
    print(buf);
    money -= 2 * v;
    tt = -1;
    v = 0;
    return money > 0;
}

// ============ 窗口过程 ============
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_CREATE:
        g_hwnd = hwnd;
        SetTimer(hwnd, 1, 100, NULL);
        return 0;

    case WM_TIMER:
        if (g_waitingInput)
            InvalidateRect(hwnd, NULL, FALSE);
        return 0;

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        OnPaint(hdc);
        EndPaint(hwnd, &ps);
        return 0;
    }

    case WM_CHAR:
        if (g_waitingInput)
        {
            wchar_t ch = (wchar_t)wParam;
            if (ch == L'\r')
            {
                g_inputResult = g_inputBuffer;
                g_inputDone = true;
            }
            else if (ch == L'\b')
            {
                if (!g_inputBuffer.empty())
                    g_inputBuffer.erase(g_inputBuffer.size() - 1);
                InvalidateRect(hwnd, NULL, FALSE);
            }
            else if (ch >= 32 && ch < 127)
            {
                g_inputBuffer += ch;
                InvalidateRect(hwnd, NULL, FALSE);
            }
        }
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

// ============ 主游戏流程 ============
void runGame()
{
    wchar_t buf[256];

    print(L"\u6b22\u8fce\u6765\u5230**\u6e38\u620f\uff01");
    printLine();
    print(L"\u89c4\u5219\uff1a\u5728\u6e38\u620f\u5185\u8bf7\u52ff\u4f7f\u7528\u5c0f\u6570\u3001\u8d1f\u6570\u3001\u82f1\u6587\u5b57\u6bcd\u3001\u7279\u6b8a\u5b57\u7b26\uff08\u6e38\u620f\u4e2d\u53e6\u8bf4\u660e\u9664\u5916\uff09\uff0c");
    print(L"\u5426\u5219\u540e\u679c\u81ea\u8d1f\u3002");
    printLine();
    print(L"\u8bf7\u9009\u62e9\u96be\u5ea6(\u8f93\u5165\u5e8f\u53f7\u5373\u53ef):");
    print(L"1:\u5165\u95e8  2:\u7b80\u5355  3:\u666e\u901a  4:\u4e2d\u7b49  5:\u56f0\u96be");

    while (true)
    {
        d = waitInt(L"\u8bf7\u8f93\u5165\u96be\u5ea6\u5e8f\u53f7(1-5): ");
        if (d >= 1 && d <= 5) break;
        print(L"\u6ca1\u6709\u8fd9\u4e2a\u9009\u9879\uff0c\u8bf7\u91cd\u65b0\u9009\u62e9(1-5)\u3002");
    }

    swprintf(buf, 256, L"\u5df2\u9009\u62e9\u96be\u5ea6: %d", d);
    print(buf);
    printLine();

    bool flag = true;
    srand((unsigned)time(0));
    int n = 0, p = 0;

    if (d == 1)
    {
        print(L"\u6bcf\u5f20** \u8d2d\u5165\u4ef7\u4e3a1\u7f8e\u5143\uff0c\u51fa\u552e\u4ef7\u4e3a5\u7f8e\u5143\uff0c\u6709\u4e94\u4e2a\u5956\u9879");
        print(L"\u5c0f\u5956\uff1a10\u7f8e\u5143  **\uff1a20\u7f8e\u5143  \u5927\u5956\uff1a100\u7f8e\u5143  \u5de8\u989d\u5956\u91d1\uff1a1,000\u7f8e\u5143  \u6770\u514b\u58f6\uff1a10,000\u7f8e\u5143");
        print(L"\u4f60\u6709100\u7f8e\u5143\uff0c\u5f53\u4f60\u8d5a\u4e86\u8d85\u8fc710,000\u7f8e\u5143\uff0c\u4f60\u5c31\u53d1\u8d22\u4e86\u3002");
        print(L"\u4f46\u5982\u679c\u4f60\u5931\u53bb\u4e86\u6240\u6709\u7684\u94b1\uff0c\u4f60\u7834\u4ea7\u4e86\u3002");
        print(L"\u4f60\u53ef\u80fd\u60f3\u501f\u94b1\uff08\u6700\u591a1,000\u7f8e\u5143\uff09\uff0c\u5982\u679c\u4f60\u60f3\uff0c\u63090\u3002");
        print(L"\u8bf7\u8bb0\u4f4f\uff0c\u5f53\u4f60\u501f\u4e86\u5341\u5929\u4ee5\u540e\u3002\u4f60\u5fc5\u987b\u507f\u8fd8\u4e24\u500d\uff0c");
        print(L"\u4f60\u60f3\u4e70**\u8fd8\u662f\u5356**\uff1f\uff08buy/sell\uff09");
    }
    else if (d == 2)
    {
        print(L"\u6bcf\u5f20** \u8d2d\u5165\u4ef7\u4e3a2\u7f8e\u5143\uff0c\u51fa\u552e\u4ef7\u4e3a3\u7f8e\u5143\uff0c\u6709\u4e94\u4e2a\u5956\u9879");
        print(L"\u5c0f\u5956\uff1a5\u7f8e\u5143  **\uff1a20\u7f8e\u5143  \u5927\u5956\uff1a100\u7f8e\u5143  \u5de8\u989d\u5956\u91d1\uff1a1,000\u7f8e\u5143  \u6770\u514b\u58f6\uff1a10,000\u7f8e\u5143");
        print(L"\u4f60\u6709100\u7f8e\u5143\uff0c\u5f53\u4f60\u8d5a\u4e86\u8d85\u8fc710,000\u7f8e\u5143\uff0c\u4f60\u5c31\u53d1\u8d22\u4e86\u3002");
        print(L"\u4f46\u5982\u679c\u4f60\u5931\u53bb\u4e86\u6240\u6709\u7684\u94b1\uff0c\u4f60\u7834\u4ea7\u4e86\u3002");
        print(L"\u4f60\u53ef\u80fd\u60f3\u501f\u94b1\uff08\u6700\u591a1,000\u7f8e\u5143\uff09\uff0c\u5982\u679c\u4f60\u60f3\uff0c\u8bf7\u63090\u3002");
        print(L"\u8bf7\u8bb0\u4f4f\uff0c\u5f53\u4f60\u501f\u4e86\u5341\u5929\u4ee5\u540e\u3002\u4f60\u5fc5\u987b\u507f\u8fd8\u4e24\u500d\uff0c");
        print(L"\u4f60\u60f3\u4e70**\u8fd8\u662f\u5356**\uff1f\uff08buy/sell\uff09");
    }
    else if (d == 3)
    {
        print(L"\u6bcf\u5f20** \u552e\u4ef72\u7f8e\u5143\uff0c\u6709\u4e94\u4e2a\u5956\u9879");
        print(L"\u5c0f\u5956\uff1a5\u7f8e\u5143  **\uff1a20\u7f8e\u5143  \u5927\u5956\uff1a100\u7f8e\u5143  \u5de8\u989d\u5956\u91d1\uff1a1,000\u7f8e\u5143  \u6770\u514b\u58f6\uff1a10,000\u7f8e\u5143");
        print(L"\u4f60\u6709100\u7f8e\u5143\uff0c\u5f53\u4f60\u8d5a\u4e86\u8d85\u8fc710,000\u7f8e\u5143\uff0c\u4f60\u5c31\u53d1\u8d22\u4e86\u3002");
        print(L"\u4f46\u5982\u679c\u4f60\u5931\u53bb\u4e86\u6240\u6709\u7684\u94b1\uff0c\u4f60\u7834\u4ea7\u4e86\u3002");
        print(L"\u4f60\u53ef\u80fd\u60f3\u501f\u94b1\uff08\u6700\u591a100\u7f8e\u5143\uff09\uff0c\u5982\u679c\u4f60\u60f3\uff0c\u8bf7\u63090\u3002");
        print(L"\u8bf7\u8bb0\u4f4f\uff0c\u5f53\u4f60\u501f\u4e86\u5341\u5929\u4ee5\u540e\u3002\u4f60\u5fc5\u987b\u507f\u8fd8\u4e24\u500d\uff0c");
        print(L"\u4f60\u60f3\u4e70**\u8fd8\u662f\u5356**\uff1f\uff08buy/sell\uff09");
    }
    else if (d == 4)
    {
        print(L"\u6bcf\u5f20** \u552e\u4ef73\u7f8e\u5143\uff0c\u6709\u4e94\u4e2a\u5956\u9879");
        print(L"\u5c0f\u5956\uff1a5\u7f8e\u5143  **\uff1a20\u7f8e\u5143  \u5927\u5956\uff1a100\u7f8e\u5143  \u5de8\u989d\u5956\u91d1\uff1a1,000\u7f8e\u5143  \u6770\u514b\u58f6\uff1a10,000\u7f8e\u5143");
        print(L"\u4f60\u6709100\u7f8e\u5143\uff0c\u5f53\u4f60\u8d5a\u4e86\u8d85\u8fc7100,000\u7f8e\u5143\uff0c\u4f60\u5c31\u53d1\u8d22\u4e86\u3002");
        print(L"\u4f46\u5982\u679c\u4f60\u5931\u53bb\u4e86\u6240\u6709\u7684\u94b1\uff0c\u4f60\u7834\u4ea7\u4e86\u3002");
        print(L"\u4f60\u53ef\u80fd\u60f3\u501f\u94b1\uff08\u6700\u591a100\u7f8e\u5143\uff09\uff0c\u5982\u679c\u4f60\u60f3\uff0c\u8bf7\u63090\u3002");
        print(L"\u8bf7\u8bb0\u4f4f\uff0c\u5f53\u4f60\u501f\u4e86\u4e03\u5929\u4ee5\u540e\u3002\u4f60\u5fc5\u987b\u507f\u8fd8\u4e24\u500d\uff0c");
        print(L"\u4f60\u60f3\u4e70**\u8fd8\u662f\u5356**\uff1f\uff08buy/sell\uff09");
    }
    else if (d == 5)
    {
        print(L"\u6bcf\u5f20** \u8d2d\u5165\u4ef7\u4e3a5\u7f8e\u5143\uff0c\u51fa\u552e\u4ef7\u4e3a2\u7f8e\u5143\uff0c\u6709\u4e94\u4e2a\u5956\u9879");
        print(L"\u5c0f\u5956\uff1a5\u7f8e\u5143  **\uff1a20\u7f8e\u5143  \u5927\u5956\uff1a100\u7f8e\u5143  \u5de8\u989d\u5956\u91d1\uff1a1,000\u7f8e\u5143  \u6770\u514b\u58f6\uff1a5,000\u7f8e\u5143");
        print(L"\u4f60\u6709100\u7f8e\u5143\uff0c\u5f53\u4f60\u8d5a\u4e86\u8d85\u8fc7100,000\u7f8e\u5143\uff0c\u4f60\u5c31\u53d1\u8d22\u4e86\u3002");
        print(L"\u4f46\u5982\u679c\u4f60\u5931\u53bb\u4e86\u6240\u6709\u7684\u94b1\uff0c\u4f60\u5c31\u7834\u4ea7\u4e86\u3002");
        print(L"\u4f60\u53ef\u80fd\u60f3\u501f\u94b1\uff08\u6700\u591a100\u7f8e\u5143\uff09\uff0c\u5982\u679c\u4f60\u60f3\uff0c\u8bf7\u63090\u3002");
        print(L"\u8bf7\u8bb0\u4f4f\uff0c\u5f53\u4f60\u501f\u4e86\u4e94\u5929\u4ee5\u540e\u3002\u4f60\u5fc5\u987b\u507f\u8fd8\u4e24\u500d\uff0c");
        print(L"\u4f60\u60f3\u4e70**\u8fd8\u662f\u5356**\uff1f\uff08buy/sell\uff09");
    }

    wstring c = waitInput(L"\u8bf7\u8f93\u5165(buy/sell): ");

    // ===== 买票 =====
    if (!c.empty() && (c[0] == L'b' || c[0] == L'B'))
    {
        while (money > 0)
        {
            if (d == 1 || d == 2 || d == 3)
            {
                if (money >= 10000)
                {
                    print(L"\u4f60\u53d1\u8d22\u4e86! ");
                    swprintf(buf, 256, L"\u4f60\u82b1\u4e86 %d \u5929", t);
                    print(buf);
                    waitKey();
                    return;
                }
            }
            if (d == 4 || d == 5)
            {
                if (money >= 100000)
                {
                    print(L"\u4f60\u53d1\u8d22\u4e86! ");
                    swprintf(buf, 256, L"\u4f60\u82b1\u4e86 %d \u5929", t);
                    print(buf);
                    waitKey();
                    return;
                }
            }
            t++;
            swprintf(buf, 256, L"\u4f60\u6709$%d", money);
            print(buf);
            n = waitInt(L"\u4f60\u8981\u4e70\u51e0\u5f20\u7968\uff1f ");

            if (n == 0)
            {
                if (d == 4) { borrow(); tt = t + 7; }
                else if (d == 5) { borrow(); tt = t + 5; }
                else { borrow(); tt = t + 10; }
            }
            if (t == tt) flag = pay();
            if (t == tt - 1)
                print(L"[\u8b66\u544a]\u4f60\u5fc5\u987b\u5728\u660e\u5929\u8fd8\u94b1\uff01");
            if (flag == false)
            {
                print(L"\u4f60\u4e0d\u80fd\u507f\u8fd8\u4f60\u501f\u7684\u94b1\uff01");
                print(L"\u4f60\u7834\u4ea7\u4e86\u3002");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929\u3002", t);
                print(buf);
                waitKey();
                return;
            }
            flag = true;
            if (n < 0)
            {
                print(L"\u56e0\u4e3a\u4f60\u8fdd\u53cd\u89c4\u5219\uff0c\u6240\u4ee5**\u5f3a\u5236\u505c\u6b62\u4e86\u4f60\u7684\u6e38\u620f");
                waitKey();
                return;
            }

            if (d == 1) money = money - n;
            if (d == 2 || d == 3) money = money - n * 2;
            if (d == 4) money = money - n * 3;
            if (d == 5) money = money - n * 5;

            if (money < 0)
            {
                print(L"\u4f60\u7834\u4ea7\u4e86\u3002");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929", t);
                print(buf);
                waitKey();
                return;
            }

            for (int i = 0; i < n; i++)
            {
                p = rand() % 12000;
                if (p == 0)
                {
                    int q = rand() % 4;
                    if (q == 1)
                    {
                        print(L"\u4f60\u83b7\u5f97\u4e86\u6770\u514b\u58f6\uff01");
                        if (d == 5) money += 5000;
                        else money += 10000;
                    }
                }
                else if (p >= 1 && p <= 8)
                {
                    int g = rand() % 2;
                    if (g == 0)
                    {
                        print(L"\u4f60\u83b7\u5f97\u4e86\u5de8\u989d\u5956\u91d1\uff01 ");
                        money += 1000;
                    }
                }
                else if (p >= 9 && p <= 99)
                {
                    print(L"\u4f60\u83b7\u5f97\u4e86\u5927\u5956\uff01");
                    money += 100;
                }
                else if ((p >= 100 && p <= 399) || (p > 1500 && p <= 1600))
                {
                    print(L"\u4f60\u83b7\u5f97\u4e86\u4e2d\u95f4\u5956\uff01");
                    money += 20;
                }
                else if (p >= 400 && p <= 1500)
                {
                    print(L"\u4f60\u83b7\u5f97\u4e86\u5c0f\u5956\uff01");
                    if (d == 1) money += 10;
                    else money += 5;
                }
            }
            if (money <= 0)
            {
                print(L"\u4f60\u7834\u4ea7\u4e86\u3002");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929\u3002", t);
                print(buf);
                waitKey();
                return;
            }
        }
    }

    // ===== 卖票 =====
    if (!c.empty() && (c[0] == L's' || c[0] == L'S'))
    {
        if (d == 1) { print(L"\u4f60\u5fc5\u987b\u4ed825\u7f8e\u5143\u4e70\u4e00\u4e2a\u5546\u5e97\u3002"); money -= 25; }
        if (d == 2) { print(L"\u4f60\u5fc5\u987b\u4ed835\u7f8e\u5143\u4e70\u4e00\u4e2a\u5546\u5e97\u3002"); money -= 35; }
        if (d == 3 || d == 4) { print(L"\u4f60\u5fc5\u987b\u4ed850\u7f8e\u5143\u4e70\u4e00\u4e2a\u5546\u5e97\u3002"); money -= 50; }
        if (d == 5) { print(L"\u4f60\u5fc5\u987b\u4ed860\u7f8e\u5143\u4e70\u4e00\u4e2a\u5546\u5e97\u3002"); money -= 60; }

        swprintf(buf, 256, L"\u4f60\u6709$%d", money);
        print(buf);

        while (money > 0)
        {
            if (d == 1 || d == 2 || d == 3)
            {
                if (money >= 10000)
                {
                    print(L"\u4f60\u53d1\u8d22\u4e86!");
                    swprintf(buf, 256, L"\u4f60\u82b1\u4e86%d\u5929\u3002", t);
                    print(buf);
                    waitKey();
                    return;
                }
            }
            if (d == 4 || d == 5)
            {
                if (money >= 100000)
                {
                    print(L"\u4f60\u53d1\u8d22\u4e86!");
                    swprintf(buf, 256, L"\u4f60\u82b1\u4e86%d\u5929\u3002", t);
                    print(buf);
                    waitKey();
                    return;
                }
            }
            t++;
            swprintf(buf, 256, L"\u4f60\u6709$%d", money);
            print(buf);
            n = waitInt(L"\u4f60\u8981\u5356\u51e0\u5f20\u7968\uff1f ");

            if (n == 0)
            {
                borrow();
                tt = t + 10;
            }
            if (t == tt) flag = pay();
            if (flag == false)
            {
                print(L"\u4f60\u4e0d\u80fd\u507f\u8fd8\u4f60\u501f\u7684\u94b1\u3002");
                print(L"\u4f60\u7834\u4ea7\u4e86\uff01");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929\u3002", t);
                print(buf);
                waitKey();
                return;
            }
            if (n < 0 || n > money)
            {
                print(L"\u4f60\u7834\u4ea7\u4e86\uff01");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929", t);
                print(buf);
                waitKey();
                return;
            }

            if (d == 1) money = money + n * 5;
            else if (d == 2) money = money + n * 3;
            else money = money + n * 2;

            if (money < 0)
            {
                print(L"\u4f60\u7834\u4ea7\u4e86\uff01");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929", t);
                print(buf);
                waitKey();
                return;
            }

            for (int i = 0; i < n; i++)
            {
                p = rand() % 12000;
                if (p == 0)
                {
                    int y = rand() % 4;
                    if (y == 1)
                    {
                        print(L"\u4f60\u5931\u53bb\u4e86\u6770\u514b\u58f6\uff01");
                        if (d == 5) money -= 5000;
                        else money -= 10000;
                    }
                }
                else if (p >= 1 && p <= 8)
                {
                    print(L"\u4f60\u5931\u53bb\u4e86\u5de8\u989d\u5956\u91d1\uff01");
                    money -= 1000;
                }
                else if (p >= 15 && p <= 50)
                {
                    print(L"\u4f60\u5931\u53bb\u4e86\u5927\u5956\uff01");
                    money -= 100;
                }
                else if (p >= 61 && p <= 360)
                {
                    print(L"\u4f60\u5931\u53bb\u4e86**\uff01");
                    money -= 20;
                }
                else if (p >= 401 && p <= 1500)
                {
                    print(L"\u4f60\u5931\u53bb\u4e86\u5c0f\u5956\uff01");
                    money -= 5;
                }
            }
        }
    }

    if (money <= 0)
    {
        print(L"\u4f60\u7834\u4ea7\u4e86\u3002");
        swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929\u3002", t);
        print(buf);
        waitKey();
    }
}

// ============ WinMain ============
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
    const wchar_t CLASS_NAME[] = L"GameWindowClass";
    WNDCLASSW wc;
    ZeroMemory(&wc, sizeof(wc));
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(RGB(20, 20, 30));
    RegisterClassW(&wc);

    RECT rc = { 0, 0, WIN_W, WIN_H };
    AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
                     FALSE);

    HWND hwnd = CreateWindowExW(
        0, CLASS_NAME, L"\u6e38\u620f",
        WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT,
        rc.right - rc.left, rc.bottom - rc.top,
        NULL, NULL, hInstance, NULL);

    if (!hwnd) return 0;

    // 微软雅黑
    g_font = CreateFontW(20, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
                         DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                         CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
                         L"\u5fae\u8f6f\u96c5\u9ed1");
    g_fontTitle = CreateFontW(26, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE,
                              DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                              CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
                              L"\u5fae\u8f6f\u96c5\u9ed1");

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    runGame();

    if (g_font) DeleteObject(g_font);
    if (g_fontTitle) DeleteObject(g_fontTitle);

    return 0;
}

干秣然在2026-10-15 19:37:47追加了内容

好了

#include <windows.h>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <ctime>
using namespace std;

// ============ 全局变量 ============
int money = 100;
int t = 0;
int tt = -1;
int v = 0;
int d = 0;

vector<wstring> g_messages;
int g_scrollOffset = 0;

wstring g_inputBuffer;
bool g_waitingInput = false;
wstring g_inputPrompt;
bool g_inputDone = false;
wstring g_inputResult;

HWND g_hwnd = NULL;
HFONT g_font = NULL;
HFONT g_fontTitle = NULL;

const int WIN_W = 900;
const int WIN_H = 650;
const int LINE_H = 24;
const int MARGIN_X = 20;
const int MARGIN_Y = 70;

// ============ 工具函数 ============
wstring toW(const string& s)
{
    if (s.empty()) return L"";
    int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), -1, NULL, 0);
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), -1, buf, len);
    wstring r(buf);
    delete[] buf;
    return r;
}

void print(const wstring& s)
{
    g_messages.push_back(s);
    int maxLines = (WIN_H - MARGIN_Y - 90) / LINE_H;
    if ((int)g_messages.size() > maxLines)
        g_scrollOffset = (int)g_messages.size() - maxLines;
    else
        g_scrollOffset = 0;
    if (g_hwnd) InvalidateRect(g_hwnd, NULL, TRUE);
}

void print(const string& s) { print(toW(s)); }
void printLine() { print(L""); }

// ============ 绘制 ============
void OnPaint(HDC hdc)
{
    HDC memDC = CreateCompatibleDC(hdc);
    HBITMAP memBmp = CreateCompatibleBitmap(hdc, WIN_W, WIN_H);
    HBITMAP oldBmp = (HBITMAP)SelectObject(memDC, memBmp);

    HBRUSH bgBrush = CreateSolidBrush(RGB(20, 20, 30));
    RECT rc = { 0, 0, WIN_W, WIN_H };
    FillRect(memDC, &rc, bgBrush);
    DeleteObject(bgBrush);

    SetBkMode(memDC, TRANSPARENT);

    SelectObject(memDC, g_fontTitle);
    SetTextColor(memDC, RGB(255, 215, 0));
    TextOutW(memDC, 20, 10, L"*** \u6e38\u620f ***", 10);

    SelectObject(memDC, g_font);
    SetTextColor(memDC, RGB(120, 220, 120));
    wchar_t status[256];
    swprintf(status, 256, L"\u91d1\u94b1: $%d    \u5929\u6570: %d", money, t);
    TextOutW(memDC, WIN_W - 380, 15, status, (int)wcslen(status));

    if (tt != -1)
    {
        SetTextColor(memDC, RGB(255, 100, 100));
        swprintf(status, 256,
                 L"\u8fd8\u6b3e\u65e5: \u7b2c%d\u5929  \u6b20\u6b3e: $%d",
                 tt, 2 * v);
        TextOutW(memDC, WIN_W - 380, 40, status, (int)wcslen(status));
    }

    HPEN pen = CreatePen(PS_SOLID, 1, RGB(80, 80, 100));
    HPEN oldPen = (HPEN)SelectObject(memDC, pen);
    MoveToEx(memDC, 20, 62, NULL);
    LineTo(memDC, WIN_W - 20, 62);
    SelectObject(memDC, oldPen);
    DeleteObject(pen);

    int maxLines = (WIN_H - MARGIN_Y - 90) / LINE_H;
    int end = min((int)g_messages.size(), g_scrollOffset + maxLines);
    for (int i = g_scrollOffset; i < end; i++)
    {
        const wstring& s = g_messages[i];
        if (s.find(L"\u7834\u4ea7") != wstring::npos ||
            s.find(L"\u4e0d\u80fd") != wstring::npos)
            SetTextColor(memDC, RGB(255, 80, 80));
        else if (s.find(L"\u53d1\u8d22") != wstring::npos ||
                 s.find(L"\u83b7\u5f97") != wstring::npos)
            SetTextColor(memDC, RGB(80, 255, 80));
        else if (s.find(L"\u8b66\u544a") != wstring::npos)
            SetTextColor(memDC, RGB(255, 200, 0));
        else
            SetTextColor(memDC, RGB(220, 220, 220));

        TextOutW(memDC, MARGIN_X, MARGIN_Y + (i - g_scrollOffset) * LINE_H,
                 s.c_str(), (int)s.size());
    }

    if (g_waitingInput)
    {
        int boxY = WIN_H - 60;
        HBRUSH inBrush = CreateSolidBrush(RGB(40, 40, 55));
        RECT inRc = { MARGIN_X, boxY, WIN_W - MARGIN_X, boxY + 40 };
        FillRect(memDC, &inRc, inBrush);
        DeleteObject(inBrush);

        HPEN inPen = CreatePen(PS_SOLID, 1, RGB(100, 100, 150));
        HPEN op = (HPEN)SelectObject(memDC, inPen);
        HBRUSH ob = (HBRUSH)SelectObject(memDC, GetStockObject(NULL_BRUSH));
        Rectangle(memDC, MARGIN_X, boxY, WIN_W - MARGIN_X, boxY + 40);
        SelectObject(memDC, op);
        SelectObject(memDC, ob);
        DeleteObject(inPen);

        SetTextColor(memDC, RGB(255, 255, 100));
        TextOutW(memDC, MARGIN_X + 10, boxY + 10,
                 g_inputPrompt.c_str(), (int)g_inputPrompt.size());

        SIZE sz;
        GetTextExtentPoint32W(memDC, g_inputPrompt.c_str(),
                              (int)g_inputPrompt.size(), &sz);
        SetTextColor(memDC, RGB(255, 255, 255));
        TextOutW(memDC, MARGIN_X + 15 + sz.cx, boxY + 10,
                 g_inputBuffer.c_str(), (int)g_inputBuffer.size());

        static int blink = 0;
        if ((blink++ / 15) % 2 == 0)
        {
            SIZE sz2;
            GetTextExtentPoint32W(memDC, g_inputBuffer.c_str(),
                                  (int)g_inputBuffer.size(), &sz2);
            int cx = MARGIN_X + 15 + sz.cx + sz2.cx;
            HPEN cP = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
            HPEN ocp = (HPEN)SelectObject(memDC, cP);
            MoveToEx(memDC, cx, boxY + 8, NULL);
            LineTo(memDC, cx, boxY + 32);
            SelectObject(memDC, ocp);
            DeleteObject(cP);
        }
    }

    BitBlt(hdc, 0, 0, WIN_W, WIN_H, memDC, 0, 0, SRCCOPY);
    SelectObject(memDC, oldBmp);
    DeleteObject(memBmp);
    DeleteDC(memDC);
}

// ============ 输入 ============
wstring waitInput(const wstring& prompt)
{
    g_inputPrompt = prompt;
    g_inputBuffer = L"";
    g_waitingInput = true;
    g_inputDone = false;
    g_inputResult = L"";

    if (g_hwnd) InvalidateRect(g_hwnd, NULL, TRUE);

    MSG msg;
    while (!g_inputDone)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            Sleep(20);
            if (g_hwnd) InvalidateRect(g_hwnd, NULL, FALSE);
        }
    }
    g_waitingInput = false;
    print(prompt + g_inputResult);
    return g_inputResult;
}

int waitInt(const wstring& prompt)
{
    wstring s = waitInput(prompt);
    wstring num;
    for (size_t i = 0; i < s.size(); i++)
    {
        if ((s[i] >= L'0' && s[i] <= L'9') || (i == 0 && s[i] == L'-'))
            num += s[i];
        else
            break;
    }
    if (num.empty() || num == L"-") return 0;
    return _wtoi(num.c_str());
}

void waitKey()
{
    print(L"[\u6309\u4efb\u610f\u952e\u7ee7\u7eed...]");
    if (g_hwnd) InvalidateRect(g_hwnd, NULL, TRUE);

    while (true)
    {
        MSG msg;
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_KEYDOWN || msg.message == WM_LBUTTONDOWN)
                break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
            Sleep(20);
    }
}

// ============ 游戏逻辑 ============
void borrow()
{
    if (tt != -1)
    {
        print(L"\u4f60\u73b0\u5728\u4e0d\u80fd\u501f\u94b1");
        return;
    }
    int vv = waitInt(L"\u4f60\u8981\u501f\u591a\u5c11\u94b1\uff1f ");
    if (d == 1 || d == 2)
    {
        while (vv > 1000)
        {
            print(L"\u4f60\u4e0d\u80fd\u501f\u8fd9\u4e48\u591a\u94b1\uff01");
            vv = waitInt(L"\u4f60\u8981\u501f\u591a\u5c11\u94b1\uff1f ");
        }
    }
    else
    {
        while (vv > 100)
        {
            print(L"\u4f60\u4e0d\u80fd\u501f\u8fd9\u4e48\u591a\u94b1\uff01");
            vv = waitInt(L"\u4f60\u8981\u501f\u591a\u5c11\u94b1\uff1f ");
        }
    }
    if (vv < 0) vv = 0;
    v = vv;
    money += v;
    wchar_t buf[128];
    swprintf(buf, 128,
             L"10\u5929\u4ee5\u540e\u4f60\u8981\u8fd8 %d \u7f8e\u5143", 2 * v);
    print(buf);
}

bool pay()
{
    wchar_t buf[128];
    swprintf(buf, 128, L"\u4f60\u73b0\u5728\u8981\u8fd8 %d", 2 * v);
    print(buf);
    money -= 2 * v;
    tt = -1;
    v = 0;
    return money > 0;
}

// ============ 窗口过程 ============
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_CREATE:
        g_hwnd = hwnd;
        SetTimer(hwnd, 1, 100, NULL);
        return 0;

    case WM_TIMER:
        if (g_waitingInput)
            InvalidateRect(hwnd, NULL, FALSE);
        return 0;

    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
        OnPaint(hdc);
        EndPaint(hwnd, &ps);
        return 0;
    }

    case WM_CHAR:
        if (g_waitingInput)
        {
            wchar_t ch = (wchar_t)wParam;
            if (ch == L'\r')
            {
                g_inputResult = g_inputBuffer;
                g_inputDone = true;
            }
            else if (ch == L'\b')
            {
                if (!g_inputBuffer.empty())
                    g_inputBuffer.erase(g_inputBuffer.size() - 1);
                InvalidateRect(hwnd, NULL, FALSE);
            }
            else if (ch >= 32 && ch < 127)
            {
                g_inputBuffer += ch;
                InvalidateRect(hwnd, NULL, FALSE);
            }
        }
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

// ============ 主游戏流程 ============
void runGame()
{
    wchar_t buf[256];

    print(L"\u6b22\u8fce\u6765\u5230**\u6e38\u620f\uff01");
    printLine();
    print(L"\u89c4\u5219\uff1a\u5728\u6e38\u620f\u5185\u8bf7\u52ff\u4f7f\u7528\u5c0f\u6570\u3001\u8d1f\u6570\u3001\u82f1\u6587\u5b57\u6bcd\u3001\u7279\u6b8a\u5b57\u7b26\uff08\u6e38\u620f\u4e2d\u53e6\u8bf4\u660e\u9664\u5916\uff09\uff0c");
    print(L"\u5426\u5219\u540e\u679c\u81ea\u8d1f\u3002");
    printLine();
    print(L"\u8bf7\u9009\u62e9\u96be\u5ea6(\u8f93\u5165\u5e8f\u53f7\u5373\u53ef):");
    print(L"1:\u5165\u95e8  2:\u7b80\u5355  3:\u666e\u901a  4:\u4e2d\u7b49  5:\u56f0\u96be");

    while (true)
    {
        d = waitInt(L"\u8bf7\u8f93\u5165\u96be\u5ea6\u5e8f\u53f7(1-5): ");
        if (d >= 1 && d <= 5) break;
        print(L"\u6ca1\u6709\u8fd9\u4e2a\u9009\u9879\uff0c\u8bf7\u91cd\u65b0\u9009\u62e9(1-5)\u3002");
    }

    swprintf(buf, 256, L"\u5df2\u9009\u62e9\u96be\u5ea6: %d", d);
    print(buf);
    printLine();

    bool flag = true;
    srand((unsigned)time(0));
    int n = 0, p = 0;

    if (d == 1)
    {
        print(L"\u6bcf\u5f20** \u8d2d\u5165\u4ef7\u4e3a1\u7f8e\u5143\uff0c\u51fa\u552e\u4ef7\u4e3a5\u7f8e\u5143\uff0c\u6709\u4e94\u4e2a\u5956\u9879");
        print(L"\u5c0f\u5956\uff1a10\u7f8e\u5143  **\uff1a20\u7f8e\u5143  \u5927\u5956\uff1a100\u7f8e\u5143  \u5de8\u989d\u5956\u91d1\uff1a1,000\u7f8e\u5143  \u6770\u514b\u58f6\uff1a10,000\u7f8e\u5143");
        print(L"\u4f60\u6709100\u7f8e\u5143\uff0c\u5f53\u4f60\u8d5a\u4e86\u8d85\u8fc710,000\u7f8e\u5143\uff0c\u4f60\u5c31\u53d1\u8d22\u4e86\u3002");
        print(L"\u4f46\u5982\u679c\u4f60\u5931\u53bb\u4e86\u6240\u6709\u7684\u94b1\uff0c\u4f60\u7834\u4ea7\u4e86\u3002");
        print(L"\u4f60\u53ef\u80fd\u60f3\u501f\u94b1\uff08\u6700\u591a1,000\u7f8e\u5143\uff09\uff0c\u5982\u679c\u4f60\u60f3\uff0c\u63090\u3002");
        print(L"\u8bf7\u8bb0\u4f4f\uff0c\u5f53\u4f60\u501f\u4e86\u5341\u5929\u4ee5\u540e\u3002\u4f60\u5fc5\u987b\u507f\u8fd8\u4e24\u500d\uff0c");
        print(L"\u4f60\u60f3\u4e70**\u8fd8\u662f\u5356**\uff1f\uff08buy/sell\uff09");
    }
    else if (d == 2)
    {
        print(L"\u6bcf\u5f20** \u8d2d\u5165\u4ef7\u4e3a2\u7f8e\u5143\uff0c\u51fa\u552e\u4ef7\u4e3a3\u7f8e\u5143\uff0c\u6709\u4e94\u4e2a\u5956\u9879");
        print(L"\u5c0f\u5956\uff1a5\u7f8e\u5143  **\uff1a20\u7f8e\u5143  \u5927\u5956\uff1a100\u7f8e\u5143  \u5de8\u989d\u5956\u91d1\uff1a1,000\u7f8e\u5143  \u6770\u514b\u58f6\uff1a10,000\u7f8e\u5143");
        print(L"\u4f60\u6709100\u7f8e\u5143\uff0c\u5f53\u4f60\u8d5a\u4e86\u8d85\u8fc710,000\u7f8e\u5143\uff0c\u4f60\u5c31\u53d1\u8d22\u4e86\u3002");
        print(L"\u4f46\u5982\u679c\u4f60\u5931\u53bb\u4e86\u6240\u6709\u7684\u94b1\uff0c\u4f60\u7834\u4ea7\u4e86\u3002");
        print(L"\u4f60\u53ef\u80fd\u60f3\u501f\u94b1\uff08\u6700\u591a1,000\u7f8e\u5143\uff09\uff0c\u5982\u679c\u4f60\u60f3\uff0c\u8bf7\u63090\u3002");
        print(L"\u8bf7\u8bb0\u4f4f\uff0c\u5f53\u4f60\u501f\u4e86\u5341\u5929\u4ee5\u540e\u3002\u4f60\u5fc5\u987b\u507f\u8fd8\u4e24\u500d\uff0c");
        print(L"\u4f60\u60f3\u4e70**\u8fd8\u662f\u5356**\uff1f\uff08buy/sell\uff09");
    }
    else if (d == 3)
    {
        print(L"\u6bcf\u5f20** \u552e\u4ef72\u7f8e\u5143\uff0c\u6709\u4e94\u4e2a\u5956\u9879");
        print(L"\u5c0f\u5956\uff1a5\u7f8e\u5143  **\uff1a20\u7f8e\u5143  \u5927\u5956\uff1a100\u7f8e\u5143  \u5de8\u989d\u5956\u91d1\uff1a1,000\u7f8e\u5143  \u6770\u514b\u58f6\uff1a10,000\u7f8e\u5143");
        print(L"\u4f60\u6709100\u7f8e\u5143\uff0c\u5f53\u4f60\u8d5a\u4e86\u8d85\u8fc710,000\u7f8e\u5143\uff0c\u4f60\u5c31\u53d1\u8d22\u4e86\u3002");
        print(L"\u4f46\u5982\u679c\u4f60\u5931\u53bb\u4e86\u6240\u6709\u7684\u94b1\uff0c\u4f60\u7834\u4ea7\u4e86\u3002");
        print(L"\u4f60\u53ef\u80fd\u60f3\u501f\u94b1\uff08\u6700\u591a100\u7f8e\u5143\uff09\uff0c\u5982\u679c\u4f60\u60f3\uff0c\u8bf7\u63090\u3002");
        print(L"\u8bf7\u8bb0\u4f4f\uff0c\u5f53\u4f60\u501f\u4e86\u5341\u5929\u4ee5\u540e\u3002\u4f60\u5fc5\u987b\u507f\u8fd8\u4e24\u500d\uff0c");
        print(L"\u4f60\u60f3\u4e70**\u8fd8\u662f\u5356**\uff1f\uff08buy/sell\uff09");
    }
    else if (d == 4)
    {
        print(L"\u6bcf\u5f20** \u552e\u4ef73\u7f8e\u5143\uff0c\u6709\u4e94\u4e2a\u5956\u9879");
        print(L"\u5c0f\u5956\uff1a5\u7f8e\u5143  **\uff1a20\u7f8e\u5143  \u5927\u5956\uff1a100\u7f8e\u5143  \u5de8\u989d\u5956\u91d1\uff1a1,000\u7f8e\u5143  \u6770\u514b\u58f6\uff1a10,000\u7f8e\u5143");
        print(L"\u4f60\u6709100\u7f8e\u5143\uff0c\u5f53\u4f60\u8d5a\u4e86\u8d85\u8fc7100,000\u7f8e\u5143\uff0c\u4f60\u5c31\u53d1\u8d22\u4e86\u3002");
        print(L"\u4f46\u5982\u679c\u4f60\u5931\u53bb\u4e86\u6240\u6709\u7684\u94b1\uff0c\u4f60\u7834\u4ea7\u4e86\u3002");
        print(L"\u4f60\u53ef\u80fd\u60f3\u501f\u94b1\uff08\u6700\u591a100\u7f8e\u5143\uff09\uff0c\u5982\u679c\u4f60\u60f3\uff0c\u8bf7\u63090\u3002");
        print(L"\u8bf7\u8bb0\u4f4f\uff0c\u5f53\u4f60\u501f\u4e86\u4e03\u5929\u4ee5\u540e\u3002\u4f60\u5fc5\u987b\u507f\u8fd8\u4e24\u500d\uff0c");
        print(L"\u4f60\u60f3\u4e70**\u8fd8\u662f\u5356**\uff1f\uff08buy/sell\uff09");
    }
    else if (d == 5)
    {
        print(L"\u6bcf\u5f20** \u8d2d\u5165\u4ef7\u4e3a5\u7f8e\u5143\uff0c\u51fa\u552e\u4ef7\u4e3a2\u7f8e\u5143\uff0c\u6709\u4e94\u4e2a\u5956\u9879");
        print(L"\u5c0f\u5956\uff1a5\u7f8e\u5143  **\uff1a20\u7f8e\u5143  \u5927\u5956\uff1a100\u7f8e\u5143  \u5de8\u989d\u5956\u91d1\uff1a1,000\u7f8e\u5143  \u6770\u514b\u58f6\uff1a5,000\u7f8e\u5143");
        print(L"\u4f60\u6709100\u7f8e\u5143\uff0c\u5f53\u4f60\u8d5a\u4e86\u8d85\u8fc7100,000\u7f8e\u5143\uff0c\u4f60\u5c31\u53d1\u8d22\u4e86\u3002");
        print(L"\u4f46\u5982\u679c\u4f60\u5931\u53bb\u4e86\u6240\u6709\u7684\u94b1\uff0c\u4f60\u5c31\u7834\u4ea7\u4e86\u3002");
        print(L"\u4f60\u53ef\u80fd\u60f3\u501f\u94b1\uff08\u6700\u591a100\u7f8e\u5143\uff09\uff0c\u5982\u679c\u4f60\u60f3\uff0c\u8bf7\u63090\u3002");
        print(L"\u8bf7\u8bb0\u4f4f\uff0c\u5f53\u4f60\u501f\u4e86\u4e94\u5929\u4ee5\u540e\u3002\u4f60\u5fc5\u987b\u507f\u8fd8\u4e24\u500d\uff0c");
        print(L"\u4f60\u60f3\u4e70**\u8fd8\u662f\u5356**\uff1f\uff08buy/sell\uff09");
    }

    wstring c = waitInput(L"\u8bf7\u8f93\u5165(buy/sell): ");

    // ===== 买票 =====
    if (!c.empty() && (c[0] == L'b' || c[0] == L'B'))
    {
        while (money > 0)
        {
            if (d == 1 || d == 2 || d == 3)
            {
                if (money >= 10000)
                {
                    print(L"\u4f60\u53d1\u8d22\u4e86! ");
                    swprintf(buf, 256, L"\u4f60\u82b1\u4e86 %d \u5929", t);
                    print(buf);
                    waitKey();
                    return;
                }
            }
            if (d == 4 || d == 5)
            {
                if (money >= 100000)
                {
                    print(L"\u4f60\u53d1\u8d22\u4e86! ");
                    swprintf(buf, 256, L"\u4f60\u82b1\u4e86 %d \u5929", t);
                    print(buf);
                    waitKey();
                    return;
                }
            }
            t++;
            swprintf(buf, 256, L"\u4f60\u6709$%d", money);
            print(buf);
            n = waitInt(L"\u4f60\u8981\u4e70\u51e0\u5f20\u7968\uff1f ");

            if (n == 0)
            {
                if (d == 4) { borrow(); tt = t + 7; }
                else if (d == 5) { borrow(); tt = t + 5; }
                else { borrow(); tt = t + 10; }
            }
            if (t == tt) flag = pay();
            if (t == tt - 1)
                print(L"[\u8b66\u544a]\u4f60\u5fc5\u987b\u5728\u660e\u5929\u8fd8\u94b1\uff01");
            if (flag == false)
            {
                print(L"\u4f60\u4e0d\u80fd\u507f\u8fd8\u4f60\u501f\u7684\u94b1\uff01");
                print(L"\u4f60\u7834\u4ea7\u4e86\u3002");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929\u3002", t);
                print(buf);
                waitKey();
                return;
            }
            flag = true;
            if (n < 0)
            {
                print(L"\u56e0\u4e3a\u4f60\u8fdd\u53cd\u89c4\u5219\uff0c\u6240\u4ee5**\u5f3a\u5236\u505c\u6b62\u4e86\u4f60\u7684\u6e38\u620f");
                waitKey();
                return;
            }

            if (d == 1) money = money - n;
            if (d == 2 || d == 3) money = money - n * 2;
            if (d == 4) money = money - n * 3;
            if (d == 5) money = money - n * 5;

            if (money < 0)
            {
                print(L"\u4f60\u7834\u4ea7\u4e86\u3002");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929", t);
                print(buf);
                waitKey();
                return;
            }

            for (int i = 0; i < n; i++)
            {
                p = rand() % 12000;
                if (p == 0)
                {
                    int q = rand() % 4;
                    if (q == 1)
                    {
                        print(L"\u4f60\u83b7\u5f97\u4e86\u6770\u514b\u58f6\uff01");
                        if (d == 5) money += 5000;
                        else money += 10000;
                    }
                }
                else if (p >= 1 && p <= 8)
                {
                    int g = rand() % 2;
                    if (g == 0)
                    {
                        print(L"\u4f60\u83b7\u5f97\u4e86\u5de8\u989d\u5956\u91d1\uff01 ");
                        money += 1000;
                    }
                }
                else if (p >= 9 && p <= 99)
                {
                    print(L"\u4f60\u83b7\u5f97\u4e86\u5927\u5956\uff01");
                    money += 100;
                }
                else if ((p >= 100 && p <= 399) || (p > 1500 && p <= 1600))
                {
                    print(L"\u4f60\u83b7\u5f97\u4e86\u4e2d\u95f4\u5956\uff01");
                    money += 20;
                }
                else if (p >= 400 && p <= 1500)
                {
                    print(L"\u4f60\u83b7\u5f97\u4e86\u5c0f\u5956\uff01");
                    if (d == 1) money += 10;
                    else money += 5;
                }
            }
            if (money <= 0)
            {
                print(L"\u4f60\u7834\u4ea7\u4e86\u3002");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929\u3002", t);
                print(buf);
                waitKey();
                return;
            }
        }
    }

    // ===== 卖票 =====
    if (!c.empty() && (c[0] == L's' || c[0] == L'S'))
    {
        if (d == 1) { print(L"\u4f60\u5fc5\u987b\u4ed825\u7f8e\u5143\u4e70\u4e00\u4e2a\u5546\u5e97\u3002"); money -= 25; }
        if (d == 2) { print(L"\u4f60\u5fc5\u987b\u4ed835\u7f8e\u5143\u4e70\u4e00\u4e2a\u5546\u5e97\u3002"); money -= 35; }
        if (d == 3 || d == 4) { print(L"\u4f60\u5fc5\u987b\u4ed850\u7f8e\u5143\u4e70\u4e00\u4e2a\u5546\u5e97\u3002"); money -= 50; }
        if (d == 5) { print(L"\u4f60\u5fc5\u987b\u4ed860\u7f8e\u5143\u4e70\u4e00\u4e2a\u5546\u5e97\u3002"); money -= 60; }

        swprintf(buf, 256, L"\u4f60\u6709$%d", money);
        print(buf);

        while (money > 0)
        {
            if (d == 1 || d == 2 || d == 3)
            {
                if (money >= 10000)
                {
                    print(L"\u4f60\u53d1\u8d22\u4e86!");
                    swprintf(buf, 256, L"\u4f60\u82b1\u4e86%d\u5929\u3002", t);
                    print(buf);
                    waitKey();
                    return;
                }
            }
            if (d == 4 || d == 5)
            {
                if (money >= 100000)
                {
                    print(L"\u4f60\u53d1\u8d22\u4e86!");
                    swprintf(buf, 256, L"\u4f60\u82b1\u4e86%d\u5929\u3002", t);
                    print(buf);
                    waitKey();
                    return;
                }
            }
            t++;
            swprintf(buf, 256, L"\u4f60\u6709$%d", money);
            print(buf);
            n = waitInt(L"\u4f60\u8981\u5356\u51e0\u5f20\u7968\uff1f ");

            if (n == 0)
            {
                borrow();
                tt = t + 10;
            }
            if (t == tt) flag = pay();
            if (flag == false)
            {
                print(L"\u4f60\u4e0d\u80fd\u507f\u8fd8\u4f60\u501f\u7684\u94b1\u3002");
                print(L"\u4f60\u7834\u4ea7\u4e86\uff01");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929\u3002", t);
                print(buf);
                waitKey();
                return;
            }
            if (n < 0 || n > money)
            {
                print(L"\u4f60\u7834\u4ea7\u4e86\uff01");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929", t);
                print(buf);
                waitKey();
                return;
            }

            if (d == 1) money = money + n * 5;
            else if (d == 2) money = money + n * 3;
            else money = money + n * 2;

            if (money < 0)
            {
                print(L"\u4f60\u7834\u4ea7\u4e86\uff01");
                swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929", t);
                print(buf);
                waitKey();
                return;
            }

            for (int i = 0; i < n; i++)
            {
                p = rand() % 12000;
                if (p == 0)
                {
                    int y = rand() % 4;
                    if (y == 1)
                    {
                        print(L"\u4f60\u5931\u53bb\u4e86\u6770\u514b\u58f6\uff01");
                        if (d == 5) money -= 5000;
                        else money -= 10000;
                    }
                }
                else if (p >= 1 && p <= 8)
                {
                    print(L"\u4f60\u5931\u53bb\u4e86\u5de8\u989d\u5956\u91d1\uff01");
                    money -= 1000;
                }
                else if (p >= 15 && p <= 50)
                {
                    print(L"\u4f60\u5931\u53bb\u4e86\u5927\u5956\uff01");
                    money -= 100;
                }
                else if (p >= 61 && p <= 360)
                {
                    print(L"\u4f60\u5931\u53bb\u4e86**\uff01");
                    money -= 20;
                }
                else if (p >= 401 && p <= 1500)
                {
                    print(L"\u4f60\u5931\u53bb\u4e86\u5c0f\u5956\uff01");
                    money -= 5;
                }
            }
        }
    }

    if (money <= 0)
    {
        print(L"\u4f60\u7834\u4ea7\u4e86\u3002");
        swprintf(buf, 256, L"\u4f60\u751f\u5b58\u4e86 %d \u5929\u3002", t);
        print(buf);
        waitKey();
    }
}

// ============ WinMain ============
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine, int nCmdShow)
{
    const wchar_t CLASS_NAME[] = L"GameWindowClass";
    WNDCLASSW wc;
    ZeroMemory(&wc, sizeof(wc));
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(RGB(20, 20, 30));
    RegisterClassW(&wc);

    RECT rc = { 0, 0, WIN_W, WIN_H };
    AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
                     FALSE);

    HWND hwnd = CreateWindowExW(
        0, CLASS_NAME, L"\u6e38\u620f",
        WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT,
        rc.right - rc.left, rc.bottom - rc.top,
        NULL, NULL, hInstance, NULL);

    if (!hwnd) return 0;

    // 微软雅黑
    g_font = CreateFontW(20, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
                         DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                         CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
                         L"\u5fae\u8f6f\u96c5\u9ed1");
    g_fontTitle = CreateFontW(26, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE,
                              DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                              CLEARTYPE_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
                              L"\u5fae\u8f6f\u96c5\u9ed1");

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    runGame();

    if (g_font) DeleteObject(g_font);
    if (g_fontTitle) DeleteObject(g_fontTitle);

    return 0;
}


0
0
我要回答