所以我正在制作一个基本的井字游戏,作为我在win32中的第一个程序(只是为了好玩,学习更多,没有学校作业或任何东西)。我已经完成了大部分的UI和基本的游戏,比如点击方块和适当地放置x或o。我写了它,这样它就可以在游戏结束时识别谁是赢家,并可以显示一个小文本窗口,上面写着"PLAYER 1 WINS!"等等…
不,我的问题是关于如何显示分数。我的想法是有一个名为scorplayer1的int变量,当玩家获胜时,我会将其增加1(scorplayer1++)。然后,我希望将以前的分数更改为新分数的窗口。这就是我到目前为止所拥有的(我将删除所有与这个问题无关的代码,但如果你需要更多,请告诉我):
我的全局变量:
//Global Variables
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
HWND hwnd1, hwnd2, hwnd3, hwnd4, hwnd5, hwnd6, hwnd7, hwnd8;
HWND hwnd9, hwndscore1, hwndscore2, hWnd;
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int determinewinner();
int showscore(int win_value);
int scoreplayer1,scoreplayer2;
最初创建分数窗口的CreateWindow函数(它们以空白开始):
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
case WM_CREATE:
hwndscore1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"),TEXT(""), WS_CHILD|WS_VISIBLE|SS_CENTER, 20,285,100,20,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL);
hwndscore2 = CreateWindowEx(WS_EX_CLIENTEDGE,TEXT("STATIC"),TEXT(""), WS_CHILD|WS_VISIBLE|SS_CENTER, 130,285,100,20,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL);
然后是试图处理更改分数窗口的功能:
int showscore(int win_value)
{
if(win_value==1)
{ scoreplayer1++;
DestroyWindow(hwndscore1);
hwndscore1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"),TEXT(scoreplayer1), WS_CHILD|WS_VISIBLE|SS_CENTER, 20,285,100,20,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL);
return (scoreplayer1);} // This return part is just temporary because it wants
// the function to return a value, it doesn't come into play
}
这个想法是摧毁旧窗口,用新分数重新创建一个新窗口(这似乎是最简单的方法)。我知道问题出在哪里,它说我不能把int scoreplayer1变量放在最后一个CreateWindowEx函数的TEXT("scoreplayer.1")部分。错误为:类型为int的参数与类型为LPCSTR的参数不兼容。
那么,如何更改最后一个窗口的创建,使其显示一个int变量(如scorplayer1),该变量将随着游戏的进行而增加呢?谢谢
*编辑***
作为对一条评论的回应,我试图使用itoa()来解决这个问题,我做了以下操作:
int showscore(int win_value)
{ if(win_value==1)
{ scoreplayer1++;
char score1[1];
itoa(scoreplayer1, score1, 1);
DestroyWindow(hwndscore1);
hwndscore1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"),TEXT(score1), WS_CHILD|WS_VISIBLE|SS_CENTER, 20,285,100,20,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL);
return (scoreplayer1);}
这迫使程序在我到达游戏中的那个点时立即中断。。。你知道我做错了什么吗?
在C和C++中,将整数转换为字符串的方法多种多样。
您编辑的代码失败,因为字符串有1个字符长,并且所有数字都保证不能放在一个字符中,因为所有数字都为字符串本身取一个字符,为标记字符串末尾的零字节取另一个字符。如果数字大于9,它将占用三个字符,大于99将占用4个字符,依此类推
在C++中,我建议,尽管时间稍长,但使用stringstream
来输出数字是一种更容易/更安全的方法,可以避免在计算字符串需要多少空间时出现问题(并且允许输出比一个整数更复杂的东西,因为你可以简单地组合任何输出,就像使用cout
进行控制台输出一样)。
类似这样的东西:
std::stringstream ss;
ss << scoreplayer1;
hwndscore1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"),ss.str().c_str(), WS_CHILD|WS_VISIBLE|SS_CENTER, 20,285,100,20,hWnd,HMENU(NULL),GetModuleHandle(NULL),NULL);