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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2013, 16:06   #11
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, Grids;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    ScrollBox1: TScrollBox;
    TabSheet1: TTabSheet;
    RadioGroup1: TRadioGroup;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    DrawGrid1: TDrawGrid;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure DrawGrid1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Type TKrestikeNolice=(KrKrestik, KrNolic);
Type TRubachkaType=(TlRubachka, TlNilice, TlKrestike);
Type TilesMap=record
  TypeRubachkaType:TRubachkaType;
end;
var
  Form1: TForm1;
  TypeHod:Integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Bitbtn1.Align:=AlTop;
  Bitbtn2.Align:=AlTop;
  Bitbtn3.Align:=AlTop;
  Bitbtn4.Align:=AlTop;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
Var bit:TBitmap;
begin
  RadioGroup1.Enabled:=True;
  RadioGroup1.Buttons[1].Enabled:=False;
  RadioGroup1.Buttons[2].Enabled:=False;
  Radiogroup1.ItemIndex:=0;
  DrawGrid1.Width:=161;
  DrawGrid1.Height:=161;
  Drawgrid1.Left:=0;
  Drawgrid1.Top:=0;
  DrawGrid1.RowCount:=3;
  DrawGrid1.ColCount:=3;
  BitBtn3.Enabled:=False;
end;

procedure TForm1.DrawGrid1Click(Sender: TObject);
Var bit:TBitmap;
begin
  bit:=TBitmap.Create;
  Case typeHod of
    0:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resKr.bmp');
    1:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resNl.bmp');
  end;
  DrawGrid1.Canvas.Draw(DrawGrid1.Selection.Left*50,DrawGrid1.Selection.Top*50,bit);
  If typeHod=0then typeHod:=1 else typeHod:=0;
end;

end.
когда отрисовываешь вторую картинку 1 исчезает и еще нужно сделать отрисовку рубашек но так чтобы отрисовывалась 1 раз
Alexandr17-10 вне форума Ответить с цитированием
Старый 08.09.2013, 16:54   #12
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Alexandr17-10, если ты пишешь игру "крестики-нолики", перестань заниматься фигней и напиши как человек.

Каждому полю соответствует свое состояние: "чисто", "крестик", "нолик". Отрисовка делается в OnDrawCell, -- только там. Остальные управлющие элементы изменяют состояние игрового поля, настройки и прочее, после чего вызывается перерисовка игрового поля методом Invalidate. Если чистые поля могут иметь разные рубашки -- это настройка.

Получается, что есть среда -- игровое поле, и все остальное пляшет вокруг нее. В этом ключе и думай.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 08.09.2013, 22:18   #13
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

ТС хочет совместить данные с UI, что не есть хорошо...Даже для игры "крестики-нолики"...
В целом ничего сложного - поле это массив NxM, значения элементов которого равны тому, что Vapaamies написал (например, 0 -"чисто", 1 -"крестик", 2 -"нолик")...Изначально массив заполнен 0 (нулями). Игрок, посредством UI, изменяет элементы данного массива, после чего идет перерисовка UI в буфер (тот же TBitmap) и далее уже выводите нарисованное на Canvas чего либо...
Как-то так...общая идея думаю должна быть понятна...
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 09.09.2013, 16:24   #14
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию

А как сделать отрисовку ведь он отрисовывает для каждой ячейки мне вот нужна проверка какой тайл отрисовывать
Код:
procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
Var bit:TBitmap;
begin
  bit:=TBitmap.Create;
  Case typeHod of
    TlRubachka:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resRub.bmp');
    TlNolice:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resNl.bmp');
    TlKrestike:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resKr.bmp');
  end;
  DrawGrid1.Canvas.Draw(ACol*50,ARow*50,bit);
end;
Но это работать не будет так как он перерисовывает это приведет к перерисовки всего поля а не одной клетки

Последний раз редактировалось Alexandr17-10; 09.09.2013 в 16:43.
Alexandr17-10 вне форума Ответить с цитированием
Старый 09.09.2013, 16:33   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
это приведет к перерисовки всего поля а не одной клетки
Как раз наоборот. Перерисовка только одной клетки:
Код:
DrawGrid1.Canvas.Draw(Rect.Left,Rect.Top,bit);
Ты можешь хранить массив, в ячейках которого будет указание что рисовать.
Тогда:
Код:

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
Var bit:TBitmap;
begin
  bit:=TBitmap.Create;
 
  Case массив[acol,arow] of
    TlRubachka:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resRub.bmp');
    TlNolice:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resNl.bmp');
    TlKrestike:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resKr.bmp');
  end;
  DrawGrid1.Canvas.Draw(Rect.Left,Rect.Top,bit);

end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.09.2013, 17:04   #16
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию

Код:
var
  Form1: TForm1;
  TypeHod:Array of Array of TRubachkaType;
  Hod:TKrestikeNolice;
procedure TForm1.FormCreate(Sender: TObject);
begin
  Bitbtn1.Align:=AlTop;
  Bitbtn2.Align:=AlTop;
  Bitbtn3.Align:=AlTop;
  Bitbtn4.Align:=AlTop;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
Var bit:TBitmap;
I,I1:Integer;
begin
  Randomize;
  RadioGroup1.Enabled:=True;
  RadioGroup1.Buttons[1].Enabled:=False;
  RadioGroup1.Buttons[2].Enabled:=False;
  Radiogroup1.ItemIndex:=0;
  DrawGrid1.Width:=161;
  DrawGrid1.Height:=161;
  Drawgrid1.Left:=0;
  Drawgrid1.Top:=0;
  DrawGrid1.RowCount:=3;
  DrawGrid1.ColCount:=3;
  BitBtn3.Enabled:=False;
  Hod:=TKrestikeNolice(Random(2));
  SetLength(TypeHod,3,3);
  For i:= 0 to 2 do For i1:=0 to 2 do
    TypeHod[i,i1]:=TlRubachka;
end;

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
Var bit:TBitmap;
X,Y,i,i1:Integer;
begin
  bit:=TBitmap.Create;
  Case typeHod[ACol, ARow] of
    TlRubachka:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resRub.bmp');
    TlNolice:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resNl.bmp');
    TlKrestike:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resKr.bmp');
  end;
end;

procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  If Hod=KrKrestik then begin
    TypeHod[ACol, ARow]:=TlKrestike;
    Hod:=KrNolic;
  end else begin
    TypeHod[ACol, ARow]:=TlNolice;
    Hod:=KrKrestik;
  end;

end;
И как сделать отрисовку чтобы нормально было
Alexandr17-10 вне форума Ответить с цитированием
Старый 09.09.2013, 17:13   #17
Alexandr17-10
Пользователь
 
Регистрация: 12.08.2013
Сообщений: 99
По умолчанию

Хотя не надо вот код
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls, Grids;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    ScrollBox1: TScrollBox;
    TabSheet1: TTabSheet;
    RadioGroup1: TRadioGroup;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    DrawGrid1: TDrawGrid;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Type TKrestikeNolice=(KrKrestik, KrNolic);
Type TRubachkaType=(TlRubachka, TlNolice, TlKrestike);
Type TilesMap=record
  TypeRubachkaType:TRubachkaType;
end;
var
  Form1: TForm1;
  TypeHod:Array of Array of TRubachkaType;
  Hod:TKrestikeNolice;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Bitbtn1.Align:=AlTop;
  Bitbtn2.Align:=AlTop;
  Bitbtn3.Align:=AlTop;
  Bitbtn4.Align:=AlTop;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
Var bit:TBitmap;
I,I1:Integer;
begin
  Randomize;
  RadioGroup1.Enabled:=True;
  RadioGroup1.Buttons[1].Enabled:=False;
  RadioGroup1.Buttons[2].Enabled:=False;
  Radiogroup1.ItemIndex:=0;
  DrawGrid1.Width:=161;
  DrawGrid1.Height:=161;
  Drawgrid1.Left:=0;
  Drawgrid1.Top:=0;
  DrawGrid1.RowCount:=3;
  DrawGrid1.ColCount:=3;
  BitBtn3.Enabled:=False;
  Hod:=TKrestikeNolice(Random(2));
  SetLength(TypeHod,3,3);
  For i:= 0 to 2 do For i1:=0 to 2 do
    TypeHod[i,i1]:=TlRubachka;
end;

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
Var bit:TBitmap;
X,Y,i,i1:Integer;
begin
  bit:=TBitmap.Create;
  Case typeHod[ACol, ARow] of
    TlRubachka:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resRub.bmp');
    TlNolice:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resNl.bmp');
    TlKrestike:bit.LoadFromFile(ExtractFileDir(Application.ExeName)+'\resKr.bmp');
  end;
  DrawGrid1.Canvas.Draw(Rect.Left,Rect.Top,bit);
end;

procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
  If TypeHod[ACol, ARow]=TlRubachka then
    If Hod=KrKrestik then begin
      TypeHod[ACol, ARow]:=TlKrestike;
      Hod:=KrNolic;
    end else begin
      TypeHod[ACol, ARow]:=TlNolice;
      Hod:=KrKrestik;
    end;
end;

end.
Осталось сделать ИИ
С 3 на 3 полем ии сделатьне проблема но мнебы хотелась сделать для всех размеров 4 на 4 или 5 на 5 по правилу что и в обычных крестиках ноликах
Alexandr17-10 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как привязать компоненту TComboBox к Button, чтобы при нажатии Button, данные из ComboBox вводились в TstringGrid Marta_ Помощь студентам 2 15.10.2011 01:02
Открывать/создавать папку по нажатию на Button Akemi Общие вопросы Delphi 5 01.09.2010 19:47
Как рисовать через Canvas на TPageControl Манжосов Денис :) Компоненты Delphi 2 24.01.2010 21:33
Как по нажатию на Button открыть документ, выбранный в OpenDialog Stranger333 Общие вопросы Delphi 4 12.11.2009 14:27
Как рисовать на Canvas объектов Jean-Esther Общие вопросы Delphi 2 02.03.2009 02:57