purebasic.info

PureBasic forum
Текущее время: Пт окт 19, 2018 11:29 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Шахматный движок на PureBasic
СообщениеДобавлено: Вс июн 15, 2014 11:14 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 26, 2011 8:18 pm
Сообщений: 263
Откуда: Волгоград
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Вместо небольшого предисловия скажу:собирался я слепить такую поделку уже давно, но всё руки не доходили. Лето уже началось, вот уже 2 недели как, а я всё ленюсь. Но сегодня, вот, решился.
К участию в разработке приглашаются все желающие, проЭкт некоммерческий, а опен-сырцный. Ежели он получит какой-то профит, естественно, в разумных для пересылки размерах (будь то добровольные пожертвования, или закрытие исходников и продажа движка, в случае его успешности - мечтать не вредно) все принявшие участие могут расчитывать на какую-то долю.
Итак, версия 0.001, а вернее, её заготовка. Основной файл - console.pb, код постарался прокомментировать везде. Собственно, это часть, осуществляющая "общение" с шахматным GUI, типа Arena, Chess Wizard (фри/опен сурц), Aquarium, Fritz (коммерческие).
Коды самого движка пока находятся в неприличном/нерабочем состоянии, но если кто готов рискнуть, то смотреть во вложениях (engine.pbi, engine64.pbi).
Теперь немного тематической литературы:
Немного документации на русском языке. Отсюда понадобится пока только UCI и FEN. Впоследствие, возможно, BIN.
Крупнейшая вики по кодингу в области шахмат. На аглицком языке. Если кто-то шарит, оттуда можно много чего вытянуть.
Форум ImmortalChess, раздел про шахматное программирование. Там на русском, но на всяких сях, в коих я не очень-то шарю (пытался изучать, но больно сложные они для начинающих). Теоретические вопросы шахматного программирования тоже рассматривались.
В гугле можно найти много литературы на аглицком для шарящих, и на русском, может быть. Поисковые запросы могут быть самыми разными, я много чего обшарил, но на русском мало что нашел.
Вот, например, или вот,вот ещё, ещё... Видел ещё одну книжку, но она где-то потерялась. Во вложении есть одна книженция на аглицком. Их найти гораздо легче.
Если кто-то шарит в сях, может покурить коды довольно сильных программ (гугл в помощь) Critter, Stockfish, Crafty, Fruit, Toga а также отечественных авторов Strelka, GullChess (чайка), Murka. Всё, что удалось вспомнить. Можете погуглить CCRL, это рейтинг-лист шахматных движков. Чтобы ориентироваться в их силе.
А также небольшая рабочая шахматная программа easychess.pb (написана кем-то из наших заграничных коллег, ссылку, увы, уже где-то потерял). В коде копался, но, вроде бы, ничего сильно не менял. Содержит пару багов и не соответствует формату UCI. Но пойдет в качестве рабочего примера.


Вложения:
engine64.pbi [9.32 KiB]
Скачиваний: 229
easychess.pb [18.7 KiB]
Скачиваний: 207
console.pb [7.1 KiB]
Скачиваний: 205
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Шахматный движок на PureBasic
СообщениеДобавлено: Вс июн 15, 2014 4:48 pm 
Не в сети
профессор

Зарегистрирован: Сб авг 18, 2007 1:38 pm
Сообщений: 232
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Давно интересовался темой.
Вот на заметку исходник на Си, вызывается с необязательным числовым параметром (по умолчанию 2) и играет в шахматы. Параметр определяет глубину просмотра (при глубине большей, чем 3, она будет думать очень долго). Ходы задаются двумя восьмеричными числами (откуда куда — см. доску в начале игры, например, «e2-e4» нужно будет вводить как 64 44), в приглашении к приему указывается количество просмотренных ходов и оценка позиций (своей и противника, т.е. Вас).
Код:
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
 
#include <stdio.h>;
#include <stdlib.h>;
 
#define m(x)(x<0?-1:!!x)
#define g tj()-J
#define a(x)(x<0?-x:x)
#define h(x)((x)<=K?x:N-(x))
#define f 9999
#define A return
#define H printf(
#define R double
#define U int
#define V for
#define b else
#define u while
#define B if
U v,w,Y= -1,W,J,p,F,o=f,M,N,K,X,YY,_,P[f],s(); typedef U(*L)(); L q[f]; tj(){
U S=m(v)+(m(w)<<K); B(!S)A J; V(v=W+S; v!=J&&!q[v]; v+=S); A v; } k(){ _=K; A
v?a(v)>1||w-Y||!q[J]:(w-Y&&(w-Y*2||q[W+Y*(N+1)]|| (J>>K)-K+(Y-1)/ 2))||q[J];
} z(){ _=5; A v*w||g; } e(){ _= -2;
A(v*v*v-v||w*w*w-w)&&(J-W-2||(W&N)-4||(W>>K!=(Y-1?N:0))||
q[W+1]||q[W+2]||q[W+K]!=z||P[W+K]*Y<0); } R VR(){ int PZ=0x7fff;
A(R)(rand()&PZ)/(R)PZ; } l(){ _=K+1; A(v*w&&a(v)-a(w))||g; } R UC(){ R i=0,d;
u((i+=d=VR())<1.0); A d; } c(){ _= -11; A a(v)-a(w)||g; } I(ur,n,x){ W=ur;
J=n; B(P[W]!=Y||P[J]==Y)A J+1; v=(J&N)-(W&N); w=(J>>K)-(W>>K); A
q[W]()||(x&&QL(W,J,s)); } TT(W){ v=w=0; A q[W]()+K; } s(){ U j= -1,i; Y= -Y;
V(i=0; i<M; ++i){ B(j<0&&P[i]== -Y&&TT(i)&&_== -2) { j=i; i= -1; } b
B(j>=0&&!I(i,j,0))A Y= -Y; } A!(Y= -Y); } bb(){ _=1; A a(v*w)-2; } uv(){
V(v=0; v<f; ++v){ B(h(v>>K)==0){ U S=h(v&N);
q[v]=!S?z:(S==1?bb:(S==2?c:(v&N>K?l:e))); } b B(h(v>>K)==1)q[v]=k; b q[v]=0;
P[v]=!!q[v]*(28-v); } } y(){ U G=Y,i; J=0; V(i=0; i<M; ++i){
i%8||H"\n%4o ",i); B((Y=P[i]=m(P[i]))&& TT(i))H"%c ",_+93+Y*16); b H"- "); }
H"\n    "); do H"%2d",i++&N); u(i&N); Y=G; H"\n"); } O(W,J){
B((q[J]=q[W])==k&&h(J>>K)==0)q[J]=l; B(q[W]==e)B(J-W==2)O(J+1,J-1); b
B(W-J==2)O(W-1,W+1); P[J]=P[W]; q[W]=0; P[W]=0; } QL(W,J,D)L D; { U
HQ=P[J],YX; L AJ=q[J],XY=q[W]; O(W,J); YX=D(); O(J,W); q[J]=AJ; q[W]=XY;
P[J]=HQ; A YX; } C(){ U i,j,BZ=0; V(i=0; i<M; ++i){ L Z=q[i]; B(Z){ U
r=h(i>>K)+h(i&N),G=Y, S=Z==z?88:(Z==k?11 +r+(P[i]<0?N-(i>>K):(i>>K)):
(Z==l?124-((YY<8&&((i&N)!=K|| (i>>K)!=(P[i]>0?0:N)))?M:0):
(Z==c?41+r:(Z==e?f-r-r:36+r+r)))); Y=P[i]; V(j=0; j<M;
++j)B(!I(i,j,0))S+=(P[j]?5:1); BZ+=G==Y?S:-S; Y=G; } }
B(!(++X&M-1))write(1,".",1); A BZ; } PX(){ U i,Q=0,XP=0,JZ=M*M,E= -f,t,S=o;
B(!F--)A++F+C(); V(i=0; i<JZ; ++i)B(!I(i>>K+K,i&M-1,1)){ Y= -Y; o= -E; t=
-QL(i>>K+K,i&M-1,PX); Y= -Y; B(t>E){ ++XP; Q=i; E=t; B(E>=S) A++F,E; } }
B(!XP)E=s()?-f+1:0; p=Q; A++F,E; } RZ(){ U i,j,T=0; V(; ; ){ y(); o=f; do{
H"\n%d %d %d %s ",X,T,C(),s()?"!":">"); fflush(stdout); }
u(scanf("%o%o",&i,&j)!=2||I(i,j,1)); O(i,j); y(); X=0; ++YY; Y= -Y; T=PX();
i=p>>(K<<1); j=p&(M-1); B(I(i,j,1)){ H"Rats!\n"); A; } O(i,j); Y= -Y;
B(T>M*M)H"\nHar har.\n"); } } main(ac,av)char**av; { long time(),j=time(&j);
R i=0; srand((U)j); V(M=0; M<=f; ++M)i+=UC(); M=i/100; B(M&3)++M; B(M&1)--M;
V(N=1; N*N<M; ++N); K= --N/2; F=ac>1?atoi(av[1]):2; uv(); RZ(); }
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Шахматный движок на PureBasic
СообщениеДобавлено: Вс июн 15, 2014 10:19 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Ой ужас, этот код (( я хотел перевести, но его Х разберешь

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Шахматный движок на PureBasic
СообщениеДобавлено: Вс июн 15, 2014 11:40 pm 
Не в сети
лентяй ужасный
Аватар пользователя

Зарегистрирован: Вс фев 27, 2011 4:23 pm
Сообщений: 646
Благодарил (а): 4 раз.
Поблагодарили: 5 раз.
Никита Однороб писал(а):
Ой ужас, этот код (( я хотел перевести, но его Х разберешь

Как ты его переводить собрался, если разобрать не можешь :?


Вложения:
chess.c [3.32 KiB]
Скачиваний: 174
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Шахматный движок на PureBasic
СообщениеДобавлено: Пн июн 16, 2014 4:16 am 
Не в сети
профессор

Зарегистрирован: Сб авг 18, 2007 1:38 pm
Сообщений: 232
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Я тоже его переделывал, и еще выкинул лишнее ))
Код:
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
/* chess  */
 
#include <stdio.h>;
 
#define m(x)(x<0?-1:!!x) // if (x<0) x=-1; if (x=0) x=0; if (x>0) x=1  
#define g tj()-J
#define a(x)(x<0?-x:x) // возвращает модуль числа x
#define h(x)((x)<=3?x:7-(x))
#define DEPH 3  //  глубина просчета ходов
 
int v,w,Y= -1,W,J,p,F=DEPH,o=64,X,YY,_,P[64],s(),i,j,T=0;
 
typedef int(*L)();
L q[64];
 
tj()
 {
  int S=m(v)+(m(w)<<3);
  if(!S)return J;
  for(v=W+S;v!=J&&!q[v]; v+=S);
  return v;
 }
 
k()     // пешка
 { _=3;
  return v?a(v)>1||w-Y||!q[J]:(w-Y&&(w-Y*2||q[W+Y*8]|| (J>>3)-3+(Y-1)/ 2))||q[J];
 }
 
z()     // тура
 {
  _=5;
  return v*w||g;
 }
 
e()     // король
 {
  _= -2;
  return(v*v*v-v||w*w*w-w)&&(J-W-2||(W&7)-4||(W>>3!=(Y-1?7:0))||q[W+1]||q[W+2]||q[W+3]!=z||P[W+3]*Y<0);
 }
 
 
l()     // ферзь
 {
  _=4;
  return(v*w&&a(v)-a(w))||g;
 }
 
 
c() // офицер
 {
  _= -11;
  return a(v)-a(w)||g;
 }
 
bb() // конь
 {
  _=1;
   return a(v*w)-2;
 }
 
I(ur,n,x)
 {
  W=ur;
  J=n;
  if(P[W]!=Y||P[J]==Y)return J+1;
  v=(J&7)-(W&7);
  w=(J>>3)-(W>>3);
  return q[W]()||(x&&QL(W,J,s));
 }
 
TT(W)
 {
  v=w=0;
  return q[W]()+3;
 }
 
s()
 {
  int j= -1,i;
  Y= -Y;
  for(i=0; i<64; ++i)
   {
    if(j<0&&P[i]== -Y&&TT(i)&&_== -2)
     {
      j=i; i= -1;
     }
    else
    if(j>=0&&!I(i,j,0))return Y= -Y;
   }
  return!(Y= -Y);
 }
 
 
 
y()// вывод доски
 {
  int G=Y,i;
  J=0;
  for(i=0; i<64; ++i)
   {
    i%8||printf("\n%4o ",i);// номер строки
    if((Y=P[i]=m(P[i]))&& TT(i))printf("%c ",_+93+Y*16);// фигура
    else
    printf("- "); // пустое поле
   }
  printf("\n    ");
  do
   printf("%2d",i++&7); // номера столбцов
   while(i&7);
    Y=G;
    printf("\n");
 }
 
O(W,J) // перемищение фигуры из W в J
 {
  if((q[J]=q[W])==k&&h(J>>3)==0)q[J]=l;
  if(q[W]==e)if(J-W==2)O(J+1,J-1); //
  else
  if(W-J==2)O(W-1,W+1);
  P[J]=P[W];
  q[W]=0;
  P[W]=0;
 }
 
QL(W,J,D)
 L D;
 {
  int HQ=P[J],YX;
  L AJ=q[J],XY=q[W];
  O(W,J);
  YX=D();
  O(J,W);
  q[J]=AJ;
  q[W]=XY;
  P[J]=HQ;
  return YX;
 }
 
C()
 {
  int i,j,BZ=0;
  for(i=0; i<64; ++i)
   {
    L Z=q[i];
    if(Z)
     {
      int r=h(i>>3)+h(i&7),G=Y, S=Z==z?88:(Z==k?11 +r+(P[i]<0?7-(i>>3):(i>>3)):
          (Z==l?124-((YY<8&&((i&7)!=3|| (i>>3)!=(P[i]>0?0:7)))?64:0):
          (Z==c?41+r:(Z==e?64-r-r:36+r+r))));
      Y=P[i];
      for(j=0; j<64;++j)
       if(!I(i,j,0))S+=(P[j]?5:1);
      BZ+=G==Y?S:-S;
      Y=G;
     }
   }
  if(!(++X&64-1))write(1,".",1);
  return BZ;
 }
 
PX()
 {
  int i,Q=0,XP=0,JZ=4096,E= -64,t,S=o;
  if(!F--) return ++F+C();
  for(i=0; i<JZ; ++i)
   if(!I(i>>6,i&63,1))
    {
     Y= -Y;
     o= -E;
     t=-QL(i>>6,i&63,PX);
     Y= -Y;
     if(t>E)
      {
       ++XP;
       Q=i;
       E=t;
       if(E>=S) return++F,E;
      }
    }
   if(!XP)E=s()?-65:0;
   p=Q;
   return++F,E;
 }
 
/* main */
 main()
  {
        /* инициализация массивов */
   for(v=0; v<64; ++v)
   {
    if(h(v>>3)==0)
     {
      int S=h(v&7);
      q[v]=!S?z:(S==1?bb:(S==2?c:(v&7>3?l:e)));
     }
    else
    if(h(v>>3)==1)q[v]=k;
    else q[v]=0;
    P[v]=!!q[v]*m((32-v));//
   }
        /* основной цикл программы */
  for(; ; )
   {
    y();// рисование доски
    o=64;
    do
        {
      printf("\n%d %d %d %s ",X,T,C(),s()?"!":">"); // вывод кол-ва проверенных ходов и оценка
          fflush(stdout);
        }
    while(scanf("%o%o",&i,&j)!=2||I(i,j,1)); // запрос хода и его проверка на правильность
    O(i,j); // передвижение фигуры человека
    y(); // рисование доски
    X=0;
    ++YY;
    Y= -Y;
    T=PX(); // расчет хода компьютера
    i=p>>(3<<1);
    j=p&(63);
    if(I(i,j,1)) // мат
     {
      printf("Mat!\n");
      return;
     }
    O(i,j); // передвижение фигуры компьютера
    Y= -Y;
    if(T>4096) printf("\nHar har.\n");
   }
  }
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Шахматный движок на PureBasic
СообщениеДобавлено: Пн июн 16, 2014 11:03 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 26, 2011 8:18 pm
Сообщений: 263
Откуда: Волгоград
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Для меня все прочие языки, кроме PureBasic'а - это как языки братских славянских народов. Вроде бы, в целом и общем более-менее понятно, но толком ничего и не разберешь. Так что, буду рад любым интересным кодам, но именно на PureBasic. Сам бы переводил, если б мне давалось это полегче. А знающим всякие СИ это будет гораздо проще.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB