• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szachy-błąd w kodzie.

Object Storage Arubacloud
0 głosów
394 wizyt
pytanie zadane 18 kwietnia 2017 w C i C++ przez mamchec333 Nowicjusz (170 p.)

Witam smiley Zwracam się z prośbą o pomoc w rozwiązaniu problemu z obiektem pionek1 w szachach które próbuję ogarnąć :c Jak wiadomo pionek ma taką specyfikację że jak rusza z pola startowego to może  pokonać dwa pola przed sobą i właśnie w tym problem ze mi to nie wychodzi i nie wiem gdzie mam błąd :/ Byłbym wdzięczny ja każdą pomoc :D Ps. proszę o pisanie prostym językiem bo dopiero co zaczynam zabawę z c++. 

Main.cpp

#include <iostream>
#include "figura.h"
#include <cstdlib>

using namespace std;
char miejsce[8][8];
//figury gracza pierwszego :D
figura krol;
figura goniec1;
figura goniec2;
figura wieza1;
figura wieza2;
figura skoczek1;
figura skoczek2;
figura hetman1;
figura hetman2;
figura pionek1;
figura pionek2;
figura pionek3;
figura pionek4;
figura pionek5;
figura pionek6;
figura pionek7;
figura pionek8;


void figury1()
{
{//  król
krol.pg=true;
krol.p=true;
krol.pd=true;
krol.d=true;
krol.ld=true;
krol.l=true;
krol.lg=true;
krol.g=true;
krol.wyglad='K';
krol.ile=1;
}
{//  goniec1
goniec1.pg=true;
goniec1.pd=true;
goniec1.lg=true;
goniec1.ld=true;
goniec1.wyglad='G';
goniec1.ile=8;
}
{//  goniec2
goniec2.pg=true;
goniec2.pd=true;
goniec2.lg=true;
goniec2.ld=true;
goniec2.wyglad='G';
goniec2.ile=8;
}
{//  wieża1
wieza1.p=true;
wieza1.l=true;
wieza1.g=true;
wieza1.d=true;
wieza1.ile=8;
wieza1.wyglad='W';
}
{//  wieża2
wieza2.p=true;
wieza2.l=true;
wieza2.g=true;
wieza2.d=true;
wieza2.ile=8;
wieza2.wyglad='W';
}
{//  skoczek1
skoczek1.ddl=true;
skoczek1.ddp=true;
skoczek1.dll=true;
skoczek1.dpp=true;
skoczek1.ggp=true;
skoczek1.gpp=true;
skoczek1.gll=true;
skoczek1.ggl=true;
skoczek1.wyglad='S';
}
{//  skoczek2
skoczek2.ddl=true;
skoczek2.ddp=true;
skoczek2.dll=true;
skoczek2.dpp=true;
skoczek2.ggp=true;
skoczek2.gpp=true;
skoczek2.gll=true;
skoczek2.ggl=true;
skoczek2.wyglad='S';
}
{//  hetman1
hetman1.pg=true;
hetman1.p=true;
hetman1.pd=true;
hetman1.d=true;
hetman1.ld=true;
hetman1.l=true;
hetman1.lg=true;
hetman1.g=true;
hetman1.wyglad='H';
hetman1.ile=8;
}
{//  hetman2
hetman2.pg=true;
hetman2.p=true;
hetman2.pd=true;
hetman2.d=true;
hetman2.ld=true;
hetman2.l=true;
hetman2.lg=true;
hetman2.g=true;
hetman2.wyglad='H';
hetman2.ile=8;
}
{//  pionek1
pionek1.wyglad='P';
pionek1.d=true;
if(pionek1.wysokosc==1)
    pionek1.ile=2;
else if(miejsce[pionek1.wysokosc+1][pionek1.szerokosc-1]==('k'||'w'||'p'||'h'||'s'))
    pionek1.lg=true;
else if(miejsce[pionek1.wysokosc+1][pionek1.szerokosc+1]==('k'||'w'||'p'||'h'||'s'))
    pionek1.pg=true;
else if(miejsce[pionek1.wysokosc+1][pionek1.szerokosc]==('k'||'w'||'p'||'h'||'s'))
    pionek1.ile=0;
else pionek1.ile=1;// trzeba naprawić chodzenie pionka:: błąd z pozycja :c
}
}
void poczatek()
{
miejsce[0][0]=wieza1.wyglad;
miejsce[0][1]=skoczek1.wyglad;
miejsce[0][2]=hetman1.wyglad;
miejsce[0][3]=krol.wyglad;
miejsce[1][3]=pionek1.wyglad;
miejsce[0][4]=goniec1.wyglad;
}
void odswiez()
{
void pole();
void kratki();
}
void pole()//pole
{

{
cout<<"                                        1   2   3   4   5   6   7   8"<<endl;
cout<<" 1-król                              1  "<<miejsce [0][0]<<" | "<<miejsce [0][1]<<" | "<<miejsce [0][2]<<" | "<<miejsce [0][3]<<" | "<<miejsce [0][4]<<" | "<<miejsce [0][5]<<" | "<<miejsce [0][6]<<" | "<<miejsce [0][7]<<" "<<endl;
cout<<"                                       ---+---+---+---+---+---+---+---"<<endl;
cout<<" 2-goniec                            2  "<<miejsce [1][0]<<" | "<<miejsce [1][1]<<" | "<<miejsce [1][2]<<" | "<<miejsce [1][3]<<" | "<<miejsce [1][4]<<" | "<<miejsce [1][5]<<" | "<<miejsce [1][6]<<" | "<<miejsce [1][7]<<" "<<endl;
cout<<"                                       ---+---+---+---+---+---+---+---"<<endl;
cout<<" 3-wieża                             3  "<<miejsce [2][0]<<" | "<<miejsce [2][1]<<" | "<<miejsce [2][2]<<" | "<<miejsce [2][3]<<" | "<<miejsce [2][4]<<" | "<<miejsce [2][5]<<" | "<<miejsce [2][6]<<" | "<<miejsce [2][7]<<" "<<endl;
cout<<"                                       ---+---+---+---+---+---+---+---"<<endl;
cout<<" 4-pionek                            4  "<<miejsce [3][0]<<" | "<<miejsce [3][1]<<" | "<<miejsce [3][2]<<" | "<<miejsce [3][3]<<" | "<<miejsce [3][4]<<" | "<<miejsce [3][5]<<" | "<<miejsce [3][6]<<" | "<<miejsce [3][7]<<" "<<endl;
cout<<"                                       ---+---+---+---+---+---+---+---"<<endl;
cout<<" 5-skoczek                           5  "<<miejsce [4][0]<<" | "<<miejsce [4][1]<<" | "<<miejsce [4][2]<<" | "<<miejsce [4][3]<<" | "<<miejsce [4][4]<<" | "<<miejsce [4][5]<<" | "<<miejsce [4][6]<<" | "<<miejsce [4][7]<<" "<<endl;
cout<<"                                       ---+---+---+---+---+---+---+---"<<endl;
cout<<" 6-hetman                            6  "<<miejsce [5][0]<<" | "<<miejsce [5][1]<<" | "<<miejsce [5][2]<<" | "<<miejsce [5][3]<<" | "<<miejsce [5][4]<<" | "<<miejsce [5][5]<<" | "<<miejsce [5][6]<<" | "<<miejsce [5][7]<<" "<<endl;
cout<<"                                       ---+---+---+---+---+---+---+---"<<endl;
cout<<"                                     7  "<<miejsce [6][0]<<" | "<<miejsce [6][1]<<" | "<<miejsce [6][2]<<" | "<<miejsce [6][3]<<" | "<<miejsce [6][4]<<" | "<<miejsce [6][5]<<" | "<<miejsce [6][6]<<" | "<<miejsce [6][7]<<" "<<endl;
cout<<"                                       ---+---+---+---+---+---+---+---"<<endl;
cout<<"                                     8  "<<miejsce [7][0]<<" | "<<miejsce [7][1]<<" | "<<miejsce [7][2]<<" | "<<miejsce [7][3]<<" | "<<miejsce [7][4]<<" | "<<miejsce [7][5]<<" | "<<miejsce [7][6]<<" | "<<miejsce [7][7]<<" "<<endl;
}

}
void kratki()//wypełninie pola kratkami
{
system ("clear");
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
miejsce[i][j]=' ';
for(int i=0;i<9;i++){
    if (i%2==1)
        for(int j=0;j<8;j=2+j)
        miejsce[i][j]='x';
    else
        for(int j=1;j<8;j=2+j)
        miejsce[i][j]='x';
}
}
void wybieraj()
{
int a;
cout<<"wybierz pionka: ";
cin>>a;
system("clear");
pole();
switch (a)
{

case 1:
krol.ruch();
break;
case 2:
goniec1.ruch();
break;
case 3:
wieza1.ruch();
break;
case 4:
pionek1.ruch();
break;
case 5:
skoczek1.ruch();
break;
case 6:
hetman1.ruch();
break;
}

}
void figura::pozycja()//wyszukiwanie pozycji figury
{
for (int i=0;i<8;i++)
    for(int j=0; j<8;j++){
        if(miejsce[i][j]==wyglad){
             wysokosc=i;
             szerokosc=j;}
            }
}
void figura::zmianaPozycji()//zmiana pozycji
{
if(miejsce[y][x]==' '||miejsce[y][x]=='x')
{
miejsce[y][x]=wyglad;
miejsce[wysokosc][szerokosc]=' ';}
}
int main()
{
kratki();
figury1();
poczatek();
pole();
int a=0;
do{
wybieraj();
pole();
a++;
}while(a!=10);
return 0;
}

figura.h

 

#include <iostream>
#include <string>

using namespace std;
class figura
{
    public:
    char wyglad;
     bool g=false;
     bool pg=false;
     bool p=false;
     bool pd=false;
     bool d=false;
     bool ld=false;
     bool l=false;
     bool lg=false;
     bool gpp=false;
     bool ggp=false;
     bool gll=false;
     bool ggl=false;
     bool dpp=false;
     bool ddp=false;
     bool ddl=false;
     bool dll=false;
     int ile=0;
     int wysokosc;
     int szerokosc;
      int x=0;
      int y=0;
    void ruch ();
    void pozycja();
    void zmianaPozycji();
};

figura.cpp

#include "figura.h"
#include <iostream>
#include <string>
#include <cstdlib>
#include <cmath>

using namespace std;



void figura::ruch()
{
pozycja();
cout<<wysokosc+1<<" "<<szerokosc+1<<endl;
cout<<"na jaką pozycję zmienić?"<<endl;
cout<<"szerokość: ";cin>>x;
cout<<"wysokość: ";cin>>y;
x--;
y--;
system("clear");
if (x>=0&&y>=0&&x<=8&&y<=8)
{
    if (labs(wysokosc-y)==labs(szerokosc-x))//jesli chodzi po krzyżu
    {
        if(wysokosc-y>0)//jeśli idzie w góre
        {
            if(pg==true&&lg==true)//jesli może iśc
            {
                if((wysokosc-y)^2<=ile^2)
                zmianaPozycji();
            }
        }
        if(wysokosc-y<0)//jesli idzie w dół
        {
            if(pd==true&&ld==true)//jeśli może iść
            {
                if(pow(wysokosc-y,2)<=pow(ile,2))
                zmianaPozycji();
            }
        }
    }
    if (szerokosc-x==0)//jeśli chodzi dół-góra
        {
        if(wysokosc-y<0)
        {
            if(d==true)
                if(labs(wysokosc-y)<=ile)
                zmianaPozycji();
        }
        if(wysokosc-y>0)
        {
          if(g==true)
            {
             if(labs(wysokosc-y)<=ile)
                zmianaPozycji();
            }
        }
        }
    if (wysokosc-y==0)//jeśli chodzi prawo-lewo
        {
        if(szerokosc-x>0)
        {
            if(p==true)
            {
                if(labs(szerokosc-x)<=ile)
                zmianaPozycji();
            }
        }
        if(szerokosc-x<0)
        {
        if(l==true)
            {
             if(labs(szerokosc-x)<=ile)
                zmianaPozycji();
            }
        }
        }
    if (labs(wysokosc-y)==2&&labs(szerokosc-x)==1||labs(wysokosc-y)==1&&labs(szerokosc-x)==2)//jesli jest skoczkiem
        {
        if(ddp==true)
        zmianaPozycji();
        }
}

}

 

komentarz 18 kwietnia 2017 przez draghan VIP (106,230 p.)

właśnie w tym problem ze mi to nie wychodzi i nie wiem gdzie mam błąd :/

Napisz trochę jaśniej, co jest nie tak z Twoim programem.

komentarz 18 kwietnia 2017 przez mamchec333 Nowicjusz (170 p.)
Pionek z pozycji startowej nie chce przeskoczyć dwóch pól :P
komentarz 18 kwietnia 2017 przez draghan VIP (106,230 p.)
Z jednym polem nie ma problemu?
komentarz 18 kwietnia 2017 przez mamchec333 Nowicjusz (170 p.)
Tak jakby źle wczytywał miejsce z którego startuje
komentarz 18 kwietnia 2017 przez mamchec333 Nowicjusz (170 p.)
z jednym nie ma żadnych problemow

1 odpowiedź

+1 głos
odpowiedź 18 kwietnia 2017 przez draghan VIP (106,230 p.)
wybrane 18 kwietnia 2017 przez mamchec333
 
Najlepsza

Mało czytelny jest Twój kod. Ale starasz się jakoś sensownie podzielić program, co jest na plus.

Rozważ, czy wyszukiwanie pozycji figury na podstawie przypisanego do niej znaku jest dobrym pomysłem (mówię tutaj o funkcji figura::pozycja()) - w zasadzie większość figur występuje w liczbie większej niż 1.

Naprawdę ciężko odnaleźć się w Twoim kodzie - analiza źródeł niestety nie pomaga. Po małej sesji debugowania: w funkcji figury1() masz taki zapis:

        if(pionek1.wysokosc==1)
            pionek1.ile=2;

W momencie wykonania tego fragmentu kodu, wartość pionek1.wysokosc wynosi 0, stąd pionek1.ile nie otrzymuje możliwości przesunięcia się o dwa pola.

Poza tym powinieneś po pierwszym ruchu usuwać możliwość tak dalekiej eskapady dla pionka. ;)

komentarz 18 kwietnia 2017 przez mamchec333 Nowicjusz (170 p.)
A w jaki sposób mógłbym zamienić tę funkcje figura::pozycja()? Bo nic mi do głowy nie przychodzi :c
komentarz 18 kwietnia 2017 przez draghan VIP (106,230 p.)
A do czego ona w ogóle ma służyć? Nie mogę za bardzo pojąć, po co ona jest, skoro przecież każda pozycja ma tak czy siak pola do określenia pozycji.
komentarz 18 kwietnia 2017 przez mamchec333 Nowicjusz (170 p.)
dzięki tej funkcji mogłem w funkcji figura::ruch() sprawdzać kierunek ruchu figur i na jaką odegłość się przemieszczają :P
komentarz 18 kwietnia 2017 przez draghan VIP (106,230 p.)
Ale przecież figura::ruch ma dostęp do składowych x, y konkretnego obiektu. Jeśli wywołujesz np. pionek1.ruch(), to x, y zawierają informacje, gdzie znajduje się pionek1. Tak samo dla każdej innej figury, którą utworzysz.
komentarz 18 kwietnia 2017 przez mamchec333 Nowicjusz (170 p.)
Tylko że x,y zawierają inforamacje gdzie gracz chciałby ustawić pionka, a następnie program miał sprawdzać czy może on go tam przestawić odejmując od  wysokosc y ,a   od szerokosc x i następnie sprawdzając czy dana figura ma możliwośc przesunąć się o tyle.(wysokosc i szerokosc są pozycją figury).
komentarz 18 kwietnia 2017 przez draghan VIP (106,230 p.)
Ech... Bardzo mylące. Jeśli jakiś obiekt ma pola x, y, to sugeruje pozycję kartezjańską tego obiektu. W takim razie dodaj do klasy pola wysokosc i szerokosc i niech każdy obiekt zna swoje położenie. Wtedy nie będzie problemu z rozpoznaniem, o którą figurę chodzi.

A tak poza tym, to fajnie by było, gdyby użytkownik podawał współrzędne zgodne z zapisem szachowym, np. Gg4-d1. Do tego musiałbyś napisać prosty parser, który rozbiłby Ci takie polecenie na trzy informacje: figurę do ruchu, pole początkowe i docelowe. Potem musiałbyś sprawdzić, czy na danym polu znajduje się zadana figura i czy może jechać na zadane pole docelowe i dopiero wykonać ewentualne przesunięcie.
komentarz 18 kwietnia 2017 przez mamchec333 Nowicjusz (170 p.)
Ten zapis szachowy w sumie jest o wiele prostszy :D Biorę się do roboty :)  Dzięki wielkie za pomoc :3
komentarz 18 kwietnia 2017 przez draghan VIP (106,230 p.)
Powodzenia. W razie problemów (spróbuj je rozwiązać samodzielnie), pisz - może akurat będę, to pomogę.

Podobne pytania

0 głosów
2 odpowiedzi 114 wizyt
pytanie zadane 14 lutego 2023 w C i C++ przez piotr_domanski Bywalec (2,080 p.)
+1 głos
1 odpowiedź 189 wizyt
pytanie zadane 6 października 2021 w C i C++ przez <młody_programista> Początkujący (450 p.)
0 głosów
3 odpowiedzi 149 wizyt
pytanie zadane 5 marca 2021 w C i C++ przez Krystian000 Nowicjusz (150 p.)

92,551 zapytań

141,399 odpowiedzi

319,531 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...