Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Idei cale de actiune recuperare g...

Intoleranța lactoza- vegan v...

Cine canta? Fragment din melodie...

Tablou sigurante Dacia Sandero 2012
 Baby Reindeer - 2024

Hotii voteaza hoti?!

Camera video masina

Zilele emailului din gospodaria n...
 Best gaming laptop?

Humane (2024)

Recomandare casti 100-150 lei

Schimbare bec far VW Touran 1T3
 Plata impozit PF

Ce parere aveti de viteza/ modul ...

Love Lies Bleeding - 2024

Cum sterg mails din Promotions
 

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

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

#37
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
Enumul e un intreg, n-ai nevoie de if/if/if.

#38
OriginalCopy

OriginalCopy

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

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

 andreim77, on 23 decembrie 2016 - 17:46, said:

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.
1. Nu, pentru renderingul imaginii ai avea un helper in view layer care accepta ChessPieceType ca parametru, si returneaza un string ce poate fi folosit in crearea caii catre imagine.

2. Sau view helper ia intreaga Piece, care are si pointer catre Player, si returneaza calea.

Oricare ar fi, 1 sau 2, e oarecum un detaliu pana la urma urmei.

Nu ai if in if cu oricare dintre abordari in acest view helper, ci un switch.

#39
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,235
  • Înscris: 11.04.2006
dar tot il testezi, nu?
if(piesa==turn) {
if(output==jpg) desenazaTurn()
else if (output==wav) playTurn()
...
} else if(piesa=pion) {
....
}

switch, if, tot niste ramuri care trebuie actualizate pt orice tip nou de output.

Edited by andreim77, 23 December 2016 - 17:55.


#40
OriginalCopy

OriginalCopy

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

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

 andreim77, on 23 decembrie 2016 - 17:54, said:

dar tot il testezi, nu?
if(piesa==turn) {
if(output==jpg) desenazaTurn()
else if (output==wav) playTurn()
...
} else if(piesa=pion) {
....
}
Ok, imi voi rafina raspunsul anterior:

prin faptul ca ai diferite interfete nu ma refer la ingramadirea diferitelor interfete intr-o singura componenta, ci la posibilitatea (flexibilitatea) de a avea diferite componente (numeste-le plug-ins, namespaces, packages, whatever fits you), fiecare cu specificul sau, fara ca, in libChessGame, care e generic, sa fortezi o anumita structura.

Daca ai returna un string din libChessGame, ai avea o functie care "atarna in aer" dpv logistic in acele interfete in care nu e vorba despre niciun fisier - ci de asset-uri in RAM sau cine mai stie ce.

Tocmai asta e ideea: ca nu stii, si nu ar trebui sa-ti pese, ce fel de interfete vor folosi biblioteca ta generica libChessGame.

Quote

dar tot il testezi, nu?
Deci nu, nu il testezi, in interfata pe care o va construi in C++ Builder, el stie cu certitudine ca va desena imagini.

Dar poate peste un an va face o interfata in OpenGL. Un alt proiect, complet nou, diferit de interfata scrisa in C++ Builder.

Edited by OriginalCopy, 23 December 2016 - 18:02.


#41
enterspeed

enterspeed

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 23.12.2016
Cum e mai simplu de facut? Sa fac o variabila id si sa am cate un id = ? la fiecare piesa? Sau sa pun cu #define ? (#define Pawn 1, #define Rook 2, #define white/black)

#42
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
Sa pui un ... enum?

#43
OriginalCopy

OriginalCopy

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

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

 enterspeed, on 23 decembrie 2016 - 18:02, said:

Cum e mai simplu de facut? Sa fac o variabila id si sa am cate un id = ? la fiecare piesa? Sau sa pun cu #define ? (#define Pawn 1, #define Rook 2, #define white/black)
Defineste problema pe care incerci sa o rezolvi.

Diagrama lui dani.user iti spune practic ce ai de facut, nu vad loc de niciun id deocamdata.

#44
enterspeed

enterspeed

    Junior Member

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

 OriginalCopy, on 23 decembrie 2016 - 18:05, said:

Defineste problema pe care incerci sa o rezolvi.

Diagrama lui dani.user iti spune practic ce ai de facut, nu vad loc de niciun id deocamdata.

In ChessPieceType alea le scriu cu enum?

#45
OriginalCopy

OriginalCopy

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

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

 enterspeed, on 23 decembrie 2016 - 18:09, said:


In ChessPieceType alea le scriu cu enum?
ChessPieceType este un enum, da, asta inseamna E-ul in cercul rosu din diagrama.

#46
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,235
  • Înscris: 11.04.2006
as vrea sa vad interfata care asigura "afisarea" pieselor catre jucator (jpg, wav, etc) cu acele enum la treaba. care cumva duplica ierarhia pieselor.

#47
OriginalCopy

OriginalCopy

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

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
In proiectul C++ Builder, ar avea ceva de genul:
imPiesa->Picture->LoadFromFile(build_image_path_for_piece(piece));

In alt proiect pentru dizabilitati ar avea:

play_sound(build_sound_path_for_piece(piece));

Sunt proiecte complet diferite, disjuncte, nu ai if-uri in functie de tipul interfetei, pentru ca interfata insasi stie deja ce fel de interfata este.

build_image_path_for_piece sau build_sound_path_for_piece sunt helperele despre care vorbeam. In ele ai switch in functie de acel ChessPieceType. Nu if in if.

 andreim77, on 23 decembrie 2016 - 18:13, said:

care cumva duplica ierarhia pieselor.
Nu duplica nimic, din contra, separa concerns: logica jocului (libChessGame) de vizualizare.

 andreim77, on 23 decembrie 2016 - 17:54, said:

switch, if, tot niste ramuri care trebuie actualizate pt orice tip nou de output.
switch-ul ar trebui actualizat pentru noi tipuri de piese de sah, nu pentru tipurile de interfata.

Interesting fact: in Rust, programul nici nu ar compila intr-o astfel de situatie, daca scrii codul curat, pentru ca match necesita matching exhaustiv: https://doc.rust-lan...ook/match.html.

Edited by OriginalCopy, 23 December 2016 - 18:26.


#48
andreim77

andreim77

    Senior Member

  • Grup: Senior Members
  • Posts: 4,235
  • Înscris: 11.04.2006
si in toate build alea o sa ai un switch sa testezi piesa. ok. noroc ca tipul de piese in jocul asta e fix. altfel...

bine, mai filozofam zilele urmatoare.

#49
OriginalCopy

OriginalCopy

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

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

 andreim77, on 23 decembrie 2016 - 18:27, said:

si in toate build alea o sa ai un switch sa testezi piesa. ok. noroc ca tipul de piese in jocul asta e fix. altfel...

bine, mai filozofam zilele urmatoare.
Normal ca ai switch in fiecare, pentru ca fiecare interfata are specificul ei.

Sunt multe lucruri pe marginea carora am putea filozofa, dar acesta nu este unul dintre ele.

Vorbim despre separation of concerns, despre "model vs view", sau cum vrei tu sa le botezi.

Sau sa punem altfel problema:

daca ai un bug in afisare, unde cauti mai degraba cauza, in view layer (proiectul C++ Builder) sau in biblioteca generica libChessGame?

#50
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
De ce sa testezi piesa?
std::string imagePath = std::string("chess_piece-") + std::to_string(static_cast<int>(piece->getType())) + std::to_string(static_cast<int>(piece->getPlayer->getColor())) + std::string(".jpg");


Edited by dani.user, 23 December 2016 - 18:32.


#51
enterspeed

enterspeed

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 23.12.2016
enum ChessPieceType { Pawn, Knight, Bishop, Rook, Queen, King }; -> se pun in .h sau .cpp?

Edit: nvm, se pun in .h

Edited by enterspeed, 23 December 2016 - 18:57.


#52
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,239
  • Înscris: 24.02.2007
In .h, e ceva de interes larg, nu doar local.

#53
OriginalCopy

OriginalCopy

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

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

 enterspeed, on 23 decembrie 2016 - 18:55, said:

enum ChessPieceType { Pawn, Knight, Bishop, Rook, Queen, King }; -> se pun in .h sau .cpp?

Edit: nvm, se pun in .h
Tare am senzatia ca tu nu faci TDD.

#54
enterspeed

enterspeed

    Junior Member

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

 OriginalCopy, on 23 decembrie 2016 - 18:59, said:

Tare am senzatia ca tu nu faci TDD.

Nu fac ca nu-mi ajunge timpul.

Cum scriu getName() : String ?

Edited by enterspeed, 23 December 2016 - 19:31.


Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

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