Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/30: Рейтинг темы: голосов - 30, средняя оценка - 4.57
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023

Программа крестики-нолики

27.07.2019, 12:53. Показов 7141. Ответов 57

Студворк — интернет-сервис помощи студентам
Здравствуйте, дорогие форумчане.
Представляю вашему вниманию свою попытку разработать на Паскале искусственный интеллект для игры крестики-нолики.
Программа играет не идеально, но некоторое сопротивление оказать все же способна...

Надеюсь, вам понравится.

P.S. Управление осуществляется с помощью клавиатуры:
  • Стрелка вправо – движение вправо.
  • Стрелка влево – движение влево.
  • Стрелка вниз – движение вниз.
  • Стрелка вверх – движение вверх.
  • Пробел – поставить крестик.
  • Клавиша ESC – выход из программы.

Pascal
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
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
USES
  CRT,
  Graph;
TYPE
  Line=ARRAY[0..14] OF Integer;
CONST
  l1:Line=(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14);
  l2:Line=(15,16,17,18,19,20,21,22,23,24,25,26,27,28,29);
  l3:Line=(30,31,32,33,34,35,36,37,38,39,40,41,42,43,44);
  l4:Line=(45,46,47,48,49,50,51,52,53,54,55,56,57,58,59);
  l5:Line=(60,61,62,63,64,65,66,67,68,69,70,71,72,73,74);
  l6:Line=(75,76,77,78,79,80,81,82,83,84,85,86,87,88,89);
  l7:Line=(90,91,92,93,94,95,96,97,98,99,100,101,102,103,104);
  l8:Line=(105,106,107,108,109,110,111,112,113,114,115,116,117,118,119);
  l9:Line=(120,121,122,123,124,125,126,127,128,129,130,131,132,133,134);
  l10:Line=(135,136,137,138,139,140,141,142,143,144,145,146,147,148,149);
  l11:Line=(150,151,152,153,154,155,156,157,158,159,160,161,162,163,164);
  l12:Line=(165,166,167,168,169,170,171,172,173,174,175,176,177,178,179);
  l13:Line=(180,181,182,183,184,185,186,187,188,189,190,191,192,193,194);
  l14:Line=(195,196,197,198,199,200,201,202,203,204,205,206,207,208,209);
  l15:Line=(210,211,212,213,214,215,216,217,218,219,220,221,222,223,224);
  l16:Line=(0,15,30,45,60,75,90,105,120,135,150,165,180,195,210);
  l17:Line=(1,16,31,46,61,76,91,106,121,136,151,166,181,196,211);
  l18:Line=(2,17,32,47,62,77,92,107,122,137,152,167,182,197,212);
  l19:Line=(3,18,33,48,63,78,93,108,123,138,153,168,183,198,213);
  l20:Line=(4,19,34,49,64,79,94,109,124,139,154,169,184,199,214);
  l21:Line=(5,20,35,50,65,80,95,110,125,140,155,170,185,200,215);
  l22:Line=(6,21,36,51,66,81,96,111,126,141,156,171,186,201,216);
  l23:Line=(7,22,37,52,67,82,97,112,127,142,157,172,187,202,217);
  l24:Line=(8,23,38,53,68,83,98,113,128,143,158,173,188,203,218);
  l25:Line=(9,24,39,54,69,84,99,114,129,144,159,174,189,204,219);
  l26:Line=(10,25,40,55,70,85,100,115,130,145,160,175,190,205,220);
  l27:Line=(11,26,41,56,71,86,101,116,131,146,161,176,191,206,221);
  l28:Line=(12,27,42,57,72,87,102,117,132,147,162,177,192,207,222);
  l29:Line=(13,28,43,58,73,88,103,118,133,148,163,178,193,208,223);
  l30:Line=(14,29,44,59,74,89,104,119,134,149,164,179,194,209,224);
  l31:Line=(4,18,32,46,60,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1);
  l32:Line=(5,19,33,47,61,75,-1,-1,-1,-1,-1,-1,-1,-1,-1);
  l33:Line=(6,20,34,48,62,76,90,-1,-1,-1,-1,-1,-1,-1,-1);
  l34:Line=(7,21,35,49,63,77,91,105,-1,-1,-1,-1,-1,-1,-1);
  l35:Line=(8,22,36,50,64,78,92,106,120,-1,-1,-1,-1,-1,-1);
  l36:Line=(9,23,37,51,65,79,93,107,121,135,-1,-1,-1,-1,-1);
  l37:Line=(10,24,38,52,66,80,94,108,122,136,150,-1,-1,-1,-1);
  l38:Line=(11,25,39,53,67,81,95,109,123,137,151,165,-1,-1,-1);
  l39:Line=(12,26,40,54,68,82,96,110,124,138,152,166,180,-1,-1);
  l40:Line=(13,27,41,55,69,83,97,111,125,139,153,167,181,195,-1);
  l41:Line=(14,28,42,56,70,84,98,112,126,140,154,168,182,196,210);
  l42:Line=(29,43,57,71,85,99,113,127,141,155,169,183,197,211,-1);
  l43:Line=(44,58,72,86,100,114,128,142,156,170,184,198,212,-1,-1);
  l44:Line=(59,73,87,101,115,129,143,157,171,185,199,213,-1,-1,-1);
  l45:Line=(74,88,102,116,130,144,158,172,186,200,214,-1,-1,-1,-1);
  l46:Line=(89,103,117,131,145,159,173,187,201,215,-1,-1,-1,-1,-1);
  l47:Line=(104,118,132,146,160,174,188,202,216,-1,-1,-1,-1,-1,-1);
  l48:Line=(119,133,147,161,175,189,203,217,-1,-1,-1,-1,-1,-1,-1);
  l49:Line=(134,148,162,176,190,204,218,-1,-1,-1,-1,-1,-1,-1,-1);
  l50:Line=(149,163,177,191,205,219,-1,-1,-1,-1,-1,-1,-1,-1,-1);
  l51:Line=(164,178,192,206,220,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1);
  l52:Line=(0,16,32,48,64,80,96,112,128,144,160,176,192,208,224);
  l53:Line=(1,17,33,49,65,81,97,113,129,145,161,177,193,209,-1);
  l54:Line=(2,18,34,50,66,82,98,114,130,146,162,178,194,-1,-1);
  l55:Line=(3,19,35,51,67,83,99,115,131,147,163,179,-1,-1,-1);
  l56:Line=(4,20,36,52,68,84,100,116,132,148,164,-1,-1,-1,-1);
  l57:Line=(5,21,37,53,69,85,101,117,133,149,-1,-1,-1,-1,-1);
  l58:Line=(6,22,38,54,70,86,102,118,134,-1,-1,-1,-1,-1,-1);
  l59:Line=(7,23,39,55,71,87,103,119,-1,-1,-1,-1,-1,-1,-1);
  l60:Line=(8,24,40,56,72,88,104,-1,-1,-1,-1,-1,-1,-1,-1);
  l61:Line=(9,25,41,57,73,89,-1,-1,-1,-1,-1,-1,-1,-1,-1);
  l62:Line=(10,26,42,58,74,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1);
  l63:Line=(15,31,47,63,79,95,111,127,143,159,175,191,207,223,-1);
  l64:Line=(30,46,62,78,94,110,126,142,158,174,190,206,222,-1,-1);
  l65:Line=(45,61,77,93,109,125,141,157,173,189,205,221,-1,-1,-1);
  l66:Line=(60,76,92,108,124,140,156,172,188,204,220,-1,-1,-1,-1);
  l67:Line=(75,91,107,123,139,155,171,187,203,219,-1,-1,-1,-1,-1);
  l68:Line=(90,106,122,138,154,170,186,202,218,-1,-1,-1,-1,-1,-1);
  l69:Line=(105,121,137,153,169,185,201,217,-1,-1,-1,-1,-1,-1,-1);
  l70:Line=(120,136,152,168,184,200,216,-1,-1,-1,-1,-1,-1,-1,-1);
  l71:Line=(135,151,167,183,199,215,-1,-1,-1,-1,-1,-1,-1,-1,-1);
  l72:Line=(150,166,182,198,214,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1);
VAR
  gd,gm:Integer;
  i,j:Integer;
  a:ARRAY[0..224] OF Integer;
  k,q,r:Integer;
  ch:Char;
  l:ARRAY[0..71] OF Line;
  w:ARRAY[0..4] OF Integer;
  g:ARRAY[0..224] OF LongInt;
  game_over:Boolean;
PROCEDURE DrawField(i:Integer;j:Integer;s:Integer;h:Integer);
VAR
  x,y,c:Integer;
  ss:String;
BEGIN
  x:=(i*2+1)*15;
  y:=(j*2+1)*15;
  CASE h OF
    0:c:=(i+j) MOD 2+7;
    1:c:=4;
    2:c:=14;
  END;
  SetFillStyle(1,c);
  Bar(x,y,x+30,y+30);
  CASE s OF
    1:BEGIN
      SetFillStyle(1,1);
      Circle(x+15,y+15,10);
      Circle(x+15,y+15,5);
      FloodFill(x+10,y+10,15);
    END;
    2:BEGIN
      SetFillStyle(1,2);
      MoveTo(x+6,y+6);
      LineRel(3,0);
      LineRel(6,6);
      LineRel(6,-6);
      LineRel(3,0);
      LineRel(0,3);
      LineRel(-6,6);
      LineRel(6,6);
      LIneRel(0,3);
      LineRel(-3,0);
      LineRel(-6,-6);
      LineRel(-6,6);
      LineRel(-3,0);
      LineRel(0,-3);
      LIneRel(6,-6);
      LineRel(-6,-6);
      LIneRel(0,-3);
      FloodFill(x+10,y+10,15);
    END;
  END;
  {Str(g[i+j*15],ss);   Vyvod znachenii koefiicienta
  SetColor(0);          opasnosti v celyax otladki.
  IF g[i+j*15]<10000 THEN OutTextXY(x,y,ss) ELSE OutTextXY(x,y,'Inf');
  SetColor(15);}
END;
FUNCTION CheckVictory:Integer;
VAR
  i,j,q,v:Integer;
  w1,w2:Boolean;
BEGIN
  v:=0;
  FOR i:=0 TO 71 DO BEGIN
    FOR j:=0 TO 10 DO BEGIN
      w1:=TRUE;
      w2:=TRUE;
      FOR q:=0 TO 4 DO BEGIN
        w[q]:=l[i][j+q];
        IF w[q]=-1 THEN BEGIN
          w1:=FALSE;
          w2:=FALSE;
        END
        ELSE BEGIN
          IF a[w[q]]<>1 THEN w1:=FALSE;
          IF a[w[q]]<>2 THEN w2:=FALSE;
        END;
      END;
      IF w1 THEN v:=1;
      IF w2 THEN v:=2;
      IF v<>0 THEN break;
    END;
    IF v<>0 THEN break;
  END;
  CheckVictory:=v;
END;
FUNCTION GetResponse:Integer;
VAR
  i,j,k,q,z,r,ii,jj:Integer;
  gmax:LongInt;
  f:Boolean;
BEGIN
  r:=-1;
  FOR k:=0 TO 224 DO BEGIN
    IF a[k]=0 THEN BEGIN
      r:=k;
      break;
    END;
  END;
  IF r<>-1 THEN BEGIN
    k:=0;
    FOR i:=0 TO 14 DO BEGIN
      FOR j:=0 TO 14 DO BEGIN
        IF a[k]=0 THEN g[k]:=100-(i-7)*(i-7)-(j-7)*(j-7) ELSE g[k]:=0;
        k:=k+1;
      END;
    END;
    FOR k:=0 TO 224 DO BEGIN
      IF a[k]=2 THEN BEGIN
        IF k MOD 15>0 THEN BEGIN
          IF a[k-1]=0 THEN g[k-1]:=g[k-1]+1000;
          IF k>14 THEN IF a[k-16]=0 THEN g[k-16]:=g[k-16]+1000;
          IF k<210 THEN IF a[k+14]=0 THEN g[k+14]:=g[k+14]+1000;
        END;
        IF k MOD 15<14 THEN BEGIN
          IF a[k+1]=0 THEN g[k+1]:=g[k+1]+1000;
          IF k>14 THEN IF a[k-14]=0 THEN g[k-14]:=g[k-14]+1000;
          IF k<210 THEN IF a[k+16]=0 THEN g[k+16]:=g[k+16]+1000;
        END;
        IF k>14 THEN IF a[k-15]=0 THEN g[k-15]:=g[k-15]+1000;
        IF k<210 THEN IF a[k+15]=0 THEN g[k+15]:=g[k+15]+1000;
      END;
    END;
    f:=FALSE;
    FOR i:=0 TO 71 DO BEGIN
      FOR j:=0 TO 13 DO BEGIN
        FOR k:=j+1 TO 14 DO BEGIN
          IF (a[l[i][j]]=0) AND (a[l[i][k]]=0) THEN BEGIN
            a[l[i][j]]:=2;
            a[l[i][k]]:=2;
            f:=FALSE;
            FOR q:=0 TO 10 DO BEGIN
              IF (a[l[i][q]]=2) THEN BEGIN
                IF (a[l[i][q+1]]=2) THEN BEGIN
                  IF (a[l[i][q+2]]=2) THEN BEGIN
                    IF (a[l[i][q+3]]=2) THEN BEGIN
                      IF (a[l[i][q+4]]=2) THEN BEGIN
                        f:=TRUE;
                        break;
                      END;
                    END;
                  END;
                END;
              END;
            END;
            a[l[i][j]]:=0;
            a[l[i][k]]:=0;
            IF f THEN BEGIN
              g[l[i][j]]:=g[l[i][j]]+1000000;
              g[l[i][k]]:=g[l[i][k]]+1000000;
              break;
            END;
          END;
          IF f THEN break;
        END;
        If f THEN break;
      END;
    END;
    FOR i:=0 TO 71 DO BEGIN
      FOR j:=0 TO 14 DO BEGIN
        IF a[l[i][j]]=0 THEN BEGIN
          a[l[i][j]]:=2;
          FOR q:=0 TO 10 DO BEGIN
            f:=TRUE;
            FOR z:=0 TO 4 DO BEGIN
              IF a[l[i][q+z]]<>2 THEN BEGIN
                f:=FALSE;
                break;
              END;
            END;
            IF f THEN break;
          END;
          IF f THEN g[l[i][j]]:=1000000000;
          a[l[i][j]]:=0;
        END;
      END;
    END;
    r:=0;
    gmax:=g[0];
    FOR k:=1 TO 224 DO BEGIN
      IF g[k]>gmax THEN BEGIN
        r:=k;
        gmax:=g[k];
      END;
    END;
  END;
  GetResponse:=r;
END;
BEGIN
  l[0]:=l1;
  l[1]:=l2;
  l[2]:=l3;
  l[3]:=l4;
  l[4]:=l5;
  l[5]:=l6;
  l[6]:=l7;
  l[7]:=l8;
  l[8]:=l9;
  l[9]:=l10;
  l[10]:=l11;
  l[11]:=l12;
  l[12]:=l13;
  l[13]:=l14;
  l[14]:=l15;
  l[15]:=l16;
  l[16]:=l17;
  l[17]:=l18;
  l[18]:=l19;
  l[19]:=l20;
  l[20]:=l21;
  l[21]:=l22;
  l[22]:=l23;
  l[23]:=l24;
  l[24]:=l25;
  l[25]:=l26;
  l[26]:=l27;
  l[27]:=l28;
  l[28]:=l29;
  l[29]:=l30;
  l[30]:=l31;
  l[31]:=l32;
  l[32]:=l33;
  l[33]:=l34;
  l[34]:=l35;
  l[35]:=l36;
  l[36]:=l37;
  l[37]:=l38;
  l[38]:=l39;
  l[39]:=l40;
  l[40]:=l41;
  l[41]:=l42;
  l[42]:=l43;
  l[43]:=l44;
  l[44]:=l45;
  l[45]:=l46;
  l[46]:=l47;
  l[47]:=l48;
  l[48]:=l49;
  l[49]:=l50;
  l[50]:=l51;
  l[51]:=l52;
  l[52]:=l53;
  l[53]:=l54;
  l[54]:=l55;
  l[55]:=l56;
  l[56]:=l57;
  l[57]:=l58;
  l[58]:=l59;
  l[59]:=l60;
  l[60]:=l61;
  l[61]:=l62;
  l[62]:=l63;
  l[63]:=l64;
  l[64]:=l65;
  l[65]:=l66;
  l[66]:=l67;
  l[67]:=l68;
  l[68]:=l69;
  l[69]:=l70;
  l[70]:=l71;
  l[71]:=l72;
  game_over:=FALSE;
  gd:=0;
  gm:=0;
  InitGraph(gd,gm,'../BGI/');
  IF GraphResult<>0 THEN BEGIN
     ClrScr;
     WriteLn('Y vas ne klassicheskii Turpo Pascal.');
     WriteLn('Nastroite put k papke graphiki v procedure InitGraph.');
     ReadKey;
  END;
  FOR i:=0 TO 14 DO BEGIN
    FOR j:=0 TO 14 DO BEGIN
      DrawField(i,j,0,0);
    END;
  END;
  DrawField(0,0,0,1);
  FOR i:=0 TO 224 DO a[i]:=0;
  i:=0;
  j:=0;
  k:=0;
  REPEAT
    ch:=ReadKey;
    IF NOT game_over THEN BEGIN
      CASE ch OF
        #32:BEGIN
          IF a[k]=0 THEN BEGIN
            a[k]:=2;
            IF CheckVictory=2 THEN BEGIN
              game_over:=TRUE;
              FOR q:=0 TO 4 DO BEGIN
                k:=w[q];
                i:=k MOD 15;
                j:=k DIV 15;
                DrawField(i,j,a[k],2);
                SetFillStyle(1,1);
                SetTextStyle(1,0,5);
                Bar(30,50,570,105);
                OutTextXY(50,50,'Pozdravlyaem s pobedoi!');
              END;
            END
            ELSE BEGIN
              r:=GetResponse;
              IF r<>-1 THEN BEGIN
                a[r]:=1;
                IF CheckVictory=1 THEN BEGIN
                  game_over:=TRUE;
                  DrawField(i,j,a[k],0);
                  FOR q:=0 TO 4 DO BEGIN
                    k:=w[q];
                    i:=k MOD 15;
                    j:=k DIV 15;
                    DrawField(i,j,a[k],2);
                  END;
                  SetFillStyle(1,1);
                  SetTextStyle(1,0,5);
                  Bar(30,50,590,105);
                  OutTextXY(50,50,'Komp okazalsya umnee :)');
                END
                ELSE BEGIN
                  DrawField(i,j,a[k],1);
                  DrawField(r MOD 15,r DIV 15,a[r],0);
                END;
              END
              ELSE BEGIN
                game_over:=TRUE;
                DrawField(i,j,a[k],0);
              END;
            END;
          END;
        END;
        #72:BEGIN
          IF j>0 THEN BEGIN
            DrawField(i,j,a[k],0);
            j:=j-1;
            k:=k-15;
            DrawField(i,j,a[k],1);
          END;
        END;
        #75:BEGIN
          IF i>0 THEN BEGIN
            DrawField(i,j,a[k],0);
            i:=i-1;
            k:=k-1;
            DrawField(i,j,a[k],1);
          END;
        END;
        #77:BEGIN
          IF i<14 THEN BEGIN
            DrawField(i,j,a[k],0);
            i:=i+1;
            k:=k+1;
            DrawField(i,j,a[k],1);
          END;
        END;
        #80:BEGIN
          IF j<14 THEN BEGIN
            DrawField(i,j,a[k],0);
            j:=j+1;
            k:=k+15;
            DrawField(i,j,a[k],1);
          END;
        END;
      END;
    END;
  UNTIL ch=#27;
  CloseGraph;
END.
Желаю приятной игры!

С уважением,
Аксима
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.07.2019, 12:53
Ответы с готовыми решениями:

Крестики-нолики
Создать программу, играющую с пользователем в «крестики-нолики» на поле 3×3. Программа должна всегда выигрывать. Ввод поля пользователем...

Крестики-нолики NxN
Доброго времени суток! Друзья, написала программу крестиков-ноликов 3х3, преподаватель просит переделать под NxN(размеры поля задаются в...

Крестики-нолики
Как сделать игру крестик и нолик в паскале

57
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
02.08.2019, 13:38
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Joy Посмотреть сообщение
сначала ошибки в ней исправь, а потом предлагай качать.
У меня все работает. (Windows 7, 32bit).
0
Модератор
10451 / 5746 / 3409
Регистрация: 17.08.2012
Сообщений: 17,482
03.08.2019, 07:43
ValentinNemo, так, навскидку:
  • Объявлять глобальные переменные до подпрограмм нехорошо, это может вызвать трудно локализуемые ошибки из-за перекрытия областей видимости переменных. В данном случае, может быть, и оправдано это нехорошее деяние, но... Что-то мне подсказывает, что... Нет, не надо было этого делать.
  • В процедуре DrawField переменная ss лишняя (использовалась в закомментированных строках 132..135).
  • В функции GetResponse переменные ii и jj лишние.
При запуске в Lazarus с директивой компилятора {$mode tp} при нажатии пробела программа завершается аварийно с External SIGSEGV на строке 212. Это происходит потому, что при переборе вариантов в функции GetResponse в конце концов получается i=30, q=5. Так как l[30][5]=-1, а индексация массива "a" начинается с 0, происходит вылет за границы массива, на который TP плюёт, а FPC - нет, не плюёт. В TP будет чтение из глобальной переменной "j", которая объявлена как раз перед массивом "a". Такое поведение программы является алгоритмической ошибкой.

Далее копаться пока не стану, и лень, и незачем. Доберусь до TP, ещё гляну.

Неважно совершенно, работает у Вас программа или нет. И в самом деле, ошибки исправьте, а потом уж выкладывайте, а то нехорошо как-то получается.
0
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
03.08.2019, 20:09
Cyborg Drone. Посвящаю вас в историю вопроса.
Крестики-нолики существуют в двух видах. В виде программы Аксима на ТP и в виде программы приложения под Lazarus/Free Pascal от того же Аксима, но в графической оболочке, которая сделана мной, потому что мне легче переписать программу под GUI, чем мучиться с консольной графикой TP и даже Free Pascal. Переписывая программу под GUI я сделал облегчение прежде всего самому себе. Мне хотелось попробовать игру, но я не хотел связываться с установкой TP. (Разрешение на использование своего кода Аксима мне предоставил. Это на тот случай, если у вас будет подгорать по поводу использования чужого кода. Если у кого-то, озабоченного авторскими правами тоже будет подгорать, то в программе приложении на Lazarus четко указано авторство кода - Аксима. ) Однако то ли зависть людей заела от работоспособного кода, то ли курили, что то не то, но набежали флудильщики и троли и засрали обе темы.
Я еще раз говорю, связываться с Turbo Pascal у меня нет желания. И исправлять код на TP я тоже не буду, а то потом опять набегут озабоченные троли и будут набрасывать "говно на вентилятор" по поводу использования чужих кодов. Это вотчина Аксима. Аксима и ValentinNemo - это не два ника одного человека, это два отдельных человека, не связанных друг с другом.
Моя ошибка, это то, что я опубликовал код приложения "крестики-нолики" в разделе Lazarus, а нужно было опубликовать этот код в теме, которую открыл Аксима. Обращайтесь к Аксима, пусть исправляет свой код на TP. Если Аксима не желает вам отвечать, то это его решение.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
04.08.2019, 10:45
Аксима,
Основная ошибка тут.
Pascal
1
2
3
4
5
6
7
8
  InitGraph(gd,gm,'../BGI/');
  IF GraphResult<>0 THEN BEGIN
     ClrScr;
     WriteLn('Y vas ne klassicheskii Turpo Pascal.');
     WriteLn('Nastroite put k papke graphiki v procedure InitGraph.');
     ReadKey;
  END;
  FOR i:=0 TO 14 DO BEGIN
1)Если была ошибка, будет выведено сообщение, нажмут клавишу и программа полезет в неподключенную графику.
2)Вы уверены, что программа не будет перемещаться в другие папки. Если её перемещать, то нужно ещё и модуль графики за ней тянуть. Чтобы этого не делать графика подключается в саму программу c помощью {$L <Filename>}
1
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
08.08.2019, 21:19  [ТС]
Здравствуйте,
Извините, что так долго не отвечал. В последние две недели практически не было ни минуты свободного времени. Но я так рад видеть всех вас после долгого отсутствия!

ValentinNemo, вашу программу посмотрел, и она мне понравилась. Теперь я имею представление о том, как выглядела бы моя программа, если бы я ее писал на Delphi (Lazarus - это ведь среда, которая позволяет разрабатывать Delphi-подобные приложения, или я ошибаюсь?).

Constantin Cat, ваше замечание с благодарностью принимаю. Если удастся выкроить хоть немного времени, выложу вторую, исправленную версию программы крестики-нолики. Не хочется оставлять такой большой проект (над первой версией программы трудился почти месяц) недоделанным.

С уважением,
Aksima
1
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
09.08.2019, 00:20
Аксима, спасибо за положительный отзыв. Стараюсь потихоньку. Тут множество событий из-за вас произошло. Набежали троли и говнофлудильщики и начали меня люто пинать за то что я использовал ваш код в своей работе.
Во первых, я получил от вас разрешение на использование вашего кода, во вторых в самой программе указан настоящий автор - Аксима. Уж прошу прощения, что окунаю вас в это форумное говно.
С удовольствием посмотрю на ваши другие работы, а может и снова сделаю для вас оболочку, даже не смотря на то, что исходный код может глючить. Я не профессионал, но программирование мне нравится. Если есть желание поделиться своими работами снова - посмотрю с удовольствием. (Месяц на программирование маленькой игры - это много. Могу сказать, что программирование вам достается тяжелым трудом.)

Одна гигантская и важная просьба - откажитесь от использования Turbo Pascal несмотря на то, что вы к нему привыкли, а работайте сразу в IDE Lazarus. Lazarus поддерживается сообществом программистов, а Turbo Pascal - нет. Когда вы захотите выйти за рамки консольных программ, вы сразу ощутите разницу. Не надо боятся сложную среду, на практике она оказалась гораздо проще, чем DOS программы. Можно спокойно делать и простые консольные программы и сложные с GUI оболочкой. Lazarus бесплатный, быстрый, очень удобный и это почти копия Delphi. Коды и компоненты в Lazarus на 99% совпадают с Delphi. Научитесь работать в Lazarus, считай научились работать в Delphi. Я лет 20 назад хотел научиться программировать в Delphi, но когда узнал цену на лицензионную копию отказался от этой затеи. Зато теперь благодать - есть бесплатный и кроссплатформенный Lazarus. Единственная проблема Lazarus/Free Pascal - это то, что в консольных программах плохо поддерживается кириллица, но это можно преодолеть.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7818 / 4637 / 2837
Регистрация: 22.11.2013
Сообщений: 13,159
Записей в блоге: 1
09.08.2019, 17:54
Цитата Сообщение от ValentinNemo Посмотреть сообщение
Я лет 20 назад хотел научиться программировать в Delphi, но когда узнал цену на лицензионную копию отказался от этой затеи.
Хозяйке на заметку: с относительно недавнего времени доступна Delphi Community Edition -- можно дать волю прежней "хотелке".
--
Искренне ваш, Тролль, говнофлудильщик и лютопинатель
1
2374 / 776 / 561
Регистрация: 15.01.2019
Сообщений: 2,394
09.08.2019, 19:06
Цитата Сообщение от bormant Посмотреть сообщение
Искренне ваш, Тролль, говнофлудильщик и лютопинатель
М-м-м... Могу на чем угодно поклясться, что даже в мыслях не причислял вас к троллям.
А так вы сами об этом сказали (вас за язык никто не тянул), теперь я буду знать кто стоит за работой троллей и флудильщиков. Прискорбно ..., но не удивительно. Я часто встречался с таким явлением на форумах. Спасибо за откровенность, но это означает, что каждый раз когда начнется атака троллей я буду вас тревожить с вопросом "Кто заказал?" и "По какому поводу?".
Цитата Сообщение от bormant Посмотреть сообщение
Хозяйке на заметку: с относительно недавнего времени доступна Delphi Community Edition -- можно дать волю прежней "хотелке".
Боже упаси меня связываться с проприетарной системой программирования. Сегодня Правительство США разрешает разработчикам Delphi платно и бесплатно распространять свои продукты, а завтра запретят.
Послезавтра они могут нанять троллей... если им не нравиться что я питаю расположенность с свободному программному обеспечению Lazarus, а не Delphi.
Поезд удачи для Delphi давным-давно ушел. Этот продукт будет постепенно умирать. Превратиться в универсальную мультиязычную IDE, как это сделали другие компании, делающие продукты для программистов, им гордыня не позволит.
У меня есть бесплатная среда от Microsoft для C# и мне этого хватает за глаза. (я ей редко пользуюсь, - на моем компе она с трудом работает и часто крашится.)
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
09.08.2019, 19:42
Лучший ответ Сообщение было отмечено Аксима как решение

Решение

Цитата Сообщение от Аксима Посмотреть сообщение
Если удастся выкроить хоть немного времени, выложу вторую, исправленную версию программы крестики-нолики.
Надеюсь Вы ещё не начали, предлагаю Вам такой вариант движка, без мозгов:
Pascal
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
uses Graph;
const
  n=30;{pixel per field}
  m=5;{image size}
  k=15;{count field}
  {for image}
  x0=m;{begin x}
  x1=n-m;{end x}
  y0=m;{begin y}
  y1=n-m;{end y}
type
  tMass=array[0..n,0..n]of byte;
var
  a,b,mX,mY,SizeImage:integer;
  c:byte;
  x,o,s:pointer;
  Field:tMass;
{Quasi crt:ReadKey}
function GetKey:byte;
  var a:byte;
  begin{GetKey}
    asm
      xor ax,ax
      int 16h
      mov a,ah
    end;
    GetKey:=a;
  end;{GetKey}
{debug - procedure only}
procedure DbgKey;
  begin{DbgKey}
{    GetKey;}
  end;{DbgKey}
{output figure}
procedure ImagePut(a,b:integer;c:pointer;d:integer);
  begin{ImagePut}
    PutImage(m+n*a,m+n*b,c^,d)
  end;{ImagePut}
{Artificial Intelligence}
procedure AIStep(var pole:tMass);
  var a,b:integer;
  begin{AIStep}
    {begin AI for you}
    repeat
      a:=random(k);
      b:=random(k);
    until pole[a,b]=0;
    {end AI for you}
    pole[a,b]:=2;
    ImagePut(a,b,o,NormalPut);
  end;{AIStep}
begin{main}
  a:=detect;
  InitGraph(a,b,'');
  a:=GraphResult;
  if a=grOK then
    begin{graph mode}
      {begin program}
      SizeImage:=ImageSize(0,0,n-2*m,n-2*m);
      {crate x}
      ClearDevice;
      for a:=0 to n do for b:=0 to n do
        if (a in[0..n])and(b in[0..n])and
        ((abs(a-b)<4)or(abs(n-a-b)<4))then PutPixel(a,b,15);
      GetMem(x,SizeImage);
      GetImage(x0,y0,x1,y1,x^);
      DbgKey;
      {create o}
      ClearDevice;
      for a:=0 to 3 do Circle(n div 2,n div 2,(n div 2)-m-a);
      GetMem(o,SizeImage);
      GetImage(x0,y0,x1,y1,o^);
      DbgKey;
      {create +}
      ClearDevice;
      Line(0,n div 2,n,n div 2);
      Line(n div 2,0,n div 2,n);
      Circle(n div 2,n div 2,n div 4);
      GetMem(s,SizeImage);
      GetImage(x0,y0,x1,y1,s^);
      DbgKey;
      {generate field}
      for a:=0 to n do for b:=0 to n do Field[a,b]:=0;
      ClearDevice;
      {show desk}
      for a:=0 to k do Line(n*a,0,n*a,15*n);
      for a:=0 to k do Line(0,n*a,15*n,n*a);
      {begin main loop}
      mX:=0;mY:=0;
      repeat
        {show marker}
        ImagePut(mX,mY,s,XorPut);
        c:=GetKey;
        a:=0;b:=0;
        {hide marker}
        ImagePut(mX,mY,s,XorPut);
        case c of
          57:if Field[mX,mY]=0 then{Space}
            begin
              Field[mX,mY]:=1;
              ImagePut(mX,mY,x,NormalPut);
              AIStep(Field);
            end;
          75:a:=-1;{Left arrow}
          77:a:=1;{Right arrow}
          72:b:=-1;{Up arrow}
          80:b:=1;{Down arrow}
          end;
        {change marker position}
        if((a+mX)in[0..k-1])and((b+mY)in[0..k-1])then
          begin
            mX:=mX+a;
            mY:=mY+b;
          end;
      until c=1;
      {end main loop}
      {fremem}
      FreeMem(x,SizeImage);
      FreeMem(o,SizeImage);
      FreeMem(s,SizeImage);
      {end program}
      GetKey;
      CloseGraph;
    end{graph mode}
    else
    begin{no graph mode}
      {error message}
      writeln('Graph mode error:',GraphErrorMsg(a));
      writeln('Press any key . . .');
      GetKey;
    end{no graph mode}
end.{main}
Сразу оговорюсь, на РС, где писалась программа стоит ТР с кривым CRT - он дает ошибку(заменить на исправленный - всегда забываю )
Вместо ReadKey - написал GetKey - упрощенный аналог ReadKey. Его достоинство, что в регистре ah, передается скан-код клавиши(номер клавиши на клавиатуре). Он всегда одинаков для всех раскладок(RU, EN, и т.д.).
ImagePut - выводит изображения с переводом координат массива в координаты экрана. Если Вам нужно будет, что-то маштабировать, вносите изменения только сюда.
Создание изображений: я указывал - ярко белый для всех, если захотите перед рисованием фигурки, укажите свой, так он и будет выводится.
DbgKey - это отладочная подпрограмма, если содержимое закоментированно, то это просто "пустышка". Но если нужно, что-то отследить, помогает при отладке, закоментировали - не мешает.
С учетом того, что нет многократной перерисовки(занимает меньше времени), можно сделать более "умный" ИИ.
А, разработку ИИ(AIStep), оставляю Вам.

Для этого посмотрите в сети Рэндзю, показаны "вилки-ловушки" и прочие "фокусы" в игре. Ну ещё сюда загляните, указанные книги, правда на английском, но просто об элементарном.
На картинке показано как влияет константа "M" на отображаемую информацию(слева на право: 1,3,5 и 7).

ps:Не верьте никому: простая и четкая логика PASCAL, позволяет сформировать алгоритм, обкатать его, а потом перевести на любой язык, даже с GUI.
Миниатюры
Программа крестики-нолики  
2
 Аватар для vlisp
1068 / 989 / 153
Регистрация: 10.08.2015
Сообщений: 5,394
10.08.2019, 11:41
Цитата Сообщение от Constantin Cat Посмотреть сообщение
вариант движка
шо? где? Да вы издеваетесь? Откройте нормальные турбопаскалевские исходники и вы ужаснетесь на каком уровне дна вы находитесь. ТП - мощный объектно-ориентированный язык. А что у вас? Это извините как есть и гадить в одном месте.

Я уж не говорю что ТП уже настолько морально устарел, что А не работает в современных ОС. Б Скучен из-за своей архаичности

Что вам мешает сделать проект в лазарус и писать на нормальном! объектном паскале? Пусть... Можно изнасиловать консоль с помощью винапи... для извращенцев, коих тут достаточно. Зато можно закинуть исходники на гитхаб и разрабатывать суперпупермегаигру совместно... это я вам про планку, если кто захочет заикнуться про обучающий аспект.

ну и асм... 5 строчек кода, чтоб положить болт на свое поделие, ради чего?
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
10.08.2019, 14:53
Цитата Сообщение от vlisp Посмотреть сообщение
Что вам мешает сделать проект в лазарус и писать на нормальном! объектном паскале?
А зачем?

Мне нравится ТР.

Тот или иной язык, я выбираю, в зависимости от целесообразности решения той или иной задачи!
Городить ООП, для того, чтобы сложить два числа - эквивалентно использованию бомбы, для забивания гвоздей.
Для этой задачи, ТР как язык обкатки алгоритма вполне подходит, а уже потом можно портировать куда угодно.

То, что я использовал ассемблер, я уже писал : в этом ТР кривой CRT(дает ошибку деления на ноль). Надеюсь у ТС, этот модуль нормальный и он может использовать ReadKey вместо GetKey.
1
 Аватар для vlisp
1068 / 989 / 153
Регистрация: 10.08.2015
Сообщений: 5,394
10.08.2019, 18:44
Цитата Сообщение от Constantin Cat Посмотреть сообщение
А зачем?
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Городить ООП
Цитата Сообщение от Constantin Cat Посмотреть сообщение
о, что я использовал ассемблер, я уже писал : в этом ТР кривой CRT(дает ошибку деления на ноль). Надеюсь у ТС, этот модуль нормальный и он может использовать ReadKey вместо GetKey.
ну, что тут можно сказать... это не смешно даже...
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
10.08.2019, 22:04
Цитата Сообщение от vlisp Посмотреть сообщение
... это не смешно даже...
Создать проэкт, подключить библиотеки с методами вывода, создать класс <переменная> в 1000-у символов, со свойствами и методами. Создать два объекта этого класса. Сложить свойство - "зачения" двух объектов и вывести результат. Итого - это как минимум сотня килобайт на диске. И это вместо простого writeln(a+b), при этом ТР всего создаст код в 100-байт и довесит к нем полтора килобайта стандарта.

Вот это не смешно.

Я вам уже писал:
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Тот или иной язык, я выбираю, в зависимости от целесообразности решения той или иной задачи!
Кроме тех разделов, в которых я засветился на форуме, у меня на компах, вернее ноутах(их всего три: lenovo, asus и hp) есть Fortran(несколько компиляторов, начиная с 4-го), С/С++(начиная ещё с тройки, тоже несколько), NewLisp(им я тоже иногда балуюсь, и запись: (+ а b) - явно короче, чем writeln(a+b), вот только без ВМ не работает), куча различных ассемблеров, куча различных потомков Паскаля , в том числе дельфины, с лазарями. В своё время, когда HTML + javascript учил, тоже считал все с их помощью, и что - перерос. Всем этим я пользуюсь - когда нужно.

Но:
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Мне нравится ТР
Если Вам не нравится, что ТР мне нравится - подайте на меня в суд.

Есть задача - под эту задачу выбираю нужный ЯП, который позволит решить её без лишних делодвижений.
Для задачи "ХО", ТР в самый раз, чтобы настроить "мозги" ИИ. А дальше портируйте его куда угодно.
ps:перестаем заниматся флудом.

А, забыл, есть ещё Перл и РНР, но я не считаю себя в них "гуру", по этому читаю, но не лезу с коментами.
0
 Аватар для vlisp
1068 / 989 / 153
Регистрация: 10.08.2015
Сообщений: 5,394
11.08.2019, 10:25
Цитата Сообщение от Constantin Cat Посмотреть сообщение
перестаем заниматся флудом.
действительно... - код плохой. - я еще на пхп пишу... ну, логика... вы даже не понимаете, что вам написали.

Не по теме:

вот интересно а на пхп и асме вы также гениально творите?


я не обсуждаю людей или их заслуги. мне это не интересно, я вижу плохой код и говорю, что он плохой. и делаю это просто потому, что вы строите из себя гуру. и кто-то из начинающих может наткнуться на ваши перлы и принять их за чистую монету.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
11.08.2019, 11:39
Цитата Сообщение от vlisp Посмотреть сообщение
код плохой.
Вот ткните в плохое место кода.
0
 Аватар для vlisp
1068 / 989 / 153
Регистрация: 10.08.2015
Сообщений: 5,394
11.08.2019, 12:29
Цитата Сообщение от Constantin Cat Посмотреть сообщение
в плохое место кода.
он весь плохой. как минимум не понятный. ну, неужели вы сами не видите? неужели вы ни одной книги по программированию не читали? вы хоть первые 10 строчек своего кода объяснить сможете???
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
11.08.2019, 13:25
Цитата Сообщение от vlisp Посмотреть сообщение
как минимум не понятный
Что именно Вам не понятно?

Цитата Сообщение от vlisp Посмотреть сообщение
неужели вы ни одной книги по программированию не читали
Алексеев Е.Р., Чеснокова О.В. Турбо Паскаль 7.0, глава 12
Немнюгин С.А. Turbo Pascal, урок 6
Гусева А.И. Учимся программировать- Pascal 7.0. Задачи и методы их решения, тема 11
Думаю, даже этих трех книг достаточно, чтобы понять, что там написано.

Цитата Сообщение от vlisp Посмотреть сообщение
вы хоть первые 10 строчек своего кода объяснить сможете
Ну там, подключение модуля графики и описание констант:
n=30;{размер ячейки в пикселях}
m=5;{число пропускаемых пикселей с краев}
k=15;{размер поля в клетках т.е. 15х15}
остальные константы для функции GetImage, координаты захватываемого изображения.
0
 Аватар для vlisp
1068 / 989 / 153
Регистрация: 10.08.2015
Сообщений: 5,394
11.08.2019, 14:33
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Думаю, даже этих трех книг достаточно
их не достаточно, чтоб получить прочные знания о языке паскаль. что уж говорить о программировании
Цитата Сообщение от Constantin Cat Посмотреть сообщение
описание констант
серьезно? а что если я захочу во время игры увеличить размер клетки? или например сыграть еще раз, но не 15х15, а 20х20? кто даст мне гарантию, если я изменю одну константу, что у меня не поплывет вся программа? тогда зачем такое выкладывать?
Цитата Сообщение от Constantin Cat Посмотреть сообщение
остальные константы для функции GetImage
серьезно? а чем они отличаются от других? вот у них на лбу не написано, для чего они... или вам лень их обозвать нормально?

Не по теме:

впрочем во времена доса как раз игроделие и держалось на одиночках, но ведь сейчас не времена доса и запросы как бы совсем другие...


вот вам и а + бэ вы опасный человек и пишете опасные программы. взяли память в одном месте, отдали в другом, хорошо хоть отдали. и все потому что боитесь писать нормальный код.
вы посмотрите самые элементарные игры от микрософта и сравните со своим поделием. даже не в плане кода, а в плане функционала, а он как раз и определяет код.
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
11.08.2019, 16:05
Цитата Сообщение от vlisp Посмотреть сообщение
серьезно? а чем они отличаются от других? вот у них на лбу не написано, для чего они... или вам лень их обозвать нормально?
Упс, да Вы даже код не смотрели или посмотрели и ничего не поняли.

Все завязано на трех константах:
Pascal
1
2
3
  n=30;{pixel per field}
  m=5;{image size}
  k=15;{count field}
Смотрите пост 29, там для "ООПкуренных" есть картинка.
Цитата Сообщение от Constantin Cat Посмотреть сообщение
На картинке показано как влияет константа "M" на отображаемую информацию(слева на право: 1,3,5 и 7).
А, спасибо, что напомнили:
Pascal
1
2
      for a:=0 to k do Line(n*a,0,n*a,15*n);
      for a:=0 to k do Line(0,n*a,15*n,n*a);
Единственное место где стоит число вместо константы.

Цитата Сообщение от vlisp Посмотреть сообщение
вы опасный человек и пишете опасные программы.
Ну, так блин. Если Вам кажется, что программа опасна, распечатайте исходник, с карандашиком пройдите по каждой строчке, если что-то не поняли - спросите, ну или в книгу помотрите.

В моей эл.библиотеке 17500+ файлов, если убрать прилагаемые CD и разделить на 16-ть, т.к. одинаковые книги (формат pdf и djvu), могут быть в разных форматах, могут быть в разных переводах(вместе с оригиналом) и находится в разных соответсвующих темах. В любом случае число не маленькое.
Миниатюры
Программа крестики-нолики  
0
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
11.08.2019, 16:17
Цитата Сообщение от vlisp Посмотреть сообщение
серьезно? а чем они отличаются от других? вот у них на лбу не написано, для чего они... или вам лень их обозвать нормально?
Упс, да Вы даже код не смотрели или посмотрели и ничего не поняли.

Все завязано на трех константах:
Pascal
1
2
3
  n=30;{pixel per field}
  m=5;{image size}
  k=15;{count field}
Смотрите пост 29, там для "ООПкуренных" есть картинка.
Цитата Сообщение от Constantin Cat Посмотреть сообщение
На картинке показано как влияет константа "M" на отображаемую информацию(слева на право: 1,3,5 и 7).
А, спасибо, что напомнили:
Pascal
1
2
      for a:=0 to k do Line(n*a,0,n*a,15*n);
      for a:=0 to k do Line(0,n*a,15*n,n*a);
Единственное место где стоит число вместо константы.

Цитата Сообщение от vlisp Посмотреть сообщение
вы опасный человек и пишете опасные программы.
Ну, так блин. Если Вам кажется, что программа опасна, распечатайте исходник, с карандашиком пройдите по каждой строчке, если что-то не поняли - спросите, ну или в книгу помотрите.

В моей эл.библиотеке 17500+ файлов, если убрать прилагаемые CD и разделить на 16-ть, т.к. одинаковые книги (формат pdf и djvu), могут быть в разных форматах, могут быть в разных переводах(вместе с оригиналом) и находится в разных соответсвующих темах. В любом случае число не маленькое.

Добавлено через 12 минут
Модеры, уберите дубль.
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2019, 16:17
Помогаю со студенческими работами здесь

Крестики нолики
Здравствуйте, в данное программе нужно заменить символы &quot;крестики и нолики&quot; на картинку, чтобы было интереснее. Более подробно если...

Крестики-нолики
Интересуюсь созданием программы &quot;Крестики - нолики&quot; в Паскале. Нужно оздать программу, играющую с пользователем в «крестики-нолики» на поле...

Крестики-нолики
11. Квадраты при игре в крестики-нолики занумерованы, как показано на рисунке. Заданы номера трех квадратов: N1, N2, N3, причем...

Крестики-нолики
Нужно реализовать в Pascal. Что бы были входные(1.in) и выходные(1.out) данные. ) создать .ехе файл Крестики-нолики Условие...

Крестики-нолики в графическом режиме
Крестики-нолики. Описание: Игра осуществляется по стандартным правилам для поля 3х3. Предусмотреть режимы игры для двух игроков и для...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru