Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2011, 15:12   #1
вася радугов
Форумчанин
 
Регистрация: 09.04.2011
Сообщений: 134
По умолчанию Игры на Delphi

Задали написать игру Джона Конвея Жизнь. Я до этого писал только самые простые программы, а игры не знаю как создвать. Плюс нам еще поставили условия чтобы в игре можно было регулировать скорость размножения клеток, счет поколений и возможность начать сохраненную игру.
Подскажите как все это релизовать на делфи или может есть исходник. Мне нужен простой код, не через объектно - ориентированное( классы, canvas,proceduredraw и т.п.- я ООП не понимаю)
Помогите пожалуйста а то я вообще не знаю что делать.
вася радугов вне форума Ответить с цитированием
Старый 29.11.2011, 15:43   #2
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

на С++

Код:
#include "stdafx.h"
#include <vinlib/winapi.h>
#include <vinlib/ctl_std.h>

const int S=60; // Ширина и высота поля

class Live : public Window {
public:
  MainMenu mainMenu;  
  int zoom, ox, oy;
  bool map[S*S];
  
  Live();
  void redraw(DC&);
  void wmLButtonDown(short,short,int);
  void wmTimer(int id, TIMERPROC proc);
  void go(int interval);
  void clear(int=0);
  void noise(int=0);
};

#define ptr(X) method(this,&Live::X)

Live::Live() {
  // Создание окна
  create(0,0,WS_VISIBLE|WS_OVERLAPPEDWINDOW,0,100,100,640,480, 
       "Жизнь. VinxNoise (www.vinx.ru)",0);
  dblbuf = true;

  // Создание главного меню (0 - без пиктограммы)
  mainMenu.add(0, "Стоп", ptr(go), VK_ESCAPE, 0);
  mainMenu.add(0, "1 Гц", ptr(go), VK_F1, 1000);
  mainMenu.add(0, "3 Гц", ptr(go), VK_F2, 333);
  mainMenu.add(0, "10 Гц", ptr(go), VK_F3, 100);
  mainMenu.add(0, "30 Гц", ptr(go), VK_F4, 33);
  mainMenu.add(0, "Очистить", ptr(clear));
  mainMenu.add(0, "Шум", ptr(noise));
  mainMenu.create(this);

  // Очистка игрового поля
  clear();
}

// Запуск и остановка игры
void Live::go(int interval) {
  if(interval==0) killTimer(x0);
             else setTimer(0, interval);
}

// Очистка игрового поля
void Live::clear(int) {
  memset(map, 0, sizeof(map));
  invalidate();
}

// Заполнение игрового поля шумом
void Live::noise(int) {
  for(int i=0; i<S*S; i++)
    map[i] = rand()&1;
  invalidate();
}

// Щелчек кнопкой мыши
void Live::wmLButtonDown(short x, short y, int) {
  // Приведение экранных координат к координате ячейки
  x=(x-ox)/zoom, y=(y-oy)/zoom;
  if(x<0 || y<0 || x>=S || y>=S) return;

  // Изменение состояния ячейки
  map[x+y*S] ^= 1;

  invalidate();
}

// Перерисовка окна
void Live::redraw(DC& dc) {
  // Расчет размера ячейки и смещения игрового поля (для центрирования)
  zoom = max(min(clientWidth/S, clientHeight/S), 1);
  ox = (clientWidth-S*zoom)/2;
  oy = (clientHeight-S*zoom)/2;

  // Перерисовка экрана
  int s = zoom>3 ? zoom-2 : zoom-1;
  bool* a = map;
  dc.clear(0xA0A0A0);
  for(int gy=oy, my=oy+S*zoom; gy<my; gy+=zoom)
    for(int gx=ox, mx=ox+S*zoom; gx<mx; gx+=zoom)
      dc.fillRect(gx, gy, gx+s, gy+s, *a++ ? 0 : 0xFFFFFF);
}

// Тик таймера
void Live::wmTimer(int id, TIMERPROC proc) {
  // Подсчет кол-ва соседей
  char map1[S*S];  
  char *b = map1;
  for(int y=0; y<S; y++)
    for(int x=0; x<S; x++) {
      int s=0;
      for(int i=-1; i<=1; i++)
        for(int j=-1; j<=1; j++)
          if(i|j)
            s += map[(x+i+S)%S+((y+j+S)%S)*S];
      *b++ = s;
    }

  // Алгоритм игры
  b = map1;
  for(bool *a=map, *e=map+S*S; a<e; a++, b++)
    if(*a) { if(*b!=2 && *b!=3) *a=0; }
      else { if(*b==3) *a=1; }

  invalidate();
}

// Запуск игры
int main(const char*) {
  Live l;
  l.beginModal();
  return 0;
}
L6go1as вне форума Ответить с цитированием
Старый 29.11.2011, 15:48   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,869
По умолчанию

поищи по форуму, похожие темы были. да и я там кому-то какую-то прогу выкладывал: амёбы в ящике бегают и что-то хавают. там вам только прикрутить им процедуру спаривания (столкновения) и рождение третьего несчастного организма. программа называется BIO. а скрость размножения зависит от того, как они быстро найдут друг друга. там настройки скорости и количества амёб есть. но там всё на Delphi.
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
NetSpace вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
биматричные игры (Delphi) Кэт Помощь студентам 0 19.03.2010 19:29
известные игры на delphi Iceman Gamedev - cоздание игр: Unity, OpenGL, DirectX 10 12.02.2010 18:30
Игры на Delphi (обсуждение) AcerAlex Софт 12 19.03.2009 21:25
Игры на Delphi CyberOrcX Gamedev - cоздание игр: Unity, OpenGL, DirectX 30 22.07.2008 00:31