Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Incalzire in pardoseala etapizata

Suprataxa card energie?!

Cum era nivelul de trai cam din a...

probleme cu ochelarii
 Impozite pe proprietati de anul v...

teava rezistenta panou apa calda

Acces in Curte din Drum National

Sub mobila de bucatarie si sub fr...
 Rezultat RMN

Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...

Lucruri inaintea vremurilor lor
 Discuții despre TVR Sport HD.

Cost abonament clinica privata

Tremura toata, dar nu de la ro...

Renault Android
 

[C-Builder] Proiect Sah - Incarcare imagine din fisier (OOP)

- - - - -
  • Please log in to reply
62 replies to this topic

#1
enterspeed

enterspeed

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 23.12.2016
Salut. Am de facut un proiect in C-builder pentru facultate. Sah in retea. Trebuie facut cu clase pentru OOP. Am clasele: Board, Piesa si clasa cu fiecare piesa derivata din clasa Piesa (ex: Regina, Pion, Rege).

Am luat o variabila imPiesa pe care o folosesc in fiecare clasa sa incarc o imagine pentru fiecare piesa. Nu da eroare, dar nici nu-mi afiseaza imaginea. Uitati ce am pana acuma:

class Piesa
{
protected:
	 TImage *imPiesa;
	 TImage *aCal1;
public:
	 Piesa(unsigned int, unsigned int, TForm*);
	 bool capturata;
	 int color;
	 virtual void LoadImg()=0;
	 virtual ~Piesa();
};

Piesa::Piesa(unsigned int a, unsigned int b, TForm* Form1){
	 imPiesa = new TImage(Form1);
	 imPiesa -> AutoSize = false;
	 imPiesa -> Left = a;
	 imPiesa -> Top = b;
	 imPiesa -> Parent = Form1;
	 imPiesa -> Stretch = true;
	 imPiesa -> Enabled = true;
}



class whRook : public Piesa
{
private:
	 AnsiString strwhRookImg;
public:
	 whRook(unsigned int, unsigned int, TForm*);
	 void LoadImg();
};



whRook::whRook(unsigned int a, unsigned int b, TForm* Form1):Piesa(a, b, Form1){
	 strwhRookImg = "whRook1.bmp";
	 imPiesa->Left = a;
	 imPiesa->Top = b;
}
void whRook::LoadImg(){
	 imPiesa->Picture->LoadFromFile(strwhRookImg);
}


Pe net nu exista nimic care sa ma ajute cu programul asta. Ideea mea principala era sa fac o variabila piesa in care sa pun un cod. In functie de cod sa fie o anumita piesa, iar alea sa le pun cu define (ex: 13 pion, 19 tura, 22 cal) si sa pun codul la variabila din clasa piesa. Si in functie de ce cod e, vroiam sa fac sa afiseze o anumita piesa.

Nu reusesc deloc sa pun imagine pentru fiecare piesa folosind clase.

#2
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,233
  • Înscris: 11.04.2006
nu iti trebuie cod pt fieare piesa din moment ce ti-ai create ierarhia piesa-cal/pion/etc, asta-i unul din avanatajele oop.
cauta sa intelegi mecanismul de apel al functiilor virtuale ca sa simplifici treaba.

#3
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Calea catre imagine este relativa la directorul de lucru curent.


Lipseste o clasa: Player.

Culoarea nu este un atribut specific piesei dpv logistic, ci un atribut al lui Player - caci vad ca ai o clasa whRook, presupun ca vine de la "White Rook"? Existenta unei astfel de clase e gresita.

Fa Player, si fiecare Player are lista de Piesa pe care le detine.

Board contine lista de Player, cei doi.

Imaginile ce trebuie incarcate ar trebui decise dinamic pe baza unor altor atribute, aici "culoarea playerului care ma detine" si "tipul piesei". Nu setate explicit cum ai facut tu. O astfel de metoda care decide cum se numeste fisierul poate fi implementata apoi, o singura data, in clasa de baza a tuturor pieselor.

Edited by OriginalCopy, 23 December 2016 - 10:42.


#4
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Piesa si derivate contin logica despre jocul de sah. Ar trebui sa fie independente de tehnologia de afisare (adica nici o referinta spre nimic ce tine de clasele lui Borland).

Drept urmare:
  • Scoti TImage* si altele de genul din Piesa
  • Creezi o matrice 8x8 de TImage in Form pentru fundalul tablei de sah
  • Creezi o matrice 8x4 de TImage pentru piesele de sah, si asociezie fiecarei TImage un pointer la Piesa
  • Creezi o metoda abstracta virtuala ChessPieceType getType() care returneaza un enum cu ce tip de piesa e actuala
  • Definesti in Form o mapare intre ChessPieceType si numele fisierului de unde incarci imaginea (piesei de sah n-ar trebui sa-i pese de numele fisierului)
  • Incarci in Form imaginea fiecarei piese

Suplimentar:
  • Nu amesteci limbile. Ori romana, ori engleza (preferat). whRook care mostenete Piesa suna oribil
  • Nu mai prefixezi numele variabilelor cu tipul lor, gen "strCeva". Se vede ca e string cand te uiti la tipul variabilei.


#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Mi-a scapat ceva: piesa ar putea avea drept parent un pointer la jucatorul curent. Astfel, cand alegi fisierul pentru imagine, verifici si culoarea piece->getPlayer()->getColor().

#6
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Si ca sa nu fii confuz: 3 oameni diferiti ti-au dat aparent trei sfaturi diferite. Doar aparent. Ceea ce am spus toti trei se completeaza reciproc, nu sunt conflicte. Aplica tot ce ti s-a spus.

#7
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,233
  • Înscris: 11.04.2006

Quote

Mi-a scapat ceva: piesa ar putea avea drept parent un pointer la jucatorul curent. Astfel, cand alegi fisierul pentru imagine, verifici si culoarea piece->getPlayer()->getColor().
cred ca il complici prea mult Posted Image logic piesa nu stie cine-o controleaza si nici nu tre sa stie, jucatorul stie ce controleaza. iar culoarea e proprietate a piesei nu a jucatorului. dar asta e o discutie asa, mai filozofica.

Edited by andreim77, 23 December 2016 - 10:48.


#8
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 andreim77, on 23 decembrie 2016 - 10:48, said:

cred ca il complici prea mult Posted Image logic piesa nu stie cine-o controleaza si nici nu tre sa stie, jucatorul stie ce controleaza. iar culoarea e proprietate a piesei nu a jucatorului. dar asta e o discutie asa, mai filozofica.
Din exterior, Piesa ar avea un getter pentru culoare, da, dar adevaratul "single source of truth" pentru culoare e in Player.

Un scop e minimizarea numarului de "source of truth", "single" e idealul, si Playerii au inerent deja culor, deci... de ce sa cream duplicate?

Dar da, putem filozofa mult pe acest subiect, exista si alte abordari la fel de curate, genul: Piesa nu are setter pentru culoare, si Player are factory method pentru piese, iar la constructie Player seteaza culoarea sa in piesa.

#9
enterspeed

enterspeed

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 23.12.2016
Momentan ma uitam la ce a zis dani.

O sa schimb toate numele in engleza ca sa fie mai bine.

Eu cam am o nebunie pe-aici: [ https://i.imgur.com/kXakHqx.png - Pentru incarcare in pagina (embed) Click aici ]

Hai sa o luam pe rand.
  • Creezi o matrice 8x8 de TImage in Form pentru fundalul tablei de sah : Adica in Chess.h sa am TImage *Board la published si la public board[8][8]?


#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Eu ma gandesc asa: care-i responsabilitatea piesei? Sa stie unde poate muta si unde nu. Difera acest comportament functie de culoarea piesei? Eu zic ca nu, deci piesa n-ar trebui sa fie direct interesata de ce culoare are. Un caz mai aparte ar fi cand iei alta piesa sau cand decizi daca regele se poate apropia de alt rege, dar si aici s-ar putea sa fie suficient ca piesa sa compare doar pointerii la Player pentru a observa daca e langa o piesa prietena sau inamica.

 enterspeed, on 23 decembrie 2016 - 10:59, said:

Hai sa o luam pe rand.
  • Creezi o matrice 8x8 de TImage in Form pentru fundalul tablei de sah : Adica in Chess.h sa am TImage *Board la published si la public board[8][8]?

Aici apare un mic conflict. Ideea de matrice 8x8 cu fundalul e gandita pentru cand generezi interfata din cod, nu drag&drop cu mouse-ul. Acum, tabla de sah fiind una singura si neschimbandu-se pe parcursul jocului, poti s-o tratezi ca pe o singura imagine pe care o plasezi undeva si atat, nu-i mai faci nimic pe parcursul jocului.

Cand vine vorba insa de piese, plasarea cu mouse-ul a 32 de piese e overkill. Asadar, pentru acest al doilea pas va trebui sa inveti sa generezi partea asta de interfata din cod, mai ales ca plasezi totul pe o matrice, deci e banala aflarea coordonatelor la care pozitionezi piesele relativ la tabla.

#11
enterspeed

enterspeed

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 23.12.2016
Ma gandeam sa am clasa Board in care sa am un TImage *imBoard si tot acolo sa pun board[8][8].
Dupa, in clasa Piece sa am TImage *imPiece si cu piece[8][4].

Nu merge si asa? Sau trebuie neaparat in Form? Daca trebuie in Form, nu stiu cum sa scriu.

#12
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 dani.user, on 23 decembrie 2016 - 11:06, said:

Eu ma gandesc asa: care-i responsabilitatea piesei? Sa stie unde poate muta si unde nu. Difera acest comportament functie de culoarea piesei? Eu zic ca nu, deci piesa n-ar trebui sa fie direct interesata de ce culoare are. Un caz mai aparte ar fi cand iei alta piesa sau cand decizi daca regele se poate apropia de alt rege, dar si aici s-ar putea sa fie suficient ca piesa sa compare doar pointerii la Player pentru a observa daca e langa o piesa prietena sau inamica.
Piesa trebuie doar sa fie capabila sa spuna lista de coordonate la care ea poate fi mutata pe o tabla de joc goala dintr-o singura mutare, data fiind o coordonata curenta ca parametru, nelegat de starea curenta a jocului, culoarea jucatorului, etc.

Jucatorul e cel care controleaza piesa in realitate, deci asa ar fi si in cod. Si Player stie care e el si care e celalalt. El decide de exemplu "calul mi-a dat lista asta de coordonate posibile, dar din ele nu pot muta aici si aici pentru ca acolo am deja alte piese".

Asa s-ar respecta toate principiile de OOP curat.

 enterspeed, on 23 decembrie 2016 - 11:19, said:

Ma gandeam sa am clasa Board in care sa am un TImage *imBoard si tot acolo sa pun board[8][8].
Dupa, in clasa Piece sa am TImage *imPiece si cu piece[8][4].

Nu merge si asa? Sau trebuie neaparat in Form? Daca trebuie in Form, nu stiu cum sa scriu.
Intr-un design curat, ai nevoie de doua "clase Board", una pentru vizualizare, si una strict pentru logica jocului.

Eu zic sa incepi de la zero un nou proiect, si doar copy/paste pe sarite.

In acest nou proiect, fa doua directoare, unul src/chess/ si unul src/plugin/gui/

In src/chess/ nu ai ce sa cauti cu absolut nicio clasa sau interfata de desenat, nu tu timage, nu tu form/controls/whatever, doar C++ scris de tine.

Edited by OriginalCopy, 23 December 2016 - 11:31.


#13
enterspeed

enterspeed

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 23.12.2016

 OriginalCopy, on 23 decembrie 2016 - 11:29, said:

Piesa trebuie doar sa fie capabila sa spuna lista de coordonate la care ea poate fi mutata pe o tabla de joc goala dintr-o singura mutare, data fiind o coordonata curenta ca parametru, nelegat de starea curenta a jocului, culoarea jucatorului, etc.

Jucatorul e cel care controleaza piesa in realitate, deci asa ar fi si in cod. Si Player stie care e el si care e celalalt. El decide de exemplu "calul mi-a dat lista asta de coordonate posibile, dar din ele nu pot muta aici si aici pentru ca acolo am deja alte piese".

Asa s-ar respecta toate principiile de OOP curat.


Intr-un design curat, ai nevoie de doua "clase Board", una pentru vizualizare, si una strict pentru logica jocului.

Eu zic sa incepi de la zero un nou proiect, si doar copy/paste pe sarite.

In acest nou proiect, fa doua directoare, unul src/chess/ si unul src/plugin/gui/

In src/chess/ nu ai ce sa cauti cu absolut nicio clasa sau interfata de desenat, nu tu timage, nu tu form/controls/whatever, doar C++ scris de tine.

Pai si pana la urma ce scriu in src/chess? Codul C++ pe care vreau sa-l scriu este legat de clase.

#14
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 enterspeed, on 23 decembrie 2016 - 11:35, said:

Pai si pana la urma ce scriu in src/chess? Codul C++ pe care vreau sa-l scriu este legat de clase.
Codul usor testabil, scris de tine de la zero, indiferent de interfata grafica. Logica pura a jocului, in termeni abstracti.

Cine va invata programare face o greseala fundamentala: nu va invata TDD cat mai de la inceput.

Uite un exemplu de proiect facut in C, decuplat corect, de liceeni si studenti activi pe forum pe aici: https://github.com/C...tree/master/src

src/chess/ e analogul tau pentru subdirectorul libCruceGame/, o biblioteca reutilizabila - ca dovada ca acel joc are interfata de consola, si bindings pentru .NET, si ar fi usor sa ii faca o interfata grafica si o interfata web sau openGl.

Edited by OriginalCopy, 23 December 2016 - 11:41.


#15
enterspeed

enterspeed

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 23.12.2016

 OriginalCopy, on 23 decembrie 2016 - 11:38, said:

Codul usor testabil, scris de tine de la zero, indiferent de interfata grafica. Logica pura a jocului, in termeni abstracti.

Cine va invata programare face o greseala fundamentala: nu va invata TDD cat mai de la inceput.

Uite un exemplu de proiect facut in C, decuplat corect, de liceeni si studenti activi pe forum pe aici: https://github.com/C...tree/master/src

src/chess/ e analogul tau pentru subdirectorul libCruceGame/, o biblioteca reutilizabila - ca dovada ca acel joc are interfata de consola, si bindings pentru .NET, si ar fi usor sa ii faca o interfata grafica si o interfata web sau openGl.

E prea greu asa.

#16
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006

 enterspeed, on 23 decembrie 2016 - 11:47, said:

E prea greu asa.
Ma indoiesc. Esti mult peste nivelul acelor liceeni la momentul in care ei au inceput proiectul, si ei au reusit.

Faptul ca tu n-ai incredere in propriile forte e o alta problema, nu de natura tehnica.

Edited by OriginalCopy, 23 December 2016 - 12:01.


#17
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,233
  • Înscris: 11.04.2006
pe masura ce analiza sau chiar implementarea avanseaza iti dai seama cum se poate simplifica programul.
eu vad 2 unghiuri de abordare care converg pana la urma:
- abstract: nu culoarea conteaza ci carui jucator apartine piesa, apartenenta automata prin compozitie Jucator::piese[16], jucatorul is va muta propriile piese, nu are acces la ale adversarului.
- real, aceeasi tabla de joc poate fi folosita de mai multi jucatori sau la finalul jocului pot face schimbarea culorilor pt jocul urmator. oop modeleaza realitatea, jucatorul va folosi piesele albe sau cele negre, deci modelarea ar putea fi: clasa pt jucator, clasa joc cu o tabla si cele doua seturi de piese, sa zicem 2 vectori pieseAlbe/Negre[16]. intr-un joc, jucator1::piese=Joc::pieseAlbe, in urmatorul, jucator1::piese=Joc::pieseNerge.

Acum ramane de filozofat despre cine sa tina locul in care se afla piesele: tabla de joc sau piesa sa pastreze coordonata? eu raman la parerea ca piesa nu are habar ce-i cu ea, responsabilitatile ei sunt limitate, ea tre sa stie doar ce tip de piesa e ca stie cum arata si cum muta, nu se poate muta singura, jucatorul o muta, in functie de reguli (deci un set de reguli ar trebui modelat de asemenea). deci pozitiile pieselor ar trebui pastrate in tabla de joc cum se si intampla in realitate, tabla de joc are coordonatele nu piesa. astfel incat, atunci cand mut pot sa detectez mutari ilegale, sa verific daca nu am in cale o piesa proprie, daca nu e un rege pe care nu-l pot hali la pozitia x,y, etc.

#18
enterspeed

enterspeed

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 23.12.2016
Si pana la urma cum incarc o imagine din fisier in C-builder?

Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate