DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir

"Ez dizanim ku ez tiştekî nizanim" Sokrates

Ji bo kê: ji bo kesên IT-ê yên ku tif li hemî pêşdebiran dikin û dixwazin lîstikên xwe bilîzin!

Li ser çi: Ger hewce be meriv çawa dest bi nivîsandina lîstikan di C/C++ de dike!

Çima divê hûn vê bixwînin: Pêşveçûna serîlêdanê ne taybetmendiya xebata min e, lê ez hewl didim ku her hefte kodê bikim. Ji ber ku ez ji lîstikan hez dikim!

Merheba navê min Andrey Grankin, Ez li Luxoft DevOps im. Pêşveçûna serîlêdanê ne pisporiya xebata min e, lê ez hewl didim ku her hefte kodê bikim. Ji ber ku ez ji lîstikan hez dikim!

Pîşesaziya lîstikên komputerê pir mezin e, îro ji pîşesaziya fîlimê jî bêtir tê gotin. Lîstok ji destpêka pêşkeftina komputeran ve, bi karanîna standardên nûjen, rêbazên pêşkeftina tevlihev û bingehîn hatine nivîsandin. Bi demê re, motorên lîstikê bi grafîk, fîzîk û dengek berê bernamekirî dest pê kirin. Ew dihêlin ku hûn bala xwe bidin ser pêşkeftina lîstikê bixwe û ji bingeha wê aciz nebin. Lê bi wan re, bi motoran re, pêşdebiran jî "kor dibin" û xirab dibin. Hilberîna lîstikan pir li ser veguhêz tê danîn. Û mîqdara hilberînê dest pê dike ku li ser kalîteya wê serdest bibe.

Di heman demê de, dema ku lîstokên mirovên din dilîzin, em bi domdarî ji hêla cîh, plan, karakter, mekanîzmayên lîstikê yên ku mirovên din jê re derketine têne sînorkirin. Ji ber vê yekê min fêm kir ku ...

... dem hatiye ku ez cîhanên xwe biafirînim, tenê li ser min bin. Cîhanên ku ez Bav, Kur û Ruhê Pîroz im!

Û ez ji dil bawer dikim ku bi nivîsandina motora lîstika xwe û lîstikek li ser wê, hûn ê karibin çavên xwe vekin, pencereyan paqij bikin û kabîneya xwe pomp bikin, û bibin bernamenûsek bi ezmûn û entegre.

Di vê gotarê de ez ê hewl bidim ku ji we re vebêjim ka min çawa dest bi nivîsandina lîstikên piçûk di C/C++ kir, pêvajoya pêşkeftinê çawa ye, û ez li ku derê ji bo hobiyek di hawîrdorek mijûl de dem dibînim. Ew subjektîf e û pêvajoya destpêkek kesane diyar dike. Materyal li ser nezanî û baweriyê, li ser wêneya min a kesane ya cîhanê ya vê gavê. Bi gotineke din, "Rêveberî ji mêjiyên we yên kesane ne berpirsiyar e!"

Praktice

"Zaneya bê pratîk bêkêr e, pratîka bê zanîn xeternak e." Konfuçyûs

Deftera min jiyana min e!


Ji ber vê yekê, di pratîkê de, ez dikarim bibêjim ku her tişt ji bo min bi defterê dest pê dike. Ez ne tenê karên xwe yên rojane li wir dinivîsim, lê di heman demê de xêz dikim, bername dikim, nexşeyên herikandinê sêwirandim û pirsgirêkan, tevî yên matematîkî, çareser dikim. Her tim notepadek bikar bînin û tenê bi qelemê binivîsin. Ew paqij, rehet û pêbawer e, IMHO.

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Deftera min (jixwe dagirtî). Ev çawa xuya dike. Ew peywirên rojane, raman, xêzkirin, diagram, çareserî, pirtûkparêziya reş, kod û hwd dihewîne.

Di vê qonaxê de, min sê projeyan temam kir (ev di têgihîştina min de "dawî" ye, ji ber ku her hilberek bi rengek bêdawî dikare were pêşve xistin).

  • Proje 0: ev dîmenek Mîmar Demo 3D ye ku bi C# bi karanîna motora lîstika Unity hatî nivîsandin. Ji bo platformên macOS û Windows.
  • Lîstik 1: lîstika konsolê Simple Snake (ji her kesî re wekî "Snake" tê zanîn) ji bo Windows. bi C hatiye nivîsandin.
  • Lîstik 2: Lîstika konsolê Crazy Tanks (ji her kesî re wekî "Tanks" tê zanîn), berê bi C ++ (bi karanîna dersan) û di bin Windows de jî hatî nivîsandin.

Projeya 0 Mîmar Demo

  • Platformê: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Ziman: C#
  • Motora lîstikê: Yekîtî
  • Eyan: Darrin Lile
  • Depo: GitHub

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
3D Scene Mîmar Demo

Projeya yekem ne di C/C++, lê di C# de bi karanîna motora lîstika Unity hate bicîh kirin. Ev motor bi qasî ku li ser hardware ne daxwaz bû Endamê Unreal, û di heman demê de ji min re sazkirin û karanîna hêsantir xuya bû. Min motorên din hesab nekir.

Armanca Unity ji bo min ne pêşxistina celebek lîstikê bû. Min dixwest ku bi celebek karakterek dîmenek 3D biafirînim. Ew, an bêtir Ew (min modela keça ku ez jê re evîndar bûm =) neçar bû ku bi cîhana derve re tevbigere û têkeve têkiliyê. Tenê girîng bû ku meriv fêm bike ka Yekîtî çi ye, pêvajoya pêşkeftinê çi ye, û ji bo afirandina tiştek çiqas hewl dide. Bi vî rengî projeya Mîmar Demo ji dayik bû (nav hema hema ji bilbilê hate îcadkirin). Bernamekirin, modelkirin, anîmasyon, texturkirin belkî du meh karê rojane ji min re girt.

Min bi vîdyoyên dersê yên li ser YouTube-ê dest pê kir ka meriv çawa modelên 3D diafirîne Blender. Blender ji bo modela 3D (û bêtir) amûrek belaş a mezin e ku pêdivî bi sazkirinê nake. Û li vir şokek li benda min bû ... Derket holê ku modelkirin, anîmasyon, texturing mijarên cihêreng ên mezin in ku hûn dikarin li ser wan pirtûkan binivîsin. Ev bi taybetî ji bo karakteran rast e. Ji bo modela tiliyan, diran, çav û beşên din ên laş, hûn ê hewceyê zanîna anatomiyê bibin. Masûlkeyên rû çawa hatine rêzkirin? Mirov çawa tevdigere? Diviya bû ku min hestî "têxe nav her mil, ling, tilî, kulm!"

Klavîk, lebatên hestî yên zêde model bikin, da ku anîmasyon xwezayî xuya bike. Piştî dersên weha, hûn fêhm dikin ku çêkerên fîlmên anîmasyon çi karekî mezin dikin, tenê ji bo afirandina 30 saniye vîdyoyê. Lê fîlimên 3D bi saetan dom dikin! Û paşê em ji şanogeran derdikevin û tiştekî wiha dibêjin: “Ta, karîkatur/fîlmek şêt! Wan dikaribû çêtir bikira…” Ehmeqan!

Û tiştek din di derbarê bernamekirinê de di vê projeyê de. Weke ku derket holê, ji bo min beşa herî balkêş beşa matematîkê bû. Ger hûn dîmenê bimeşînin (di danasîna projeyê de bi depoyê ve girêdin), hûn ê ferq bikin ku kamera li dora karaktera keçikê di qadek de dizivire. Ji bo bernamekirina zivirîna kamerayek wusa, diviya bû ku ez pêşî koordînatên xala pozîsyonê li ser çemberê (2D), û dûv re jî li qada (3D) hesab bikim. Tiştê xweş ev e ku min li dibistanê ji matematîkê nefret dikir û ew bi kêmasî dizanibû. Qet nebe, dibe ku, ji ber ku li dibistanê ew bi hêsanî ji we re rave nakin ka ev matematîkî çawa di jiyanê de tê sepandin. Lê gava ku hûn bi armanca xwe, xewna xwe re mijûl bibin, wê demê hiş paqij dibe, eşkere dibe! Û hûn dest pê dikin ku karên tevlihev wekî serpêhatiyek balkêş dibînin. Û dûv re hûn difikirin: "Belê, çima matematîkzanê *hezkirî* bi gelemperî nekare bêje ka van formulan li ku derê dikarin werin rijandin?".

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Hesabkirina formulên ji bo hesabkirina koordînatên xalek li ser çemberek û li ser qonaxekê (ji deftera min)

Lîstika 1

  • Platformê: Windows (li ser Windows 7, 10 ceribandin)
  • Ziman: Ez difikirim ku min ew bi C-ya paqij nivîsand
  • Motora lîstikê: Konsolê Windows
  • Eyan: javidx9
  • Depo: GitHub

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Lîstika Marê ya hêsan

Dîmena 3D ne lîstikek e. Wekî din, modelkirin û anîmkirina tiştên 3D (bi taybetî karakter) dirêj û dijwar e. Piştî ku ez bi Unity re lîstim, min fêm kir ku pêdivî ye ku ez ji bingehan bidomînim, an bêtir dest pê bikim. Tiştek hêsan û bilez, lê di heman demê de gerdûnî ye, ji bo fêmkirina avahiya lîstikan.

Û çi me sade û bi lez heye? Rast e, konsol û 2D. Bi rastî, tewra konsol û sembol jî. Dîsa, min li ser Înternetê dest bi lêgerîna îlhamê kir (bi giştî ez Înternetê îcada herî şoreşger û xeternak a sedsala XNUMX-an dibînim). Min vîdyoyek bernamesazek ​​ku konsolê Tetris çêkiriye vekir. Û wek lîstika xwe, wî biryar da ku "mar" bibire. Ji vîdyoyê, ez li ser du tiştên bingehîn fêr bûm - lûleya lîstikê (bi sê fonksiyonên / beşên bingehîn) û derketina ji tamponê.

Lîstika lîstikê dibe ku tiştek wusa xuya bike:

int main()
   {
      Setup();
      // a game loop
      while (!quit)
      {
          Input();
          Logic();
          Draw();
          Sleep(gameSpeed);  // game timing
      }
      return 0;
   }

Kod tevahiya fonksiyona sereke () bi yekcarî pêşkêş dike. Û çerxa lîstikê piştî şîroveya têkildar dest pê dike. Sê fonksîyonên bingehîn di çerxê de hene: Input(), Mantiq(), Draw(). Pêşîn, daneya têketinê Têketinê (bi piranî kontrolkirina lêdana bişkojan), dûv re Mantiqa daneya têketinê hildiweşîne, dûv re li ser ekranê xuyang dike - Draw. Û vî awayî her çarçoveyê. Anîmasyon bi vî rengî tê çêkirin. Mîna karîkaturan e. Bi gelemperî hilberandina daneya têketinê herî zêde wext digire û, bi qasî ku ez dizanim, rêjeya çarçoveya lîstikê diyar dike. Lê li vir fonksiyona Logic() pir bi lez e. Ji ber vê yekê, rêjeya çarçoveyê divê ji hêla fonksiyona Xew () ve bi parametreya gameSpeed ​​​​, ku vê rêjeyê diyar dike, were kontrol kirin.

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
çerxa lîstikê. Bernamekirina maran di notepad de

Heke hûn lîstikek konsolê ya sembolîk pêşve dikin, wê hingê nîşandana daneyan li ser ekranê bi karanîna derana asayî ya 'cout' nexebite - ew pir hêdî ye. Ji ber vê yekê, pêdivî ye ku encam di tampona ekranê de were kirin. Ew qas zûtir û lîstik dê bêyî xeletiyan bixebite. Bi rastî, ez baş fam nakim ka tamponek ekranê çi ye û ew çawa dixebite. Lê ez ê li vir mînakek kodê bidim, û dibe ku kesek di şîroveyan de bikaribe rewşê zelal bike.

Danîna tampona ekranê (heke ez wusa bibêjim):

// create screen buffer for drawings
   HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0,
 							   NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
   DWORD dwBytesWritten = 0;
   SetConsoleActiveScreenBuffer(hConsole);

Derketina rasterast li ser ekrana rêzek rêzek diyarkirî (xêza nîşandana xalan):

// draw the score
   WriteConsoleOutputCharacter(hConsole, scoreLine, GAME_WIDTH, {2,3}, &dwBytesWritten);

Di teoriyê de, di vê lîstikê de tiştek tevlihev tune, ji min re mînakek baş a lîstikek asta têketinê xuya dike. Kod di yek pelê de tê nivîsandin û di çend fonksiyonan de têne rêz kirin. Ne ders, ne mîras. Hûn bixwe dikarin her tiştî di koda çavkaniyê ya lîstikê de bi çûna depoya li ser GitHub bibînin.

Lîstik 2 Tankên Crazy

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Lîstika Crazy Tanks

Çapkirina karakteran li ser konsolê dibe ku tiştê herî hêsan e ku hûn dikarin veguhezînin lîstikek. Lê dûv re pirsgirêkek xuya dike: karakter xwedî bilindî û firehiyên cihê ne (bilindahî ji firehiyê mezintir e). Bi vî rengî, her tişt dê bêhevseng xuya bike, û herikîna berjêr an jor dê ji tevgerîna çep an rast pir zûtir xuya bike. Ev bandor di "Snake" (Lîstik 1) de pir xuya ye. "Tanks" (Lîstik 2) xwedan kêmasiyek wusa nîn e, ji ber ku derketin li wir bi boyaxkirina pîxelên ekranê bi rengên cihê têne organîze kirin. Hûn dikarin bêjin ku min rendererek nivîsand. Rast e, ev jixwe hinekî tevlihevtir e, her çend pir balkêştir be.

Ji bo vê lîstikê, ew ê bes be ku pergala min ji bo nîşandana pixelan li ser ekranê diyar bike. Ez difikirim ku ev beşa sereke ya lîstikê ye. Û her tiştê din hûn dikarin bi xwe re bibin.

Ji ber vê yekê, ya ku hûn li ser ekranê dibînin, tenê komek çargoşeyên rengîn ên diherikin e.

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Set ji rectangles

Her çargoşe bi matrixeke bi hejmaran dagirtî tê temsîl kirin. Bi awayê, ez dikarim nuwazeyek balkêş ronî bikim - hemî matrices di lîstikê de wekî rêzek yek-alî têne bername kirin. Ne du-alî, lê yek-alî! Karê bi arrayên yek-dimensî pir hêsantir û bileztir in.

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Mînakek matrixek tankek lîstikê

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Nûnertiya Matrixa Tankek Lîstikê bi Arrayek Yek-Dîmenî

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Nimûneyek berbiçavtir a temsîla matrixê ya ji hêla rêzek yek-alî ve

Lê gihandina hêmanên rêzê di çerxeke dualî de çêdibe, mîna ku ew ne rêzek yek-alî be, lê komek du-alî be. Ev tê kirin ji ber ku em hîn jî bi matrican dixebitin.

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Di çerxeke ducar de rêçek yek-dimensî digere. Y - nasnavê rêzê, X - nasnavê stûnê

Ji kerema xwe bala xwe bidin ku li şûna nasnameyên matrixê yên asayî i, j, ez nasnavên x û y bikar tînim. Ji ber vê yekê, ji min re, ji çavê xweştir û ji mêjî re zelaltir xuya dike. Digel vê yekê, nîşanek wusa gengaz dike ku meriv bi rehetî matrîsên ku li ser axên hevrêz ên wêneyek du-alî têne bikar anîn proje bike.

Naha li ser pixel, reng û dîmenderê. Fonksiyona StretchDIBits (Header: windows.h; Pirtûkxane: gdi32.lib) ji bo derketinê tê bikar anîn. Di nav tiştên din de, jêrîn ji vê fonksiyonê re derbas dibe: cîhaza ku li ser wêneyê tê xuyang kirin (di rewşa min de, ev konsolê Windows-ê ye), hevrêzên destpêka nîşandana wêneyê, firehî / bilindahiya wê, û wêne xwe di forma bitmap (bitmap) de, ku ji hêla komek byte ve tê temsîl kirin. Bitmap wekî komek bytes!

Fonksiyona StretchDIBits() di xebatê de:

// screen output for game field
   StretchDIBits(
               deviceContext,
               OFFSET_LEFT, OFFSET_TOP,
               PMATRIX_WIDTH, PMATRIX_HEIGHT,
               0, 0,
               PMATRIX_WIDTH, PMATRIX_HEIGHT,
               m_p_bitmapMemory, &bitmapInfo,
               DIB_RGB_COLORS,
               SRCCOPY
               );

Bîr ji bo vê bitmap-ê bi karanîna fonksiyona VirtualAlloc() di pêş de tê veqetandin. Ango, jimara pêdivî ya bytes tê veqetandin ku agahdariya li ser hemî pîxelan hilîne, ku paşê dê li ser ekranê bêne xuyang kirin.

Afirandina bitmap-ya m_p_bitmapMemory:

// create bitmap
   int bitmapMemorySize = (PMATRIX_WIDTH * PMATRIX_HEIGHT) * BYTES_PER_PIXEL;
   void* m_p_bitmapMemory = VirtualAlloc(0, bitmapMemorySize, MEM_COMMIT, PAGE_READWRITE);

Bi gelemperî, bitmap ji komek pixelan pêk tê. Her çar bit di rêzê de pixelek RGB ye. Ji her nirxa sor yek byte, ji bo nirxa kesk (G) yek byte û ji bo rengê şîn (B) yek byte. Zêdeyî, yek byte li her hêlînê heye. Van her sê rengan - Sor / Kesk / Şîn (RGB) - bi rêjeyên cûda bi hev re têne tevlihev kirin - û rengê pîxelê ya encam tê wergirtin.

Naha, dîsa, her çargoşe, an tişta lîstikê, ji hêla matrixek hejmarê ve tê destnîşan kirin. Hemî van tiştên lîstikê di berhevokê de têne danîn. Û dûv re ew li qada lîstikê têne danîn, yek matrixek hejmarî ya mezin ava dikin. Min her hejmar di matrixê de bi rengek taybetî veqetand. Bo nimûne, hejmara 8 şîn e, hejmara 9 zer e, hejmara 10 gewr tarî ye, û hwd. Bi vî rengî, em dikarin bibêjin ku me matrixek qada lîstikê heye, ku her hejmar rengek rengek e.

Ji ber vê yekê, me ji aliyekî ve matrixek hejmarî ya tevahiya qada lîstikê û ji hêla din ve jî bitmapek ji bo nîşandana wêneyê heye. Heya nuha, bitmap "vala" ye - hîna di derheqê pixelên rengê xwestinê de agahdariya wê tune. Ev tê vê wateyê ku gava paşîn dê bitmap-ê bi agahdariya li ser her pixelê li ser bingeha matrixa hejmarî ya qada lîstikê dagirtin. Nimûneyek berbiçav a veguherînek weha di wêneya jêrîn de ye.

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Nimûneyek dagirtina bitmap (matrixa Pixel) bi agahdariya li ser bingeha matrixa hejmarî (matrîsa dîjîtal) ya qada lîstikê (nîşaneyên rengan bi nîşaneyên lîstikê re hev nagirin)

Ez ê jî perçeyek kodek rastîn ji lîstikê pêşkêşî bikim. Indeksa rengîn a guhêrbar di her dubarekirina lûkê de ji matrixa hejmarî ya qada lîstikê (mainDigitalMatrix) nirxek (indeksa rengan) tê destnîşan kirin. Dûv re reng bi xwe li ser guhêrbara rengîn li ser bingeha îndeksê tê nivîsandin. Wekî din, rengê encam di nav rêjeya sor, kesk û şîn (RGB) de tê dabeş kirin. Û bi hev re (pixelPadding) re, ev agahdarî li ser pixelê dîsa û ji nû ve têne nivîsandin, di bitmap-ê de wêneyek rengîn ava dike.

Kod nîşanker û operasyonên bitwise bikar tîne, ku têgihîştina wan dijwar be. Ji ber vê yekê ez ji we re şîret dikim ku hûn li cîhek cûda bixwînin ka çawa strukturên weha dixebitin.

Dagirtina bitmap bi agahdarî li ser bingeha matrixa hejmarî ya qada lîstikê:

// set pixel map variables
   int colorIndex;
   COLORREF color;
   int pitch;
   uint8_t* p_row;
 
   // arrange pixels for game field
   pitch = PMATRIX_WIDTH * BYTES_PER_PIXEL;     // row size in bytes
   p_row = (uint8_t*)m_p_bitmapMemory;       //cast to uint8 for valid pointer arithmetic
   							(to add by 1 byte (8 bits) at a time)   
   for (int y = 0; y < PMATRIX_HEIGHT; ++y)
   {
       uint32_t* p_pixel = (uint32_t*)p_row;
       for (int x = 0; x < PMATRIX_WIDTH; ++x)
       {
           colorIndex = mainDigitalMatrix[y * PMATRIX_WIDTH + x];
           color = Utils::GetColor(colorIndex);
           uint8_t blue = GetBValue(color);
           uint8_t green = GetGValue(color);
           uint8_t red = GetRValue(color);
           uint8_t pixelPadding = 0;
 
           *p_pixel = ((pixelPadding << 24) | (red << 16) | (green << 8) | blue);
           ++p_pixel;
       }
       p_row += pitch;
   }

Li gorî rêbaza ku li jor hatî destnîşan kirin, di lîstika Crazy Tanks de yek wêne (çarçove) tê çêkirin û di fonksiyona Draw() de li ser ekranê tê xuyang kirin. Piştî tomarkirina bişkojkên di fonksiyona Input() de û pêvajokirina wan a paşîn di fonksiyona Logic() de, wêneyek (çarçoveyek) nû tê çêkirin. Rast e, tiştên lîstikê dibe ku jixwe li qada lîstikê xwedî helwestek cûda bin û, li gorî vê yekê, li cîhek cûda têne xêz kirin. Anîmasyon (tevger) bi vî awayî çêdibe.

Di teoriyê de (heke we tiştek ji bîr nekiriye), têgihîştina lûleya lîstikê ya ji lîstika yekem ("Snake") û pergala nîşandana pixelên li ser ekranê ji lîstika duyemîn ("Tanks") hemî tiştê ku hûn hewce ne ku hûn binivîsin e. ji lîstikên weyên 2D yên ji bo Windows-ê. Soundless! 😉 Parçeyên mayî tenê firînek xeyal in.

Bê guman, lîstika "Tanks" ji "Snake" pir tevlihevtir e. Min berê zimanê C++ bikar anî, ango min tiştên lîstikê yên cihêreng bi dersan vegot. Min berhevoka xwe çêkir - kod dikare di sernavan/Box.h de were dîtin. Bi awayê, berhevokê bi îhtîmalek mezin xwedan lekeyek bîranînê ye. Nîşanker bikar anîn. Bi bîrê re xebitî. Divê ez bibêjim ku pirtûkê gelek alîkariya min kir Destpêka C++ Bi Bernameya Lîstikê. Ev ji bo destpêkan di C ++ de destpêkek girîng e. Ew piçûk, balkêş û baş organîze ye.

Nêzîkî şeş mehan ji bo pêşxistina vê lîstikê girt. Min bi giranî di dema firavînê û xwarinên li ser kar de dinivîsî. Ew li metbexê ofîsê rûnişt, li ser xwarinê da û kod nivîsand. An jî li malê ji bo xwarinê. Ji ber vê yekê min "şerên metbexê" yên weha girt. Mîna her gav, min bi aktîf defterek bikar anî, û hemî tiştên têgînî tê de çêbûn.

Di dawiya beşa pratîkî de, ez ê çend skanên deftera xwe derxim. Ji bo ku nîşan bidim ka min bi rastî çi nivîsî, xêz kir, fikirî, sêwirand ...

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Sêwirana wêneya tankê. Û pênasekirina çend pixelan divê her tank li ser ekranê dagir bike

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Hesabkirina algorîtma û formulan ji bo zivirîna tankê li dora eksê xwe

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Diagrama berhevoka min (ya ku bi lehiya bîranînê ye, bi îhtîmalek mezin). Koleksiyon wekî Lîsteya Girêdayî tê afirandin

DevOps C++ û "şerên metbexê", an jî dema xwarinê min çawa dest bi nivîsandina lîstikan kir
Û ev hewildanên pûç in ku îstîxbarata sûnî di lîstikê de derxînin

Theory

"Tevî rêwîtiyek hezar mîl bi gava yekem dest pê dike" (Aqilmendiya çînî ya kevnar)

Ka em ji pratîkê derbasî teoriyê bibin! Hûn ji bo hobiya xwe çawa wext dibînin?

  1. Diyar bikin ka hûn bi rastî çi dixwazin (hey, ev ya herî dijwar e).
  2. Set pêşanî.
  3. Ji bo xatirê pêşîniyên bilind hemî "zêde" qurban bikin.
  4. Her roj ber bi armancên xwe ve biçin.
  5. Li bendê nebin ku ji bo hobîyek du-sê saetan wextê vala hebe.

Ji aliyekî ve, hûn hewce ne ku hûn diyar bikin ka hûn çi dixwazin û pêşîn bikin. Ji hêla din ve, gengaz e ku meriv hin doz / projeyan di berjewendiya van pêşînan de berde. Bi gotineke din, hûn ê neçar bibin ku her tiştê "zêde" bikin qurban. Min li derekê bihîst ku di jiyanê de divê herî zêde sê çalakiyên sereke hebin. Wê hingê hûn ê bikaribin bi awayê çêtirîn bi wan re mijûl bibin. Û projeyên / rêwerzên din dê dest bi barkirina korneyê bikin. Lê ev hemî, belkî, subjektîf û kesane ye.

Rêgezek zêrîn heye: qet rojek 0% nebe! Ez li ser wê di gotarek ji hêla pêşdebirek indie ve fêr bûm. Heke hûn li ser projeyek dixebitin, wê hingê her roj tiştek li ser wê bikin. Û ne girîng e ku hûn çiqas dikin. Peyvek an rêzek kodê binivîsin, vîdyoyek fêrbûnê temaşe bikin, an jî yek neynûkê li ser panelê bixin - tenê tiştek bikin. Ya herî dijwar destpêk e. Gava ku hûn dest pê bikin, hûn ê belkî ji ya ku we dixwest hinekî bêtir bikin. Ji ber vê yekê hûn ê bi berdewamî berbi armanca xwe ve biçin û, ji min bawer bikin, pir zû. Beriya her tiştî, frena sereke ya her tiştî paşveçûn e.

Û girîng e ku ji bîr mekin ku divê hûn di nav 5, 10, 15 hûrdeman de "tûz"a belaş kêm nebînin û paşguh nekin, li benda hin "logên" mezin bisekinin ku yek an du saet berdewam dikin. Ma hûn di rêzê de radiwestin? Ji bo projeya xwe tiştek bifikirin. Ma hûn diçin ser asalatorê? Tiştekî di defterê de binivîse. Ma hûn li otobusê dixwin? Baş e, hin gotar bixwînin. Her derfetê bikar bînin. Li ser YouTube temaşekirina pisîk û kûçikan rawestînin! Bi mejiyê xwe nexebite!

Û ya dawî. Ger, piştî xwendina vê gotarê, we ji ramana afirandina lîstikan bêyî karanîna motorên lîstikê hez kir, wê hingê navê Casey Muratori bi bîr bînin. Ev zilam heye malpera. Di beşa "temaşe bikin -> PÊŞÎDÊN BERÊ" de hûn ê dersên vîdyoyê yên belaş ên ecêb bibînin ka meriv çawa ji nû ve lîstikek profesyonel biafirîne. Hûn dikarin di pênc dersên Intro to C de ji bo Windows-ê ji pênc salên xwendina li zanîngehê bêtir fêr bibin (kesek li ser vê yekê di şîroveyên binê vîdyoyê de nivîsand).

Casey jî diyar dike ku bi pêşxistina motora lîstika xwe, hûn ê ji motorên heyî çêtir têgihiştinek çêbikin. Di cîhana çarçoveyan de, ku her kes hewl dide ku bixweber bike, hûn ê fêr bibin ka meriv çawa biafirîne, ne bikar bîne. Xwezaya komputeran fêm bikin. Û hûn ê jî bibin bernamenûsek pir jîr û mazintir - pispor.

Bextê te xweş bî li ser riya te ya hilbijartî! Û em dinya profesyoneltir bikin.

Author: Grankin Andrey, DevOps



Source: www.habr.com