Diskuze: Piskvorky

Ostatní jazyky Delphi Delphi (Pascal) Piskvorky

Avatar
Ondřej Tkadlec:

Zdravím všechny, snad mi někdo pomůžete. Děláme ve škole program piškvorky a téměř vše mi jede, jen malá drobnost na konci. Nechce se mi vypsat procedura kdyzjevyhra;, ačkoliv tam mám jasně danou podmínku. Tudíž vždy když už je konec, místo vypsaní -- Vyhrava hrac se symbolem ',kamen,' -- to nic neudělá. Vím, že se to některým nechce číst, ale budu za každou radu rád :) Díky.

program damto;

{$APPTYPE CONSOLE}

uses
SysUtils;
const
m=20;
n=50;
type
pole=array[1.­.m,1..n] of char;
var
vyhra,pomr,pom­s,r,s,kamenuve­dlesebe:byte;
p:pole;
kamen,odpoved:char;
hrakonec,volne­pole,konec:bo­olean;

procedure zadavanivyhry;
begin
writeln('Zadejte, kolik znaku je pro vas vyhernich (3-10): ');
readln(vyhra);
while (vyhra<3) or (vyhra>10) do
begin
writeln('Znova!');
readln(vyhra);
end;
end;

procedure vypistecek;
begin
for r:=1 to m do
begin
for s:=1 to n do
begin
p[r,s]:='.';
end;
end;
end;

procedure vypiskamenu;
begin
volnepole:=false;
while (volnepole=false) do
begin //1
writeln('zadejte radek, kde ma byt symbol: ');
readln(r);
while (r<1) or (r>m) do
begin
writeln('Znova!');
readln(r);
end;

writeln('zadejte sloupec, kde ma byt symbol: ');
readln(s);
while (s<1) or (s>n) do
begin
writeln('Znova!');
readln(s);
end;

if p[r,s]='.' then volnepole:=true
else writeln('na teto pozici neni misto!');

end; //1
end;

procedure radkysloupcedi­agonaly;
begin
pomr:=r;
poms:=s;
kamenuvedlesebe:=1;
konec:=false;
while (konec=false) do
begin // radkysloupcedi­agonaly
konec:=true;
if (poms-1)>=1 then
begin
if p[pomr,poms-1]=kamen then
begin
kamenuvedlese­be:=kamenuvedle­sebe+1;
poms:=poms-1;
konec:=false;
end;
end;
if (poms+1)>=1 then //2
begin
if p[pomr,poms+1]=ka­men then
begin
kamenuvedlese­be:=kamenuvedle­sebe+1;
poms:=poms+1;
konec:=false;
end;
end;
if (pomr-1)>=1 then //3
begin
if p[pomr-1,poms]=kamen then
begin
kamenuvedlese­be:=kamenuvedle­sebe+1;
pomr:=pomr-1;
konec:=false;
end;
end;
if (pomr+1)>=1 then //4
begin
if p[pomr+1,poms]=ka­men then
begin
kamenuvedlese­be:=kamenuvedle­sebe+1;
pomr:=pomr+1;
konec:=false;
end;
end;
if ((poms-1) and (pomr-1)) >=1 then //5
begin
if p[pomr-1,poms-1]=kamen then
begin
kamenuvedlese­be:=kamenuvedle­sebe+1;
poms:=poms-1;
pomr:=pomr-1;
konec:=false;
end;
end;
if ((poms-1) and (pomr+1))>=1 then //6
begin
if p[pomr+1,poms-1]=kamen then
begin
kamenuvedlese­be:=kamenuvedle­sebe+1;
poms:=poms-1;
pomr:=pomr+1;
konec:=false;
end;
end;
if ((poms+1) and (pomr-1))>=1 then //7
begin
if p[pomr-1,poms+1]=kamen then
begin
kamenuvedlese­be:=kamenuvedle­sebe+1;
poms:=poms+1;
pomr:=pomr-1;
konec:=false;
end;
end;
if ((poms+1) and (pomr-+1))>=1 then //8
begin
if p[pomr+1,poms+1]=ka­men then
begin
kamenuvedlese­be:=kamenuvedle­sebe+1;
poms:=poms+1;
pomr:=pomr+1;
konec:=false;
end;
end;

end; // radkysloupcedi­agonaly

end;

procedure vypispole;
begin
p[r,s]:=kamen;
for r:=1 to m do
begin
for s:=1 to n do
begin
write(p[r,s]);
end;
writeln;
end;
end;

procedure vypiskamenuve­dlesebe;
begin
writeln('Kamenu vedle sebe je ',kamenuvedlesebe);
end;

procedure kdyzjevyhra;
begin
if (kamenuvedlese­be>=vyhra)
then
hrakonec:=true;
writeln('Vyhrava hrac se symbolem ',kamen,'.');
end;

begin //zacatek hlavniho programu
odpoved:='a';
while (odpoved='a') do
begin
zadavanivyhry;
vypistecek;
kamen:='O';
hrakonec:=false;
while (hrakonec=false) do
begin
vypiskamenu;
if (kamen='O') then kamen:='X' else kamen:='O';
radkysloupcedi­agonaly;
vypispole;
vypiskamenuve­dlesebe;
kdyzjevyhra;
end;

writeln('Chcete hrat znova? a-ano/jinak ne.');
readln(odpoved);
end;

readln;
end.

 
Odpovědět 11. dubna 21:53
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Ondřej Tkadlec
Martin Dráb:

Ahoj,

u té podmínky ti chybí begin a end pro označení bloku, který se má při jejím splnění vykonat. Bez toho se ti jen nastaví hrackonec na true, což je pro tebe málo. Po úpravě:

procedure kdyzjevyhra;
begin
if (kamenuvedlesebe>=vyhra) then
  begin
  hrakonec:=true;
  writeln('Vyhrava hrac se symbolem ',kamen,'.');
  end;
end;

A na vkládání zdrojáků tu máme značky [ code ] a [ / code ]

Nahoru Odpovědět 11. dubna 22:25
2 + 2 = 5 for extremely large values of 2
Avatar
Ondřej Tkadlec:

Díky za odpověď, tohle jsem opravil, ale byly chyby i jinde. Naštěstí už vše funguje :) a sorry za ten zdroják, nevěděl jsem...

 
Nahoru Odpovědět 12. dubna 15:44
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Ondřej Tkadlec
Martin Dráb:

ale byly chyby i jinde.

To nevylučuji. Hledal jsem jen to, na co jsi se ptal. A stačilo projít tu příslušnou proceduru, takže se přiznám, že jsem se více nesnažil :-).

Nahoru Odpovědět 12. dubna 18:14
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.