0

所以我正在制作一个基本的井字游戏作为我在 win32 中的第一个程序(只是为了学习更多的乐趣,没有学校作业或任何东西)。我已经完成了大部分 UI 和基本的游戏玩法,例如单击方块和适当地放置 x 或 o。我写了它,以便在游戏结束时识别谁是赢家,并且可以显示一个小文本窗口,上面写着“PLAYER 1 WINS!” ETC....

不,我的问题是关于如何显示分数。我的想法是有一个名为 scoreplayer1 的 int 变量,当玩家获胜时,我会将它增加 1(scoreplayer1++)。然后,我希望将先前分数更改为新分数的窗口。这是我到目前为止所拥有的(我将删除所有与此问题无关的代码,但如果您需要更多,请告诉我):

我的全局变量:

   //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("scoreplayer1") 部分中。错误是:typ int 的参数与 LPCSTR 类型的参数不兼容。

那么如何更改最后一个窗口的创建,使其显示一个随着游戏进行而增加的 int 变量(例如 scoreplayer1)?谢谢!

*编辑***

为了回应我尝试使用 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);}

一旦我到达游戏中的那个点,这就会迫使程序中断......关于我做错了什么的任何想法?

4

1 回答 1

0

在 C 和 C++ 中,可以通过多种不同的方式将整数转换为字符串。

您编辑的代码失败,因为字符串长度为 1 个字符,并且所有数字都保证不适合一个字符,因为所有数字都为字符串本身占用一个字符,而另一个字符用于标记字符串结尾的零字节。如果数字大于 9 则占用三个字符,大于 99 则占用 4 个字符,以此类推。

在 C++ 中,我建议,虽然有点长,但使用 astringstream来输出数字是一种更简单/更安全的方法,如果确定字符串需要多少空间(并允许输出比只有一个整数,因为您可以简单地组合任何输出,就像使用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);
于 2013-06-28T21:15:55.147 回答