-
Posts
228 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Store
Downloads
Everything posted by Cdorsu
-
In functie de limbajul in care a fost scris, exista mai multe decompilatoare, deci mi-ar fi aproape imposibil sa-ti dau un anumit program care sa decompileze fara ca eu sa stiu mai multe detalii despre program. Cauta tu pe internet decompilator pentru limbajul in care a fost scris.
-
@@TimeLine, cred ca ar trebui sa folosesti un decompilator ( vezi sa fie unul bun, care sa reziste la fisiere mai mari ), faci rost de cod, modifici codul dupa bunul plac si compilezi.
-
@@TimeLine, vrei sa modifici doar numele lui si imaginea sau codul sursa?
-
Sincer, nu mi se pare un program chiar atat de bun... E doar o simpla folosire a functiei rand(). Acele numere sunt orice, dar numai alese aleator nu...
-
Asta e doar in cazul in care vrem sa folosim vectorii din C sau pointeri. Si, in plus, ai putea explica de ce ai pus (v+1, v+49) si nu altfel. Daca vrem sa folosim containerele secventiale, trebuie sa folosim iteratori.
-
Sper sa intelegeti, cat de cat. Sa trecem la cod. Am sarit peste explicatiile despre cum se face o fereastra si cum ne "ocupam" de mesajele primite de la utilizator. Daca aveti intrebari, nu ezitati sa le puneti in comentarii. Nota: E posibil ca pe unele compilatoare sa nu ruleze.
- 1 reply
-
2
-
N-ai inteles ce am vrut sa spun prin "log sistem". Am vrut sa spun ca poti sa scrii intr-un fisier ora exacta la care s-a intamplat un lucru. Exemplu: ora la care s-a initializat un anumit obiect, daca s-a incarcat un anumit lucru sau lucruri de genul asta, lucruri pe care le faci direct din cod.
-
Pentru moment, dar daca, in viitor, se va schimba calea catre fisierul Windows si fisierul va fi pus intr-un fisier din alt fisier dintr-un alt fisier care se afla pe o partitie la care trebuie sa fii redirectionat din alt fisier din alta partitie? ) ) Trebuie sa fii pregatit. Vorbesc cam mult in seara asta ...
-
Cred ca e foarete folositor acest tutorial in cazul in care doriti sa faceti un "log sistem" sau doar doriti sa afisati ceasul. #include <chrono>//chrono namespace #include <ctime>//time_t, localtime #include <iostream>//std::cout #include <windows.h>//HANDLE, SetConsoleCursorPosition int main() { while(true)//loop continuu { system("CLS"); auto durNow = std::chrono::system_clock::now(); // Luam timpul din sistem time_t ttTime = std::chrono::system_clock::to_time_t(durNow); //Il transformam in time_t struct tm* tmTime = localtime(&ttTime); //time_t-ul in transformam cu ajutorul functiei localtime in struct tm* SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),{35,12}); //Setam cursorul std::cout<<tmTime->tm_hour<<" : "<<tmTime->tm_min<<" : "<<tmTime->tm_sec; // Afisam in formal HH : MM : SS } }
-
Cred ca ar fi mai bine sa folosesti MAX_PATH in loc de acel 256 e putin mai sigur si mai usor de inteles.
-
Nu prea-mi place pawno si, in plus, nici macar nu ma mai joc sa:mp...
-
Ar fi frumos daca ai putea calcula radicali de ordin N. Astept sa revii cu codul modificat.
-
Totusi, ce inseamna toate acele argumente "NULL"? Inafara de filePath si SW_SHOWNORMAL nu prea inteleg ce sunt celelalte argumente.
-
Pe langa metoda clasica de conversii: #include <iostream> int main() { void* pvValoare = new int(3); int iValoare = *(int*)(pvValoare); } exista si unele metode de conversii care se axeaza destul de mult pe pointer: dynamic_cast, static_cast, const_cast si reinterpret_cast. Toate avand acelasi tip de argument si aceeasi metoda de folosire. dynamic_cast<tip_in_care_dorim_sa_facem_conversia>(argument); static_cast<tip_in_care_dorim_sa_facem_conversia>(argument); reinterpret_cast<tip_in_care_dorim_sa_facem_conversia>(argument); const_cast<tip_in_care_dorim_sa_facem_conversia>(argument); O sa vorbesc putin despre fiecare. O sa incep cu cel mai usor: const_cast Face conversii intre tipuri de date constante si neconstante. #include <iostream> int main() { const char* pcText = "Text"; char* pcText1 = pcText; } Codul de mai sus va produce o eroare, pe cand codul de mai jos nu. #include <iostream> int main() { const char* pcText = "Text"; char* pcText1 = const_cast<char*>(pcText); } reinterpret_cast Converteste un pointer catre orice alt tip de pointer. #include <iostream> class clasa_mea { private: int m_iValoare; public: clasa_mea(int arg):m_iValoare(arg) {}; }; class clasa_mea1 { private: int m_iValoare; public: clasa_mea1(int arg):m_iValoare(arg) {}; void print() { std::cout<<m_iValoare; }; }; int main() { clasa_mea* pcmPointer = new clasa_mea(3); clasa_mea1* pcm1Pointer = pcmPointer; pcm1Pointer->print(); } Codul de mai sus produce o eroare, codul de mai jos nu produce o eroare. #include <iostream> class clasa_mea { private: int m_iValoare; public: clasa_mea(int arg):m_iValoare(arg) {}; }; class clasa_mea1 { private: int m_iValoare; public: clasa_mea1(int arg):m_iValoare(arg) {}; void print() { std::cout<<m_iValoare; }; }; int main() { clasa_mea* pcmPointer = new clasa_mea(3); clasa_mea1* pcm1Pointer = reinterpret_cast<clasa_mea1*>(pcmPointer); pcm1Pointer->print(); } static_cast Converteste un pointer catre o clasa familiara (mostenitoare sau mostenita) #include <iostream> class clasa_mea { public: int m_iValoare; clasa_mea(int arg):m_iValoare(arg) {}; }; class clasa_mea1:public clasa_mea { private: int m_iValoare1; public: void print() { std::cout<<m_iValoare<<' '<<m_iValoare1; }; }; int main() { clasa_mea* pcmPointer = new clasa_mea(3); clasa_mea1* pcm1Pointer = pcmPointer; pcm1Pointer->print(); } Acest cod produce eroare si, cred ca deja v-ati prins, codul de mai jos nu. #include <iostream> class clasa_mea { public: int m_iValoare; clasa_mea(int arg):m_iValoare(arg) {}; }; class clasa_mea1:public clasa_mea { private: int m_iValoare1; public: void print() { std::cout<<m_iValoare<<' '<<m_iValoare1; }; }; int main() { clasa_mea* pcmPointer = new clasa_mea(3); clasa_mea1* pcm1Pointer = static_cast<clasa_mea1*>(pcmPointer); pcm1Pointer->print(); } static_cast va apela constructorul care are un singur parametru. static_cast poate face conversii intre tipuri numerice. Exemplu: int->float, float->int static_cast poate face conversii catre o referinta rvalue. static_cast poate face conversii intre o enumeratie si un int. dynamic_cast Poate face conversii doar cu pointeri si referinte (sau void*) intre clase familiare #include <iostream> class clasa_baza { private: int m_iValoare; public: clasa_baza(int arg):m_iValoare(arg) {}; virtual void Ceva() { }; void Print() { std::cout<<m_iValoare; }; int GetValoare() { return m_iValoare; }; }; class clasa_derivata:public clasa_baza { int m_iValoare; public: clasa_derivata(int arg, int arg1):clasa_baza(arg1), m_iValoare(arg) {}; void print() { std::cout<<m_iValoare<<' '<<GetValoare(); }; }; int main() { clasa_baza* pcbPointer = new clasa_derivata(5,3); clasa_derivata* pcdObiect1 = pcbPointer; pcdObiect1->print(); } Codul de mai sus eroare, codul de mai jos succes. #include <iostream> class clasa_baza { private: int m_iValoare; public: clasa_baza(int arg):m_iValoare(arg) {}; virtual void Ceva() { }; void Print() { std::cout<<m_iValoare; }; int GetValoare() { return m_iValoare; }; }; class clasa_derivata:public clasa_baza { int m_iValoare; public: clasa_derivata(int arg, int arg1):clasa_baza(arg1), m_iValoare(arg) {}; void print() { std::cout<<m_iValoare<<' '<<GetValoare(); }; }; int main() { clasa_baza* pcbPointer = new clasa_derivata(5,3); clasa_derivata* pcdObiect1 = dynamic_cast<clasa_derivata*>(pvPointer); pcdObiect1->print(); } Sper ca ati inteles ceva din ce am incercat eu sa explic.
-
Stiu ca e destul de complex. Dar alta varianta pentru un meniu care poate procesa input de la mouse nu cunosc si m-am gandit ca ar fi frumos sa fac publica metoda mea. Pe unele compilatoare s-ar putea sa dea erori sau avertizari. Mersi!
-
Sa trecem direct in cod. Avem nevoie de o clasa "menu" (la mine o sa fie singletone, la voi poate sa nu fie) menu.h #pragma once #include <vector> //std::vector #include <string> //std::string #include <string.h> // strlen #include <functional> // std::move #include <windows.h> //ReadConsoleInput, HANDLE, SetConsoleCursorPosition, SetConsoleTextAttribute #include <iostream> // std::cout class menu { //Voi face aceasta clasa un Singletone //Adica o clasa cu UN SINGUR OBIECT private: // Atribute private std::vector<std::string> m_vecstrOptiuni; HANDLE hInPut; private: // Constructori / Destructor menu(std::vector<std::string> elemente); menu(const menu&) = delete; menu(const menu&&) = delete; const menu& operator = (const menu&) = delete; ~menu(); private: // Atribute statice private static menu* m_pmenuInstance; public: // Singletone static void Create(std::vector<std::string>);//Cu aceasta functie vom crea obiectul static menu* GetInstance();//Aceasta functie returneaza obiectul static void Destroy();//Cu aceasta functie vom distruge obiectul public: std::string PrintMenu();//Functia principala }; menu.cpp #include "menu.h" menu* menu::m_pmenuInstance = nullptr; // Initial m_pmenuInstance va avea valoarea nullptr void menu::Create(std::vector<std::string> elemente) { m_pmenuInstance = new menu(elemente); // Initializam obiectul m_pmenuInstance } menu* menu::GetInstance() { return m_pmenuInstance; // Returnam instanta } void menu::Destroy() { delete m_pmenuInstance; // Stergem instanta } menu::menu(std::vector<std::string> elemente) :hInPut(GetStdHandle(STD_INPUT_HANDLE)) // Initializam { m_vecstrOptiuni = elemente; // Initializam } menu::~menu() { } //O "consola normala" are 24 de linii si 80 de "coloane" std::string menu::PrintMenu() { UINT i; int iInitOy = (24 / 2 - (m_vecstrOptiuni.size() / 2 + 0.5f)); //Asta inseamna jumatatea ecranului (Oy) int iOptiune = 0;//Initial, va fi aleasa optiunea 0 DWORD EventsToRead = 0; //Pentru ReadConsoleInput. Cate evenimente a inregistrat, pana acum INPUT_RECORD irBuffer; //Aceasta ne va arata evenimentele inregistrate while (true) { //Scriem optiunile for (i = 0; i < m_vecstrOptiuni.size(); ++i) { //Sunteti pregatiti pentru putina matematica? if (iOptiune == i) { // 80 / 2 - (short(strlen(m_vecstrOptiuni[i].data()))) / 2 inseamna mijlocul ecranului (Axa Ox) si in partea Stanga a optiunii //iInitOy este linia de unde vom incepe sa scriem ( i va incepe de la 0) //Si vom adauga cate 1 pentru fiecare optiune pe care o vom afisa SafePrint({ 80 / 2 - (short(strlen(m_vecstrOptiuni[i].data()) / 2)),short(iInitOy + i) }, m_vecstrOptiuni[i],10); } else { SafePrint({ 80 / 2 - (short(strlen(m_vecstrOptiuni[i].data()) / 2)),short(iInitOy + i) }, m_vecstrOptiuni[i]); } } while (true) { //hInPut - Bufferul pentru input al consolei //&irBuffer - vom trece pe referinta variabila de tip INPUT_BUFFER //1 - Lungimea variabilei de mai sus // - Ar trebui sa fie un vector, dar nu avem nevoie de asa ceva //&EventsToRead - Cate evenimente s-au inregistrat ( Daca veti face debug veti observa ca va creste de fiecare data cand consola primeste un input) ReadConsoleInput(hInPut, &irBuffer, 1, &EventsToRead); if (irBuffer.EventType == KEY_EVENT)//Verificam daca s-a apasat vreo tasta { //Windows-ul inregistreaza momentul in care s-a apasat o tasta si cel in care s-a ridicat ( am luat degetul de pe ea ) if (irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_DOWN && //Daca a apasat pe 'VK_DOWN' (Sageata-jos) irBuffer.Event.KeyEvent.bKeyDown)//Daca tasta e jos { ++iOptiune; if (iOptiune == m_vecstrOptiuni.size())//Daca a iesti din meniu, il introducem inapoi in meniu iOptiune = 0; break;//O luam de la inceput, de la scrierea optiunilor } if (irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_UP &&//Daca a apasat pe 'VK_UP' (Sageata-sus) irBuffer.Event.KeyEvent.bKeyDown)//Daca tasta e jos { --iOptiune; if (iOptiune == -1)//Daca a iesti din meniu, il introducem inapoi in meniu iOptiune = m_vecstrOptiuni.size() - 1; break;//O luam de la inceput, de la scrierea optiunilor } if (irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_RETURN &&//Daca a apasat pe 'VK_RETURN'(Enter) irBuffer.Event.KeyEvent.bKeyDown)//Daca tasta e jos { return m_vecstrOptiuni[iOptiune];//Returnam optiunea } if (irBuffer.Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE &&//Daca a apasat pe 'VK_ESCAPE'(Esc) irBuffer.Event.KeyEvent.bKeyDown)//Daca tasta e jos return "Exit";//Userul doresta sa iasa } else if (irBuffer.EventType == MOUSE_EVENT)//Daca utilizatorul a "intrat" cu mouse-ul in consola { for (i = 0; i < m_vecstrOptiuni.size(); ++i) { /** 80 / 2 - strlen("Optiune") / 2 ->|Optiune|<- 80 / 2 + strlen("Optiune") / 2 */ if (irBuffer.Event.MouseEvent.dwMousePosition.X >= 80 / 2 - (short(strlen(m_vecstrOptiuni[i].data()) / 2)) &&//Verificam daca utilizatorul a pus mouse-ul intre partea stanga irBuffer.Event.MouseEvent.dwMousePosition.X <= 80 / 2 + (short(strlen(m_vecstrOptiuni[i].data()) / 2)) &&//si partea dreapta a optiunii irBuffer.Event.MouseEvent.dwMousePosition.Y == iInitOy + i)//Verificam daca utilizatorul a dus mouse-ul pe linia pe care se afla optiunea { iOptiune = i;//Daca mouse-ul e deasupra scrisului iOptiune va deveni Pe ce a pus utilizatorul mouse-ul if (irBuffer.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)//Daca a apasat pe 'FROM_LEFT_1ST_BUTTON_PRESSED' Click-Stanga { return m_vecstrOptiuni[i];//Returnam } break;//Oprim for-ul } } break;//O luam de la inceput, de la scrierea optiunilor } } } } main.cpp #include "menu.h" int main() { menu::Create({"Salut!", "Exit"}); Initial: auto strOptiune = menu::GetInstance()->PrintMenu(); if(strOptiune == "Salut!") { SafePrint({0,0},"Salut selected"); goto Initial; } else if(strOptiune == "Exit") { SafePrint({0,0},"Exit selected"); return 0; } menu::Destroy(); } Compilat in C++11. Sper ca ati inteles, cat de cat, ce am incercat eu sa explic aici. Este o versiune mai complexa a meniului de aici.
-
Imi place meniul, dar puteai sa-l pui pe mijlocul ecranului dar mi se pare ca se misca mult prea repede. Ai putea adauga cateva Sleep-uri. C# si C++ sunt doua limbaje care nu au prea multe lucruri in comun. In ce clasa esti?
-
Incearca sa-l instalezi in alt fisier.
-
Sa adaugi sunete pentru 'X' si 'O', un sunet pentru atunci cand se termina runda si sa poti modifica din optiuni. Dificultatea bot-ului s-o pui de acolo. Sa poti alege cu ce caracter vrei sa joci. Poti adauga un fel de "streak" - numarul de castiguri/pierderi consecutive sa salvezi intr-un fisier si in primul dialog sa-ti apara acel numar. Din setari sa poti reseta numarul.
-
In primul dialog, ala cu "Single Player" si "Multiplayer".
-
Gata c-o dam in off-topic. Daca e sa inveti doar C++ e destul de usor, da' sa inveti API-uri pentru C++ nu e chiar atat de usor. Propunere: Adauga in primul dialog un "Options".
-
In primul rand, nu-mi place faptul ca trebuie sa scrii "If" cu 'i' mare si la fel si celelalte keyword-uri. Nu-mi place nici faptul ca "Elseif" e legat. Si cel mai tare ma enerveaza acel "As", imi aminteste de altceva, ce nu are legatura cu programarea. Si, in plus, nu inteleg de ce blocul "catch" trebuie sa fie in interiorul blocului "try". Imi aminteste de PASCAL. Esti cel mai tare daca poti scrie asemenea lucruri.
-
Asta se intampla cand lumea asculta de mine. :D Nu mi se pare chiar atat de "prietenos" codul scris in VB