DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل

"زه پوهیږم چې زه هیڅ نه پوهیږم." سقراط

د چا لپاره: د آی ټي خلکو لپاره چې د ټولو پراختیا کونکو پروا نه کوي او غواړي خپلې لوبې وکړي!

د څه په هکله: په C/C++ کې د لوبو لیکلو څرنګوالي په اړه ، که تاسو ناڅاپه ورته اړتیا لرئ!

ولې باید دا ولولئ: د غوښتنلیک پراختیا زما د مهارت ساحه نه ده، مګر زه هڅه کوم چې هره اونۍ کوډ وکړم. ځکه چې زه لوبې خوښوم!

سلام زما نوم دی اندری ګرینکین، زه په Luxoft کې DevOps یم. د غوښتنلیک پراختیا زما ځانګړتیا نه ده، مګر زه هڅه کوم چې هره اونۍ کوډ وکړم. ځکه چې زه لوبې خوښوم!

د کمپیوټر لوبو صنعت خورا لوی دی، داسې ګنګوسې دي چې نن ورځ د فلم صنعت څخه هم لوی وي. لوبې د کمپیوټر له پیل راهیسې لیکل شوي، د عصري معیارونو، پیچلو او بنسټیزو پراختیا میتودونو په کارولو سره. د وخت په تیریدو سره ، د لوبې انجنونه چې دمخه برنامه شوي ګرافیک ، فزیک او غږ سره څرګندیدل پیل شوي. دوی تاسو ته اجازه درکوي چې پخپله د لوبې پراختیا باندې تمرکز وکړئ او د دې بنسټ په اړه اندیښنه مه کوئ. مګر د دوی سره، د انجنونو سره، پراختیا کونکي "ړندول" او خرابیږي. د لوبو تولید پخپله د کنویر بیلټ کې ایښودل شوی. او د محصولاتو مقدار د دې کیفیت باندې غالب کیږي.

په ورته وخت کې، کله چې د نورو خلکو لوبې کول، موږ په دوامداره توګه د ځایونو، پلاټ، کرکټرونو، او د لوبې میکانیکونو لخوا محدود یو چې نور خلک ورسره راځي. نو زه پوه شوم چې ...

... هغه وخت را رسېدلی چې خپله نړۍ جوړه کړم، یوازې زما موضوع. نړۍ چیرته چې زه پلار، زوی او روح القدس یم!

او زه په صادقانه توګه باور لرم چې د خپل لوبې انجن په لیکلو او په هغې کې لوبې کولو سره، تاسو به وکولی شئ خپل بوټان وباسئ، کړکۍ پاکې کړئ او خپل کیبن لوړ کړئ، یو ډیر تجربه لرونکي او بشپړ پروګرامر شئ.

پدې مقاله کې به زه هڅه وکړم تاسو ته ووایم چې څنګه ما په C/C++ کې د کوچنیو لوبو لیکل پیل کړل، د پراختیا پروسه څه ډول ده، او چیرته چې زه په مصروف چاپیریال کې د شوق لپاره وخت وموم. دا موضوعي ده او د انفرادي پیل پروسه بیانوي. د ناپوهۍ او عقیدې په اړه مواد، په اوس وخت کې زما د شخصي انځور په اړه. په بل عبارت، "اداره ستاسو د شخصي مغز لپاره مسؤل نه ده!"

تمرین

کنفیوشیس وايي: "پوهه له عمل پرته بې ګټې ده، له پوهې پرته عمل خطرناک دی."

زما نوټ بوک زما ژوند دی!


نو، په عمل کې، زه کولی شم ووایم چې زما لپاره هرڅه د نوټ پیډ سره پیل کیږي. زه هلته نه یوازې خپلې ورځنۍ دندې لیکم، زه هم رسم، پروګرام، فلوچارټ ډیزاین کوم او د ریاضیاتو په ګډون ستونزې حل کوم. تل یو نوټ پیډ وکاروئ او یوازې په پنسل ولیکئ. دا پاک، اسانه او د باور وړ دی، IMHO.

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
زما (د مخه ډک شوی) نوټ بوک. دا هغه څه دي چې ورته ښکاري. په دې کې ورځني کارونه، نظرونه، نقاشۍ، ډیاګرامونه، حلونه، تور کتابچه، کوډ او داسې نور شامل دي

پدې مرحله کې، ما درې پروژې بشپړې کړې (دا د "بشپړتیا" په اړه زما په پوهه کې ده، ځکه چې هر محصول په نسبي توګه بې پایه وده کولی شي).

  • پروژه 0: دا د 3D معمار ډیمو صحنه ده چې د یووالي لوبې انجن په کارولو سره په C# کې لیکل شوې. د macOS او وینډوز پلیټ فارمونو لپاره.
  • ۷مه لوبه: د وینډوز لپاره د کنسول لوبه ساده سانپ (هرچا ته د "سانپ" په نوم پیژندل کیږي). په سی کې لیکل شوی.
  • ۷مه لوبه: د کنسول لوبه Crazy Tanks (هرچا ته د "ټینکس" په نوم پیژندل کیږي)، په C++ کې لیکل شوي (د ټولګیو کارول) او همدارنګه د وینډوز لپاره.

پروژه 0. د معمار ډیمو

  • پلیټ فارم: وینډوز (وینډوز 7، 10)، Mac OS (OS X El Capitan v. 10.11.6)
  • موضوع: C#
  • د لوبې انجن: يووالي
  • الهام: ډارین لیل
  • ذخیره: GitHub

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
د 3D صحنې معمار ډیمو

لومړۍ پروژه په C/C++ کې نه، بلکې په C# کې د یووالي لوبې انجن په کارولو سره پلي شوې وه. دا انجن د هارډویر په څیر غوښتنه نه وه غیر حقیقي انجنی، او د نصب او کارولو لپاره هم اسانه ښکاري. ما نورو انجنونو ته پام نه دی کړی.

په یووالي کې زما هدف د لوبې وده نه وه. ما غوښتل د یو څه کرکټر سره 3D صحنه جوړه کړم. هغه، یا بلکه هغه (ما هغه نجلۍ ماډل کړه چې زه ورسره مینه لرم =) باید حرکت وکړي او د هغه شاوخوا نړۍ سره اړیکه ونیسي. یوازې دا مهمه وه چې پوه شو چې یووالی څه شی دی، د پرمختګ پروسه څه ده او د یو څه رامینځته کولو لپاره څومره هڅو ته اړتیا ده. دا څنګه د معمار ډیمو پروژه رامینځته شوه (نوم تقریبا له کوم ځای څخه اختراع شوی و). برنامه کول ، ماډلینګ ، حرکت کول ، جوړښت ما شاید دوه میاشتې ورځني کار واخیست.

ما په یوټیوب کې د 3D ماډلونو رامینځته کولو په اړه د زده کړې ویډیوګانو سره پیل وکړ مخلوط. بلینډر د 3D ماډلینګ (او نور) لپاره عالي وړیا وسیله ده چې نصب ته اړتیا نلري. او دلته یو ټکان زما په تمه و ... دا معلومه شوه چې ماډلینګ، انیمیشن، جوړښت لوی جلا موضوعات دي چې تاسو کولی شئ کتابونه ولیکئ. دا په ځانګړې توګه د کرکټرونو لپاره ریښتیا ده. د ګوتو، غاښونو، سترګو او د بدن نورو برخو ماډل کولو لپاره، تاسو به د اناتومي پوهه ته اړتیا ولرئ. د مخ عضلات څنګه جوړښت لري؟ خلک څنګه حرکت کوي؟ ما باید په هر لاس، پښه، ګوتې، د ګوتو په فلجونو کې هډوکي "نښودل".

کالربونونه او اضافي لیور هډوکي ماډل کړئ ترڅو حرکت طبیعي ښکاري. د داسې درسونو وروسته، تاسو پوهیږئ چې د متحرک فلمونو جوړونکي یوازې د 30 ثانیو ویډیو جوړولو لپاره څومره کار کوي. مګر 3D فلمونه د ساعتونو لپاره دوام کوي! او بیا موږ سینما پریږدو او یو څه ووایو لکه: "دا یو فاسد کارټون / فلم دی! دوی ښه کار کولی شو ..." احمقانو!

او په دې پروژه کې د پروګرام کولو په اړه یو بل شی. لکه څنګه چې دا وګرځید، زما لپاره ترټولو زړه پورې برخه ریاضی وه. که تاسو صحنه پرمخ وړئ (د پروژې په توضیح کې د ذخیره کولو لینک) ، تاسو به وګورئ چې کیمره د انجلۍ کرکټر شاوخوا په یوه ساحه کې ګرځي. د کیمرې دا ډول گردش پروګرام کولو لپاره، ما باید لومړی په دایره (2D) کې د موقعیت نقطه همغږي محاسبه کړي، او بیا په ساحه (3D). په زړه پورې خبره دا ده چې ما په ښوونځي کې د ریاضیاتو څخه کرکه درلوده او د C-minus سره پوهیدم. یو څه ، شاید ، ځکه چې په ښوونځي کې دوی په ساده ډول تاسو ته نه تشریح کوي چې دا ریاضی څنګه په ژوند کې پلي کیږي. مګر کله چې تاسو د خپل هدف سره لیوالتیا لرئ، ستاسو خوب، ستاسو ذهن روښانه او خلاصیږي! او تاسو د یو زړه راښکونکي جرات په توګه ستونزمن کارونه درک کول پیل کوئ. او بیا تاسو فکر کوئ: "ښه، ولې ستاسو * د خوښې * ریاضي پوه نشي کولی تاسو ته په نورمال ډول ووایی چیرې چې دا فورمولونه پلي کیدی شي؟"

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
په یوه دایره او یوه ساحه کې د یوې نقطې همغږي محاسبه کولو لپاره د فورمولونو محاسبه (زما له نوټ بوک څخه)

لوبه 1. ساده مار

  • پلیټ فارم: وینډوز (په وینډوز 7، 10 کې ازمول شوی)
  • موضوع: زه فکر کوم چې ما دا په خالص C کې لیکلي
  • د لوبې انجن: د وینډوز کنسول
  • الهام: javidx9
  • ذخیره: GitHub

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
د سانپ ساده لوبه

یو 3D صحنه لوبه نه ده. سربیره پردې ، د 3D شیانو ماډل کول او متحرک کول (په ځانګړي توګه کرکټرونه) د وخت مصرف او ستونزمن دي. د یووالي سره شاوخوا لوبې کولو وروسته ، ما ته دا احساس راغی چې زه اړتیا لرم چې دوام ورکړم ، یا بلکه له اساساتو څخه پیل کړم. یو څه ساده او ګړندی ، مګر په ورته وخت کې نړیوال ، د لوبو خورا جوړښت پوهیدو لپاره.

ساده او چټک څه شی دی؟ دا سمه ده، کنسول او 2D. ډیر دقیق، حتی کنسول او سمبولونه. یوځل بیا زه په انټرنیټ کې د الهام په لټه کې وم (په عموم کې، زه فکر کوم چې انټرنیټ د XNUMX پیړۍ ترټولو انقلابي او خطرناک اختراع دی). ما د یو پروګرامر یوه ویډیو کیندل چې کنسول Tetris جوړ کړ. او د هغه د لوبې په څیر ما پریکړه وکړه چې یو "سانپ" جوړ کړم. د ویډیو څخه ما د دوه بنسټیزو شیانو په اړه زده کړل - د لوبې لوپ (د دریو بنسټیزو فعالیتونو / برخو سره) او بفر ته محصول.

د لوبې لوپ ممکن داسې ښکاري:

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

کوډ ټول اصلي () فعالیت په یوځل کې وړاندې کوي. او د لوبې دورې د مناسب تبصرې وروسته پیل کیږي. په لوپ کې درې اساسي دندې شتون لري: Input()، Logic()، Draw(). لومړی، د ډاټا داخلول (په عمده توګه د کیسټروک کنټرول)، بیا د ننوتلو ډاټا منطق پروسس کول، بیا سکرین ته محصول - رسم کړئ. او همداسې په هر چوکاټ کې. دا څنګه انیمیشن رامینځته کیږي. دا د کارتونونو په څیر دی. په عموم کې ، د ننوتلو معلوماتو پروسس کول خورا ډیر وخت نیسي او تر هغه ځایه چې زه پوهیږم ، د لوبې چوکاټ نرخ ټاکي. مګر دلته د منطق () فنکشن خورا ګړندی اجرا کوي. له همدې امله، تاسو باید د لوبې سپیډ پیرامیټر سره د Sleep() فنکشن په کارولو سره د فریم کچه کنټرول کړئ، کوم چې دا سرعت ټاکي.

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
د لوبې دوره. په نوټ پیډ کې د "سانپ" برنامه کول

که تاسو د کرکټر پراساس کنسول لوبه رامینځته کوئ ، نو تاسو به نشئ کولی د منظم 'cout' سټریم محصول په کارولو سره سکرین ته ډیټا تولید کړئ - دا خورا ورو دی. نو ځکه، محصول باید د سکرین بفر ته واستول شي. دا خورا ګړندی دی او لوبه به پرته له خنډونو پرمخ ځي. د ریښتیني کیدو لپاره ، زه په بشپړ ډول نه پوهیږم چې د سکرین بفر څه دی او دا څنګه کار کوي. مګر زه به دلته د مثال کوډ ورکړم، او شاید یو څوک په نظرونو کې وضعیت روښانه کړي.

د سکرین بفر ترلاسه کول (داسې خبرې کول):

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

د یوې ټاکلې سټرینګ سکور لاین مستقیم ښکاره کول (د سکور ښودلو لاین):

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

په تیوري کې، پدې لوبه کې هیڅ پیچلي شتون نلري؛ زه فکر کوم چې دا د ننوتلو ښه مثال دی. کوډ په یوه فایل کې لیکل شوی او په څو دندو کې فارمیټ شوی. نه ټولګي، نه میراث. تاسو کولی شئ هرڅه پخپله د لوبې سرچینې کوډ کې د GitHub ذخیره کولو ته لاړ شئ.

لوبه 2. لیونی ټانکونه

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
لوبه لیونی ټانکونه

کنسول ته د کرکټرونو چاپ کول شاید ترټولو ساده شی وي چې تاسو کولی شئ لوبې ته واړوئ. مګر بیا یوه ستونزه ښکاري: سمبولونه مختلف لوړوالی او پلنوالی لري (د قد څخه لوړ دی). په دې توګه، هرڅه به د تناسب څخه ښکاري، او ښکته یا پورته حرکت به د چپ یا ښي خوا حرکت کولو په پرتله خورا ګړندی ښکاري. دا اغیز په سانپ (لوبه 1) کې خورا د پام وړ دی. "ټینکونه" (ګیم 2) دا نیمګړتیا نلري، ځکه چې هلته محصول د مختلف رنګونو سره د سکرین پکسلونو رنګ کولو له لارې تنظیم شوی. تاسو کولی شئ ووایاست چې ما یو رینډر لیکلی. ریښتیا، دا یو څه ډیر پیچلی دی، که څه هم ډیر په زړه پوری دی.

د دې لوبې لپاره، دا به کافي وي چې په سکرین کې د پکسلونو ښودلو لپاره زما سیسټم تشریح کړئ. زه دا د لوبې اصلي برخه ګڼم. او تاسو کولی شئ د هر څه سره پخپله راشي.

نو، هغه څه چې تاسو په سکرین کې ګورئ یوازې د څو رنګه مستطیلونو حرکت کولو سیټ دی.

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
د مستطیلونو سیټ

هر مستطیل د یو میټرکس لخوا نمایش کیږي چې د شمیرو څخه ډک شوی. په لاره کې، زه کولی شم یو په زړه پورې نزاکت روښانه کړم - په لوبې کې ټول میټریکونه د یو ابعادي صف په توګه برنامه شوي. دوه اړخیزه نه، بلکې یو اړخیزه! یو اړخیز صفونه د کار کولو لپاره خورا اسانه او ګړندي دي.

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
د لوبې ټانک میټرکس بیلګه

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
د لوبې ټانک میټرکس استازیتوب د یو ابعادي صف په توګه

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
د یو ابعادي صف په توګه د میټرکس نمایندګي یو ډیر بصری مثال

مګر د صف عناصرو ته لاسرسی په دوه اړخیزه لوپ کې واقع کیږي، لکه څنګه چې دا یو اړخیز سري نه وي، مګر دوه اړخیزه وي. دا ترسره کیږي ځکه چې موږ لاهم د میټریکونو سره کار کوو.

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
په یو دوه اړخیزه سرې کې دوه اړخیزه تیریدل. Y - قطار پیژندونکی، X - کالم پیژندونکی

مهرباني وکړئ په یاد ولرئ: د معمول میټریکس پیژندونکو پرځای i, j، زه د x او y پیژندونکي کاروم. په دې توګه، دا ماته ښکاري، دا د سترګو لپاره ډیر خوښ دی او دماغ ته ډیر د پوهیدو وړ دی. برسېره پردې، دا ډول یادښت دا ممکنه کوي چې په اسانۍ سره د دوه اړخیز عکس د همغږۍ محورونو کې کارول شوي میټریکونه په اسانۍ سره وړاندې کړي.

اوس د پکسل، رنګ او سکرین محصول په اړه. د StretchDIBits فنکشن د محصول لپاره کارول کیږي (سرلیک: windows.h؛ کتابتون: gdi32.lib). دا فنکشن ، د نورو شیانو په مینځ کې ، لاندې ترلاسه کوي: هغه وسیله چې عکس پکې ښودل کیږي (زما په قضیه کې ، دا د وینډوز کنسول دی) ، د عکس نمایش پیل همغږي ، د هغې عرض / لوړوالی ، او پخپله عکس د بټ میپ بڼه، د بایټونو د لړۍ لخوا استازیتوب کیږي. بټ میپ د بایټ سرې په توګه!

StretchDIBits() فعالیت په عمل کې:

// 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
               );

حافظه د VirtualAlloc() فنکشن په کارولو سره د دې بټ میپ لپاره دمخه تخصیص شوې. دا د ټولو پکسلونو په اړه د معلوماتو ذخیره کولو لپاره اړین شمیر بایټونه ساتل شوي، چې بیا به په سکرین کې ښکاره شي.

د m_p_bitmapMemory bitmap جوړول:

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

په لنډه توګه، یو بټ میپ د پکسلونو سیټ څخه جوړ دی. په صف کې هر څلور بایټونه د RGB پکسل دی. یو بایټ د هر سور رنګ ارزښت، یو بایټ د زرغون رنګ ارزښت (G)، او یو بایټ د هر نیلي رنګ ارزښت (B). برسېره پردې د انډیټیشن لپاره یو بایټ پاتې دی. دا درې رنګونه - سور / شین / نیلي (RGB) - د یو بل سره په مختلف تناسب کې مخلوط شوي ترڅو پایله لرونکي پکسل رنګ رامینځته کړي.

اوس، بیا، هر مستطیل، یا د لوبې څیز، د عددي میټرکس لخوا استازیتوب کیږي. دا ټول د لوبې توکي په ټولګه کې ځای پر ځای شوي دي. او بیا دوی د لوبې په ډګر کې ځای پر ځای شوي، یو لوی عددي میټرکس جوړوي. ما په میټرکس کې هره شمیره د یو ځانګړي رنګ سره وصل کړه. د مثال په توګه، 8 شمیره نیلي سره سمون لري، 9 شمیره ژیړ سره، 10 شمیره تور خړ سره، او داسې نور. په دې توګه، موږ کولی شو ووایو چې موږ د لوبې ډګر یو میټرکس لرو، چیرې چې هره شمیره یو رنګ دی.

نو، موږ په یو اړخ کې د ټول لوبې ډګر شمیري میټرکس او بل اړخ ته د عکس ښودلو لپاره بټ میپ لرو. تر دې دمه ، بټ میپ "خالي" دی - دا لاهم د مطلوب رنګ پکسلز په اړه معلومات نلري. دا پدې مانا ده چې وروستی ګام به د لوبې ساحې د عددي میټرکس پراساس د هر پکسل په اړه معلوماتو سره د بټ میپ ډکول وي. د دې ډول بدلون روښانه مثال په لاندې انځور کې دی.

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
د لوبې ډګر ډیجیټل میټرکس پراساس د معلوماتو سره د بټ میپ (پکسل میټریکس) ډکولو مثال (د رنګ شاخصونه په لوبې کې شاخصونو سره سمون نه لري)

زه به د لوبې څخه د اصلي کوډ یوه ټوټه هم وړاندې کړم. د لوپ په هر تکرار کې متغیر رنګ انډیکس د لوبې ساحې (مین ډیجیټل میټریکس) له عددي میټریکس څخه ارزښت (رنګ شاخص) ټاکل شوی. د رنګ متغیر بیا د شاخص پراساس پخپله رنګ ته ټاکل کیږي. پایله لرونکی رنګ بیا د سور ، شین او نیلي (RGB) په تناسب ویشل شوی. او د pixelPadding سره یوځای، دا معلومات بار بار په پکسل کې لیکل کیږي، په بټ میپ کې د رنګ انځور جوړوي.

کوډ پوائنټرونه او بټ وائز عملیات کاروي، کوم چې پوهیدل ستونزمن وي. نو زه تاسو ته مشوره درکوم چې په جلا توګه ولولئ چې دا ډول جوړښتونه څنګه کار کوي.

د لوبې ډګر د عددي میټرکس پراساس د معلوماتو سره د بټ میپ ډکول:

// 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;
   }

د پورته بیان شوي میتود سره سم ، په Crazy Tanks لوبه کې یو عکس (فریم) رامینځته کیږي او د Draw() فنکشن کې په سکرین کې ښودل کیږي. د Input() فنکشن کې د کیسټروکس ثبتولو او د منطق () فنکشن کې د دوی وروسته پروسس کولو وروسته ، یو نوی عکس (فریم) رامینځته کیږي. ریښتیا ، د لوبې توکي ممکن دمخه د لوبې په ډګر کې مختلف موقعیت ولري او په وینا یې په بل ځای کې رسم شوي. دا څنګه حرکت (حرکت) پیښیږي.

په تیوري کې (که ما هیڅ شی نه وي هیر کړی) ، د لومړۍ لوبې ("سانپ") څخه د لوبې لوپ پوهیدل او د دوهمې لوبې څخه په سکرین کې د پکسلونو ښودلو سیسټم ("ټینکس") ټول هغه څه دي چې تاسو ورته اړتیا لرئ لیکلو ته اړتیا لرئ. د وینډوز لاندې ستاسو د 2D لوبو څخه. بې غږه! 😉 پاتې برخې یوازې د زړه پورې الوتنې دي.

البته، لوبه "ټینک" د "سانپ" په پرتله خورا پیچلې ده. ما دمخه د C ++ ژبه کارولې ، دا دی ، ما د ټولګیو سره مختلف لوبې توکي بیان کړل. ما خپل ټولګه جوړه کړه - کوډ په سرلیکونو/Box.h کې لیدل کیدی شي. په هرصورت، ټولګه ډیری احتمال د حافظې لیک لري. کارول شوي اشارې. د حافظې سره کار کوي. زه باید ووایم چې کتاب زما سره ډیره مرسته وکړه د لوبې پروګرام کولو له لارې د C++ پیل کول. دا په C++ کې د پیل کونکو لپاره عالي پیل دی. دا کوچنی، په زړه پوری او ښه تنظیم شوی دی.

د دې لوبې پراختیا شاوخوا شپږ میاشتې وخت واخیست. ما په عمده توګه په کار کې د غرمې ډوډۍ او ناشتو لیکل. هغه د دفتر پخلنځي کې ناست و، خواړه یې ودرول او کوډ یې لیکل. یا په کور کې د شپې ډوډۍ. نو ما د دې "د پخلنځي جګړو" سره پای ته ورساوه. د تل په څیر، ما په فعاله توګه یو نوټ بوک کارولی، او ټول مفکورې شیان په دې کې زیږیدلي.

د عملي برخې بشپړولو لپاره، زه به زما د نوټ بوک یو څو سکینونه واخلم. د دې ښودلو لپاره چې دقیقا هغه څه چې ما لیکلي ، رسم کړي ، شمیرل شوي ، ډیزاین شوي ...

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
د ټانکونو انځورونه ډیزاین کول. او دا معلومول چې هر ټانک باید په سکرین کې څومره پکسلونه ونیسي

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
د خپل محور په شاوخوا کې د ټانک د گردش لپاره د الګوریتم او فورمولونو محاسبه

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
زما د راټولولو سکیم (هغه یو چې د حافظې لیک شتون لري، ډیری احتمال). ټولګه د لینک شوي لیست ډول سره سم رامینځته شوې

DevOps C++ او "د پخلنځي جنګونه"، یا څنګه ما د خوړلو پرمهال د لوبو لیکل پیل کړل
او دا لوبې ته د مصنوعي استخباراتو د ضمیمه کولو ناکامه هڅې دي

تیوري

"حتی د زرو میلونو سفر په لومړي ګام سره پیل کیږي" (د چین لرغونی حکمت)

راځئ چې له عمل څخه تیوري ته لاړ شو! څنګه د خپل شوق لپاره وخت پیدا کړئ؟

  1. هغه څه وټاکئ چې تاسو واقعیا غواړئ (افاسه، دا ترټولو سخته برخه ده).
  2. لومړیتوبونه ترتیب کړئ.
  3. د لوړو لومړیتوبونو لپاره هرڅه "اضافي" قرباني کړئ.
  4. هره ورځ د اهدافو په لور حرکت وکړئ.
  5. د دوه یا درې ساعتونو وړیا وخت تمه مه کوئ چې په شوق کې مصرف کړئ.

له یوې خوا، تاسو اړتیا لرئ هغه څه وټاکئ چې تاسو یې غواړئ او لومړیتوب ورکړئ. له بلې خوا، دا ممکنه ده چې د دې لومړیتوبونو په ګټه ځینې فعالیتونه/پروژې پریږدو. په بل عبارت، تاسو باید هرڅه "اضافي" قرباني کړئ. ما یو ځای اوریدلي چې په ژوند کې باید حد اقل درې اصلي فعالیتونه وي. بیا تاسو کولی شئ دا په لوړ کیفیت کې ترسره کړئ. او اضافي پروژې/لارښوونې به په ساده ډول د ډیر بار کولو پیل وکړي. مګر دا ټول شاید شخصي او انفرادي وي.

یو ځانګړی طلایی قانون شتون لري: هیڅکله 0٪ ورځ مه کوئ! ما د دې په اړه د انډي پراختیا کونکي لخوا په یوه مقاله کې زده کړل. که تاسو په یوه پروژه کار کوئ، هره ورځ د هغې په اړه یو څه وکړئ. او دا مهمه نده چې تاسو څومره کوئ. یوه کلمه یا د کوډ یوه کرښه ولیکئ، یو درسي ویډیو وګورئ یا یو کیل په تخته کې وخورئ - یوازې یو څه وکړئ. تر ټولو سخت کار پیل کول دي. یوځل چې تاسو پیل کړئ، تاسو به په پای کې یو څه ډیر څه وکړئ چې تاسو یې غواړئ. پدې توګه تاسو به په دوامداره توګه خپل هدف ته لاړ شئ او په ما باور وکړئ ، ډیر ژر. په هرصورت، د ټولو شیانو اصلي خنډ ځنډ دی.

او دا مهمه ده چې په یاد ولرئ چې تاسو باید د 5، 10، 15 دقیقو وړیا "چور" کم نه ارزوئ او له پامه غورځوئ، د یو یا دوه ساعتونو لپاره ځینې لوی "لوګو" ته انتظار وکړئ. ایا تاسو په لیکه کې ولاړ یاست؟ ستاسو د پروژې لپاره د یو څه په اړه فکر وکړئ. ایسکلیټر نیول؟ په نوټ پیډ کې یو څه ولیکئ. ایا تاسو په بس کې سفر کوئ؟ عالي ، یو څه مقاله ولولئ. له هر فرصت څخه ګټه پورته کړئ. په یوټیوب کې د پیشوګانو او سپیو لیدل بند کړئ! خپل مغز مه ککړوئ!

او یوه وروستۍ خبره. که ، د دې مقالې لوستلو وروسته ، تاسو د لوبې انجنونو کارولو پرته د لوبو رامینځته کولو نظر خوښ کړ ، نو د کیسي موراتوري نوم یاد کړئ. دا سړی لري ویب پاڼه. د "وګورۍ -> مخکینۍ قسط" برخه کې به تاسو د سکریچ څخه د مسلکي لوبې رامینځته کولو په اړه په زړه پوري وړیا ویډیو ټیوټوریلونه ومومئ. د وینډوز درسونو لپاره C ته په پنځو تعارف کې تاسو به شاید د پوهنتون د پنځو کلونو مطالعې څخه ډیر څه زده کړئ (یو چا د ویډیو لاندې نظرونو کې پدې اړه لیکلي).

کیسي دا هم تشریح کوي چې ستاسو د خپل لوبې انجن په جوړولو سره، تاسو به د موجوده انجنونو په اړه ښه پوهه ولرئ. د چوکاټونو په نړۍ کې چیرې چې هرڅوک د اتومات کولو هڅه کوي ، تاسو د کارولو پرځای رامینځته کول زده کوئ. تاسو د کمپیوټر په ماهیت پوهیږئ. او تاسو به یو ډیر هوښیار او بالغ پروګرامر هم شئ - یو پرو.

ستاسو په ټاکل شوي لاره کې ښه بخت! او راځئ چې نړۍ نوره مسلکي کړو.

لیکونکی: ګرانکین اندری, DevOps



سرچینه: www.habr.com