改与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;
}
