NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Ondřej Tkadlec:11.4.2016 21:53

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.4.2016 21:53
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Ondřej Tkadlec
Martin Dráb:11.4.2016 22:25

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.4.2016 22:25
2 + 2 = 5 for extremely large values of 2
Avatar
Ondřej Tkadlec:12.4.2016 15:44

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.4.2016 15:44
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Ondřej Tkadlec
Martin Dráb:12.4.2016 18:14

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.4.2016 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.