IPB
ЛогинПароль:

> ПРОСЬБА-ОБРАЩЕНИЕ, злополучные крестики-нолики
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 178
Пол: Мужской

Репутация: -  0  +


Обращаюсь прежде всего к volvo и мисс_графити.
Прошу помочь 2м нуждающимся (мне и DRAKON'у).
Есть у нас такая программа крестики-нолики.

Я (не знаю как DRAKON) не прошу комментировать текст программы (сам бы на вашем месте не стал)
прошу лишь показать и пояснить хотя бы 2 места в программе: проверка 5 символов в ряд и как компьютер определяет место для своего хода.

Я думаю так, проверка 5 в ряд здесь:
Код

type tvert=array[1..20] of integer;

const vert : tvert = (0,0,0,0,0, -1,-2,-3,-4,-5,
                 0,0,0,0,0, 1,2,3,4,5);
      hor : tvert = (-1,-2,-3,-4,-5, 0,0,0,0,0,
                1,2,3,4,5, 0,0,0,0,0);
      diag1 : tvert = (-1,-2,-3,-4,-5, -1,-2,-3,-4,-5,
                  1,2,3,4,5, 1,2,3,4,5);
      diag2 : tvert = (1,2,3,4,5, -1,-2,-3,-4,-5,
                  -1,-2,-3,-4,-5, 1,2,3,4,5);

const ee=10;


function evaluate(color:integer):longint;
  var ii,jj,i,j,k,l,pos,ev,pol : longint;
      fl,fl1,win,fl2 : boolean;

    procedure ev_(vert:tvert);
      var i : integer;
    begin
      pos:=1;
      pol:=1;
      fl:=false;
      fl1:=true;
      fl2:=false;
      for i:=1 to 4 do begin
        if field[ii+vert[i],jj+vert[i+5]]=color then
           begin
         if fl1 then pos:=pos+1;
         pol:=pol*ee;
           end
        else
        case field[ii+vert[i],jj+vert[i+5]] of

        null,rad1,rad2: begin
            if i<4 then
              if field[ii+vert[i+1],jj+vert[i+6]]=color then
            fl:=true
              else
            break
            else
              if field[ii+vert[i+1],jj+vert[i+6]]=color then begin
            pol:=pol*ee;
            fl2:=true;
              end;
            fl1:=false;
          end;
        else begin
          fl:=true;
          k:=i;
          break;
        end;
        end;{case}
      end;
      fl1:=true;
      for i:=11 to 14 do begin
        if field[ii+vert[i],jj+vert[i+5]]=color then begin
             if fl1 then pos:=pos+1;
             pol:=pol*ee;
           end
           else
        case field[ii+vert[i],jj+vert[i+5]] of
        null,rad1,rad2: begin
            if i<14 then
              if field[ii+vert[i+1]+0,jj+vert[i+6]]=color then
            fl2:=true
              else
            break
            else
              if field[ii+vert[i+1]+0,jj+vert[i+6]]=color then begin
            pol:=pol*ee;
              end;
            fl1:=false;
          end;
        else begin
          if fl and(k+i-10<5) then pol:=0;
          fl:=true;
          break;
        end;
        end;{case}
      end;
      if pol>10000000 then pol:=10000000;
      if fl or fl2 then ev:=ev+pol
      else ev:=ev+pol*ee;
      if pos>4 then win:=true;
    end;


begin
  ev:=0;
  win:=false;
  for ii:=1 to n do begin
    for jj:=1 to n do begin
      if field[ii,jj]=color then begin
    ev_(vert);
    ev_(hor);
    ev_(diag1);
    ev_(diag2);
      end;{if}
      if win then break;
    end;
    if win then break;
  end;
  if win then ev:=inf;
  evaluate:=ev;
end;

function ev_step(color:integer;ii,jj:longint):longint;
var i,j,k,l,pos,ev,pol : longint;
      fl,fl1,win,fl2 : boolean;

    procedure ev_(vert:tvert);
      var i : integer;
    begin
      pos:=1;
      pol:=1;
      fl:=false;
      fl1:=true;
      fl2:=false;
      for i:=1 to 4 do begin
        if field[ii+vert[i],jj+vert[i+5]]=color then
           begin
         if fl1 then pos:=pos+1;
         pol:=pol*ee;
           end
        else
        case field[ii+vert[i],jj+vert[i+5]] of

        null,rad1,rad2: begin
            if i<4 then
              if field[ii+vert[i+1],jj+vert[i+6]]=color then
            fl:=true
              else
            break
            else
              if field[ii+vert[i+1],jj+vert[i+6]]=color then begin
            pol:=pol*ee;
            fl2:=true;
              end;
            fl1:=false;
          end;
        else begin
          fl:=true;
          k:=i;
          break;
        end;
        end;{case}
      end;
      fl1:=true;
      for i:=11 to 14 do begin
        if field[ii+vert[i],jj+vert[i+5]]=color then begin
             if fl1 then pos:=pos+1;
             pol:=pol*ee;
           end
           else
        case field[ii+vert[i],jj+vert[i+5]] of
        null,rad1,rad2: begin
            if i<14 then
              if field[ii+vert[i+1]+0,jj+vert[i+6]]=color then
            fl2:=true
              else
            break
            else
              if field[ii+vert[i+1]+0,jj+vert[i+6]]=color then begin
            pol:=pol*ee;
              end;
            fl1:=false;
          end;
        else begin
          if fl and(k+i-10<5) then pol:=0;
          fl:=true;
          break;
        end;
        end;{case}
      end;
      if pol>10000000 then pol:=10000000;
      if fl or fl2 then ev:=ev+pol
      else ev:=ev+pol*ee;
      if pos>4 then win:=true;
    end;


begin
  win:=false;
  if field[ii,jj]=color then begin
    ev_(vert);
    ev_(hor);
    ev_(diag1);
    ev_(diag2);
  end;{if}
  if win then ev:=inf;
  ev_step:=ev;
end;

Что здесь происходит?

Помогите найти как компьютер ходит?(если можно поясните принцип)

И ещё 2 маленьких вопроса:
Что за массивы заполняются в начале программы?
Зачем так много процедур в модуле?(зачем они вообще)

Если чем поможете можем и отблагодарить. Заранее не могу, т.к уже нет времени. Просто физически не смогу.

Заранее благодарен.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 14:33
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name