Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с передачей параметра
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
klem4
Я всетаки оказался прав, игра крестики нолики,процедура CanWin проверяет нельзя ли завершить игру победой, параметр процедуры - символ, в 1-ом случае - ChAi - проверяет не может ли комп завершить игру победой, во втором случае ChHum - проверка тойже ситуации для человека, в случае

x x o
- o x
- - -

считает что он выиграл (первая строка) не различает крестик и нолик sad.gif

эти переменные глобальные :

const
  n=3; {размер поля 3х3}

var
  x:array[1..n,1..n] of char; {поле}
  Gstop:boolean;
  chAi,chHum:char;
  goi,goj:integer;



процедура выбора символа :

procedure CaseCh; {Выбор символа игрока и AI}
var
   choice:char;
   flag:boolean;
begin
   flag:=True;
   repeat
      clrscr;
      writeln('Если вы хотите играть крестиком, нажмите 1');
      writeln('Если вы хотите играть ноликом, нажмите 2');
      readln(choice);
      case choice of
         '1': begin
                 chAi:='o';
                 chHum:='x';
              end;
         '2': begin
                 chAi:='x';
                 chHum:='o';
              end
         else flag:=false;
      end;
   until flag;
   clrscr;
end;{CaseCh}



сама ф-я проверки :
function CanWin(ch:char):boolean; {можно ли завершить игру победой}
var
   countCh,NullPos:integer;
   Win:boolean;
   i,j:integer;

begin
   {Проверка горизонталей}
   Win:=false;
   i:=1;
   countCh:=0;
   NullPos:=0;
   while (i<=n)and(not(Win)) do
    Begin
       j:=1;
       while (j<=n) do
        begin
           if x[i,j]=ch then
            inc(countCh)
           else
            if x[i,j]='-' then
             begin
                inc(NullPos);
                goi:=i;
                goj:=j;
             end;
           inc(j);
         end;

        if (countCh=2)and(NullPos>0) then
         Win:=True;

        if not(Win) then inc(i);
    end;{горизонтали}

   {Проверка вертикалей}

   if not(Win) then
    begin
       countCh:=0;
       NullPos:=0;
       j:=1;
       while (j<=n)and(not(Win)) do
        begin
           i:=1;
           while (i<=n) do
            begin
               if x[i,j]=ch then
                inc(countCh)
               else
                if x[i,j]='-' then
                 begin
                    inc(NullPos);
                    goi:=i;
                    goj:=j;
                 end;
               inc(i);
            end;

           if (countCh=2)and(NullPos>0) then
            Win:=True;

           if not(Win) then
            inc(j);
        end;

    end;{вертикали}

    if not(Win) then
     {Проверка главной диагонали}
     begin
        i:=1;
        countCh:=0;
        NullPos:=0;
        while(i<=n) do
         begin
            if x[i,i]=ch then
             inc(countCh)
            else
             if x[i,i]='-' then
              begin
                 inc(NullPos);
                 goi:=i;
                 goj:=j;
              end;
             inc(i);
         end;

         if (countCh=2)and(NullPos>0) then
          Win:=true;
         
     end;{Диагональ}

     if not(Win) then
      {Проверка побочной диагонали}
       begin
          countCh:=0;
          NullPos:=0;
          i:=1;
          while (i<=n) do
           begin
              if x[i,n-i+1]=ch then
               inc(countCh)
              else
               if x[i,n-i+i]='-' then
                begin
                   inc(NullPos);
                   goi:=i;
                   goj:=n-i+1;
                end;
               inc(i);
           end;

           if countCh=2 then
            Win:=True;

       end;{побочная}

       CanWin:=Win;

end;{CanWin}






использование в основной программе :
if CanWin(ChAi) then
               begin
                  x[goi,goj]:=chAi;
                  Gstop:=True;
               end
              else
               if CanWin(ChHum) then
                x[goi,goj]:=chAi
               else
                AiGo;


помогите с передачей параметров :p2:
hiv
Я не разбирался с передачей параметров, но я бы проверку AI smile.gif изменил бы в таком духе:
   {Проверка горизонталей}
   Win:=false;
   i:=1;
   countCh:=0;
   NullPos:=0;
   while (i<=n)and(not(Win)) do
    Begin
       j:=1;
       while (j<=n)and(not(Win)) do {}
        begin
           if x[i,j]=ch then
             inc(countCh);
           else
            if x[i,j]='-' then
             begin
              inc(NullPos);
              goi:=i;
              goj:=j;
             end
            else
             begin
              countCh:=0; {это когда противник помешал }
              NullPos:=0;
             end;  
             Win:=(countCh=2)and(NullPos>0); {сразу проверяем победу} 
              inc(j);
        end;
        if not(Win) then inc(i);
    end;{горизонтали}

и остальные проверки ты бы поправил в том же духе...
ЗЫ: Код свой я не проверял, только идею подкинул.
klem4
спасибо, попробую.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.