Diskuze: Šachy - pole
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
int k=9; //Deklarace pole (sachovnice)
char p[k][k];
for (j=1;j<=9;j++){ //Naplneni pole (sachovnice) znakem "-"
for (i=1;i<=9;i++)
p[j][i]= '-';
}
Jsi si jist že následující úryvek kodu je správný?
No, tak to slouží pouze k vyplnění celého pole nějakým neutrálním znakem, nic víc. Podle mě je to správně, nebo alespoň si to tak myslím.
Správně to není, pracuješ s části pamětí která už není tvoje. Dle deklarace máš povolen přístup k indexům pole 0-8. Přístup k desátému prvku indexu i a indexu j je nebezpečný a chybný.
Mimochodem test na ohrožení figury střelcem na šachovnici je triviální (jedna podmínka).
Figura je ohrožena tehdy jeli horizontální a vertikální vzdálenost mezi
střelcem a figurou stejná.
To platí za předpokladu, že na šachovnici nejsou žádné další figury. V
opačném případě se jedná o potenciální ohrožení a pro skutečné
ohrožení je třeba provést další testy.
To ano, jenže mně nestačí vypsat kdy je ohrožena. Potřebuji to promítnout do pole a zobrazit pomocí znaků. Což si díky této myšlence nedokáži představit. Proto se snažím dojít do bodu, kdy se pole ohrožení potkají s F (figurou), x se změní tedy na F a následující políčka za F se změní například na n (neohroženo).
Proto se snažím o něco takovéhoto. Určitě by to šlo i zapsat jednodušeji. Stejně si zatím nevím rady, jak do toho promítnout označení F, které se mi v průběhu funkce přepíše na "x."
p[s1][s2]='S';
p[f1][f2]='F'; //Zadani pozice a znaku strelce
y=s1+1; //Zjisteni a vyplneni moznosti vpravo dolu od strelce
x=s2+1;
while (x<=8 and y<=8){
p[y][x]='x';
x++;y++;
}
if (p[y][x]=p[f1][f2])
p[y][x]='F';
else
p[y][x]='-';
y=f1+1;
x=f2+1;
while (y<=8 and x<=8){
p[y][x]='n';
y++;x++;
Edit: Tak zatím sem tento problém vyřešil, zkusím to otestovat a napíši výsledek, ale snad by to mělo již šlapat jak má.
#include <iostream> //Hlavickovy soubor vstupniho a vystupniho proudu
#include <fstream> //Hlavickovy soubor prace se souborem
using namespace std; //Vytvoreni jmenneho prostoru
int main() {
int s1,s2,x,y,i,j,f1,f2; //Deklarace promennych pro souradnice
cout<< "Svisla pozice strelce? "; cin>>s1; //Pozice strelce na sachovnici
cout<< "Vodorovna pozice strelce? "; cin>>s2;
cout<<"Svisla pozice figury?"; cin>>f1;
cout<<"Vodorovna pozice figury?"; cin>>f2;
int k=8; //Deklarace pole (sachovnice)
char p[k][k];
ofstream fout ("strelec3.txt"); //Otevreni textoveho souboru pro zapis
for (j=1;j<=8;j++){ //Naplneni pole (sachovnice) znakem "-"
for (i=1;i<=8;i++)
p[j][i]= '-';
}
p[s1][s2]='S';
p[f1][f2]='F'; //Zadani pozice a znaku strelce
{
y=s1+1; //Zjisteni a vyplneni moznosti vpravo dolu od strelce
x=s2+1;
while (x<=8 and y<=8){
p[y][x]='x';
x++;y++;
}
y=f1+1;
x=f2+1;
while (y<=8 and x<=8){
p[y][x]='n';
y++;x++;
}
}
{
y=s1-1; //Zjisteni a vyplneni moznosti vpravo nahoru od strelce
x=s2+1;
while (x<=8 and y>=1){
p[y][x]='x';
x++;y--;
}
y=f1-1;
x=f2+1;
while (y>=1 and x<=8){
p[y][x]='n';
y--;x++;
}
}
{
y=s1+1; //Zjisteni a vyplneni moznosti vlevo dolu od strelce
x=s2-1;
while (x>=1 and y<=8){
p[y][x]='x';
x--;y++;
}
y=f1+1;
x=f2-1;
while (y<=8 and x>=1){
p[y][x]='n';
y++;x--;
}
}
{
y=s1-1;
x=s2-1;
while (x>=1 and y>=1){ //Zjisteni a vyplneni moznosti vlevo nahoru od strelce
p[y][x]='x';
x--;y--;
}
y=f1-1;
x=f2-1;
while (y>=1 and x>=1){
p[y][x]='n';
y--;x--;
}
}
p[f1][f2]='F';
for (j=1;j<=8;j++){ //Vypis obsahu pole (sachovnice) na obrazovku (konzoli)
for (i=1;i<=8;i++)
cout <<p[j][i]<<" ";
cout<<endl;
}
for (j=1;j<=8;j++){ //Vypis obsahu pole (sachovnice) do textoveho souboru "strelec2.txt"
for (i=1;i<=8;i++)
fout <<p[j][i]<<" ";
fout<<endl;
}
fout.close(); //Uzavreni textoveho souboru
cin.get();cin.get();
return 0;
}
Tak ještě se naskytla chyba. Při tomto zápisu dojde k vypsání "n" do všech směrů (samozřejmě i k přepsání všech "x" nebo "-"). Což mě nenapadá jak řešit, tak kdyby někdo měl nějaký nápad, rád ho uvítám.
Stále tam máš chybu, povolený rozsah indexů máš 0-7:
int k=8;
char p[k][k];
for (j=1;j<=8;j++){
for (i=1;i<=8;i++)
p[j][i]= '-';
}
Ve 2D poli musíš uchovávat následující hodnoty:
s - pozice střelce
f - pozice figury (neohrožované střelcem)
F - pozice figury (ohrožované střelcem)
x - pozice ohrožující střelcem
n - pozice neohrožované střelcem
Popř. a lepší řešení, 2 2D pole, jedno pozice střelce a figury a druhé působnost střelce
A když už jsme u těch jednotlivých vlastností figur a hracího pole, bylo by elegantnější použít struktury a pracovat s figurami a hracím polem jako s objekty. Až budeš chtít rozšířit aplikaci v plnohodnotnou hru Šachy, ušetří Ti to mnoho práce, času a nervů.
Zobrazeno 9 zpráv z 9.