[C-Builder] Proiect Sah - Incarcare imagine din fisier (OOP)
Last Updated: Nov 07 2018 11:54, Started by
enterspeed
, Dec 23 2016 10:26
·
0
#19
Posted 23 December 2016 - 13:56
Sa-mi mai spuna cineva odata ce trebuie sa am in fiecare clasa va rog. Adica ce functii.
|
#20
Posted 23 December 2016 - 14:50
Cineva care stie C-Builder poate sa imi arate si mie cum se face Sah cu clase?
Gen ca programul asta: https://people.duke....land/chess2.txt Nu stiu in ce clase sa pun functiile de mai sus si nici cum sa le pun (virtual, protected, public). Un mic ajutor ar fi generos. Vreau sa fac separat clasa Board, clasa Piece si alte clase si in fiecare sa pun functiile corespunzatoare, iar in clasa aia pre-definita din c-builder sa am doar astea cu void __fastcall De exemplu am clasa pre-definita: void __fastcall TForm1::ButtonSetUpBoardClick(TObject *Sender) { setupBeginGame(); } Si in clasa board sa am: void setupBeginGame (void) { // INTERNAL REPRESENTATION // Set board to empty or not for (row = 0; row < 8; row++) { for (col = 0; col < 8; col++) { if (row > 1 && row < 6) board[row][col].empty = true; else board[row][col].empty = false; } } // INTERNAL REPRESENTATION // Set board.piece to their appropriate IDs for (col = 0; col < 8; col++) { board[0][col].piece = col + 0; board[1][col].piece = col + 8; board[6][col].piece = col + 16; board[7][col].piece = col + 24; } // GRAPHIC USER INTERFACE // Show All Pices for (int i = 0; i < 32; i++) hideShow(i, SHOW); // Move All Pieces to the Starting Position for (int i = 0; i < 32; i++) { if (i < 16) movePiece(i, i%8, i/8); else movePiece(i, i%8, i/8 + 4); } } Dar dupa da eroare ca nu am row si col si trebuie cumva sa le definesc sa pot fi folosite in orice clasa. Si la fel cu functia void MovePiece. Pe aia sa zicem ca o bag in clasa Piece, dar vreau ca si clasa board sa o ia in considerare cand o foloseste. Edited by enterspeed, 23 December 2016 - 14:51. |
#21
Posted 23 December 2016 - 15:46
enterspeed, on 23 decembrie 2016 - 13:56, said:
Sa-mi mai spuna cineva odata ce trebuie sa am in fiecare clasa va rog. Adica ce functii. [ https://i.imgur.com/BixkksR.png - Pentru incarcare in pagina (embed) Click aici ] Piece cu subclasele sale: [ https://i.imgur.com/W7z5g6Z.png - Pentru incarcare in pagina (embed) Click aici ] Update: [ https://i.imgur.com/MSDO3FI.png - Pentru incarcare in pagina (embed) Click aici ] Daca vrei sa inveti cum se programeaza curat, lasa "C++ Builder" deoparte pentru o vreme, si fa dezvoltarea strict in C++, folosind 0 alte biblioteci, si folosind TDD. Avantaj: e un antrenament bun si la sfarsit vei fi angajabil ca junior. Apoi treci la interfata efectiva, ca o fi ea C++ Builder sau altceva. In interfata doar vei folosi biblioteca asta deja construita intre timp. |
#22
Posted 23 December 2016 - 15:46
Mersi. Am o mica problema. Am o functie in clasa Board si vreau sa o accesez in clasa pre-definita din c-builder, cam asa:
void __fastcall TfJoc::btnStartClick(TObject *Sender) { setupBeginGame(); } Imi da eroarea asta: Call to undefined function 'setupBeginGame' Cum fac sa o pot accesa? (functia este publica in clasa Board)
Edited by dani.user, 23 December 2016 - 16:10.
|
#23
Posted 23 December 2016 - 15:50
#24
Posted 23 December 2016 - 15:54
#25
Posted 23 December 2016 - 16:00
Nu cunosc acest C++ Builder, dar o idee simpla ar fi:
In functia main() iti creezi o instanta src/chess/Board, si o salvezi ca membru in diferitele formulare / dialoguri / etc, in care ai nevoie de ceva legat de joc. In acele formulare nu faci nimic legat de logica jocului, ci doar de afisare. Cand vrei sa faci ceva ce tine de logica jocului, doar apelezi functii ale board, de exemplu in cazul concret despre care intrebi: this->board->resetStartPosition(); Cineva cu cunostinte de C++ Builder iti poate raspunde la intrebare, dar dupa cum am spus: nu te grabi cu acest C++ Builder, tu fa mai intai TDD si focuseaza-te pe jocul efectiv, nu pe interfata grafica. E usor apoi sa ii tragi o interfata grafica peste. dani.user, on 23 decembrie 2016 - 15:54, said:
Da, dar diagrama ta e mai completa
|
#26
Posted 23 December 2016 - 16:05
OriginalCopy, on 23 decembrie 2016 - 16:00, said:
Nu cunosc acest C++ Builder, dar o idee simpla ar fi: In functia main() iti creezi o instanta src/chess/Board, si o salvezi ca membru in diferitele formulare / dialoguri / etc, in care ai nevoie de ceva legat de joc. In acele formulare nu faci nimic legat de logica jocului, ci doar de afisare. Cand vrei sa faci ceva ce tine de logica jocului, doar apelezi functii ale board, de exemplu in cazul concret despre care intrebi: this->board->resetStartPosition(); Cineva cu cunostinte de C++ Builder iti poate raspunde la intrebare, dar dupa cum am spus: nu te grabi cu acest C++ Builder, tu fa mai intai TDD si focuseaza-te pe jocul efectiv, nu pe interfata grafica. E usor apoi sa ii tragi o interfata grafica peste. Da, dar diagrama ta e mai completa Mersi de diagrame. O sa incerc sa fac asa acum ca am o mai mare idee despre ce sa fac. Legat de ce ziceam adineauri, nu are legatura neaparat cu C-Builder. E vorba de o functie dintr-o clasa care sa poata fi folosita si in alta clasa. |
#27
Posted 23 December 2016 - 16:12
enterspeed, on 23 decembrie 2016 - 15:46, said:
Am o functie in clasa Board si vreau sa o accesez in clasa pre-definita din c-builder, cam asa: Altfel intorci directia dependintelor pe dos. O biblioteca reutilizabila precum "libChessGame" nu are voie sa depinda da tehnologii concrete - precum C++ Builder. Dependinta e invers: interfata grafica depinde de libChessGame. In interfata grafica apelezi functii din libChessGame, nu invers. enterspeed, on 23 decembrie 2016 - 16:05, said: Mersi de diagrame. O sa incerc sa fac asa acum ca am o mai mare idee despre ce sa fac. Legat de ce ziceam adineauri, nu are legatura neaparat cu C-Builder. E vorba de o functie dintr-o clasa care sa poata fi folosita si in alta clasa. Aceasta abordare are multe avantaje: 1. te pregateste pentru a deveni angajabil 2. iti da posibilitatea sa "cresti" impreuna cu codul: pe masura ce programezi, se rafineaza si modelul tau mental al codului. 3. Calitate superioara / decuplare mare, s.a.m.d. Documenteaza-te despre TDD. Projectul de pe github iti prezinta o librarie de testare, cred ca ai acolo toata infrastructura necesara pentru a porni, inclusiv Makefiles & co. |
#28
Posted 23 December 2016 - 16:18
OriginalCopy, on 23 decembrie 2016 - 16:12, said:
In clasele din src/chess/ nu accesezi niciodata nimic altceva decat clase aflate deasemenea in src/chess/ - clase scrise de tine manual. Altfel intorci directia dependintelor pe dos. O biblioteca reutilizabila precum "libChessGame" nu are voie sa depinda da tehnologii concrete - precum C++ Builder. Dependinta e invers: interfata grafica depinde de libChessGame. In interfata grafica apelezi functii din libChessGame, nu invers. Lasa deoparte acest C++ Builder, si fa TDD "din consola" pentru a-ti programa mai intai libChessGame. Aceasta abordare are multe avantaje: 1. te pregateste pentru a deveni angajabil 2. iti da posibilitatea sa "cresti" impreuna cu codul: pe masura ce programezi, se rafineaza si modelul tau mental al codului. 3. Calitate superioara / decuplare mare, s.a.m.d. Documenteaza-te despre TDD. Projectul de pe github iti prezinta o librarie de testare, cred ca ai acolo toata infrastructura necesara pentru a porni, inclusiv Makefiles & co. Ok. Ma voi documenta. Mersi! Edited by enterspeed, 23 December 2016 - 16:18. |
|
#29
Posted 23 December 2016 - 16:20
Partea de testare din acel proiect e prea tintita spre linux.
Pana te prinzi cum sta treaba, un proiect de test poate fi ceva simplu: o aplicatie tip consola unde ai diverse functii pt fiecare test si pe care le apelezi pe toate din main. |
#30
Posted 23 December 2016 - 16:59
dani,
la ce iti trebuie getPieceType? mostenirea si functiile virtuale o sa-ti automatizeze procesul, sa lucreze cu piese, nu cu turn, cal, pion, etc. |
#32
Posted 23 December 2016 - 17:15
si nu poti face asta tot cu virtuale? in loc de if(cal)... else if(turn) else..... else else...?
|
#33
Posted 23 December 2016 - 17:20
pai getPieceType() ar fi acea virtuala. Si in view are o functie pe undeva care returneaza un string pentru ce se intampla sa returneze getPieceType(). Concatenat apoi cu culoarea player-ului, obtine calea catre imagine.
|
|
#34
Posted 23 December 2016 - 17:24
eu vad un enum in dreapta, la ce-ti mai trebuie daca oricum ai ierarhia pieasa<--pion/turn?
in cazul asta pt ca piesele au asociate o imagine fixa, cred ca se poate simplifica f mult punand in clasa piesa (baza) un string catre calea cu imagine care ori e fixa ori o setezi in contructor sau cu un setter. si atunci functia de desenare va prima calea spre imagine (piesa->getImagePath()). |
#35
Posted 23 December 2016 - 17:27
andreim77, on 23 decembrie 2016 - 17:24, said:
eu vad un enum in dreapta, la ce-ti mai trebuie daca oricum ai ierarhia pieasa<--pion/turn? in cazul asta pt ca piesele au asociate o imagine fixa, cred ca se poate simplifica f mult punand in clasa piesa (baza) un string catre calea cu imagine care ori e fixa ori o setezi in contructor sau cu un setter. si atunci functia de desenare va prima calea spre imagine (piesa->getImagePath()). Imagineaza-ti de exemplu ca faci o interfata pentru oameni cu dizabilitati, si "calea catre imagine" trebuie sa fie un .wav. Sau o interfata OpenGL, unde "imaginea" trebuie sa fie un model 3D salvat deja in memorie - deci nu are o cale anume. |
#36
Posted 23 December 2016 - 17:46
ok, dar cu enum o sa ai if in if in if si tot asa pt fiecare enum: tipuri de piese, tipuri de output, etc.
in cazul asta pt piese tipul lor e fix si mic. dar cand apare un nou tip de output? mai pun un enum in tipul de output, mai adaugi un if, mai compilezi tot. se poate abstractiza mai departe, cu o interfata PieceRenderer { void renderPiece()=0; } or something din care derivezi, PieceDrawer, PieceSpeller, Piece3DRenderer, etc. care va lucra cu piese nu call, turn, etc. si scapi de enum, if... |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users