Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема с передачей параметра
Форум «Всё о Паскале» > 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
спасибо, попробую.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.