DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim

"Men hech narsa bilmasligimni bilaman" Sokrat

Kim uchun: barcha ishlab chiquvchilarga tupurgan va ularning o'yinlarini o'ynashni xohlaydigan IT odamlari uchun!

Nima haqida: Agar kerak bo'lsa C/C++ da o'yin yozishni qanday boshlash kerak!

Nima uchun buni o'qish kerak: Ilovalarni ishlab chiqish mening ish ixtisosligim emas, lekin men har hafta kodlashga harakat qilaman. Chunki men o'yinlarni yaxshi ko'raman!

Salom mening ismim Andrey Grankin, Men Luxoft kompaniyasida DevOpsman. Ilovalarni ishlab chiqish mening ish ixtisosligim emas, lekin men har hafta kodlashga harakat qilaman. Chunki men o'yinlarni yaxshi ko'raman!

Kompyuter o'yinlari sanoati juda katta, bugungi kunda kino sanoatidan ham ko'proq mish-mishlar tarqalmoqda. O'yinlar kompyuterlar rivojining boshidanoq, zamonaviy standartlar bo'yicha, murakkab va asosiy rivojlanish usullaridan foydalangan holda yozilgan. Vaqt o'tishi bilan o'yin dvigatellari allaqachon dasturlashtirilgan grafika, fizika va ovoz bilan paydo bo'la boshladi. Ular sizga o'yinning rivojlanishiga e'tibor qaratishga va uning poydevori haqida bezovta qilmaslikka imkon beradi. Ammo ular bilan birga dvigatellar bilan ishlab chiquvchilar "ko'r bo'lib qoladilar" va yomonlashadi. O'yinlarning juda ishlab chiqarilishi konveyerga qo'yiladi. Ishlab chiqarish miqdori esa sifatidan ustun kela boshlaydi.

Shu bilan birga, boshqa odamlarning o'yinlarini o'ynashda biz doimo boshqa odamlar o'ylab topgan joylar, syujet, personajlar, o'yin mexanikasi bilan cheklanamiz. Shunday qilib, men buni angladim ...

... faqat menga bo'ysunadigan o'z dunyolaringizni yaratish vaqti keldi. Men Ota, O'g'il va Muqaddas Ruh bo'lgan dunyolar!

Va men chin dildan ishonamanki, o'z o'yin dvigatelingiz va unga o'yin yozish orqali siz ko'zingizni ochib, derazalarni artib, kabinangizni pompalay olasiz, yanada tajribali va ajralmas dasturchi bo'lasiz.

Ushbu maqolada men C / C ++ da kichik o'yinlarni yozishni qanday boshlaganimni, rivojlanish jarayoni nima ekanligini va band muhitda sevimli mashg'ulot uchun vaqt topishimni aytib berishga harakat qilaman. Bu sub'ektivdir va individual boshlash jarayonini tavsiflaydi. Jaholat va e'tiqod haqida, hozirgi dunyo haqidagi shaxsiy rasmim haqida material. Boshqacha qilib aytganda, "Ma'muriyat sizning shaxsiy miyangiz uchun javobgar emas!".

Amaliyot

"Amaliyotsiz bilim foydasiz, bilimsiz amaliyot xavfli." Konfutsiy

Mening daftarim mening hayotim!


Demak, amalda aytishim mumkinki, men uchun hamma narsa daftardan boshlanadi. Men u yerda nafaqat kundalik vazifalarimni yozaman, balki chizmalarni chizaman, dasturlashtiraman, sxemalar tuzaman va masalalarni, shu jumladan matematikani ham yechaman. Har doim bloknotdan foydalaning va faqat qalam bilan yozing. Bu toza, qulay va ishonchli, IMHO.

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
Mening (allaqachon to'ldirilgan) daftarim. Bu shunday ko'rinadi. Unda kundalik vazifalar, g'oyalar, chizmalar, diagrammalar, echimlar, qora buxgalteriya hisobi, kod va boshqalar mavjud.

Ushbu bosqichda men uchta loyihani bajarishga muvaffaq bo'ldim (bu mening "yakuniylik" tushunchasida, chunki har qanday mahsulotni nisbatan cheksiz ishlab chiqish mumkin).

  • Loyiha 0: Bu Unity o'yin mexanizmi yordamida C# tilida yozilgan Architect Demo 3D sahnasi. MacOS va Windows platformalari uchun.
  • 1-o'yin: Windows uchun Simple Snake (hammaga "Snake" nomi bilan tanilgan) konsol o'yini. C da yozilgan.
  • 2-o'yin: Crazy Tanks konsol o'yini (hammaga "Tanklar" nomi bilan tanilgan), allaqachon C ++ da (sinflar yordamida) va Windows ostida yozilgan.

Loyiha 0 Architect Demo

  • Platforma: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • Til: C#
  • O'yin mexanizmi: birlik
  • Ilhom: Darrin Lile
  • Repozitoriy: GitHub

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
3D Scene Architect demo

Birinchi loyiha C/C++ da emas, C# tilida Unity oβ€˜yin mexanizmi yordamida amalga oshirildi. Ushbu dvigatel uskunaga nisbatan talabchan emas edi Unreal Engine, shuningdek, o'rnatish va foydalanish menga osonroq tuyuldi. Men boshqa dvigatellarni hisobga olmadim.

Men uchun Unitydagi maqsad qandaydir o'yinni rivojlantirish emas edi. Men qandaydir xarakterga ega 3D sahna yaratmoqchi edim. U, to'g'rirog'i, U (men oshiq bo'lgan qizni modelladim =) harakatlanishi va tashqi dunyo bilan muloqot qilishi kerak edi. Faqat Birlik nima ekanligini, rivojlanish jarayoni nima ekanligini va biror narsani yaratish uchun qancha kuch sarflash kerakligini tushunish muhim edi. Architect Demo loyihasi shunday tug'ildi (ism deyarli bema'nilikdan ixtiro qilingan). Dasturlash, modellashtirish, animatsiya, tekstura qilish menga ikki oylik kundalik ishimni talab qildi.

Men YouTube-da 3D modellarni qanday yaratish bo'yicha o'quv videolari bilan boshladim Blender. Blender o'rnatishni talab qilmaydigan 3D modellashtirish (va boshqalar) uchun ajoyib bepul vositadir. Va bu erda meni zarba kutayotgan edi ... Ma'lum bo'lishicha, modellashtirish, animatsiya, tekstura - bu kitob yozishingiz mumkin bo'lgan juda katta alohida mavzular. Bu, ayniqsa, qahramonlar uchun to'g'ri keladi. Barmoqlar, tishlar, ko'zlar va tananing boshqa qismlarini modellashtirish uchun sizga anatomiya bo'yicha bilim kerak bo'ladi. Yuz mushaklari qanday joylashgan? Odamlar qanday harakat qilishadi? Men har bir qo'l, oyoq, barmoq, bo'g'imlarga suyaklarni "qo'shishim" kerak edi!

Animatsiya tabiiy ko'rinishi uchun klavikulani, qo'shimcha suyak tutqichlarini modellang. Bunday darslardan so'ng siz animatsion filmlar yaratuvchilari atigi 30 soniyalik video yaratish uchun qanday ulkan ishni bajarishlarini tushunasiz. Ammo 3D filmlar soatlab davom etadi! Va keyin biz kinoteatrlardan chiqib, shunday deymiz: β€œTa, dahshatli multfilm / film! Ular yaxshiroq qilishlari mumkin edi ..." Ahmoqlar!

Va bu loyihada dasturlash haqida yana bir narsa. Ma'lum bo'lishicha, men uchun eng qiziq narsa matematika edi. Agar siz sahnani ishga tushirsangiz (loyiha tavsifidagi omborga havola), siz kameraning shardagi qiz qahramoni atrofida aylanishini sezasiz. Kameraning bunday aylanishini dasturlash uchun avval aylana (2D), so'ngra sferada (3D) joylashuv nuqtasining koordinatalarini hisoblashim kerak edi. Qizig'i shundaki, men maktabda matematikani yomon ko'rardim va uni minus bilan bilardim. Qisman, ehtimol, maktabda ular sizga bu matematikaning hayotda qanday qo'llanilishini tushuntirmaydilar. Ammo maqsadingiz, orzuingiz bilan band bo'lganingizda, aqlingiz tozalanadi, ochiladi! Va siz murakkab vazifalarni hayajonli sarguzasht sifatida qabul qila boshlaysiz. Va keyin siz shunday deb o'ylaysiz: "Xo'sh, nega * sevimli * matematik odatda bu formulalarni qayerga tayanish mumkinligini ayta olmadi?".

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
Doira va shardagi nuqtaning koordinatalarini hisoblash uchun formulalarni hisoblash (mening daftarimdan)

O'yin 1

  • Platforma: Windows (Windows 7, 10 da sinovdan o'tgan)
  • Til: Menimcha, u sof C tilida yozilgan
  • O'yin mexanizmi: Windows konsoli
  • Ilhom: javidx9
  • Repozitoriy: GitHub

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
Oddiy ilon o'yini

3D sahnasi o'yin emas. Bundan tashqari, 3D ob'ektlarni (ayniqsa, belgilarni) modellashtirish va animatsiya qilish uzoq va qiyin. Unity bilan o'ynaganimdan so'ng, men asoslardan davom etishim, to'g'rirog'i, boshlashim kerakligini angladim. Oddiy va tezkor, lekin ayni paytda global narsa, o'yinlarning tuzilishini tushunish uchun.

Va bizda oddiy va tez nima bor? To'g'ri, konsol va 2D. Aniqrog'i, hatto konsol va belgilar. Yana Internetdan ilhom izlay boshladim (umuman, men Internetni XXI asrning eng inqilobiy va xavfli ixtirosi deb bilaman). Men Tetris konsolini yaratgan bir dasturchining videosini qazib oldim. Va o'z o'yiniga o'xshab, u "ilon" ni kesishga qaror qildi. Videodan men ikkita asosiy narsani bilib oldim - o'yin tsikli (uchta asosiy funksiya / qism bilan) va buferga chiqish.

O'yin tsikli quyidagicha ko'rinishi mumkin:

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

Kod bir vaqtning o'zida butun main() funktsiyasini taqdim etadi. Va o'yin tsikli tegishli sharhdan keyin boshlanadi. Loopda uchta asosiy funksiya mavjud: Input(), Logic(), Draw(). Birinchidan, kirish ma'lumotlarini kiritish (asosan, tugmachalarni bosishni boshqarish), keyin kiritilgan ma'lumotlarni qayta ishlash Mantiq, so'ngra ekranda ko'rsatish - Chizish. Va shuning uchun har bir ramka. Animatsiya shu tarzda yaratiladi. Bu multfilmlarga o'xshaydi. Odatda kiritilgan ma'lumotlarni qayta ishlash eng ko'p vaqtni oladi va men bilganimdek, o'yinning kadrlar tezligini aniqlaydi. Lekin bu erda Logic() funksiyasi juda tez ishlaydi. Shuning uchun, kadr tezligini Sleep() funksiyasi bu tezlikni belgilaydigan gameSpeed ​​parametri bilan boshqarishi kerak.

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
O'yin tsikli. Bloknotda ilon dasturlash

Agar siz ramziy konsol o'yinini ishlab chiqayotgan bo'lsangiz, u holda odatiy oqim chiqishi "cout" yordamida ekranda ma'lumotlarni ko'rsatish ishlamaydi - bu juda sekin. Shuning uchun chiqish ekran buferida amalga oshirilishi kerak. Shunday qilib, tezroq va o'yin nosozliklarsiz ishlaydi. Rostini aytsam, men ekran buferi nima ekanligini va u qanday ishlashini tushunmayapman. Ammo men bu erda kod misolini keltiraman va ehtimol sharhlardagi kimdir vaziyatni aniqlab berishi mumkin.

Ekran buferini olish (agar shunday desam):

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

To'g'ridan-to'g'ri ekranga ma'lum bir chiziqli scoreLine chiqishi (ballarni ko'rsatish uchun chiziq):

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

Nazariy jihatdan, bu o'yinda murakkab narsa yo'q, bu menga kirish darajasidagi o'yinning yaxshi namunasi bo'lib tuyuladi. Kod bir faylda yozilgan va bir nechta funktsiyalarda joylashtirilgan. Na sinflar, na meros. GitHub-dagi omborga o'tib, o'yinning manba kodidagi hamma narsani o'zingiz ko'rishingiz mumkin.

O'yin 2 Crazy Tanks

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
O'yin Crazy tanklar

Konsolga belgilarni chop etish, ehtimol siz o'yinga aylantirishingiz mumkin bo'lgan eng oddiy narsadir. Ammo keyin bitta muammo paydo bo'ladi: belgilar turli balandlik va kengliklarga ega (balandligi kenglikdan kattaroqdir). Shunday qilib, hamma narsa nomutanosib ko'rinadi va pastga yoki yuqoriga harakat qilish chapga yoki o'ngga qaraganda tezroq ko'rinadi. Bu ta'sir "Ilon" da (1-o'yin) juda sezilarli. "Tanklar" (2-o'yin) bunday kamchilikka ega emas, chunki u erda chiqish ekran piksellarini turli xil ranglar bilan bo'yash orqali tashkil etilgan. Men render yozganimni aytishingiz mumkin. To'g'ri, bu allaqachon biroz murakkabroq, garchi juda qiziqroq.

Ushbu o'yin uchun ekranda piksellarni ko'rsatish uchun tizimimni tavsiflash kifoya qiladi. Menimcha, bu o'yinning asosiy qismi. Va boshqa hamma narsani o'zingiz o'ylab topishingiz mumkin.

Shunday qilib, siz ekranda ko'rgan narsa shunchaki harakatlanuvchi rangli to'rtburchaklar to'plamidir.

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
To'rtburchaklar to'plami

Har bir to'rtburchak raqamlar bilan to'ldirilgan matritsa bilan ifodalanadi. Aytgancha, men bitta qiziqarli nuanceni ajratib ko'rsatishim mumkin - o'yindagi barcha matritsalar bir o'lchovli massiv sifatida dasturlashtirilgan. Ikki o'lchovli emas, balki bir o'lchovli! Bir o'lchovli massivlar bilan ishlash ancha oson va tezroq.

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
O'yin tank matritsasiga misol

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
O'yin tankining matritsasini bir o'lchovli massiv bilan ifodalash

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
Bir o'lchovli massiv orqali matritsani tasvirlashning yanada yorqin misoli

Ammo massiv elementlariga kirish ikki o'lchovli emas, balki ikki o'lchovli massiv bo'lganidek, qo'shaloq tsiklda sodir bo'ladi. Bu biz hali ham matritsalar bilan ishlayotganimiz uchun amalga oshiriladi.

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
Bir o'lchovli massivni qo'sh tsiklda aylanib o'tish. Y - qator identifikatori, X - ustun identifikatori

E'tibor bering, odatdagi i, j matritsa identifikatorlari o'rniga men x va y identifikatorlaridan foydalanaman. Xullas, bu ko'zni quvontiradigan va miyaga aniqroq tuyuladi. Bundan tashqari, bunday belgi qo'llaniladigan matritsalarni ikki o'lchovli tasvirning koordinata o'qlariga qulay tarzda proyeksiya qilish imkonini beradi.

Endi piksellar, rang va displey haqida. Chiqish uchun StretchDIBits funksiyasi (Sarlavha: windows.h; Kutubxona: gdi32.lib) ishlatiladi. Boshqa narsalar qatorida, ushbu funktsiyaga quyidagilar o'tkaziladi: tasvir ko'rsatiladigan qurilma (mening holda, bu Windows konsoli), tasvirni ko'rsatishni boshlash koordinatalari, uning kengligi / balandligi va tasvir o'zi baytlar massivi bilan ifodalangan bitmap (bitmap) ko'rinishida. Bitmap baytlar massivi sifatida!

StretchDIBits() funktsiyasi ishda:

// 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() funksiyasi yordamida ushbu bitmap uchun xotira oldindan ajratilgan. Ya'ni, barcha piksellar haqidagi ma'lumotlarni saqlash uchun zarur bo'lgan bayt soni ajratilgan, keyinchalik ular ekranda ko'rsatiladi.

m_p_bitmapMemory bitmapini yaratish:

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

Taxminan aytganda, bitmap piksellar to'plamidan iborat. Massivdagi har to'rt bayt RGB pikselidir. Qizil rang qiymatiga bir bayt, yashil rang qiymatiga bir bayt (G) va ko'k rang qiymatiga bir bayt (B). Bundan tashqari, chekinish uchun bir bayt qoldi. Ushbu uchta rang - Qizil/Yashil/Moviy (RGB) - natijada piksel rangini yaratish uchun turli nisbatlarda bir-biri bilan aralashtiriladi.

Endi, yana, har bir to'rtburchak yoki o'yin ob'ekti raqamli matritsa bilan ifodalanadi. Ushbu o'yin ob'ektlarining barchasi to'plamga joylashtirilgan. Va keyin ular bitta katta raqamli matritsa hosil qilib, o'yin maydoniga joylashtiriladi. Men matritsadagi har bir raqamni ma'lum bir rang bilan bog'ladim. Misol uchun, 8 raqami ko'k rangga, 9 raqami sariq rangga, 10 raqami quyuq kul rangga va boshqalarga mos keladi. Shunday qilib, bizda har bir raqam rang bo'lgan o'yin maydonining matritsasi bor deb aytishimiz mumkin.

Shunday qilib, bizda bir tomondan butun o'yin maydonining raqamli matritsasi, ikkinchisida tasvirni ko'rsatish uchun bitmap mavjud. Hozircha bitmap "bo'sh" - u hali kerakli rangning piksellari haqida ma'lumotga ega emas. Bu shuni anglatadiki, oxirgi qadam o'yin maydonining raqamli matritsasi asosida bitmapni har bir piksel haqidagi ma'lumot bilan to'ldirishdir. Bunday o'zgartirishning yorqin misoli quyidagi rasmda keltirilgan.

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
Bitmapni (Piksel matritsasi) o'yin maydonining raqamli matritsasiga (Raqamli matritsa) asoslangan ma'lumot bilan to'ldirishga misol (rang indekslari o'yindagi indekslarga mos kelmaydi)

Men o'yindan haqiqiy kodning bir qismini ham taqdim etaman. Loopning har bir iteratsiyasida colorIndex o'zgaruvchisiga o'yin maydonining raqamli matritsasidan (mainDigitalMatrix) qiymat (rang indeksi) beriladi. Keyin rangning o'zi indeks asosida rang o'zgaruvchisiga yoziladi. Bundan tashqari, olingan rang qizil, yashil va ko'k (RGB) nisbatiga bo'linadi. Va chekinish (pixelPadding) bilan birgalikda bu ma'lumot pikselga qayta-qayta yoziladi va bitmapda rangli tasvirni hosil qiladi.

Kod tushunish qiyin bo'lishi mumkin bo'lgan ko'rsatkichlar va bitli operatsiyalardan foydalanadi. Shuning uchun men sizga bunday tuzilmalar qanday ishlashini alohida o'qishni maslahat beraman.

Bitmapni o'yin maydonining raqamli matritsasi asosidagi ma'lumotlar bilan to'ldirish:

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

Yuqorida tavsiflangan usulga ko'ra, Crazy Tanks o'yinida bitta rasm (ramka) shakllanadi va Draw() funksiyasida ekranda ko'rsatiladi. Input() funksiyasida klavishlar bosishlarini ro'yxatdan o'tkazgandan so'ng va ularni Logic() funktsiyasida qayta ishlashdan so'ng yangi rasm (ramka) hosil bo'ladi. To'g'ri, o'yin ob'ektlari o'yin maydonida allaqachon boshqa joyga ega bo'lishi mumkin va shunga mos ravishda boshqa joyda chizilgan. Animatsiya (harakat) shunday sodir bo'ladi.

Nazariy jihatdan (agar siz hech narsani unutmagan bo'lsangiz), birinchi o'yindagi o'yin tsiklini ("Ilon") va ikkinchi o'yindagi ekranda piksellarni ko'rsatish tizimini ("Tanklar") tushunish - istalgan narsani yozish uchun kerak bo'lgan narsa. Windows uchun 2D o'yinlaringiz. Ovozsiz! πŸ˜‰ Qolgan qismlar shunchaki xayolparastlik parvozi.

Albatta, "Tanklar" o'yini "Ilon" ga qaraganda ancha murakkabroq yaratilgan. Men allaqachon C++ tilidan foydalanganman, ya'ni sinflar bilan turli o'yin ob'ektlarini tasvirlab berganman. Men o'z kollektsiyamni yaratdim - kodni headers/Box.h da ko'rishingiz mumkin. Aytgancha, kollektsiyada xotiraning oqishi ehtimoli bor. Ishlatilgan ko'rsatkichlar. Xotira bilan ishlagan. Aytishim kerakki, kitob menga katta yordam berdi. O'yin dasturlash orqali C++ tilini boshlash. Bu C++ da yangi boshlanuvchilar uchun ajoyib boshlanish. Bu kichik, qiziqarli va yaxshi tashkil etilgan.

Ushbu o'yinni ishlab chiqish uchun taxminan olti oy vaqt ketdi. Men asosan tushlik paytida va ishda gazak paytida yozdim. U ofis oshxonasida o'tirdi, ovqatni oyoq osti qildi va kod yozdi. Yoki kechki ovqat uchun uyda. Shunday qilib, menda shunday "oshxona urushlari" bor. Har doimgidek, men daftardan faol foydalanardim va unda barcha kontseptual narsalar tug'ildi.

Amaliy qism oxirida men daftarimning bir nechta skanerlarini chiqaraman. Aynan nimani yozayotganimni, chizganimni, sanaganimni, loyihalashtirganimni ko'rsatish uchun ...

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
Tank tasviri dizayni. Va ekranda har bir tank qancha pikselni egallashi kerakligi ta'rifi

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
Tankni o'z o'qi atrofida aylantirish algoritmi va formulalarini hisoblash

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
Mening kollektsiyamning diagrammasi (xotira oqib ketgani, ehtimol). To'plam bog'langan ro'yxat sifatida yaratilgan

DevOps C++ va "oshxona urushlari" yoki ovqat paytida qanday qilib o'yin yozishni boshladim
Va bular sun'iy intellektni o'yinga kiritish uchun behuda urinishlardir

Nazariya

"Hatto ming kilometrlik sayohat ham birinchi qadamdan boshlanadi" (Qadimgi Xitoy donoligi)

Keling, amaliyotdan nazariyaga o'tamiz! Xobbingiz uchun vaqtni qanday topasiz?

  1. Haqiqatan ham nimani xohlayotganingizni aniqlang (afsuski, bu eng qiyin).
  2. Ustuvorliklarni belgilang.
  3. Yuqori ustuvorliklar uchun barcha "ortiqcha" narsalarni qurbon qiling.
  4. Maqsadlar sari har kuni harakatlaning.
  5. Xobbi uchun ikki yoki uch soat bo'sh vaqt bo'lishini kutmang.

Bir tomondan, siz nimani xohlayotganingizni va ustuvorligini aniqlashingiz kerak. Boshqa tomondan, ushbu ustuvorliklar foydasiga ba'zi holatlar/loyihalardan voz kechish mumkin. Boshqacha qilib aytganda, siz "ortiqcha" hamma narsani qurbon qilishingiz kerak bo'ladi. Hayotda ko'pi bilan uchta asosiy faoliyat bo'lishi kerakligini qaerdadir eshitdim. Shunda siz ular bilan eng yaxshi tarzda kurashishingiz mumkin. Va qo'shimcha loyihalar/yo'nalishlar makkajo'xori yuklashni boshlaydi. Ammo bularning barchasi, ehtimol, sub'ektiv va individualdir.

Ma'lum bir oltin qoida bor: hech qachon 0% kun bo'lmaydi! Men bu haqda hind dasturchisining maqolasida bilib oldim. Agar siz biron bir loyiha ustida ishlayotgan bo'lsangiz, u holda har kuni biror narsa qiling. Va qancha ishlaganingiz muhim emas. Bitta so'z yoki bitta kod qatorini yozing, bitta o'quv videosini tomosha qiling yoki doskaga bitta mixni uring - shunchaki biror narsa qiling. Eng qiyin qismi - boshlash. Bir marta boshlaganingizdan so'ng, ehtimol siz xohlaganingizdan biroz ko'proq narsani qilasiz. Shunday qilib, siz doimo maqsadingizga intilasiz va menga ishoning, juda tez. Axir, hamma narsaning asosiy tormozi bu kechiktirishdir.

Va shuni yodda tutish kerakki, siz 5, 10, 15 daqiqada vaqtning bepul "talaş" ini e'tiborsiz qoldirmasligingiz va e'tiborsiz qoldirishingiz kerak, bir yoki ikki soat davom etadigan katta "jurnallar" ni kuting. Navbatda turibsizmi? Loyihangiz uchun biror narsa haqida o'ylab ko'ring. Eskalatorga chiqyapsizmi? Daftarga biror narsani yozing. Siz avtobusda ovqatlanasizmi? Yaxshi, maqolani o'qing. Har bir imkoniyatdan foydalaning. YouTubeda mushuk va itlarni tomosha qilishni bas qiling! Miyangiz bilan aralashmang!

Va oxirgisi. Agar ushbu maqolani o'qib chiqqandan so'ng, sizga o'yin dvigatellaridan foydalanmasdan o'yin yaratish g'oyasi yoqqan bo'lsa, Casey Muratori ismini eslang. Bu yigit bor veb-sayt. "Tomosha qilish -> OLDINGI QISMLAR" bo'limida siz noldan professional o'yin yaratish bo'yicha ajoyib bepul video darsliklarni topasiz. Windows uchun Intro to C ning beshta darsida siz universitetda besh yillik o'qishdan ko'proq narsani o'rganishingiz mumkin (kimdir bu haqda video ostidagi izohlarda yozgan).

Keysi shuningdek, o'z o'yin dvigatelingizni ishlab chiqish orqali siz mavjud dvigatellarni yaxshiroq tushunishingizni tushuntiradi. Hamma avtomatlashtirishga intilayotgan ramkalar dunyosida siz foydalanishni emas, yaratishni o'rganasiz. Kompyuterlarning mohiyatini tushuning. Bundan tashqari, siz ancha aqlli va etuk dasturchi - professionalga aylanasiz.

Siz tanlagan yo'lingizda omad tilaymiz! Va keling, dunyoni yanada professionalroq qilaylik.

Muallif: Grankin Andrey, DevOps



Manba: www.habr.com