Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.96/26: Рейтинг темы: голосов - 26, средняя оценка - 4.96
0 / 0 / 2
Регистрация: 09.06.2012
Сообщений: 59
1

Процесс реализации хода шашки

24.03.2013, 12:44. Показов 4659. Ответов 4
Метки нет (Все метки)

Здравствуйте! Не так давно взял тему по курсовой работе. Ну в кратце необходимо написать шашки. В дальнейшем с AI.
Хотелось бы сразу сказать, что до этого ничего подобного в delphi не делал. Только начинаем изучать динамику в паскале. Но вот с ООП как то у нас в институте странно, в том плане что нам дают задание, а как его делать и прочее - мол ищите сами. Ну да ладно, это небольшое лирическое отступление , возможно, оправдывающее наверняка присутствующую кривизну кода и т.д.
Для себя определил, что программа будет реализоваться следующим образом:
1. Игровое окно делится на 2 части. Примерно 2/3 из которых занимает игровое поле. 1/3 Справа занимает различная доп.информация об игре и небольшая панель управления.
2. Игровое поле представляет собой TPanel, внутри которой TImage (фон с размерами панели). Внутри так же располагается меньшего размера TBevel ( само поле , без оконтовки и рамки), которое в процессе заполняется блоками TPanel[i,j]. На подобии матрицы. В результате получаем TBevel, плотно набитый TPanel[i,j].
3. После нажатия кнопки "Новая игра" происходит расстановка всех шашек на свои позиции( черные, i+j - нечетное число). На этих местах появляются TImage формата png с помощью присваивания Image[i,j].Parent:=Panel[i,j].
4. Сначала доступен только ход белых. Щелкаем на шашку, видим доступные позиции (крайние шашки доски работают некорректно). Делаем щелчок мыши по "доступным" ходам и шашка переходит на новое место. Далее становятся доступные черные шашки и все повторяется...и т.д.
5. Реализация рубки(вперед-назад), ходы дамок и т.д.

Проблема в корректном реализации 4 пункта. Получается так, что при последующих ходах, примерно после 2 хода(это ход черных), белые начинают сходить с ума. А конкретно, как видно из хода игры, на 3 ходе, белые шашки, в независимости от щелчка и выбора доступной позиции, их parent почему-то становится равным parent'у 1 из доступных ходов...если ходить по-другому то со схожей ситуацией можно столкнуться и с черными шашками, а иногда и вообще друг на друга напрыгивают.

В общем прошу помощи разобраться в этом. Быть может что-то делаю,присваиваю и понимаю не так. Сразу говорю, что сидеть и читать n-ое кол-во литературы времени особого нет, так что хотелось бы в кратце и по-существу. За ранее спасибо. Весь проект прикладываю во вложении. Создавал с помощью Delphi XE3 + AlphaControls. Наглядно думаю, что все увидите сами, если все вышеизложенное не совсем понятно

И на всякий случай листинг Unit1 ( основная часть кода ):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.ImgList,
  Vcl.Imaging.jpeg, Vcl.Menus, Vcl.StdCtrls, acPNG;
 
type
 
  TMainWindow = class(TForm)
    LeftPart: TPanel;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    ParamDifficult: TMenuItem;
    ParamDesign: TMenuItem;
    N9: TMenuItem;
    Wood: TImage;
    Marble: TImage;
    Bevel1: TBevel;
    RightPart: TPanel;
    Label1: TLabel;
    WhoNowLabel: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    HodLabel: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    LabelDesign: TLabel;
    LabelDesginValue: TLabel;
    ButtonExit: TButton;
    NewGameButton: TButton;
    GameMassiv: TPanel;
    Button1: TButton;
    Timer1: TTimer;
    procedure ButtonExitClick(Sender: TObject);
    procedure NewGameButtonClick(Sender: TObject);
    procedure ParamDesignClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ImgClk(Sender: TObject);
    procedure CycleClk(Sender:TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    Panel: array[1..8,1..8] of TPanel;
    Image: array[1..8,1..8] of TImage;
    k,n,m,p:integer;
    ImageName: string;
 
    { Public declarations }
  end;
 
var
  MainWindow: TMainWindow;
 
implementation
 
{$R *.dfm}
 
uses Unit2,pngimage;
 
 
procedure TMainWindow.Button1Click(Sender: TObject);
var x:string;
begin
x:=Image[1,4].Name;
ShowMessage(x);
end;
 
procedure TMainWindow.ImgClk(Sender: TObject);
var i,j:integer;
begin
// Выводим в окно того, кто сейчас ходит
if k mod 2=0 then WhoNowLabel.Caption:='Черные';
if k mod 2<>0 then WhoNowLabel.Caption:='Белые';
// -----
// Ход черных
if (k mod 2=0) then
begin
for i := 1 to 8 do
begin
      for j := 1 to 8 do
      begin
    if assigned(Image[i,j])  then begin
    if (Image[i,j].Tag=0)or(Image[i,j].Tag=1) then
    Image[i,j].Enabled:=False;
    end;
 
    if (Sender = Image[i,j]) then
        begin
      ImageName:=Image[i,j].Name;
      showmessage(Imagename);
            if (i+j) mod 2<>0 then
            begin
      if not assigned(Image[i+1,j-1]) then begin
 
            // первый ход
              Image[i+1,j-1]:=TImage.Create(Mainwindow);
              with Image[i+1,j-1] do
              begin
              Picture.LoadFromFile('checker-green.png');
              Parent:=Panel[i+1,j-1];
        Name:='ImageGr'+IntToStr(i+1)+IntToStr(j-1);
              Height:=50;
              Width:=50 ;
              Tag:=2;
              OnClick:=CycleClk;
              end;
      end;
      if not assigned(Image[i+1,j+1]) then begin
            //второй ход
              Image[i+1,j+1]:=TImage.Create(Mainwindow);
              with Image[i+1,j+1] do
              begin
              Picture.LoadFromFile('checker-green.png');
        Name:='ImageGr'+IntToStr(i+1)+IntToStr(j+1);
              Parent:=Panel[i+1,j+1];
              Height:=50;
              Width:=50 ;
              Tag:=2;
              OnClick:=CycleClk;
              end;
      end;
            end;
    if assigned(Image[i,j])  then begin
        Image[i,j].Enabled:=False;
    end;
        end;
    end;
end;
end;
// Ход белых
if (k mod 2<>0) then begin
for i := 1 to 8 do
begin
      for j := 1 to 8 do
      begin
    if assigned(Image[i,j])  then begin
        Image[i,j].Enabled:=False;
    end;
        if (Sender = Image[i,j]) then
        begin
      ImageName:=Image[i,j].Name;
            if (i+j) mod 2<>0 then
            begin
       if not assigned(Image[i-1,j-1]) then begin
            // первый ход
              Image[i-1,j-1]:=TImage.Create(Mainwindow);
              with Image[i-1,j-1] do
              begin
              Picture.LoadFromFile('checker-green.png');
              Parent:=Panel[i-1,j-1];
        Name:='ImageGr'+IntToStr(i-1)+IntToStr(j-1);
              Height:=50;
              Width:=50 ;
              Tag:=2;
              OnClick:=CycleClk;
              end;
      // end;
       if not assigned(Image[i-1,j+1]) then begin
            //второй ход
              Image[i-1,j+1]:=TImage.Create(Mainwindow);
              with Image[i-1,j+1] do
              begin
              Picture.LoadFromFile('checker-green.png');
        Name:='ImageGr'+IntToStr(i-1)+IntToStr(j+1);
              Parent:=Panel[i-1,j+1];
              Height:=50;
              Width:=50 ;
              Tag:=2;
              OnClick:=CycleClk;
              end;
       end;
            end;
    if assigned(Image[i,j])  then begin
        Image[i,j].Enabled:=False;
    end;
        end;
    end;
end;
//
end;
 
 
end;
end;
 
procedure TMainWindow.CycleClk(Sender:TObject);
var i,j,z:integer;
begin
z:=0;
k:=k+1;
for i := 1 to 8 do
begin
      for j := 1 to 8 do
      begin
    if z=0 then begin
    if sender = Image[i,j] then
    begin
    with Image[StrToInt(ImageName[8]),StrToInt(ImageName[9])] do
    begin
    Parent:=Panel[i,j];
    if Tag=0 then Name:='ImageWh'+IntToStr(i)+IntToStr(j);
    if Tag=1 then Name:='ImageBl'+IntToStr(i)+IntToStr(j);
    //if Tag=2 then Name:='ImageWh'+IntToStr(i)+IntToStr(j);
    z:=z+1;
    sender.CleanupInstance;
    end;
    //Image[StrToInt(ImageName[8]),StrToInt(ImageName[9])].Free;
    end;
    end;
    end;
end;
for i := 1 to 8 do
begin
      for j := 1 to 8 do
      begin
    if assigned(Image[i,j])  then begin
    if (Image[i,j].Tag=2) and (Image[i,j].Name='ImageGr'+IntToStr(i)+IntToStr(j))
     then begin Image[i,j].Free;
      end;
    if (Image[i,j].Tag=0) and (k mod 2<> 0) then Image[i,j].Enabled:=True;
    if (Image[i,j].Tag=0) and (k mod 2= 0) then Image[i,j].Enabled:=False;
    if (Image[i,j].Tag=1) and (k mod 2<> 0) then Image[i,j].Enabled:=False;
    if (Image[i,j].Tag=1) and (k mod 2= 0) then Image[i,j].Enabled:=True;
    if Image[i,j].Name='ImageGr'+IntToStr(i)+IntToStr(j) then showmessage('!!!');
 
end;
end;
end;
end;
 
procedure TMainWindow.ButtonExitClick(Sender: TObject);
begin
Close;
end;
 
procedure TMainWindow.FormCreate(Sender: TObject);
begin
Wood.Visible:=true;
Wood.Enabled:=true;
k:=1;// Счетчик ходов: нечетное число - белые, четное - черные.
end;
 
procedure TMainWindow.NewGameButtonClick(Sender: TObject);
var i,j,x,y:integer;
begin
{ выводим на экран черные шашки }
x:=0;
y:=0;
for i := 1 to 3 do begin
x:=0;
for j := 1 to 8 do begin
 
  Panel[i,j]:=TPanel.Create(Mainwindow);
  with Panel[i,j] do begin
  Parent:=GameMassiv;
  Left:=x;
  Top:=y;
  Width:=50;
  Height:=50;
  BevelOuter:=bvNone;
  Name:='Panel'+IntToStr(i)+IntToStr(j);
  Caption:='Panel'+IntToStr(i)+IntToStr(j);
  end;
  x:=x+50;
  if (i+j) mod 2<>0 then begin
 
  Image[i,j]:=TImage.Create(Mainwindow);
  with Image[i,j] do begin
  Picture.LoadFromFile('checker-black.png');
  Parent:=Panel[i,j];
  Height:=50;
  Width:=50 ;
  Name:='ImageBl'+IntToStr(i)+IntToStr(j);
  Tag:=1;
  OnClick:=ImgClk;
  Enabled:=False;
  end;
  end;
end;
y:=y+50;
end;
{заполняем "дырку" в массиве TPanel}
x:=0;
y:=150;
for i := 4 to 5 do begin
x:=0;
for j := 1 to 8 do begin
 
  Panel[i,j]:=TPanel.Create(Mainwindow);
with Panel[i,j] do begin
  Parent:=GameMassiv;
  Left:=x;
  Top:=y;
  Width:=50;
  Height:=50;
  BevelOuter:=bvNone;
  Name:='Panel'+IntToStr(i)+IntToStr(j);
  Caption:='Panel'+IntToStr(i)+IntToStr(j);
end;
  x:=x+50;
end;
y:=y+50;
end;
{ выводим на экран белые шашки }
y:=250;
for i := 6 to 8 do begin
x:=0;
for j := 1 to 8 do begin
  Panel[i,j]:=TPanel.Create(Mainwindow);
  with Panel[i,j] do begin
  Parent:=GameMassiv;
  Left:=x;
  Top:=y;
  Width:=50;
  Height:=50;
  BevelOuter:=bvNone;
  Name:='Panel'+IntToStr(i)+IntToStr(j);
  Caption:='Panel'+IntToStr(i)+IntToStr(j);
  end;
  x:=x+50;
    if (i+j) mod 2<>0 then begin
  Image[i,j]:=TImage.Create(Mainwindow);
  with Image[i,j] do begin
  Picture.LoadFromFile('checker-white.png');
  Parent:=Panel[i,j];
  Height:=50;
  Width:=50 ;
  Name:='ImageWh'+IntToStr(i)+IntToStr(j);
  Tag:=0;
  OnClick:=ImgClk;
  end;
    end;
end;
y:=y+50;
end;
NewGameButton.Enabled:=false;
end;
 
procedure TMainWindow.ParamDesignClick(Sender: TObject);
begin
Design.Showmodal;
end;
 
procedure TMainWindow.Timer1Timer(Sender: TObject);
begin
HodLabel.Caption:=IntToStr(k); // Выводим в окно кол-во ходов
end;
 
end.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Вложения
Тип файла: rar PROJECT.rar (377.3 Кб, 194 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.03.2013, 12:44
Ответы с готовыми решениями:

Шашки, Варианты хода шашки
Доброго времени суток, форумчане! Дали задание задание в университет, но в голове одна каша и не...

Подсветка хода (шашки)
Добрый день. Снова я со своими шашками. В общем суть проблемы такова: Есть класс &quot;клетка&quot;,...

Сделать несколько массивов для реализации хода шашек
Пытаюсь сделать шашки на Win Forms C# и пытался просить помощи. В общем итоге, посоветовали для...

Игра шашки: Исправить копирование шашки заместо переставления
Почти написал шашки на с++, но есть одна проблема,При захвате шашки оно ейо не перставляет а...

4
2474 / 1850 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
24.03.2013, 13:50 2
Посмотри этот вариант шашек.
0
0 / 0 / 2
Регистрация: 09.06.2012
Сообщений: 59
24.03.2013, 14:36  [ТС] 3
Неплохо, но я немного не понимаю, как exe'шник игры поможет мне найти проблему у себя?)))
0
2474 / 1850 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
24.03.2013, 16:11 4
Без проблем, вот исходный код.
0
Вложения
Тип файла: rar CheckersSrc.rar (171.3 Кб, 278 просмотров)
0 / 0 / 2
Регистрация: 09.06.2012
Сообщений: 59
26.03.2013, 14:03  [ТС] 5
Хм...просмотрел код. Мне до такого уровня и знаний еще очень далеко и не думаю, что это есть самый легкий способ коим можно написать. Хотелось бы все-таки нормально развить свою идею, впринципе , думаю что она имеет место быть.

Добавлено через 21 час 53 минуты
Сделав небольшой анализ процедуры CycleClk с помощью различных showmessage в разных местах, стало понятно, что условие первого цикла, который отвечает за перемещение шашки, выполняется n-ое кол-во раз. Сначала 1(в результате чего ход шашки отображается корректно), затем 2,3,4 и т.д...по-моему представлению как будто Sender это массив, куда каждый раз при вызове процедуры складываются и почему-то накапливаются данные. В результате чего условие "if (sender = Image[i,j]) then" выполняется несколько раз, последовательно. Т.е. стоит вопрос как очищать все то, что было передано sender'ом после завершения цикла?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2013, 14:03

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Давайте создадим шашки онлайн, шашки между людьми
Давайте я создам шашки для двух игроков,со сменой цветов,с именами,с расстановкой шашек и...

Обнулить клетку начала хода, и перезаписать шашку в клетку конца хода.
Добрый день! Казалось бы простая функция записи массива (позиции) расстановки шашек. Есть функция...

Отделение интерфейса от реализации класса: компиляция кода реализации
Доброго времени суток, У меня возникла проблема с отделением интерфейса от реализации класса....

Открыть процесс процесс на полный доступ, и запретить для других
Всем доброго времени суток. Друзья, HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.