Новичок
Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.8.2011
Репутация: нет Всего: нет
|
Написал вот такую реализацию: | Код | #include "stdafx.h" #include "iostream" #include "clocale" using namespace std; int ZeroGenerationX[]={1,2,3,4,5,6,7,8,9,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,1,2,3,4,5,6,7,8,9}; int ZeroGenerationY[]={1,0,1,1,1,0,1,1,1,-1,-1,-2,-1,-2,-1,-2,-1,-1,2,3,2,3,3,2,3,2,2}; int neighbour, CurrentPopulationSize, TempPopulationSize, NewPopulationSize=1; int ClockStart, Generation=0, N, M, Counter, x, y, MinX, MaxX, MinY, MaxY; bool s; int **NextGeneration(int**); int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_CTYPE, "Russian"); CurrentPopulationSize = sizeof(ZeroGenerationX) / sizeof(int); int **MainArray = new int* [2]; MainArray[0] = new int [CurrentPopulationSize]; MainArray[1] = new int [CurrentPopulationSize]; for (int i=0; i<CurrentPopulationSize; i++) { MainArray[0][i] = ZeroGenerationX[i]; MainArray[1][i] = ZeroGenerationY[i]; } while (NewPopulationSize>0) { Generation++; MainArray=NextGeneration(MainArray); MinX=MainArray[0][0]; MaxX=MainArray[0][0]; MinY=MainArray[1][0]; MaxY=MainArray[1][0]; for (int i=0; i<CurrentPopulationSize; i++) { if (MinX>MainArray[0][i]) MinX=MainArray[0][i]; if (MaxX<MainArray[0][i]) MaxX=MainArray[0][i]; if (MinY>MainArray[1][i]) MinY=MainArray[1][i]; if (MaxY<MainArray[1][i]) MaxY=MainArray[1][i]; } cout << "------------------------ Поколение: " << Generation << " ------------------------" << endl; for (int y=MinY-1; y<=MaxY+1; y++) { for (int x=MinX-1; x<=MaxX+1; x++) { bool s=true; for (int k=0; k<CurrentPopulationSize; k++) { if (x==MainArray[0][k] && y==MainArray[1][k]) { cout << "*"; s=false; break; } } if (s) cout << " "; } cout << endl; } cin.get(); } delete [] MainArray[1]; delete [] MainArray[0]; delete [] MainArray; cout << "Все померли ..."; cin.get(); return 0; } int **NextGeneration(int **Array) { N=9*CurrentPopulationSize; int **TempCells = new int* [2]; TempCells[0] = new int [N]; TempCells[1] = new int [N]; for (int i=0; i<CurrentPopulationSize; i++) { M=9*i; TempCells[0][M] =Array[0][i]-1; TempCells[1][M] =Array[1][i]-1; TempCells[0][M+1]=Array[0][i]-1; TempCells[1][M+1]=Array[1][i]; TempCells[0][M+2]=Array[0][i]-1; TempCells[1][M+2]=Array[1][i]+1; TempCells[0][M+3]=Array[0][i]; TempCells[1][M+3]=Array[1][i]-1; TempCells[0][M+4]=Array[0][i]; TempCells[1][M+4]=Array[1][i]; TempCells[0][M+5]=Array[0][i]; TempCells[1][M+5]=Array[1][i]+1; TempCells[0][M+6]=Array[0][i]+1; TempCells[1][M+6]=Array[1][i]-1; TempCells[0][M+7]=Array[0][i]+1; TempCells[1][M+7]=Array[1][i]; TempCells[0][M+8]=Array[0][i]+1; TempCells[1][M+8]=Array[1][i]+1; } int **Temp = new int* [2]; Temp[0] = new int [N]; Temp[1] = new int [N]; Temp[0][0]=TempCells[0][0]; Temp[1][0]=TempCells[1][0]; Counter=1; for (int i=1; i<N; i++) { s=true; for (int j=0; j<Counter; j++) { if (TempCells[0][i]==Temp[0][j] && TempCells[1][i]==Temp[1][j]) { s=false; } } if (s) { Temp[0][Counter]=TempCells[0][i]; Temp[1][Counter]=TempCells[1][i]; Counter=Counter+1; } } delete [] TempCells[0]; delete [] TempCells[1]; TempCells[0] = new int [Counter]; TempCells[1] = new int [Counter]; for (int i=0; i<Counter; i++) { TempCells[0][i] = Temp[0][i]; TempCells[1][i] = Temp[1][i]; } delete [] Temp[0]; delete [] Temp[1]; delete [] Temp; TempPopulationSize=Counter; int **TempArray = new int* [2]; TempArray[0] = new int [TempPopulationSize]; TempArray[1] = new int [TempPopulationSize]; NewPopulationSize=0; for (int i=0; i<Counter; i++) { x=TempCells[0][i]; y=TempCells[1][i]; neighbour=0; for (int k=0; k<CurrentPopulationSize; k++) { neighbour = (((x-1)==Array[0][k]) && ((y-1)==Array[1][k])) + (((x-1)==Array[0][k]) && (y==Array[1][k])) + (((x-1)==Array[0][k]) && ((y+1)==Array[1][k])) + ((x==Array[0][k]) && ((y-1)==Array[1][k])) + ((x==Array[0][k]) && ((y+1)==Array[1][k])) + (((x+1)==Array[0][k]) && ((y-1)==Array[1][k])) + (((x+1)==Array[0][k]) && (y==Array[1][k])) + (((x+1)==Array[0][k]) && ((y+1)==Array[1][k])) + neighbour; } for (int k=0; k<CurrentPopulationSize; k++) { if (x==Array[0][k] && y==Array[1][k] && (neighbour==2 || neighbour==3)) { TempArray[0][NewPopulationSize]=x; TempArray[1][NewPopulationSize]=y; NewPopulationSize=NewPopulationSize+1; break; } if (neighbour==3 && (x!=Array[0][k] || y!=Array[1][k])) { TempArray[0][NewPopulationSize]=x; TempArray[1][NewPopulationSize]=y; NewPopulationSize=NewPopulationSize+1; break; } } } delete [] TempCells[0]; delete [] TempCells[1]; delete [] TempCells; delete [] Array[1]; delete [] Array[0]; delete [] Array; int **Array = new int* [2]; Array[0] = new int [NewPopulationSize]; Array[1] = new int [NewPopulationSize]; for (int k=0; k<NewPopulationSize; k++) { Array[0][k] = TempArray[0][k]; Array[1][k] = TempArray[1][k]; } CurrentPopulationSize = NewPopulationSize; delete [] TempArray[1]; delete [] TempArray[0]; delete [] TempArray; return Array; }
|
Хотелось бы во-первых узнать мнения на счет оптимальности и ошибок если они есть (все вроде бы работает), ... Попытался прикрутить вывод в окно с помощью GDI+ и ничего не получилось ... | Код | #include <windows.h> #include <objidl.h> #include <gdiplus.h> using namespace Gdiplus; #pragma comment (lib,"Gdiplus.lib") VOID OnPaint(HDC hdc) { Graphics graphics(hdc); Pen pen(Color(255, 0, 0, 255)); здесь надо как-то вызвать функцию вычисления следующего поколения NextGeneration чтоб получить массив новых клеток, размер массива заранее неизвестен for (int i=0; i<CurrentPopulationSize; i++) { graphics.DrawRectangle(&pen, 2*Array[0][i], 2*Array[1][i], 1, 1); } } LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow) { HWND hWnd; MSG msg; WNDCLASS wndClass; GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; // Initialize GDI+. GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = TEXT("GettingStarted"); RegisterClass(&wndClass); hWnd = CreateWindow( TEXT("GettingStarted"), // window class name TEXT("Getting Started"), // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, // initial x position CW_USEDEFAULT, // initial y position CW_USEDEFAULT, // initial x size CW_USEDEFAULT, // initial y size NULL, // parent window handle NULL, // window menu handle hInstance, // program instance handle NULL); // creation parameters ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } GdiplusShutdown(gdiplusToken); return msg.wParam; } // WinMain LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; switch(message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); OnPaint(hdc); EndPaint(hWnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } }
|
в общем, что-то я запутался подскажите - как сделать красиво - чтоб в окне рисовались клетки по их координатам из двумерного динамического массива ?
|