Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 192

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте!
Пишу шахматы и не как не могу сообразить, как мне реализовать ход и соответственно его проверку?
Все писал руками - по заданию, написать шахматы без использования визуального моделирования в Delphi (т.е. нельзя визуально вставлять на форму панели, рисунки, кнопки), при компиляции приложения форма должна быть пустая)

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

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, ExtCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. ImgFigure: TImage;
  12. procedure FormCreate(Sender: TObject);
  13.  
  14.  
  15.  
  16. private
  17. { Private declarations }
  18. public
  19. { Public declarations }
  20. end;
  21. TFigure = Class(TObject)
  22. private
  23. TFigColor:boolean;
  24. TypeFigure:String;
  25. ImgFigure:TImage;
  26. Function GetCoordFigure:TPanel;
  27. Procedure SetCoordFigure(const Value:Tpanel);
  28. constructor Fcreate (cvet:Boolean);virtual;abstract;
  29. public
  30. Procedure HodFigure(a:TPanel); Virtual;
  31. Protected
  32. DestroyFigure:Boolean;
  33. OcheredHodaFigure:Boolean;
  34.  
  35. end;
  36.  
  37. TKing = class(TFigure)
  38. Constructor Fcreate(cvet:Boolean); Override;
  39. Procedure HodFigure(a:TPanel); Override;
  40. end;
  41.  
  42. TPeshka = class(TFigure)
  43. Width, Height : integer;
  44. Constructor Fcreate(cvet:Boolean); Override;
  45. Procedure HodFigure(a:TPanel); Override;
  46. end;
  47.  
  48. TFerz = Class(TFigure)
  49. Width, Height : integer;
  50. Constructor Fcreate (cvet:Boolean);Override;
  51. Procedure HodFigure(a:TPanel); Override;
  52. end;
  53.  
  54. TLoshad = Class (TFigure)
  55. Width, Height : integer;
  56. Constructor Fcreate (cvet:Boolean); Override;
  57. Procedure HodFigure(a:TPanel); Override;
  58. end;
  59.  
  60. TSlon = Class (TFigure)
  61. Width, Height : integer;
  62. Constructor Fcreate (cvet:Boolean); Override;
  63. Procedure HodFigure(a:TPanel); Override;
  64. end;
  65.  
  66. TLadya = Class (TFigure)
  67. Width, Height : integer;
  68. Constructor Fcreate(cvet:Boolean); Override;
  69. Procedure HodFigure(a:TPanel); Override;
  70. end;
  71.  
  72. var
  73. Form1: TForm1;
  74. a: array [1..8,1..8] of Tpanel;
  75. b: array [1..8,1..8] of Tpanel;
  76. c: array [1..8] of String[1]=('A','B','C','D','E','F','G','H');
  77. d: array [1..8] of String[1]=('1','2','3','4','5','6','7','8');
  78. i,j,t,r,y,u,m,n: integer;
  79. K: array [1..2,1..2] of TKing;
  80. P: array [1..2,1..8] of TPeshka;
  81. F: array [1..2,1..2] of TFerz;
  82. L: array [1..2,1..4] of TLoshad;
  83. S: array [1..2,1..4] of TSlon;
  84. Lad: array [1..2,1..4] of TLadya;
  85. implementation
  86.  
  87. {$R *.dfm}
  88.  
  89. procedure TForm1.FormCreate(Sender: TObject);
  90. begin
  91. for i:=1 to 8 do
  92. for j:=1 to 8 do
  93. begin
  94. a[i,j]:= TPanel.create(Form1);
  95. a[i,j].parent:= Form1;
  96. a[i,j].Left:=(i-1)*50+51;
  97. a[i,j].Top:=(j-1)*50+1;
  98. a[i,j].Width:=50;
  99. a[i,j].Height:=50;
  100. a[i,j].BevelOuter:=bvNone;
  101. a[i,j].Color:=clSkyBlue;
  102. if odd (i+j) then
  103. a[i,j].Color:=clGray else
  104. a[i,j].Color:=clInfobk;
  105. end;
  106.  
  107. for i:=1 to 1 do
  108. for j:=1 to 8 do
  109. begin
  110. b[i,j]:= Tpanel.Create(Form1);
  111. b[i,j].Parent:= Form1;
  112. b[i,j].Left:=0;
  113. b[i,j].Top:=((j-1)*50+1);
  114. b[i,j].Width:=50;
  115. b[i,j].Height:=50;
  116. b[i,j].BevelOuter:=bvNone;
  117. b[i,j].Caption:=d[j];
  118. end;
  119.  
  120. for i:=1 to 8 do
  121. for j:=1 to 1 do
  122. begin
  123. b[i,j]:= Tpanel.Create(Form1);
  124. b[i,j].Parent:= Form1;
  125. b[i,j].Left:=((i-1)*50+1)+50;
  126. b[i,j].Top:=400;
  127. b[i,j].Width:=50;
  128. b[i,j].Height:=50;
  129. b[i,j].BevelOuter:=bvNone;
  130. b[i,j].Caption:=c[i];
  131. end;
  132. //================PESHKA========================
  133. for t:=1 to 2 do
  134. for r:=1 to 8 do
  135. begin
  136. if t=1 then begin
  137. P[t,r]:=TPeshka.Fcreate(true);
  138. P[t,r].ImgFigure.Parent:=a[r,2];
  139. end
  140. else begin
  141. P[t,r]:=TPeshka.Fcreate(false);
  142. P[t,r].ImgFigure.Parent:=a[r,7];
  143. end;
  144. //================KING===========================
  145. for m:=1 to 2 do
  146. for n:=1 to 2 do
  147. if n=1 then begin
  148. K[m,n]:=TKing.Fcreate(true);
  149. K[m,n].ImgFigure.Parent:=a[4,1];
  150. end
  151. else begin
  152. K[m,n]:=TKing.Fcreate(false);
  153. K[m,n].ImgFigure.Parent:=a[5,8];
  154. end;
  155.  
  156. //================FERZ=========================
  157. for m:=1 to 2 do
  158. for n:=1 to 4 do
  159. if n=1 then begin
  160. F[m,n]:=TFerz.Fcreate(true);
  161. F[m,n].ImgFigure.Parent:=a[5,1];
  162. end
  163. else begin
  164. F[m,n]:=TFerz.Fcreate(false);
  165. F[m,n].ImgFigure.Parent:=a[4,8];
  166. end;
  167.  
  168. //================LOSHAD========================
  169. for m:=2 to 2 do
  170. for n:=2 to 4 do
  171. if n=3 then begin
  172. L[m,n]:=TLoshad.Fcreate(true);
  173. L[m,n].ImgFigure.Parent:=a[n,1];
  174. end
  175. else begin
  176. L[m,n]:=TLoshad.Fcreate(false);
  177. L[m,n].ImgFigure.Parent:=a[3,8];
  178. end;
  179.  
  180. //===============================================
  181. for m:=1 to 2 do
  182. for n:=1 to 8 do
  183. if n=6 then begin
  184. L[m,n]:=TLoshad.Fcreate(true);
  185. L[m,n].ImgFigure.Parent:=a[6,1];
  186. end
  187. else begin
  188. L[m,n]:=TLoshad.Fcreate(false);
  189. L[m,n].ImgFigure.Parent:=a[6,8];
  190. end;
  191.  
  192. //================LOSHAD=======================
  193. //================SLON=========================
  194. for m:=1 to 2 do
  195. for n:=1 to 8 do
  196. if n=1 then begin
  197. S[m,n]:=TSlon.Fcreate(true);
  198. S[m,n].ImgFigure.Parent:=a[7,1];
  199. end
  200. else begin
  201. S[m,n]:=TSlon.Fcreate(false);
  202. S[m,n].ImgFigure.Parent:=a[7,8];
  203. end;
  204.  
  205. //================================
  206. for m:=1 to 2 do
  207. for n:=1 to 8 do
  208. if n=1 then begin
  209. S[m,n]:=TSlon.Fcreate(true);
  210. S[m,n].ImgFigure.Parent:=a[2,1];
  211. end
  212. else begin
  213. S[m,n]:=TSlon.Fcreate(false);
  214. S[m,n].ImgFigure.Parent:=a[2,8];
  215. end;
  216.  
  217. //================LADYA=========================
  218. for m:=1 to 2 do
  219. for n:=1 to 8 do
  220. if n=1 then begin
  221. Lad[m,n]:=TLadya.Fcreate(true);
  222. Lad[m,n].ImgFigure.Parent:=a[8,1];
  223. end
  224. else begin
  225. Lad[m,n]:=TLadya.Fcreate(false);
  226. Lad[m,n].ImgFigure.Parent:=a[8,8];
  227. end;
  228.  
  229. //================================
  230. for m:=1 to 2 do
  231. for n:=1 to 8 do
  232. if n=1 then begin
  233. Lad[m,n]:=TLadya.Fcreate(true);
  234. Lad[m,n].ImgFigure.Parent:=a[1,1];
  235. end
  236. else begin
  237. Lad[m,n]:=TLadya.Fcreate(false);
  238. Lad[m,n].ImgFigure.Parent:=a[1,8];
  239. end;
  240. end;
  241. end;
  242. //======================LADYA=========================
  243. //====================================================
  244. Function TFigure.GetCoordFigure:TPanel;
  245. begin
  246. end;
  247. Procedure TFigure.SetCoordFigure(const Value:Tpanel);
  248. begin
  249. end;
  250. //=====================================================
  251. Procedure TFigure.HodFigure(a:TPanel);
  252. begin
  253. end;
  254. //=====================================================
  255.  
  256.  
  257. Procedure TKing.HodFigure(a:TPanel);
  258. begin
  259. end;
  260. Constructor TKing.Fcreate;
  261. begin
  262. create;
  263. ImgFigure:=TImage.Create(a[1,1]);
  264. if cvet then
  265. begin ImgFigure.picture.LoadFromFile('BKing.bmp');
  266.  
  267. end
  268. else
  269. begin
  270. ImgFigure.picture.LoadFromFile('WKing.bmp');
  271. ImgFigure.Transparent:=true;
  272. end;
  273. end;
  274. //===============================================================
  275. Procedure TPeshka.HodFigure(a:TPanel);
  276. begin
  277. end;
  278. Constructor TPeshka.Fcreate(cvet:boolean);
  279. begin
  280. create;
  281. ImgFigure:=TImage.Create(a[2,1]);
  282. if cvet then
  283. begin
  284. ImgFigure.picture.LoadFromFile('BPeshka.bmp');
  285. ImgFigure.Transparent:=true;
  286. end
  287. else
  288. begin
  289. ImgFigure.picture.LoadFromFile('WPeshka.bmp');
  290. ImgFigure.Transparent:=true;
  291. end;
  292. end;
  293. //================================================================
  294. Procedure TFerz.HodFigure(a:TPanel);
  295. begin
  296. end;
  297. Constructor TFerz.Fcreate;
  298. begin
  299. create;
  300. ImgFigure:=TImage.Create(a[2,1]);
  301. if cvet then
  302. begin
  303. ImgFigure.picture.LoadFromFile('BFerz.bmp');
  304. ImgFigure.Transparent:=true;
  305. end
  306. else
  307. begin
  308. ImgFigure.picture.LoadFromFile('WFerz.bmp');
  309. ImgFigure.Transparent:=true;
  310. end;
  311. end;
  312. //===================================================================
  313. Procedure TLoshad.HodFigure(a:TPanel);
  314. begin
  315. end;
  316. Constructor TLoshad.Fcreate;
  317. begin
  318. create;
  319. ImgFigure:=TImage.Create(a[2,1]);
  320. if cvet then
  321. begin
  322. ImgFigure.picture.LoadFromFile('BLoshad.bmp');
  323. ImgFigure.Transparent:=true;
  324. end
  325. else
  326. begin
  327. ImgFigure.picture.LoadFromFile('WLoshad.bmp');
  328. ImgFigure.Transparent:=true;
  329. end;
  330. end;
  331. //=============================================================================
  332. Procedure TSlon.HodFigure(a:TPanel);
  333. begin
  334. end;
  335. Constructor TSlon.Fcreate;
  336. begin
  337. create;
  338. ImgFigure:=TImage.Create(a[2,1]);
  339. if cvet then
  340. begin
  341. ImgFigure.picture.LoadFromFile('BSlon.bmp');
  342. ImgFigure.Transparent:=true;
  343. end
  344. else
  345. begin
  346. ImgFigure.picture.LoadFromFile('WSlon.bmp');
  347. ImgFigure.Transparent:=true;
  348. end;
  349. end;
  350. //============================================================================
  351. Procedure TLadya.HodFigure(a:TPanel);
  352. begin
  353. end;
  354. Constructor TLadya.Fcreate;
  355. begin
  356. create;
  357. ImgFigure:=TImage.Create(a[2,1]);
  358. if cvet then
  359. begin
  360. ImgFigure.picture.LoadFromFile('BLadya.bmp');
  361. ImgFigure.Transparent:=true;
  362. end
  363. else
  364. begin
  365. ImgFigure.picture.LoadFromFile('WLadya.bmp');
  366. ImgFigure.Transparent:=true;
  367. end;
  368. end;
  369. //=============================================================================
  370.  
  371.  
  372. end.
  373.  
  374.  


jawwwik Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: jawwwik (статус: Посетитель)
Вопрос отправлен: 11 декабря 2007, 13:05
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, jawwwik!
Касательно самого подхода - действительно, нужен абстрактный класс-фигура, от которого наследуются все реальные фигуры (пешки, слоны, короли и т.д.) как Вы это и делаете. Далее нужен класс-доста, это будет удобнее, например, чтобы определить возможна ли сейчас рокировка (такую возможность определяет доска, фигуры только "спрашивают"). Нужет класс-ход и класс-список ходов. Так каждая фигура должна уметь получать список доступных для нее ходов. В классе-ходе, помимо собственно хода должено быть значение ценности этого хода.
Далее, можно оценить все фигуры статически (скажем пешка стоит 1 у.е. конь 3 у.е. и т.д., кстати в шахматах на самом беле есть подобные веса для всех фигур), но подобный подход не даст качественной игры (все зависит от Ваших целей, или сдать курсовую, или написать прилично играющие шахматы). Второй случай - фигура сама определяет свою ценность в зависимости от положения на доске, от числа возможных ходов, от близости к вражескому королю, от числа и типа фигур, которым она угрожает, от наличия шаха на доске и др. условий.

Теперь, имеется ситуация на доске, нужно сделать ход одной из сторон (первый ход можно вообще не считать, а выбрать из дву-трех типа E2-E4). Для этого нужно определить все возможные ходы этим цветом. Далее нужно оценить каждый из этих ходов и ситуацию на доске вцелом (или просто сумма ценностей фигур, или какая-то функция от суммы).

Теперь нужна виртуальная доска. На ней делается один из возможных ходов, и ищется список всех возможных ответов со стороны противника, затем все возможные ответы с нашей стороны и т.д. до некоторого уровня вложенности. Таким образом получаем дерево где для каждого хода есть список возможных ответов. На каждом этапе считается ценность комбинации на доске, значит и ценность хода. Поскольку на каждый ход может быть сразу много ответов дерево начнет разрастаться очень быстро. Чтобы ускорить процесс обхода дерева примените алгоритм сокрашенного перебора (альфа-бета отсечения).

В итоге получите дерево с ценностями, из этого дерева выбираете лучший путь, т.е. чтобы вконце Вы получили значительное приемущество.

В этой задаче очень много тонкостей, см. home.uic.tula.ru/~kv200874/addons/rus/prog01.htm.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 12 декабря 2007, 04:01


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 21 августа 2017, 13:01
Выполнено за 0.03 сек.
Рейтинг@Mail.ru