Как на Winapi с++ решить задачу "Жизнь"
Жизнь" У меня есть поле разбитое на квадраты,(с живими и мертвыми клетками) мне нужно как-нибудь отслеживать эти клетки и записовать состояние клеток в масив , и потом обрабатывать их,может подскажете как это реализовать.
Вот графическая часть программы
Нужно написать программу которая будет воиспрозводить игру "
Вот графическая часть программы
Код:
// Win32 решетка.cpp: определяет точку входа для приложения.
//
#include "stdafx.h"
#include "Win32 решетка.h"
#include<windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
TCHAR* szProgName=L"life";
HWND button1,button2,button3,button0; //глобальные переменныедля кнопок
HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){
HWND hWnd;
MSG lpMsg;
WNDCLASS w;
w.lpszClassName=szProgName; //имя программы - объявлено выше
w.hInstance=hInst; //идентификатор текущего приложения
w.lpfnWndProc=WndProc; //указатель на функцию окна
w.hCursor=LoadCursor(NULL, IDC_ARROW); //загружаем курсор
w.hIcon=0;
w.lpszMenuName=0;
w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //цвет фона окна
w.style=CS_HREDRAW|CS_VREDRAW;
w.cbClsExtra=0;
w.cbWndExtra=0;
//Если не удалось зарегистрировать класс окна - выходим
if(!RegisterClass(&w))
return 0;
//Создадим окно в памяти, заполнив аргументы CreateWindow
hWnd=CreateWindow(szProgName, //Имя программы
L"Задача жизнь", //Заголовок окна
WS_OVERLAPPEDWINDOW, //Стиль окна - перекрывающееся
20, //положение окна на экране по х
20, //положение по у
617, //ширина
640, //высота
HWND_DESKTOP, //идентификатор родительского окна
(HMENU)NULL, //идентификатор меню
(HINSTANCE)hInst, //идентификатор экземпляра программы
(HINSTANCE)NULL); //отсутствие дополнительных параметров
//Выводим окно из памяти на экран
ShowWindow(hWnd, nCmdShow);
//Обновим содержимое окна
UpdateWindow(hWnd);
//Цикл обработки сообщений
while(GetMessage(&lpMsg, NULL, 0, 0)) {
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
return(lpMsg.wParam);
}
//Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam){
HDC hdc; //создаём контекст устройства
PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода
HBRUSH hBrush;//выбираем кисть
HPEN hPen;
int x=100, y=100;
//Цикл обработки сообщений
switch(messg){
case WM_COMMAND:
switch (LOWORD(wParam)){
case 1 :
break;
case 10 :
break;
case 100 :
break;
case 0 :
PostQuitMessage(0);
break;
}
case WM_LBUTTONDOWN:
hdc=GetDC(hWnd);
hBrush=CreateSolidBrush(RGB(20,0,0)); //задаём сплошную кисть, закрашенную цветом RGB
SelectObject(hdc, hBrush); //делаем кисть активной
x=LOWORD(lParam);//координаты с которыми нажата мышь - аргументы WndProc
y=HIWORD(lParam);
if(y>=50){
x/=40;
y/=40;
Rectangle(hdc, x*40, y*40, x*40+40, y*40+40);
ReleaseDC(hWnd, hdc);
}
break;
case WM_RBUTTONDOWN:
hdc=GetDC(hWnd);
x=LOWORD(lParam);//координаты с которыми нажата мышь - аргументы WndProc
y=HIWORD(lParam);
if(y>=50){
x/=40;
y/=40;
Rectangle(hdc, x*40, y*40, x*40+40, y*40+40);
}
break;
//сообщение рисования
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
int i;
for(i=1; i<=15; i++){
MoveToEx(hdc,0, i*40, NULL);
LineTo(hdc, 600, i*40);
MoveToEx(hdc, i*40, 40, NULL);
LineTo(hdc, i*40, 600);
}
ValidateRect(hWnd, NULL);
button1=CreateWindow(L"button",L"Наступне покоління", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 160, 40, hWnd, (HMENU)1, hInst, NULL);
button2=CreateWindow(L"button",L"Чрез 5 поколінь", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 160, 0, 160, 40, hWnd, (HMENU)10, hInst, NULL);
button3=CreateWindow(L"button",L"Чрез 5 поколінь", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 320, 0, 160, 40, hWnd, (HMENU)100, hInst, NULL);
button0=CreateWindow(L"button",L"Вихід", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,480, 0, 120, 40, hWnd, (HMENU)0, hInst, NULL);
EndPaint(hWnd, &ps);
break;
//сообщение выхода - разрушение окна
case WM_DESTROY:
PostQuitMessage(0); //Посылаем сообщение выхода с кодом 0 - нормальное завершение
break;
default:
return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных
}
return 0;
}
//
#include "stdafx.h"
#include "Win32 решетка.h"
#include<windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
TCHAR* szProgName=L"life";
HWND button1,button2,button3,button0; //глобальные переменныедля кнопок
HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){
HWND hWnd;
MSG lpMsg;
WNDCLASS w;
w.lpszClassName=szProgName; //имя программы - объявлено выше
w.hInstance=hInst; //идентификатор текущего приложения
w.lpfnWndProc=WndProc; //указатель на функцию окна
w.hCursor=LoadCursor(NULL, IDC_ARROW); //загружаем курсор
w.hIcon=0;
w.lpszMenuName=0;
w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //цвет фона окна
w.style=CS_HREDRAW|CS_VREDRAW;
w.cbClsExtra=0;
w.cbWndExtra=0;
//Если не удалось зарегистрировать класс окна - выходим
if(!RegisterClass(&w))
return 0;
//Создадим окно в памяти, заполнив аргументы CreateWindow
hWnd=CreateWindow(szProgName, //Имя программы
L"Задача жизнь", //Заголовок окна
WS_OVERLAPPEDWINDOW, //Стиль окна - перекрывающееся
20, //положение окна на экране по х
20, //положение по у
617, //ширина
640, //высота
HWND_DESKTOP, //идентификатор родительского окна
(HMENU)NULL, //идентификатор меню
(HINSTANCE)hInst, //идентификатор экземпляра программы
(HINSTANCE)NULL); //отсутствие дополнительных параметров
//Выводим окно из памяти на экран
ShowWindow(hWnd, nCmdShow);
//Обновим содержимое окна
UpdateWindow(hWnd);
//Цикл обработки сообщений
while(GetMessage(&lpMsg, NULL, 0, 0)) {
TranslateMessage(&lpMsg);
DispatchMessage(&lpMsg);
}
return(lpMsg.wParam);
}
//Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam){
HDC hdc; //создаём контекст устройства
PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода
HBRUSH hBrush;//выбираем кисть
HPEN hPen;
int x=100, y=100;
//Цикл обработки сообщений
switch(messg){
case WM_COMMAND:
switch (LOWORD(wParam)){
case 1 :
break;
case 10 :
break;
case 100 :
break;
case 0 :
PostQuitMessage(0);
break;
}
case WM_LBUTTONDOWN:
hdc=GetDC(hWnd);
hBrush=CreateSolidBrush(RGB(20,0,0)); //задаём сплошную кисть, закрашенную цветом RGB
SelectObject(hdc, hBrush); //делаем кисть активной
x=LOWORD(lParam);//координаты с которыми нажата мышь - аргументы WndProc
y=HIWORD(lParam);
if(y>=50){
x/=40;
y/=40;
Rectangle(hdc, x*40, y*40, x*40+40, y*40+40);
ReleaseDC(hWnd, hdc);
}
break;
case WM_RBUTTONDOWN:
hdc=GetDC(hWnd);
x=LOWORD(lParam);//координаты с которыми нажата мышь - аргументы WndProc
y=HIWORD(lParam);
if(y>=50){
x/=40;
y/=40;
Rectangle(hdc, x*40, y*40, x*40+40, y*40+40);
}
break;
//сообщение рисования
case WM_PAINT:
hdc=BeginPaint(hWnd, &ps);
int i;
for(i=1; i<=15; i++){
MoveToEx(hdc,0, i*40, NULL);
LineTo(hdc, 600, i*40);
MoveToEx(hdc, i*40, 40, NULL);
LineTo(hdc, i*40, 600);
}
ValidateRect(hWnd, NULL);
button1=CreateWindow(L"button",L"Наступне покоління", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 160, 40, hWnd, (HMENU)1, hInst, NULL);
button2=CreateWindow(L"button",L"Чрез 5 поколінь", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 160, 0, 160, 40, hWnd, (HMENU)10, hInst, NULL);
button3=CreateWindow(L"button",L"Чрез 5 поколінь", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 320, 0, 160, 40, hWnd, (HMENU)100, hInst, NULL);
button0=CreateWindow(L"button",L"Вихід", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,480, 0, 120, 40, hWnd, (HMENU)0, hInst, NULL);
EndPaint(hWnd, &ps);
break;
//сообщение выхода - разрушение окна
case WM_DESTROY:
PostQuitMessage(0); //Посылаем сообщение выхода с кодом 0 - нормальное завершение
break;
default:
return(DefWindowProc(hWnd, messg, wParam, lParam)); //освобождаем очередь приложения от нераспознаных
}
return 0;
}
Ёпт, так и делай, как написал — через массив. В чём трабл? В том, что ты не знаешь алгоритма?
Я не знаю как привязать клетки к елементам массива,может подскажеш.
Особенно порадовало создание кнопок в обработчике WM_PAINT. Обновилось окно? Ну так вот вам еще и новые кнопки заодно. Автор явно не понимает сути реализации того, чего он хочет. Не надо плодить 20 тем в стиле "сделайте все за меня". Вопросы надо задавать конкретно: "не знаю, как нарисовать клетки средствами WinAPI", "не понимаю, как отобразить состояние клеток поля", "не понимаю алгоритма игры и как его лучше реализовать" и т.д.