Diskuze: Šachy - pole

C a C++ C a C++ Šachy - pole American English version English version

Aktivity (1)
Avatar
Martin Mikeš:31. března 15:19

Ahoj, měl bych otázku k úkolu v c++. Mám za úkol vytvořit šachové pole (8,8), do pole umístit střelce, naprogramovat jeho klasické pohyby. Poté do pole umístit jednu další figuru a zjistit, zda střelec onu figuru ohrožuje. Má dojít k označení polí na kterých stojí Střelec a Figura (písmeny např.), poté k označení polí která nemají žádné "vlastnosti", polí které ohrožuje střelec a na závěr políček které jsou také ohroženy a nachází se na nějakém z nich Figura (označit pole za Figurou kam již střelec nemůže).

Přikládám kód, z kterého vycházím + zápis, ke kterému sem zatím došel. Změny jsou u prvního while, přemýšlel sem nad několika způsoby zápisu. Tento zápis mi funguje, bohužel pouze pro jeden směr, pro ostatní se mi nepodařilo ho upravit, i přes to že znaménka sem změnil dobře. Takže zřejmě pouze přehlížím něco, co mi to rozhodí. Předem děkuji za radu :).

#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;                                                     //Deklarace promennych pro souradnice
 cout<< "Svisla pozice strelce? "; cin>>s1;     //Pozice strelce na sachovnici
 cout<< "Vodorovna pozice strelce? "; cin>>s2;

 int k=9;                                       //Deklarace pole (sachovnice)
 char p[k][k];

ofstream fout ("strelec3.txt");                         //Otevreni textoveho souboru pro zapis

 for (j=1;j<=9;j++){                                            //Naplneni pole (sachovnice) znakem "-"
        for (i=1;i<=9;i++)
                p[j][i]= '-';
                }

p[y][x0]='S';                                                                           //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=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=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=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--;
}





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;
}
#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,n;                                                     //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=9;                                       //Deklarace pole (sachovnice)
 char p[k][k];

ofstream fout ("strelec3.txt");                         //Otevreni textoveho souboru pro zapis

 for (j=1;j<=9;j++){                                            //Naplneni pole (sachovnice) znakem "-"
        for (i=1;i<=9;i++)
                p[j][i]= '-';
                }

**p[f1][f2]='F';
p[s1][s2]='S';                                                  //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[f1][f2]='F';
    else p[y][x]='x';
}
           while (f1<=8 and f2<=8){
           p[f1+1][f2+1]='n';
           f1++;f2++;
}
**
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=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=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--;
}





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;
}
 
Odpovědět 31. března 15:19
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Mikeš
DarkCoder:31. března 15:40
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ý?

Nahoru Odpovědět 31. března 15:40
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Odpovídá na DarkCoder
Martin Mikeš:31. března 15:46

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.

 
Nahoru Odpovědět 31. března 15:46
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Mikeš
DarkCoder:31. března 15:56

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

Nahoru Odpovědět  +1 31. března 15:56
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Mikeš
DarkCoder:31. března 16:25

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.

Nahoru Odpovědět 31. března 16:25
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Odpovídá na DarkCoder
Martin Mikeš:31. března 16:38

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

Editováno 31. března 16:41
 
Nahoru Odpovědět 31. března 16:38
Avatar
Odpovídá na Martin Mikeš
Martin Mikeš:31. března 16:58
#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.

 
Nahoru Odpovědět 31. března 16:58
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Mikeš
DarkCoder:31. března 17:20

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

Editováno 31. března 17:21
Nahoru Odpovědět  +1 31. března 17:20
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Mikeš
DarkCoder:31. března 17:38

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

Nahoru Odpovědět  +1 31. března 17:38
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
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 9 zpráv z 9.