Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Игра Жизнь 
:(
    Опции темы
Coyote112358
Дата 14.8.2011, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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);
   }
}


в общем, что-то я запутался
 подскажите - как сделать красиво - чтоб в окне рисовались клетки по их координатам из двумерного динамического массива ?
PM MAIL   Вверх
bsa
Дата 15.8.2011, 00:08 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Coyote112358 @  14.8.2011,  19:23 Найти цитируемый пост)
 подскажите - как сделать красиво - чтоб в окне рисовались клетки по их координатам из двумерного динамического массива ? 

Для этого надо забыть о WinAPI. И использовать более подходящие инструменты. Для С++ я знаю только один - Qt.
PM   Вверх
mekhanikus
Дата 15.8.2011, 11:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

Репутация: нет
Всего: 1



Для начала стоит разобраться рисует вообще DrawRectangle что-нибудь или нет.
Затем, лучше рисовать в отдельном контексте, а WM_PAINT только копировать в окно.
Следующие поколения, наверн, лучше получать по какому-нибудь таймеру, а не во время прорисовки окна.
Обновили поколение, пробежали по массиву, закрасили квадратики, послали окну "инвалидате ректангл".
PM MAIL   Вверх
volatile
Дата 15.8.2011, 21:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Coyote112358, ваш код, имхо рефакторить надо. Слишком много напихано в одной функции. Функция должна быть поменьше. Желательно не больше 1-го экрана, или даже пол экрана.
Потом вместо дин. массивов, лучше заюзать стл-овский вектор. У вас же черт ногу сломит, сколько там было new, сколько delete.
Ну и по самой игре, я бы сделал поле ограниченным. И хранил бы не координаты, а само поле. Это бы значительно упростило бы алгоритм, и увеличило скорость. Ну и ограниченное поле легче бы было вывести на экран.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.