Так что я делаю основную игру в крестики-нолики в качестве моей первой программы в win32 (просто для удовольствия, чтобы узнать больше, без школьных заданий или чего-либо еще). Я сделал большую часть пользовательского интерфейса и базовый игровой процесс, такой как нажатие квадратов и размещение X или O соответственно. Я написал это так, чтобы он распознавал, кто победил, когда игра закончилась, и может отображать небольшое текстовое окно с надписью «ИГРОК 1 ВЫИГРЫВАЕТ!» так далее….
Нет, мой вопрос касается того, как отобразить счет. Моя идея состоит в том, чтобы иметь переменную int с именем scoreplayer1, и когда игрок выиграет, я увеличу ее на 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 в ту часть TEXT («scoreplayer1») в последней функции CreateWindowEx. Ошибка: аргумент типа 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);}
Что заставляет программу ломаться, как только я добираюсь до этой точки в игре … Есть идеи, что я сделал не так?
Преобразование целого числа в строку может быть сделано МНОГИМИ способами в 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);
Других решений пока нет …