De ce scriu jocuri în C (da, în C). Surse de jocuri (240) Cum să scrieți jocuri în C

Întrebare: Ce recomandați pentru a crea jocuri de la zero?


Timp bun. Inspirat recent din jucării precum Papers, Please și Hotline Miami. Am propria mea idee pentru un joc. Dar chestia e că nu știu să scriu. Jocul a fost conceput cu o vedere de sus, nu 3D, pentru PC. La serviciu, scriu în 1C, dar nu pentru jocuri, deși dacă te străduiești, poți, am studiat și bazele Java. Înțeleg că este mai bine să încerci mai întâi ceva simplu, cum ar fi tic-tac-toe sau șarpe, pentru a obține elementele de bază.
Pe Internet, ei sugerează utilizarea C ++, dar sugerează și utilizarea C # + XNA. Cine are experiență în crearea de jocuri, sfătuiește literatură sau oferă câteva sfaturi despre programarea jocurilor de la zero.

Răspuns:

mesaj de la MonteKristo

consiliază literatură

Din păcate, există foarte puțină literatură în limba rusă, mai ales de înaltă calitate. Departe de toate se traduce, departe de imediat, dar se întâmplă să nu fie de calitate. Se întâmplă ca o carte să fie tradusă la doi ani după lansarea originalului, iar o nouă versiune a originalului a fost deja lansată, iar prima este depășită. Prin urmare, studiez engleza și traduc cu ajutorul Lingvo și translate.google.com cărțile curente

Puteți căuta cărți despre crearea de jocuri în diferite limbi și tehnologii aici:

Dar în niciun caz nu începe cu cărțile din categoriile: Progressing și Mastering

Ce secțiune înseamnă că poți afla dacă dai clic pe „i”. De asemenea, puteți descărca exemple gratuit după înregistrare. Am aratat-o ​​in poza:

Întrebare: Creați un joc în limbaj C?

Răspuns: Adăugat după 30 de minute

mesaj de la HighPredator

În general, totul poate fi scris în C. Ar fi o dorință, creier și timp.

Există o dorință, fără creier, voi căuta timp >< Благодарю!

mesaj de la McFair

De asemenea, puteți începe să învățați Opengl fără un motor, puteți crea câteva Tetris și veți înțelege ce este.

Simt că va trebui să scriu singur motorul

mesaj de la McFair

7. Nu este complet clar, se presupune că tăiați o parte din imagine și puneți-o pe un cub?

Da, desenați obiectul și texturați-l prin suprapunerea imaginii.

mesaj de la satir cibernetic

GTK, de exemplu, cruce. Și așa, pentru Windows, folosiți winapi, există o interfață pur albastră.

Mulțumesc! Asta am vrut să spun

mesaj de la McFair

8. Mai mult depinde de joc, obiective și stilul de programare, totul trebuie luat în considerare, dacă luați același proiect în C și Sharp, atunci desigur C va beneficia foarte mult, dar în Sharp, viteza de dezvoltare va crește cu 2/3 dupa parerea mea.

O alegere bună ar fi să le combinați. Scrieți baza în Sharpe și răsuciți caracteristicile în C?)

Întrebare: Crearea unui joc MMORPG


Buna ziua. Recent am creat un subiect aici, unde am aflat despre crearea unui joc 2d.
Cu toate acestea, am decis să aflu în ce direcție ar trebui să studiez.
Iată 2 capturi de ecran:
http://kape.cc/uploads/posts/2011-05...a630f08343.jpg
http://mmohuts.com/wp-content/galler..._07.jpg?bb7a3b
Si video:

Trebuie să fac un astfel de joc. În general, locația este un sistem grilă. Locația este împărțită în câteva cuburi
Înțeleg că avem nevoie de grafică, sunete, biblioteci de sunet, dar mai întâi să luăm biblioteci de sunet.
Uită de grafică (să spunem că există una), sunt sunete.
Vreau să întreb dacă pachetul C++ + OpenGL îmi satisface cerințele și crearea unui joc similar și anume: mutarea unui obiect prin celule cu animație, ciocnirea obiectelor, preluarea grafică din sprites + animație scheletică (personaj gol + obiecte de legătură - grafică , la corpul personajului (pânză)).

Răspuns: 8Observator8, Nu mi-a plăcut niciodată fizica, până când mi-am dat seama că este atât de necesar... Dar acum, mi-am dat seama că Box2D cu siguranță nu este necesar pentru jocul pe care îl intenționez... M-am uitat la documentația SFML, după ce, astăzi, am scos în evidență dezvoltarea anterioară. și a reușit să interacționeze cu pereții, cât de multă fericire a fost)) A durat aproximativ 1-2 ore pentru a-mi da seama cum să o faci, dar merită.
Apropo, vreau să încerc să fac cel puțin primul nivel de bomberman)

Adăugat după 10 minute
P.S. Învăț c++ în același timp

Întrebare: Recomandați literatura despre dezvoltarea jocurilor de la început până la sfârșit


Recomandați literatura despre dezvoltarea jocului de la început până la sfârșit. Cu toate elementele, în C++ poți. Doar o carte nouă a editurii 2010-2015

Răspuns: Ce vei folosi pentru desen: DirectX sau OpenGL? M-am uitat că există cărți generale despre teoria jocurilor --> . Ce fel de plan de joc vei scrie: 2D, 3D, RPG, shooters, curse, șah, du-te? Toate aceste jocuri au specificații diferite.

Subiect: realizarea unui joc


Buna ziua, am decis sa fac un joc simplu (rpg). O voi face doar pentru mine. Jocul va fi static (imagini bmb cu personaje, obiecte etc., poate gif) Când am început să scotocesc pe Internet în căutarea cum se face acest lucru, am găsit o grămadă de componente gata făcute pentru delphi (de exemplu , delphix) și, prin urmare, am avut o întrebare dacă să folosesc ceva de genul? Sau este mai bine să desenezi singur totul pe pânză?

Răspuns:

domnule Dmitry,
Joc static? Acesta este ceva nou în programul de construcție.
Dacă este cu adevărat, atunci TImage este suficient pentru tine.
Și dacă este încă un joc dinamic, atunci aveți nevoie de TPaintBox.

Puțini oameni știu, dar pentru răzbunare, Delphi vine cu exemple de programe, inclusiv 3 mini-jocuri!

În Windows 7, faceți clic pe Start | Toate programele | Embarcadero RAD Studio XE5 | mostre.

Am acest folder
C:\Utilizatori\Public\Documente\RAD Studio\12.0\Samples\

Cat despre componente si motoare.
Uită de ingrediente. Nu există nicio componentă care să facă jocul pentru tine. Jocul este scris cu mâinile și cu capul.

Cat despre motoare. Motorul accelerează dezvoltarea.
În motor veți găsi o grămadă de coduri gata făcute. Motorul trebuie să fie adaptat jocului.

Din motor, vă sfătuiesc să vă uitați la biblioteca matematică și geometrică. Bibliotecă pentru lucrul cu continentul și multimedia. Ce formate de fișiere acceptă programul?
Suport pentru cameră. Suport pentru efecte speciale.

Nu ai spus joc 2D sau 3D.
Absența suportului pentru sprite-uri, panouri publicitare. Ieșire text.

Adăugat după 14 minute și 34 de secunde
Cred că te vei interesa. Există un site vizitat de crearea de jocuri.

Aici puteți arunca o privire și puteți împrumuta atât idei pentru joc, cât și idei pentru implementare.

Întrebare: Crearea propriului limbaj în Visual Studio


Caut exemple/tutoriale clare pas cu pas despre crearea propriului meu limbaj în Visual Studio.

Am găsit un exemplu de limbă, dar trebuie să înțeleg ce, cum și pentru ce, pentru că. culoarul meu pare un pic ok.

--
Necesar în general:
„cross-compiler” de la asma dvs. din studio, cu indicii de cod, la coduri pentru procesorul Z80 (nu mi-am dat seama încă cum să-l descarc pe hardware sau pe emulator, acesta este următorul pas).

Cerințe:
redactor - VS însăși (2013);
cod de asamblare Z80 pe ecran, fără module suplimentare;
alegerea limbii la crearea unui proiect (unde lista de limbi este C #, F #, VB.NET și altele).

Răspuns: dar cum să „spune” studioului 2013 că evidențiază și solicită?

Întrebare: Crearea unui joc pe motorul C++


Oameni buni, ajutați la crearea unui joc pe motorul c++. Doodle jump, voi fi recunoscător analogului. Problema este că am început să studiez nu de mult. Și nici nu pot scrie un program adecvat. Se pare că sunt încă un noob specific. Mulţumesc anticipat!

Jocurile video s-au dezvoltat activ de mai bine de 30 de ani, de la gameplay și capabilități grafice, la sisteme avansate de inteligență artificială și percepția utilizatorului asupra materialului trimis de dezvoltatori. Esports, la rândul său, este un sport cu drepturi depline, cu premii de mai multe milioane de dolari și miliarde de afaceri. Și industria jocurilor video în sine câștigă avânt neîncetat, fiind una dintre cele mai mari încasări și ramuri masive ale industriei divertismentului. Și la toate acestea, omenirea a venit din cea mai primitivă implementare a „tenisului”, lansată pe un osciloscop.


Eu, în calitate de boboc, am decis, ca parte a studierii capacităților de bază ale consolei C / C ++, este posibil să programez un joc ASCII „clasic” care necesită ca jucătorul să gândească rapid, să interacționeze continuu cu jocul și, de asemenea, are o parte grafică simplă pe care jucătorul o poate interpreta într-un fel de imagine tridimensională.


În ciuda primitivității vizuale a unor astfel de soluții, cu siguranță îi fac pe jucători să se simtă nostalgici pentru jocurile vechi.

inspirație

În zorii apariției pe piață a telefoanelor mobile cu afișaje monocrome s-a remarcat jocul „Space Impact”, care a fost flashat pe dispozitivele Nokia. Se potrivește perfect cu capabilitățile limitate ale telefoanelor mobile de atunci. După introducerea jocurilor simple în telefoanele mobile, vânzările de dispozitive au crescut dramatic, iar jocurile mobile au devenit treptat populare, iar acum sunt destul de competitive cu industria proiectelor AAA „adulte”.


Space Impact a fost baza primului meu joc datorită ușurinței de joc și popularității sale la începutul anilor 2000.

Caracteristicile „Space Invader”

În primul rând - ușurința programului. Fișierul executabil are mai puțin de 100 kb și va funcționa conform așteptărilor pe aproape orice computer care rulează OC Windows cu pachetul Visual C++.


În al doilea rând, portabilitatea - codul sursă poate fi convertit în sisteme POSIX în câteva minute, asigurând astfel operabilitatea pe sistemele de operare UNIX și Mac, doar prin înlocuirea câtorva funcții și reconstruirea programului pe compilatorul corespunzător.


Al treilea avantaj este că programul este portabil și nu necesită fișiere suplimentare. Toate fișierele suplimentare, dacă este necesar, sunt create automat în directorul în care se află fișierul executabil.


Cea mai simplă interfață intuitivă care nu necesită o descriere sau instrucțiuni de utilizare.


  • Subelementul „Joc nou” - începe o nouă sesiune de joc.
  • Sub-elementul „Continuare” - încarcă ultimul joc salvat din fișierul binar în directorul fișierului executabil și începe sesiunea de joc folosind datele primite.
  • Elementul „Ajutor” - instrucțiuni pentru lucrul cu aplicația și descrierea acesteia. Derulați apăsând săgețile de pe tastatură.
  • Elementul „Hall of Fame” - o listă de lideri ai sesiunilor de jocuri, este încărcat dintr-un fișier binar în directorul fișierului executabil și ieșire formatată pe consolă.
  • Elementul „Ieșire” - ieșiți din aplicație.
  • Trecerea la „lumea” stângă cu viteză dinamică. „Lumea” conține câmpuri aleatorii în partea de sus și de jos cu o grosime de 1 sau 2 caractere. De asemenea, între câmpuri apare aleatoriu „debris spațial”, afișat prin simbolul „¤”, care reprezintă un obstacol pentru jucător.
  • Apăsat pe marginea stângă a ferestrei „navei spațiale”. Nava este deplasată folosind săgețile de pe tastatură în sus și în jos, prin apăsarea barei de spațiu eliberează un proiectil care distruge „deșeurile spațiale” la atingere.
  • „Tabloul de bord” în partea de sus a consolei, care arată distanța parcursă, viteza actuală și numărul de încercări rămase.
  • Cum funcționează Space Invader?

    Când pornește aplicația, apare o animație de ecran de introducere. Este format din 6 matrice de caractere preformatate, rotite la fiecare 200 ms.


    Pornirea screensaverului - slide final


    Urmează apelul la funcția meniului principal cu parametrul 1 (întreg). Funcția afișează un meniu cu elementul de meniu selectat între paranteze unghiulare, al cărui număr se potrivește cu parametrul de intrare. În meniu sunt 4 articole, respectiv, parametrul de intrare poate varia de la 1 la 4. Apăsarea săgeții în jos accesează recursiv parametrul de intrare incrementat dacă parametrul de intrare este mai mic de 4, cu parametrul 1 dacă parametrul de intrare este 4. Space sau Enter accesează funcția corespunzătoare articolului de meniu selectat.


    void StartMenu(int switcher) ( system("cls"); comutator (switcher) (cazul 1: cout<< "\n\n\n << ИГРАТЬ! >> << "\n\n\n ИГРАТЬ!\n\n << ПОМОЩЬ! >> << "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n << ЗАЛ СЛАВЫ >> << "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n ЗАЛ СЛАВЫ\n\n << ВЫХОД >>"; break; ) int alegere = _getch(); if (alegere == 224) alegere = _getch(); if (alegere == 72) if (comutator != 1) StartMenu(switcher - 1); else StartMenu( 4); if (alegere == 80) if (comutator != 4) StartMenu(comutator + 1); else StartMenu(1); if (alegere == 13 || alegere == 32) (daca (comutator == 1) ) Meniu joc(1); dacă (comutator == 2) Ajutor(0); dacă (comutator == 3) TopChart(); dacă (comutator == 4) _ieșire(0); ) )


    Meniul principal (funcția introdusă cu parametrul 1)


    La accesarea funcției corespunzătoare articolului „Joc”, se lansează o funcție care este similară ca funcționalitate, dar există doar o alegere de 2 articole. În consecință, parametrul de intrare va fi 1 sau 2, iar atunci când apăsați pe oricare dintre săgeți (sus sau jos), trebuie doar să schimbăm numărul la „opus”. Cea mai optimizată opțiune este scăderea parametrului de intrare din 3 (3 - 1 = 2, 3 - 2 = 1).


    void GameMenu(int switcher) ( system("cls"); if (switcher == 1) cout<< "\n\n\n\n\n << НОВАЯ ИГРА! >> << "\n\n\n\n\n НОВАЯ ИГРА!\n\n << ПРОДОЛЖИТЬ! >>"; int alegere = _getch(); if (alegere == 224) alegere = _getch(); if (alegere == 72 || alegere == 80) Meniu joc(3 - comutator); dacă (alegere == 27) StartMenu(1); if (alegere == 13 || alegere == 32) Joc (comutator); )


    Meniu suplimentar (funcția a fost introdusă cu parametrul 1)


    Acum la principal - procesul jocului. Când selectați subelementul „Joc nou”, este lansată o nouă sesiune de joc. Este creată o matrice bidimensională, cu o dimensiune de 14 rânduri pe 50 de coloane. Prima linie este alocată sub tabloul de bord. Primul dispozitiv este numărul de kilometri parcurși, este egal cu numărul de actualizări ale consolei (inițial, consola se actualizează la fiecare 80ms, cu fiecare actualizare acest parametru scade până ajunge la o valoare de 25).


    int odometerBuf = odometru, odometerDigitLength; pentru (odometerDigitLength = 0; odometerBuf != 0; odometerBuf /= 10, odometerDigitLength++);// calculul numărului de cifre de pe contorul de parcurs pentru (int i = odometerDigitLength, odometerBuf = odometru; i >= 0; i--, scr[i] = odometerBuf % 10 + "0", odometerBuf /= 10);//desenarea odometrului pe tabloul de bord scr = "K"; scr = „M”;//adăugarea contorului de parcurs „KM”++;//incrementarea contorului de parcurs

    Al doilea indicator, viteza actuală, este formula - 1000/rata de actualizare a consolei. Viteza se măsoară în kilometri pe secundă. Astfel, inițial nava se deplasează cu o viteză de 12 km/s, iar după un timp ajunge la marcajul de 40 km/s.


    viteza = 1000 / cronometru;// actualizarea vitezometrului int speedBuf = viteza; pentru (int i = 42; viteza != 0; i--, scr[i] = viteza % 10 + "0", viteza /= 10);//desenarea vitezometrului pe tabloul de bord scr = "К"; scr = "M"; scr="/"; scr = „С”;//adăugând „КМ/С”

    Al treilea dispozitiv afișează numărul de încercări rămase, inițial sunt 3. Încercările sunt indicate prin simbolul „&”.


    pentru (int i = 50; vieți > 0; i--, vieți--, scr[i] = "&");


    Tabloul de bord la începutul unei sesiuni de joc


    Următoarele 2 linii, ca și ultimele 2, sunt câmpurile jocului. Decorațiile de câmp sunt alese aleatoriu, pot consta din 3 caractere sau un spațiu. Liniile extreme sunt întotdeauna complet umplute, iar a doua și penultima rânduri conțin alte caractere decât un spațiu doar în acele locuri în care aceste personaje „cresc” din altele.


    caracter borderSymbols = ( "†", "‡", "¤", " " ); pentru (int aboveBelow = 0; aboveBelow< 50; aboveBelow++)//прорисовка верхнего и нижнего полей (2 + 2) { scr = borderSymbols; if (scr == "‡") scr = "¤"; scr = borderSymbols; if (scr == "‡") scr = "¤"; }


    Tabloul de bord și câmpurile la începutul unei sesiuni de joc


    În linia centrală a spațiului de joc, apăsată spre marginea stângă, este desenată o navă spațială, pe care jucătorul va trebui să o controleze.


    scr = "\\"; scr = "\\";//desenarea navei scr = "3"; scr="="; scr="="; scr="/"; scr="/";

    Îl poți controla cu săgețile sus și jos.


    if (_kbhit())//dacă tasta a fost apăsată ( control = _getch();//variabila își va lua valoarea dacă (control == 224) control = _getch(); ) if (control == 72)/ /în timp ce se deplasează în sus dacă (scr == "\\" || scr == "\\" && scr == "¤" || scr == "\\" && scr == "¤")//dacă nava s-a prăbușit în câmpul de sus - game over if (vieți > 1) (cout<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 2; i < 13; i++)//корабль смещается на элемент выше for (int j = 0; j < 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos--; } if (control == 80)//при движении корабля вниз if (scr == "/" || scr == "/" && scr == "¤" || scr == "/" && scr == "¤")//если корабль врезался в нижнее поле - игра окончена if (lifes >1) ( afară<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 12; i > < 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos++; }


    Poziția navei când apăsați de două ori săgeata sus


    Îndepărtându-ne de vizualizare, merită remarcat faptul că împreună cu nava deplasăm în sus sau în jos elementul de matrice responsabil pentru „botul” navei. În consecință, din care puteți trage obuze apăsând bara de spațiu.


    Cu toate acestea, nici câmpul, nici proiectilele nu se mișcă, prin urmare, pentru a „reanima” jocul, după expirarea temporizatorului de redesenare a ecranului, „lumea” se va muta cu o coloană la stânga, iar proiectilele se vor muta o coloană la dreapta. . Nava rămâne pe loc până când jucătorul dorește altfel. Dar după redesenare, acum apare o coloană goală - să o umplem aleatoriu cu câmpuri și „deșeuri spațiale” care pot fi doborâte de obuze sau barele de protecție laterale ale navei.


    pentru (int i = 1; i< 14; i++)//все "космические" элементы смещаются на элемент влево for (int j = 0; j < 49; j++) { if (scr[i][j] == "\\" && scr[i] == "¤" || scr[i][j] == "=" && scr[i] == "¤" || scr[i][j] == "/" && scr[i] == "¤") if (lifes >1) ( afară<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); if (scr[i][j] != "3" && scr[i][j] != "\\" && scr[i][j] != "=" && scr[i][j] != "/" && scr[i][j] != "-" && scr[i] != "-") scr[i][j] = scr[i]; if (scr[i][j] == "¤") scr[i] = " "; } for (int i = 1; i < 14; i++)//все снаряды смещаются на элемент вправо for (int j = 48; j > < 12; i++)//рандомное появление космического мусора { if (rand() % 10 == 1) scr[i] = "¤"; }

    Când nava se mișcă în sus sau în jos în acest moment, resturile spațiale vor fi distruse fără a deteriora nava, totul datorită tocatorilor.



    Dacă în acest moment nu ocoliți resturile cu săgeata în jos, nava se va sparge


    Proiectilele trase de navă sunt proiectate în așa fel încât să măture totul în calea lor. Prin urmare, după ce a tras un proiectil, un coridor într-o linie este curățat.


    Cu toate acestea, deși câmpurile sunt făcute din materiale asemănătoare cu resturile spațiale, acestea nu pot fi distruse de aripioare. Contactul oricărei părți a navei cu câmpurile duce la un colaps inevitabil. Precum și introducerea resturilor spațiale în partea din față a navei. Dacă în astfel de momente pe tabloul de bord există o desemnare a cel puțin încă o „tentativă” - jocul pare să înceapă de la început, dar după ce a salvat scorul marcat și a pierdut o „tentativă”. Viteza este resetată la valoarea inițială de 12 km/s.


    Dacă jucătorul „s-a prăbușit” și nu mai sunt încercări, sesiunea de joc se termină și jucătorului i se cere să-și introducă numele pentru a-și salva rezultatul în „hall of fame”.



    Cererea jucătorului să introducă un nume pentru a-și salva scorul în „hall of fame”


    Aplicația procesează 2 fișiere:

    • „TopChart.bin” este un fișier binar pentru stocarea clasamentului. Datele sunt stocate în structuri (porecla jucătorului, contul acestuia, data încheierii sesiunii de joc). Datele sunt adăugate la sfârșitul fișierului când jocul se termină. Când apelați elementul „Hall of Fame”, fișierul este deschis pentru citire cu posibilitatea de editare. În continuare, este declarată o matrice dinamică de structuri, în care sunt scrise datele din fișier, după care matricea este sortată și formatată pe consolă (numărul maxim posibil de rezultate este de 12, dacă tabloul conține 13 rezultate, acesta din urmă este aruncat după sortare). Apoi, fișierul este suprascris cu o matrice de structuri rezultate, după care matricea este distrusă.
    • „CurrentSave.bin” este un fișier binar pentru stocarea jocurilor salvate. Apelat pentru citire atunci când este lansat subelementul „Continuare” al articolului „Joc”. Poate conține date pentru restabilirea unei sesiuni de joc neterminate: numărul liniei care conține prova navei, numărul de kilometri parcurși, numărul de încercări rămase, locația obiectelor pe ecran. Cu ajutorul acestor date se formează o sesiune de joc care o repetă exact pe cea neterminată. Pentru a evita înșelăciunea, atunci când încărcați o sesiune dintr-un fișier, fișierul este șters. Când apăsați Escape în timpul jocului, acest fișier este creat și toate datele necesare sunt scrise în el pentru continuarea cu succes a sesiunii de joc.

    Elementul de meniu principal „Ajutor” este o funcție care preia un parametru de la 0 la 22 și afișează următoarele 12 rânduri a câte 50 de caractere fiecare din parametrul de intrare. Controlul se efectuează recursiv folosind săgețile sus și jos.


    void Help(int switcher) ( system("cls"); cout<< "ПРОКРУТКА: СТРЕЛКИ ВВЕРХ/ВНИЗ | ВЕРНУТЬСЯ: ESCAPE\n"; char arr = { " УПРАВЛЕНИЕ В МЕНЮ Передвигаться по пунктам – СТРЕЛКИ ВВЕРХ/ВНИЗ Выбрать пункт – ПРОБЕЛ или ENTER Вернуться в предыдущее меню – ESCAPE УПРАВЛЕНИЕ В ИГРЕ Передвигаться вверх/вниз – СТРЕЛКИ ВВЕРХ/ВНИЗ Сделать выстрел – ПРОБЕЛ Вернуться в меню, сохранив игру – ESCAPE БРИФИНГ Вы – пилот космического корабля, попавшего в космическую бурю. Вам необходимо не разбиться и пролететь как можно большее расстояние. Корабль оборудован динамическим управлением. Чем быстрее вы летите – тем острее поворачивает судно. Корабльавтоматически постепенно разгоняется до 40 км/с. Вы можете сбивать космический мусор с помощью магнитной пушки, встроенной в судно, а также боковыми отбойниками. При управлении кораблем на щитке приборов отображается пройденная дистанция, текущая скорость и количество оставшихся «ячеек отката» (отображаются символом «&»), изначально их 3. Если решите прекратить игру – просто нажмите ESCAPE. Игра сохранится, и вы сможете ее продолжить даже после перезапуска приложения с помощью пункта «ПРОДОЛЖИТЬ!». В главном меню можно посмотреть таблицу почетных пилотов. Добейтесь своего права там оказаться! АВТОРСТВО Svjatoslav Laskov – AUTHOR Igor Marchenko – COACH National Technical University «Kharkiv Polytechnic Institute» 2016" }; for (int i = 0, buf = switcher; i < 13; i++) { for (int j = buf * 50; j < buf * 50 + 50; j++) cout << arr[j]; if (i != 12) cout << endl; buf++; } int controller = _getch();//получить значение нажатой клавиши if (controller == 224)//если была нажата стрелка controller = _getch();//то определить какая именно if (controller == 72)//если стрелка вверх if (switcher > < 22) Help(switcher + 1); else Help(22); if (controller == 27)//если Escape StartMenu(2); }

    Elementul din meniul principal „Ieșire” - iese din aplicație.


    Manualul utilizatorului

    CONTROLUL MENIU
    o Deplasați-vă prin puncte - SĂGEATĂ SUS/JOS
    o Selectați elementul - SPAȚIU sau ENTER
    o Reveniți la meniul anterior - ESCAPE
    COMENZI DE JOC
    o Deplasare în sus/jos - SĂGEATĂ SUS/JOS
    o Fă o lovitură - SPAȚIU
    o Reveniți la meniu după salvarea jocului - ESCAPE
    BRIEFING
    Ești pilotul unei nave spațiale prins într-o furtună spațială. Nu trebuie să vă prăbușiți și să zburați cât mai departe posibil.


    Nava este echipată cu control dinamic. Cu cât zbori mai repede, cu atât nava se întoarce mai ascuțită. Nava accelerează automat treptat până la 40 km/s.


    Puteți doborî resturile spațiale cu ajutorul pistolului magnetic încorporat în navă, precum și a deflectoarelor laterale.
    La conducerea navei, panoul de instrumente afișează distanța parcursă, viteza actuală și numărul de „celule rollback” rămase (afișat prin simbolul „&”), inițial sunt 3 dintre ele.


    Dacă decideți să opriți jocul, apăsați ESCAPE. Jocul va fi salvat și îl puteți continua chiar și după repornirea aplicației folosind elementul „CONTINUAȚI!”.


    În meniul principal, puteți vedea tabelul piloților de onoare. Obține dreptul de a fi acolo!

    Rezultat

    Personal, am avut o mare plăcere de la dezvoltarea unui astfel de proiect mărunt, mai ales că consola standard este concepută pentru a afișa informații, și nu pentru jocuri. Din această cauză, rata de cadre s-a dovedit a fi foarte limitată, indiferent de computerul pe care rulează aplicația.


    De asemenea, am vrut să împart aplicația în mai multe fire pentru un răspuns mai corect la apăsările de la taste ale utilizatorului, dar voi implementa firele în următorul proiect în C++.


    Sursă

    #include „conio.h” #include „windows.h” #include „ctime” #include folosind namespace std; struct player//definirea unei structuri care stochează date despre rezultatele oricărei sesiuni de joc finalizate ( char name; int scor; int mday; int mon; int year; ); struct save//definirea unei structuri care stochează date despre o sesiune de joc incompletă ( int weaponPos; int timer; int odometer; int lifes; char scr; ); void ScreenOutput(char scr)//funcția de ieșire a matricei element cu element către consolă ( system("cls"); for (int i = 0; i< 14; i++) { for (int j = 0; j < 50; j++) cout << scr[i][j]; if (i != 13) cout << endl; } } //блок прототипов функций void StartMenu(int switcher);//функция, вызывающаяся из главного меню, содержит пункты "ИГРА" и "ПРОДОЛЖИТЬ" void GameMenu(int switcher);//функция главного меню void GameStart(char scr, int lifes, int *timer);//функция, определяющая начальный символьный массив при запуске нового игрового сеанса void Game(int var);//функция игровго сеанса void GameOver(int score);//функция, спрашивающая имя игрока, и записывающая его результат в бинарный файл void Help(int switcher);//функция помощи игроку void TopChart();//функция "ЗАЛ СЛАВЫ" - отображает список лидеров void Help(int switcher) { system("cls"); cout << "ПРОКРУТКА: СТРЕЛКИ ВВЕРХ/ВНИЗ | ВЕРНУТЬСЯ: ESCAPE\n"; char arr = { " УПРАВЛЕНИЕ В МЕНЮ Передвигаться по пунктам – СТРЕЛКИ ВВЕРХ/ВНИЗ Выбрать пункт – ПРОБЕЛ или ENTER Вернуться в предыдущее меню – ESCAPE УПРАВЛЕНИЕ В ИГРЕ Передвигаться вверх/вниз – СТРЕЛКИ ВВЕРХ/ВНИЗ Сделать выстрел – ПРОБЕЛ Вернуться в меню, сохранив игру – ESCAPE БРИФИНГ Вы – пилот космического корабля, попавшего в космическую бурю. Вам необходимо не разбиться и пролететь как можно большее расстояние. Корабль оборудован динамическим управлением. Чем быстрее вы летите – тем острее поворачивает судно. Корабльавтоматически постепенно разгоняется до 40 км/с. Вы можете сбивать космический мусор с помощью магнитной пушки, встроенной в судно, а также боковыми отбойниками. При управлении кораблем на щитке приборов отображается пройденная дистанция, текущая скорость и количество оставшихся «ячеек отката» (отображаются символом «&»), изначально их 3. Если решите прекратить игру – просто нажмите ESCAPE. Игра сохранится, и вы сможете ее продолжить даже после перезапуска приложения с помощью пункта «ПРОДОЛЖИТЬ!». В главном меню можно посмотреть таблицу почетных пилотов. Добейтесь своего права там оказаться! АВТОРСТВО Svjatoslav Laskov – AUTHOR Igor Marchenko – COACH National Technical University «Kharkiv Polytechnic Institute» 2016" }; for (int i = 0, buf = switcher; i < 13; i++) { for (int j = buf * 50; j < buf * 50 + 50; j++) cout << arr[j]; if (i != 12) cout << endl; buf++; } int controller = _getch();//получить значение надатой клавиши if (controller == 224)//если была нажата стрелка controller = _getch();//то определить какая именно if (controller == 72)//если стрелка вверх if (switcher >0) Ajutor (comutator - 1); else Ajutor(0); if (controller == 80)//dacă săgeată în jos dacă (comutator< 22) Help(switcher + 1); else Help(22); if (controller == 27)//если Escape StartMenu(2); } void StartMenu(int switcher) { system("cls"); switch (switcher) { case 1: cout << "\n\n\n << ИГРАТЬ! >>\n\n AJUTOR!\n\n HALL OF FAME\n\n EXIT"; pauză; cazul 2: cout<< "\n\n\n ИГРАТЬ!\n\n << ПОМОЩЬ! >>\n\n HALL OF FAME\n\n EXIT"; pauză; cazul 3: cout<< "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n << ЗАЛ СЛАВЫ >>\n\n EXIT"; break; cazul 4: cout<< "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n ЗАЛ СЛАВЫ\n\n << ВЫХОД >>"; break; ) int alegere = _getch(); if (alegere == 224) alegere = _getch(); if (alegere == 72) if (comutator != 1) StartMenu(switcher - 1); else StartMenu( 4); if (alegere == 80) if (comutator != 4) StartMenu(comutator + 1); else StartMenu(1); if (alegere == 13 || alegere == 32) (daca (comutator == 1) ) GameMenu(1); if (switcher == 2) Help(0); if (switcher == 3) TopChart(); if (switcher == 4) _exit(0); ) ) void GameMenu(int switcher) ( system("cls"); if (switcher == 1) cout<< "\n\n\n\n\n << НОВАЯ ИГРА! >>\n\n CONTINUA!"; altminteri<< "\n\n\n\n\n НОВАЯ ИГРА!\n\n << ПРОДОЛЖИТЬ! >>"; int alegere = _getch(); if (alegere == 224) alegere = _getch(); if (alegere == 72 || alegere == 80) Meniu joc(3 - comutator); dacă (alegere == 27) StartMenu(1); if (alegere == 13 || alegere == 32) Joc(comutator); ) void GameStart(char scr, int lifes, int *timer) ( for (int i = 0; i< 14; i++)//очищение от мусора for (int j = 0; j < 50; j++) scr[i][j] = " "; for (int i = 50; lifes >0; i--, vieți--, scr[i] = "&"); *temporizator = 80; caracter borderSymbols = ( "†", "‡", "¤", " " ); pentru (int aboveBelow = 0; aboveBelow< 50; aboveBelow++)//прорисовка верхнего и нижнего полей (2 + 2) { scr = borderSymbols; if (scr == "‡") scr = "¤"; scr = borderSymbols; if (scr == "‡") scr = "¤"; } scr = "\\"; scr = "\\";//прорисовка корабля scr = "3"; scr = "="; scr = "="; scr = "/"; scr = "/"; } void GameOver(int score) { system("cls"); player newPlayer;//объявляние структуры newPlayer.score = score;//инициализацие поля набранного счета cout << "Поздравляем Вас!\nВы продержались " << score << " километров.\n\n(Пожалуйста, не используйте кириллические символы)\n(Используйте не более 6 символов)\nОставьте свое имя и станьте примером\nдля подражания будущим игрокам: "; cin.getline(newPlayer.name, 7);//инициализацие поля имени time_t timeCur; time(&timeCur); struct tm * timeCurStruct = localtime(&timeCur); newPlayer.mday = timeCurStruct->tm_mday;//inițializarea datei de încheiere a jocului newPlayer.mon = timeCurStruct->tm_mon; newPlayer.year = timeCurStruct->tm_year; FIȘIER *topchart; fopen_s(&topChart, „TopChart.bin”, „ab+”); fwrite(&newPlayer, 1, sizeof(player), topChart);//adăugarea rezultatului în fișierul fclose(topChart); topchart(); ) void TopChart() ( FILE *topChart; fopen_s(&topChart, "TopChart.bin", "rb+"); system("cls"); if (topChart == NULL)//dacă a apărut o eroare la deschiderea fișierului ( system( "cls"); out<< "Нет ни единого результата."; Sleep(1000); system("cls"); cout << "Нет ни единого результата.."; Sleep(1000); system("cls"); cout << "Нет ни единого результата..."; Sleep(1000); cout << "\nНажмите любую клавишу, чтобы вернуться."; _getch(); StartMenu(3); } fseek(topChart, 0L, SEEK_END); int playerAmount = ftell(topChart) / sizeof(player); player *temp = new player; fseek(topChart, 0L, SEEK_SET); for (int i = 0; i < playerAmount; i++)//копирование содержиомого файла в структкры fread(&temp[i], 1, sizeof(player), topChart); fclose(topChart); for (int i = 1; i < playerAmount; i++)//сортировка структур по спаданию итоговых счетов if (temp[i].score >temp.score) ( player tempAlone; strcpy(tempAlone.name, temp[i].name); tempAlone.score = temp[i].score; tempAlone.mday = temp[i].mday; tempAlone.mon = temp[ i].mon; tempAlone.year = temp[i].an; strcpy(temp[i].nume, temp.nume); temp[i].score = temp.score; temp[i].mday = temp. lday; temp[i].mon = temp.mon; temp[i].year = temp.an; strcpy(temp.name, tempAlone.name); temp.score = tempAlone.score; temp.mday = tempAlone.mday ;temp.mon = tempAlone.mon;temp.year = tempAlone.year;if (i > 1) i -= 2; else i = 0; ) if (playerAmount > 12) playerAmount = 12; cout<< "№ " << "Имя" << "\t" << "Счет" << "\t" << "Дата" << endl;//вывод таблицы лидеров в консоль for (int i = 0; i < playerAmount; i++) { cout << i + 1 << ")" << "\t" << temp[i].name << "\t" << temp[i].score << "\t"; if (temp[i].mday / 10 == 0) cout << "0" << temp[i].mday; else cout << temp[i].mday; cout << " "; switch (temp[i].mon) { case 0: cout << "января"; break; case 1: cout << "февраля"; break; case 2: cout << "марта"; break; case 3: cout << "апреля"; break; case 4: cout << "мая"; break; case 5: cout << "июня"; break; case 6: cout << "июля"; break; case 7: cout << "августа"; break; case 8: cout << "сентября"; break; case 9: cout << "октября"; break; case 10: cout << "ноября"; break; case 11: cout << "декабря"; break; } cout << " " << 1900 + temp[i].year << endl; } fopen_s(&topChart, "TopChart.bin", "wb+"); for (int i = 0; i < playerAmount; i++)//запись таблицы лидеров в бинарный файл fwrite(&temp[i], 1, sizeof(player), topChart); fclose(topChart); delete temp; _getch(); StartMenu(3); } int main() { setlocale(LC_ALL, "Rus");//задание кодировки system("mode con cols=51 lines=14");//задание размеров окна консоли system("title Space Invader");//задание описания окна консоли system("color 0A");//задание цвета консоли (0-задний фон; А-передний фон) HANDLE hCons = GetStdHandle(STD_OUTPUT_HANDLE);//получение хендла CONSOLE_CURSOR_INFO cursor = { 100, false };//число от 1 до 100 размер курсора в процентах; false\true - видимость SetConsoleCursorInfo(hCons, &cursor);//применение заданных параметров курсора int timer = 200; cout << " (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n\n\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\";//вступительная заставка Sleep(timer); system("cls"); cout << " \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /";//вступительная заставка Sleep(timer); system("cls"); cout << " / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка Sleep(timer); system("cls"); cout << " ____ ____ __ ___ ____\n / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка Sleep(timer); system("cls"); cout << "\n ____ ____ __ ___ ____\n / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка Sleep(timer); system("cls"); cout << "\n\n ____ ____ __ ___ ____\n / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка cout << "\a"; Sleep(10 * timer);//задержка заставки StartMenu(1); return 0; } void Game(int var) { int weaponPos;//позиция строки дула в массиве int timer;//задержка между перерисовками экрана int odometer;//количество перерисовок экрана, они же итоговые очки int lifes;//количество жизней char control = "&";//переменная управления кораблем int shotPause = 4;//задержка между выстрелами (указывать на одну перерисовку больше) int speed;//скорость корабля char scr; if (var == 1) { weaponPos = 7;//позиция строки дула в массиве odometer = 1;//количество перерисовок экрана, они же итоговые очки lifes = 3;//количество жизней GameStart(scr, lifes, &timer); } else//при восстановлении игрового сеанса из сохранения { FILE *saveBin; fopen_s(&saveBin, "CurrentSave.bin", "rb"); if (!saveBin) { system("cls"); cout << "Нет сохранения."; Sleep(1000); system("cls"); cout << "Нет сохранения.."; Sleep(1000); system("cls"); cout << "Нет сохранения..."; Sleep(1000); Game(1); } fread(&weaponPos, 1, sizeof(int), saveBin); timer = 80; fread(&odometer, 1, sizeof(int), saveBin); fread(&lifes, 1, sizeof(int), saveBin); fread(&scr, 14 * 50, sizeof(char), saveBin); fclose(saveBin); remove("CurrentSave.bin"); } while (true) { int odometerBuf = odometer, odometerDigitLength; for (odometerDigitLength = 0; odometerBuf != 0; odometerBuf /= 10, odometerDigitLength++);//вычисление количества цифр на одометре for (int i = odometerDigitLength, odometerBuf = odometer; i >= 0; i--, scr[i] = odometerBuf % 10 + "0", odometerBuf /= 10);//desenarea odometrului pe tabloul de bord scr = "К"; scr = „M”;//adăugarea contorului de parcurs „KM”++;//incrementarea vitezei contorului de parcurs = 1000 / cronometru;//actualizarea vitezometrului int speedBuf = viteza; pentru (int i = 42; viteza != 0; i--, scr[i] = viteza % 10 + "0", viteza /= 10);//desenarea vitezometrului pe tabloul de bord scr = "К"; scr = "M"; scr="/"; scr = „C”;//adăugând „KM/S” dacă (_kbhit())//dacă a fost apăsată tasta ( control = _getch();//variabila își va lua valoarea dacă (control == 224) control = _getch(); ) if (control == 13 && shotPause == 4 || control == 32 && shotPause == 4)//când declanșatorul este apăsat dacă pistolul este reîncărcat ( scr = "-"; shotPause = 0; ) dacă (shotPause< 4)//перезарядка shotPause++; if (control == 27)//при выходе { FILE *saveBin; fopen_s(&saveBin, "CurrentSave.bin", "wb"); fwrite(&weaponPos, 1, sizeof(int), saveBin); fwrite(&odometer, 1, sizeof(int), saveBin); fwrite(&lifes, 1, sizeof(int), saveBin); fwrite(&scr, 14 * 50, sizeof(char), saveBin); fclose(saveBin); GameMenu(2); } if (control == 72)//при движении корабля вверх if (scr == "\\" || scr == "\\" && scr == "¤" || scr == "\\" && scr == "¤")//если корабль врезался в верхнее поле - игра окончена if (lifes >1) ( afară<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 2; i < 13; i++)//корабль смещается на элемент выше for (int j = 0; j < 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos--; } if (control == 80)//при движении корабля вниз if (scr == "/" || scr == "/" && scr == "¤" || scr == "/" && scr == "¤")//если корабль врезался в нижнее поле - игра окончена if (lifes >1) ( afară<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 12; i >= 2; i--)//nava mută un element în jos pentru (int j = 0; j< 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos++; } for (int i = 1; i < 14; i++)//все "космические" элементы смещаются на элемент влево for (int j = 0; j < 49; j++) { if (scr[i][j] == "\\" && scr[i] == "¤" || scr[i][j] == "=" && scr[i] == "¤" || scr[i][j] == "/" && scr[i] == "¤") if (lifes >1) ( afară<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); if (scr[i][j] != "3" && scr[i][j] != "\\" && scr[i][j] != "=" && scr[i][j] != "/" && scr[i][j] != "-" && scr[i] != "-") scr[i][j] = scr[i]; if (scr[i][j] == "¤") scr[i] = " "; } for (int i = 1; i < 14; i++)//все снаряды смещаются на элемент вправо for (int j = 48; j >= 0; j--) dacă (scr[i][j] == "-") dacă (j != 48) ( scr[i] = "-"; scr[i][j] = " "; ) else scr [i][j] = " "; caracter borderSymbols = ( "†", "‡", "¤", " " ); scr = " ";// umplerea aleatorie a noilor elemente de bordura scr = borderSymbols; if (scr == "‡") scr = "¤"; scr=""; scr = borderSymbols; if (scr == "‡") scr = "¤"; pentru (int i = 3; i< 12; i++)//рандомное появление космического мусора { if (rand() % 10 == 1) scr[i] = "¤"; } ScreenOutput(scr);//вывод экрана if (control != "&")//"обнуление" управляющей переменной control = "&"; if (timer >25)//temporizator de accelerare a navei--; Sleep (temporizator);//întârziere redesenare) )


    Puteți descărca fișierul .exe de aici.

    Eu sunt acel fruct. Toate proiectele mele personale de jocuri pe care le-am făcut în ultima vreme au fost scrise în „vanilie” C. Nimeni altcineva nu face asta, așa că s-ar putea să vă întrebați de ce am făcut această alegere.
    Următoarele conține opinii despre limbaje de programare care s-ar putea să nu vă placă. am avertizat.

    De ce am nevoie de la o limbă

    Unele cerințe nu fac obiectul discuțiilor sau compromisurilor. În primul rând, limbajul trebuie să fie de încredere. Nu-mi permit să-mi pierd timpul căutând greșeli pe care nu le-am făcut.

    Am scris o mulțime de jocuri în Flash și iată, Flash a murit. Nu vreau să petrec timp portând jocuri vechi pe platforme moderne, vreau să scriu jocuri noi. Am nevoie de o platformă în care să am încredere pentru a dura.

    Ceea ce vreau cu siguranță este să evit să depind de un anumit sistem de operare. Ideal - pentru a putea dezvolta pentru console. Prin urmare, este important ca limbajul să vă permită să portați cu ușurință ceea ce este scris în el și, de asemenea, să aibă un suport bun pentru bibliotecile multiplatforme.

    Ce vreau eu de la limba

    Simplitatea este cea mai importantă cerință, dar nu esențială. Mi se pare nebunește de plictisitor studierea caracteristicilor limbajului și a minunatului său API „inteligent”. O limbă ideală poate fi învățată într-o zi și nu a mai folosit documentația sa.

    Găsirea și remedierea erorilor epuizează creativitatea. Vreau mai puține erori, așa că vreau o tastare puternică, o raportare bună a erorilor și o analiză statică a codului. Vreau să simplific căutarea erorilor și, în consecință, instrumente bune de depanare și analiză dinamică.

    Nu mă interesează o imagine frumoasă și realistă, dar îmi pasă de performanță. Mai puțin solicitant de resurse extinde gama de posibilități disponibile pentru implementare. Este deosebit de interesant să urmăriți ce se întâmplă cu computerele moderne puternice când dezvoltatorul nu se gândește la performanță.

    Sunt și mai îngrijorat de viteza compilatorului. Nu sunt un maestru budist al concentrării, iar așteptarea mai mult de 10 secunde este o risipă. Mai rău, este în afara fluxului. Se pare că tocmai s-a uitat pe Twitter și 5 minute au dispărut undeva.

    Nu sunt fan OOP. De cele mai multe ori petrecut la serviciu, m-am ocupat de cursuri și obiecte. Dar cu cât mai departe, cu atât înțeleg mai puțin de ce este necesar să combin codul și datele atât de strâns. Vreau să lucrez cu datele ca și cum ar fi date și să scriu codul care se potrivește cel mai bine situației.

    Alternative

    C++ continuă să fie limbajul cel mai utilizat pentru dezvoltarea jocurilor și din motive întemeiate. Până acum, majoritatea proiectelor mele personalizate sunt scrise pe el și nu îmi place.

    C++ îmi acoperă nevoile, dar nu se potrivește cu dorințele mele. El este extrem de complex. În ciuda prezenței instrumentelor adecvate, este ușor să faci greșeli insidioase pe el. De asemenea, în comparație cu C, se compilează lent. C++ are performanțe ridicate și oferă caracteristici care nu sunt disponibile în C, dar nu este ceea ce vreau și vine cu prețul unei complexități mari.

    C# și Java au probleme similare. Aceștia sunt monștri proliști și complexi și am nevoie de un animal mic și simplu. Ambele limbi trimit programatorul direct în abisul OOP, iar eu sunt împotrivă. La fel ca în majoritatea limbilor de nivel înalt, multe dintre lucrurile complexe sunt ascunse în așa fel încât nimic nu vă împiedică să vă împușcați accidental în picior.

    Îmi place foarte mult Go. În multe privințe, este un C reinventat, cu avertismentul că a fost în pregătire de câțiva ani înainte de a fi lansat publicului. Aș dori să folosesc Go, dar există o capcană uriașă - colectarea gunoiului. Dezvoltarea jocului în Go este discutabilă, deoarece colectorul de gunoi va întrerupe întreaga lume a jocului, ceea ce dezvoltatorul nu și-o poate permite. De asemenea, aici totul nu este foarte bine cu bibliotecile de jocuri. Și deși puteți adapta oricând o bibliotecă C pentru această afacere și fără prea multe probleme, tot generează multă muncă inutilă. În plus, am îndoieli cu privire la perspective. Go ar fi bine pentru web, dar este un mediu în schimbare rapidă. Acest lucru s-a simțit mai ales odată cu moartea lui Flash.

    Nu-mi place deloc JavaScript. Oferă atât de multă libertate încât nu înțeleg cum reușesc oamenii să scrie proiecte complicate pe el. Și nici nu vreau să încerc.

    Haxe pare mult mai promițător decât restul limbilor de pe această listă. Nu are probleme cu bibliotecile. Dacă încep să scriu din nou pentru web, cu siguranță îl voi cunoaște mai bine. Oarecum îngrijorat de relativa tinerețe a limbii, va trăi? Nu mai am nimic de adăugat, cu Haxe am reușit doar să joc puțin, fără să intru adânc.

    Jonathan Blow își scrie propria limbă. Limba pe care el însuși ar dori să o folosească. Îi admir decizia, uneori chiar îmi aprind ideea de a face la fel. Dar nu aruncați toate bibliotecile existente. Și să realizezi compatibilitatea deplină cu ele nu este atât de simplu. Și în general este dificil, aș prefera să continui să scriu jocuri, și nu limbaje de programare.

    De ce C este cea mai bună alegere pentru mine

    Deși C este periculos, este de încredere. Acesta este un cuțit foarte ascuțit care poate tăia degetele la fel de ușor ca tăierea legumelor. Dar este simplu și să înveți cum să-l folosești corect nu va fi dificil.

    Bună, e rapid. Și când vine vorba de compilare, nu îmi imaginez că orice limbă o poate face mai repede.
    Este posibil să scrieți cod, astfel încât să funcționeze peste tot. Și de obicei este relativ ușor. Este greu de imaginat că într-o zi asta se va schimba.

    Există un suport excelent pentru biblioteci și instrumente.

    Deși mă întristează puțin, C este totuși cel mai bun limbaj pentru mine.

    Chiar nu vreau să spun ceva de genul: „Hei, ar trebui să scrii și tu în C”. Sunt conștient că preferințele mele sunt foarte specifice. În plus, în ceea ce privește cantitatea de cod pe care o scriu în diferite limbi, codul C „vanilat” ocupă o poziție de lider, așa că acesta face deja parte din zona mea de confort.

    Deci da, C este cea mai bună alegere pentru mine.

    De la traducător

    Traducerea pe alocuri este destul de liberă, dar nu în detrimentul sensului sau al conținutului.

    Traducerea am pregătit-o special pentru vineri, în această zi este deosebit de potrivită, după părerea mea. Deși autorul textului original pare să scrie cu toată seriozitatea... chiar tu înțelegi totul dacă îl citești. Nu trebuie luat ca adevăr.

    Cu sugestii, urări și comentarii, ca de obicei, în LAN.

     
    Articole De subiect:
    Paste cu ton în sos cremos Paste cu ton proaspăt în sos cremos
    Pastele cu ton în sos cremos este un preparat din care oricine își va înghiți limba, desigur, nu doar pentru distracție, ci pentru că este nebunește de delicios. Tonul și pastele sunt în perfectă armonie unul cu celălalt. Desigur, poate cuiva nu va place acest fel de mâncare.
    Rulouri de primăvară cu legume Rulouri de legume acasă
    Astfel, dacă te lupți cu întrebarea „care este diferența dintre sushi și rulouri?”, răspundem - nimic. Câteva cuvinte despre ce sunt rulourile. Rulourile nu sunt neapărat bucătărie japoneză. Rețeta de rulouri într-o formă sau alta este prezentă în multe bucătării asiatice.
    Protecția florei și faunei în tratatele internaționale ȘI sănătatea umană
    Rezolvarea problemelor de mediu și, în consecință, perspectivele dezvoltării durabile a civilizației sunt în mare măsură asociate cu utilizarea competentă a resurselor regenerabile și a diferitelor funcții ale ecosistemelor și gestionarea acestora. Această direcție este cea mai importantă cale de a ajunge
    Salariul minim (salariul minim)
    Salariul minim este salariul minim (SMIC), care este aprobat anual de Guvernul Federației Ruse pe baza Legii federale „Cu privire la salariul minim”. Salariul minim este calculat pentru rata de muncă lunară completă.