Witam. Piszę taki programik, który wyrysuje szachownice, następnie zapyta o pozycję króla. Gdy podamy np. C5 to literka “K” symbolizująca króla ustawi się na tym polu. Problem polega na tym, żeby zaznaczyć jeszcze pola na które król może w danym momencie stanąć, czyli wszystkie w okół siebie. Z zablokowaniem szachownicy sobie poradzę, nie wiem tylko jak zaznaczyć te pola w okół.
Korzystam z program Free Pascal 2.4.2 na Windows 7.
Poniżej zamieszczam kod (szachownica jest z kodów ASCII, dlatego nie wyświetla się poprawnie na forum, jeśli by pomogło to mogę zrobić jej screen)
program projekt;
uses crt;
var
i,j,k,y,x:integer;
kpo:char;
procedure szachownica;
begin
writeln;
writeln(' A B C D E F G H ');
writeln(' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ');
writeln('1ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('2ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('3ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('4ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('5ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('6ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('7ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('8ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' ČÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍĽ ');
end;
begin
clrscr;
clrscr;
writeln('Podaj pooľenie kr˘la (w poziomie |A|B|C|D|E|F|G|H|)');
readln(kpo);
writeln('Podaj pooľenie kr˘la (w pionie |1|2|3|4|5|6|7|8|)');
readln(k);
szachownica;
if (kpo='a') or (kpo='A') then
x:=5;
if (kpo='b') or (kpo='B') then
x:=11;
if (kpo='c') or (kpo='C') then
x:=17;
if (kpo='d') or (kpo='D') then
x:=23;
if (kpo='e') or (kpo='E') then
x:=29;
if (kpo='f') or (kpo='F') then
x:=35;
if (kpo='g') or (kpo='G') then
x:=41;
if (kpo='h') or (kpo='H') then
x:=47;
if k=1 then
y:=9;
if k=2 then
y:=12;
if k=3 then
y:=15;
if k=4 then
y:=18;
if k=5 then
y:=21;
if k=6 then
y:=24;
if k=7 then
y:=27;
if k=8 then
y:=30;
gotoxy(x,y);
textcolor(2);
write('K');
readln;
end.
Po pierwsze, liczby które wpisujesz układają się regularnie więc ja bym dodał coś na wzór wyliczania na podstawie znaku. Najpierw wczytuję znak, sprawdzam czy to mała czy duża litera, jeśli mała (albo duża) to zamieniam na dużą (albo małą). Następnie odejmuje literkę ‘A’ (lub ‘a’) i liczę więc wzór wyglądałby tak x:=5+6*(kpo-‘a’) lub x:=5+6*(kpo-‘A’).
To samo z k
y:=6+3*k
Dodatkowo ja tego nie widzę ale jakie tam są pola ? To nie kwadrat ? Tylko z tego co widzę prostokąt 5x2? I czy przy K tam na pewno powinno się zaczynać od 9? A nie od 3?
Bo jeśli to jest tak jak ja to widzę to powinno wyglądać tak, jeśli nie zadziała to zmień wzór na y na taki y:=6+3*k. A jeśli będzie błąd przy linijkach z wyliczaniem x to daj znać.
program projekt;
uses crt;
var
i,j,k,y,x:integer;
kpo:char;
procedure szachownica;
begin
writeln;
writeln(' A B C D E F G H ');
writeln(' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ');
writeln('1ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('2ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('3ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('4ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('5ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('6ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('7ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ');
writeln(' şÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍş ');
writeln('8ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' ş°°°°°ş ş°°°°°ş ş°°°°°ş ş°°°°°ş ş ');
writeln(' ČÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍĽ ');
end;
begin
clrscr;
clrscr;
writeln('Podaj pooľenie kr˘la (w poziomie |A|B|C|D|E|F|G|H|)');
readln(kpo);
writeln('Podaj pooľenie kr˘la (w pionie |1|2|3|4|5|6|7|8|)');
readln(k);
szachownica;
if(kpo >='a') and (kpo <='h') then
x:=5+6*(kpo-'a');
else
begin
if(kpo>='A') and (kpo <='H') then
x=5+6*(kpo-'A');
end;
y:=3*k;
FOR i:=y TO y+1 DO
BEGIN
FOR j:=x-2 TO x+2 DO
BEGIN
gotoxy(x,y);
textcolor(3);
write('Z');
END;
END;
gotoxy(x,y);
textcolor(2);
write('K');
readln;
end.
if(kpo >='a') and (kpo <='h') then
begin
x:=5+6*(integer(kpo)-integer('a'));
end
else
begin
if(kpo>='A') and (kpo <='H') then
x:=5+6*(integer(kpo)-integer('A'));
end;
Jednak u mnie jest problem z wyświetlaniem bo tak jakby Twoja szachownica była za duża.
if UpCase(kpo) in ['A'..'H']
then x:= 5 + 6*(Ord(UpCase(kpo)) - Ord('A'));
y:= 3*k-1;
for i:= -1 to 1 do
for j:= -1 to 1 do begin
gotoxy(x+6*i, y+3*j);
write('Z');
end;
Trochę teorii, dlaczego to nie działa : Otóż w zmiennej typu integer próbujesz odjąć znak ‘A’. Bardzo szkolny błąd i tutaj jest potrzebne rzutowanie, jakie zastosował Marcin511. Myślę, że to się przyda, jeśli chcesz nadal zastosować ten kod przy “obronie” tego projektu
Ponadto do ustalenia stanu danego pola szachownicy wykorzystałbym typ wyliczeniowy;
type TSzach = (nic, bije, stoi);
var
Szachownica : array[1..8, 'A'..'H'] of TSzach;
i na początku wyzerować tablicę reprezentującą szachownice.
for wiersz:=1 to 8 do
for kolumna:='A' to 'H' do
Szachownica[wiersz,kolumna]:=nic;
Ten błąd ja zrobiłem, a później go poprawiłem w drugim poście. Pisałem wtedy z laptopa gdzie nie miałem dostępu do żadnego kompilatora oraz wychodziłem z pracy i nie miałem czasu sprawdzać jak wygląda rzutowanie w Pascalu a o Pascalu mam bardzo małe pojęcie. Co do samego projektu to można tutaj dużo usprawnić ale Ty musisz samodzielnie to zrobić żeby rozumieć istotę całego programu
Program będę jeszcze usprawniał, jednak nie mogę cały czas dojść do tego, jak zrobić żeby pola wokół króla (te, na które może teoretycznie stanąć) były zamalowane na kolor czerwony. Ma ktoś na to pomysł ?
Ogólnie źle do tego podchodzisz. Twoja szachownika powinna być wyświetlana w pętli, a twoje pionki powinny być przy tym wczytywane z tablicy (podczas wyświetlania szachownicy).
Wtedy wybierasz pole na którym stoi twój pionek, wyświetlasz szachownicę na nowo wraz z TextColor dla pól ±1 (wszystkie kombinacje, pomijając wyjścia poza zakres tablicy))