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

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

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2007, 09:28   #11
zetrix
Delphi/C++/C#
Участник клуба
 
Аватар для zetrix
 
Регистрация: 29.10.2006
Сообщений: 1,972
По умолчанию

Цитата:
Например, я сделал пятнашки и нужно, чтобы условие победы отслеживалось не при каком-то событии, а постоянно
Хм... Я что-то не понимаю: как может наступить победа, если ничего не произошло? Ну в крайнем случае через таймер можно.
zetrix вне форума Ответить с цитированием
Старый 04.03.2007, 11:07   #12
Yogurt
Пользователь
 
Аватар для Yogurt
 
Регистрация: 22.01.2007
Сообщений: 25
По умолчанию

У меня может быть огромное кол-во различных событий, которые приводят к победе, при этом в случае победы реализуется большой механизм. Это получается, что мне в каждую процедуру надо вствить один и тот же код? Даже если оформить это все в отдельную процедуру и вставлять только её название, но если событий более ста?
Yogurt вне форума Ответить с цитированием
Старый 13.03.2007, 15:04   #13
LepihinMS
Пользователь
 
Регистрация: 03.02.2007
Сообщений: 45
По умолчанию

Значит перемудрил
LepihinMS вне форума Ответить с цитированием
Старый 26.03.2007, 13:06   #14
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию Исходник Пятняшек!

2Yogurt:
Попробую, вам уважаемый помочь! Представив вам разсосанный сорец пятнашек! Назовём это урок №4 для начинающего!
Код:
{ Игра "15"}
unit game15_;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes,
  Graphics, Controls, Forms, Dialogs;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormPaint(Sender: TObject);
    // эти объявления вставлены сюда вручную
    procedure ShowPole;
    procedure Mixer;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
const
    H = 4;   W = 4;   // размер поля - 4х4
    CH = 64; CW = 64; // размер клеток - 16х16
var
    // правильное расположение фишек
    stp : array[1..H, 1..W] of byte =
    (( 1, 2, 3, 4),
     ( 5, 6, 7, 8),
     ( 9,10,11,12),
     (13,14,15, 0));
    // игровое поле
    pole: array[1..H, 1..W] of byte;
    ex,ey: integer; // координаты пустой клетки
// новая игра
procedure NewGame;
var
    i,j: integer;
begin
    // исходное (правильное) положение
    for i:=0 to H+1 do
        for j:=0 to W+1 do
            pole[i,j] := stp[i,j];
    Form1.Mixer;    // перемешать фишки
    Form1.ShowPole; // отобразить поле
end;
// проверяет, расположены ли
// фишки в нужном порядке
function Finish: boolean;
var
    row,col: integer;
    i: integer;
begin
    row :=1; col :=1;
    Finish := True; // пусть фишки в нужном порядке
    for i:=1 to 15 do
    begin
       if pole[row,col] <> i then
       begin
            Finish:= False;
            break;
       end;
       // к следующей клетке
       if col < 4
          then inc(col)
       else begin
          col :=1;
          inc(row);
       end;
    end;
end;
 
// "перемещает" фишку в соседнюю пустую клетку,
// если она есть, конечно
procedure Move(cx,cy: integer);
// cx,cy - клетка, в которой игрок сделал щелчок
var
    r: integer;       // выбор игрока
begin
    // проверим, возможен ли обмен
    if not (( abs(cx-ex) = 1) and (cy-ey = 0) or
            ( abs(cy-ey) = 1) and (cx-ex = 0))
    then exit;
    // Обмен. Переместим фишку из x,y в ex,ey
    Pole[ey,ex] := Pole[cy,cx];
    Pole[cy,cx] := 0;
    ex:=cx;
    ey:=cy;
    // отрисовать поле
    Form1.ShowPole;
    if Finish then
    begin
        r := MessageDlg('Цель достигнута!'+ #13+
        'Еще раз?',mtInformation,[mbYes,mbNo],0);
        if r = mrNo then Form1.Close; // завершить работу программы
    end;
//end;
end;
// щелчок в клетке
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
    cx,cy: integer; // координаты клетки
begin
    // преобразуем координаты мыши в координаты клетки
    cx := Trunc(X / CW) + 1;
    cy := Trunc(Y / CH) + 1;
    Move(cx,cy);
end;
// выводит игровое поле
procedure TForm1.ShowPole;
var
    i,j: integer;
    x,y: integer; // x,y - координаты вывода 
                  //  текста в клетке
begin
    // сетка: вертикальные линии
    for i:= 1 to W - 1 do
    begin
        Canvas.MoveTo(i*CW,0);
        Canvas.LineTo(i*CW,ClientHeight);
    end;
    // сетка: горизонтальные линии
    for i:= 1 to H - 1 do
    begin
        Canvas.MoveTo(0,i*CH);
        Canvas.LineTo(ClientWidth,i*CH);
    end;
    // содержимое клеток
    // x,y - координаты вывода текста
    for i:= 1 to H do
    begin
        y:=(i-1)*CH + 15;
        for j:=1 to W do
        begin
            x:= (j-1)*CW + 15;
            case Pole[i,j] of
            0:      Canvas.TextOut(x,y,'     ');
            1..9:   Canvas.TextOut(x,y,' '+IntToStr(Pole[i,j])+'  ');
            10..15: Canvas.TextOut(x,y,IntToStr(Pole[i,j]));
            end;
        end;
    end;
end;
// "перемешивает" фишки
procedure TForm1.Mixer;
var
    x1,y1: integer; // пустая клетка
    x2,y2: integer; // эту переместить в пустую
    d: integer;     // направление, относительно пустой
    i: integer;
begin
    x1:=4;
    y1:=4;
    randomize;
    for i:= 1 to 150 do
    begin
        repeat
            x2:=x1;
            y2:=y1;
            d:=random(4)+1;
            case d of
                1: dec(x2);
                2: inc(x2);
                3: dec(y2);
                4: inc(y2);
            end;
        until (x2>=1) and (x2<=4) and (y2>=1) and (y2<=4);
        // здесь определили фишку, которую
        // надо переместить в пустую клетку
        Pole[y1,x1] := Pole[y2,x2];
        Pole[y2,x2] := 0;
        x1:=x2;
        y1:=y2;
    end;
    // запомним координаты пустой клетки
    ex:= x1;
    ey:= y1;
end;
// обработка события OnCreate
procedure TForm1.FormCreate(Sender: TObject);
begin
    ClientWidth := CW * W;
    ClientHeight := CH * H;
    Canvas.Font.Name := 'Times New Roman';
    Canvas.Font.Size := 22;
    NewGame;
end;
// обработка события OnPaint
procedure TForm1.FormPaint(Sender: TObject);
begin
    Form1.ShowPole;
end;
end.
Вложения
Тип файла: rar 15.rar (3.9 Кб, 389 просмотров)

Последний раз редактировалось execom; 26.03.2007 в 13:18.
execom вне форума Ответить с цитированием
Старый 27.03.2007, 15:37   #15
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Урок № 5
Отдельный класс игрушек прадставлен, так называемыми игрушками на развитие памяти! Вот попробуем написать одну из таких! Что она будет делать!? А практически ни чего особенно сложно, просто запускаем прогу она на секунду показывает число, а потом число пропадает и появляется окно для ввода числа, там мы его по памяти вводим и если мы правильно ввели, то показывается следующее, а если неправильно, то следующее число будет показано после звукового сигнала об ошибке! Вот откоментированный исходник игры а ниже архив с исходником!
Код:
unit memory_;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
implementation
const
  KC = 5;   // разрядность числа (кол-во цифр)
  LT = 10;  // количество чисел (длинна теста)
var
  numb: integer;  // число, которое должен запомнить испытуемый
  right: integer; // количество правильно запомненных чисел
  n: integer;     // счетчик чисел
{$R *.dfm}
// генерирует k - разрядное число
function GetNumb(k: integer) : integer;
var
  n: integer; // генерируемое число
  i: integer;
begin
  // процедура генерирует число по разрядам
  // начиная со старшего
  n:= Random(9)+1; // старший разряд не может быть нулем
  // остальные разряды
  for i := 1 to (k-1) do
    n := n*10 + Random(10);
  GetNumb := n;
end;
// создание формы
procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Visible := False;  // скрыть поле ввода Edit1
  Edit1.MaxLength := KC;   // кол-во символов, которое можно ввести
  Label1.WordWrap := True; // разрешить перенос слов на следующую строку
  Label1.Caption :=
  'Сейчас на экране будут появляться числа. ' +
  'Вы должны запомнить число, набрать его на клавиатуре и нажать <Enter>';
  Button1.Caption := 'Начать';
  Timer1.Enabled := False;    // таймер остановлен
  Timer1.Interval := 1000;    // время показа числа - 1 секунда
  right := 0;    // кол-во правильных
  n := 0;    // счетчик чисел
  Randomize;     // инициализация ГСЧ
end;
// щелчок на кнопке "Начать/Завершить"
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Button1.Caption = 'Завершить' then
     Form1.Close; // закрыть окно программы
  if Button1.Caption = 'Начать' then
  begin
      Button1.Caption := 'Завершить';
      Button1.Visible := False;  // скрыть кнопку
      // кнопка Button1 станет доступной после того
      // как испытание закончится
      Label1.Caption := '';
      Label1.Font.Size := 24;       // размер шрифта поля Label1
      Edit1.Font.Size := 24;        // размер шрифта поля Edit1
      // сгенерировать и вывести число
      numb := GetNumb(KC);
      Label1.Caption := IntToStr(numb);
      Timer1.Enabled := True;       // запуск таймера
      // процедура обработки сигнала от таймера
      // "сотрет" число
    end;
end;
// обработка события таймера
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False; // остановить таймер
  Label1.Visible := False; // скрыть число
  Edit1.Visible := True;   // сделать доступным поле Edit1
  Edit1.SetFocus;          // установить курсор в поле Edit1
end;
// нажатие клавиш в поле Edit1
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  igrok: integer;  // число, которое ввел испытуемый
begin
    case Key of
        '0'..'9',#8:  ; // клавиши "0"-"9",<Backspace>
        #13:            // клавиша <Enter>
    begin
        igrok := StrToInt(Edit1.Text);
        if (igrok = numb)
           then right := right + 1;
        n := n + 1; // счетчик чисел
        Edit1.Text := '';
        Edit1.Visible := False;   // скрыть поле Edit1
        if n < LT then
        begin
          numb := GetNumb(KC); // сгенерировать следующее число
          Label1.Caption := IntToStr(numb); // отобразить число
          Label1.Visible := True;
          Timer1.Enabled := True;           // пуск таймера
        end
        else begin
          // испытание закончено
          // вывести результат
          Label1.Font.Size := 10;
          Label1.Caption := 'Результат:' + #13 +
            'Показано чисел:  ' + IntToStr(LT) + #13 +
            'Правильных:  ' + IntToStr(right);
          Label1.Visible := True;
          Button1.Visible := True;    // показывается кнопка "Завершить"
        end;
    end;
    else Key := Chr(0);
    end;
end;
end.
Вложения
Тип файла: rar Память.rar (3.7 Кб, 207 просмотров)

Последний раз редактировалось execom; 27.03.2007 в 15:45.
execom вне форума Ответить с цитированием
Старый 29.03.2007, 03:38   #16
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Урок №6!
Теперь попробуем написать игрушку развивающую реакцию! Суть её заключается в следующем, на экране появляются смайлики и на м нужно успавать по ним кликать курсором! В конце выдаётся результат о попаданиях и промахах!
Вот откоментированный исходник игры "Тир":
Код:
unit tir_;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Timer: TTimer;
    Label1: TLabel;
    Button1: TButton;
    procedure TimerTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    { *****************************
      объявление процедур помещено сюда,
      чтобы процедуры имели прямой доступ
      к форме, на которой они рисуют
      ****************************** }
    procedure PaintFace(x,y: integer); // рисует рожицу
    procedure EraseFace(x,y: integer); // стирает рожицу
  end;
var
  Form1: TForm1;
  fx,fy: integer;  // координаты рожицы
  n: integer;      // количество щелчков кнопкой мыши
  p: integer;      // количество попаданий
implementation
// рисует рожицу
procedure TForm1.PaintFace(x,y: integer);
begin
    Canvas.Pen.Color := clBlack;     // цвет линий
    Canvas.Brush.Color := clYellow;  // цвет закраски
    // рисуем рожицу
    Canvas.Ellipse(x,y,x+30,Y+30);       // лицо
    Canvas.Ellipse(x+9,y+10,x+11,y+13);  // левый глаз
    Canvas.Ellipse(x+19,y+10,x+21,y+13); // правый глаз
    Canvas.Arc(x+4,y+4,x+26,y+26,x,y+20,x+30,y+20); // улыбка
end;
// стирает рожицу
procedure TForm1.EraseFace(x,y: integer);
begin
   // зададим цвет границы и цвет закраски,
   // совпадающий с цветом формы. По умолчанию
   // цвет формы - clBtnFace (см. в Object Inspector)
   Canvas.Pen.Color := clBtnFace;   // цвет окружности
   Canvas.Brush.Color := clBtnFace; // цвет закраски
   Canvas.Ellipse(x,y,x+30,y+30);
end;
 
{$R *.dfm}
procedure TForm1.TimerTimer(Sender: TObject);
begin
    EraseFace(fx,fy);
    // новое положение рожицы
    fx:= Random(ClientWidth-30);  // 30 - это диаметр рожицы
    fy:= Random(ClientHeight-30);
    PaintFace(fx,fy);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
    // исходное положение рожицы
    fx:=100;
    fy:=100;
    Randomize;  // инициализация генератора
                // случайных чисел
end;
// нажатие клавиши мыши
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  inc(n);  // кол-во щелчков
  if (x > fx) and (x < fx+30) and
     (y > fy) and (y < fy+30)
  then begin
       // щелчок по рожице
       inc(p);
       end;
  if n = 10 then
    begin
        // игра закончена
        Timer.Enabled := False; // остановить таймер
        ShowMessage('Выстрелов: 10. Попаданий: ' +
                 IntToStr(p)+'.');
        EraseFace(fx,fy);
        Label1.Visible := True;
        Button1.Visible := True;
        // теперь кнопка и сообщение снова видны
    end;
end;
// щелчок на кнопке Ok
procedure TForm1.Button1Click(Sender: TObject);
begin
    Label1.Visible := False;  // скрыть сообщение
    Button1.Visible := False; // скрыть кнопку
    Timer.Enabled := True;    // пуск таймера
end;
end.
А это полностью исходник игры!
Вложения
Тип файла: rar tir.rar (3.6 Кб, 256 просмотров)

Последний раз редактировалось execom; 29.03.2007 в 03:41.
execom вне форума Ответить с цитированием
Старый 30.03.2007, 09:02   #17
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию Морской бой

Урок №7
Практчески любой и каждый уважающий себя человек в своей жизни хотя бы раз играл в эту занимательную стратегическую игрушку - Морской бой! Исходник не такой простой, как в предыдущих примерах, но и не сложный, разобраться при желании можно! При желании вы можете дороботать игру добавив новые стили игры (их существует огромное множество)! Можно доработать стратегию компа! А можно просто оптимизировать (а скорей адаптировать) интерфейс под себя!
Игра в принципе работает, но компьютер довольно просто рвёт!...
Вложения
Тип файла: rar Морской бой.rar (13.7 Кб, 555 просмотров)
execom вне форума Ответить с цитированием
Старый 01.04.2007, 23:22   #18
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Урок №8
Немного теории по особенностям создания игр разных жанров!
Anim_Games.rar - Анимация в компьютерных играх;
Arcade_Games.rar - Аркадные игры;
Prikluch_Games.rar - Приключеньческие игры.
Вложения
Тип файла: rar Anim_Games.rar (14.1 Кб, 558 просмотров)
Тип файла: rar Arcade_Games.rar (7.2 Кб, 476 просмотров)
Тип файла: rar Prikluch_Games.rar (4.7 Кб, 410 просмотров)

Последний раз редактировалось execom; 01.04.2007 в 23:30.
execom вне форума Ответить с цитированием
Старый 03.04.2007, 20:18   #19
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Урок №9
А вот исходник более серьёзной и весьма увлекательной игрухи! Игра называется "Линии"! Цель игры методом передвиженя кружков необходимо поставить в ряд 4 и более кружка одного цвета, при этом они исчезают! При каждом ходе появляется несколько новых кружков. Игра заканчивается когда заканчивается место на игровом поле! Что бы передвинуть кружок, надо по нему щёлкнуть, а потом щёлкнуть по месту назначения, но при том условии что кружок сможет доехать до места назначения не перепрыгивая (хотя можно обходить) через другие кружки! В общем кому интересно разберитесь с исходником, он там не сложный, а кому не очень это интересно, советую поиграть!!!
Вложения
Тип файла: rar Lines.rar (26.3 Кб, 318 просмотров)
execom вне форума Ответить с цитированием
Старый 05.04.2007, 00:33   #20
execom
Редкий тунеядец
Форумчанин
 
Аватар для execom
 
Регистрация: 29.10.2006
Сообщений: 595
По умолчанию

Урок №10
Вот пример того как можно работать с возможностями 3D в Delphi!
Простенький мануальнчик с примером исходника!
Вложения
Тип файла: rar 3d.rar (3.3 Кб, 707 просмотров)
execom вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хорошие уроки Render Общие вопросы Delphi 9 15.09.2012 07:13
Акцесс вопросы новичков Yaga Помощь студентам 4 02.06.2008 00:16
Учебники для новичков в програмировании Рар Общие вопросы Delphi 6 08.01.2007 08:07