DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым

"Мен эч нерсе билбегенимди билем" Сократ

Кимге: бардык иштеп чыгуучуларга маани бербеген жана алардын оюндарын ойногусу келген IT адамдары үчүн!

Эмне жонундо: Эгер күтүлбөгөн жерден керек болсо, C/C++ тилинде оюндарды кантип жазууну баштоо жөнүндө!

Эмне үчүн муну окуу керек: Колдонмолорду иштеп чыгуу менин адистик чөйрөм эмес, бирок мен жума сайын кодтоого аракет кылам. Анткени мен оюндарды жакшы көрөм!

Салам менин атым Андрей Гранкин, Мен Luxoft компаниясында DevOpsмин. Колдонмолорду иштеп чыгуу менин адистигим эмес, бирок мен жума сайын код жазууга аракет кылам. Анткени мен оюндарды жакшы көрөм!

Компьютердик оюндар индустриясы абдан чоң, имиштер бүгүнкү күндө кино индустриясынан да чоңураак. Оюндар компьютерлер жаралгандан бери, заманбап стандарттарга ылайык, татаал жана негизги өнүктүрүү ыкмаларын колдонуу менен жазылган. Убакыттын өтүшү менен, мурунтан эле программаланган графика, физика жана үн менен оюн кыймылдаткычтары пайда боло баштады. Алар оюндун өзүн өнүктүрүүгө көңүл бурууга жана анын пайдубалына кабатырланбоого мүмкүндүк берет. Бирок алар менен бирге, кыймылдаткычтары менен иштеп чыгуучулар "сокур болуп" жана начарлайт. Оюндардын өндүрүшүнүн өзү конвейерге коюлат. Ал эми продукциянын саны анын сапатына басым жасай баштайт.

Ошол эле учурда, башка адамдардын оюндарын ойноп жатканда, биз дайыма башка адамдар ойлоп тапкан жерлер, сюжет, каармандар жана оюн механикасы менен чектелип калабыз. Ошентип мен түшүндүм ...

... мага гана баш ийип, өз дүйнөмдү түзө турган убак келди. Мен Ата, Уул жана Ыйык Рух болгон дүйнөлөр!

Өзүңүздүн оюн кыймылдаткычыңызды жазып, ага ойноо менен сиз бут кийимиңизди чечип, терезелерди сүртүп, кабинаңызды жаңылап, тажрыйбалуу жана толук программист боло аласыз деп чын жүрөктөн ишенем.

Бул макалада мен C/C++ тилинде кичинекей оюндарды кантип жаза баштаганымды, өнүгүү процесси кандай экенин жана бош эмес чөйрөдө хоббиге кайдан убакыт тапканымды айтып берүүгө аракет кылам. Бул субъективдүү жана жеке баштоо процессин сүрөттөйт. Надандык жана ыйман жөнүндө материал, менин азыркы дүйнөдөгү жеке сүрөтүм жөнүндө. Башкача айтканда, "Администрация сиздин жеке мээңиз үчүн жооп бербейт!"

практика

"Практикасыз билим пайдасыз, билимсиз практика коркунучтуу" Конфуций

Менин дептерим менин жашоом!


Ошентип, иш жүзүндө мен үчүн бардыгы блокноттон башталат деп айта алам. Ал жерде мен күнүмдүк тапшырмаларымды гана жазып тим болбостон, блок-схемаларды чийип, программалап, долбоорлоп, маселелерди, анын ичинде математикалык маселелерди да чыгарам. Ар дайым блокнот колдонуңуз жана карандаш менен гана жазыңыз. Бул таза, ыңгайлуу жана ишенимдүү, IMHO.

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Менин (буга чейин толтурулган) дептерим. Бул анын көрүнүшү. Ал күнүмдүк тапшырмаларды, идеяларды, чиймелерди, диаграммаларды, чечимдерди, кара бухгалтерияны, кодду жана башкаларды камтыйт.

Бул этапта мен үч долбоорду бүтүрүүгө жетиштим (бул менин түшүнүгүмдө “толуктуулук”, анткени ар кандай продукты салыштырмалуу чексиз иштеп чыгууга болот).

  • Долбоор 0: Бул Unity оюн кыймылдаткычын колдонуу менен C# тилинде жазылган 3D Architect Demo сценасы. MacOS жана Windows платформалары үчүн.
  • Оюн 1: Windows үчүн Simple Snake консолдук оюну (бардыгына "Жылан" катары белгилүү). C тилинде жазылган.
  • Оюн 2: Crazy Tanks консолдук оюну (бардыгына “Танктар” катары белгилүү), C++ тилинде жазылган (класстарды колдонуу) жана ошондой эле Windows үчүн.

Долбоор 0. Architect Demo

  • платформа: Windows (Windows 7, 10), Mac OS (OS X El Capitan v. 10.11.6)
  • тили: C#
  • Оюн кыймылдаткычы: биримдик
  • Илхам: Даррин Лил
  • Репозиторий: GitHub

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
3D Scene Architect Demo

Биринчи долбоор C/C++ тилинде эмес, C# тилинде Unity оюн кыймылдаткычын колдонуу менен ишке ашырылган. Бул кыймылдаткыч аппараттык жактан талап кылынгандай болгон эмес Unreal Engine, ошондой эле орнотуу жана колдонуу оңой көрүндү. Башка моторлорду ойлогон эмесмин.

Биримдикте менин максатым оюнду өнүктүрүү эмес болчу. Мен кандайдыр бир каарман менен 3D көрүнүшүн түзгүм келди. Ал, тагыраак айтканда, Ал (мен сүйгөн кызды моделдедим =) анын айланасындагы дүйнө менен кыймылдап, өз ара аракеттениши керек болчу. Биримдик деген эмне экенин, өнүгүү процесси эмне экенин жана бир нерсени жаратуу үчүн канча күч талап кылынарын түшүнүү гана маанилүү болчу. Architect Demo долбоору ушинтип пайда болгон (ат дээрлик жок жерден ойлоп табылган). Программалоо, моделдөө, анимациялоо, текстуралоо мага эки ай күнүмдүк жумушту талап кылды.

Мен YouTube'да 3D моделдерин түзүү боюнча үйрөтүүчү видеолордон баштадым Комбайн. Блендер - орнотууну талап кылбаган 3D моделдөө (жана башкалар) үчүн эң сонун акысыз курал. Бул жерде мени шок күтүп турган... Көрсө, моделдөө, анимация, текстуралоо китептерди жаза турган чоң өзүнчө темалар экен. Бул өзгөчө каармандарга тиешелүү. Манжаларды, тиштерди, көздөрдү жана башка дене бөлүктөрүн моделдөө үчүн сизге анатомия боюнча билим керек болот. Бет булчуңдары кандай түзүлүштө? Адамдар кантип кыймылдайт? Ар бир колго, бутка, манжага, манжалардын фалангаларына сөөктөрдү "киргизиш" керек болчу!

Анимация табигый көрүнүш үчүн, жака сөөктөрдү жана кошумча рычаг сөөктөрүн моделдеңиз. Мындай сабактардан кийин 30 секунддук видеону жаратуу үчүн анимациялык фильмдердин жаратуучулары канчалык эмгек жумшаарын түшүнөсүз. Бирок 3D тасмалар бир нече саатка созулат! Анан биз кинотеатрлардан чыгып, мындай деп айтабыз: “Бул жаман мультфильм/фильм! Жакшыраак кылышса болмок..." Акмактар!

Бул долбоордо программалоо боюнча дагы бир нерсе. Көрсө, мен үчүн эң кызыктуусу математикалык бөлүгү болду. Эгер сиз сахнаны иштетсеңиз (долбоордун сүрөттөмөсүндөгү репозиторийге шилтеме), сиз камеранын сферада кыздын каарманынын айланасында айланганын байкайсыз. Камеранын мындай айлануусун программалоо үчүн мен алгач тегеректеги (2D), андан кийин сферада (3D) жайгашкан чекиттин координаталарын эсептеп чыгышым керек болчу. Кызык жери мен мектепте математиканы жек көрчүмүн жана аны С-минус менен билчүмүн. Жарым-жартылай, балким, мектепте алар сизге бул математика жашоодо кандайча колдонуларын түшүндүрүшпөйт. Ал эми максатыңызга, кыялыңызга, ой-санааңызга берилип, жан дүйнөңүз ачылат! Жана сиз татаал тапшырмаларды кызыктуу укмуштуу окуя катары кабылдай баштайсыз. Анан мындай деп ойлойсуң: "Эмне үчүн сиздин * сүйүктүү * математикиңиз сизге бул формулаларды кайда колдонууга болорун айта алган жок?"

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Тегеректеги жана шардагы чекиттин координаталарын эсептөө үчүн формулаларды эсептөө (менин дептеримден)

Оюн 1. Жөнөкөй жылан

  • платформа: Windows (Windows 7, 10до сыналган)
  • тили: Мен аны таза С менен жаздым деп ойлойм
  • Оюн кыймылдаткычы: Windows консолу
  • Илхам: javidx9
  • Репозиторий: GitHub

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Жөнөкөй Жылан оюну

3D көрүнүшү оюн эмес. Мындан тышкары, 3D объектилерин (өзгөчө каармандарды) моделдөө жана анимациялоо көп убакытты талап кылат жана кыйын. Биримдик менен ойногондон кийин, мен улантуум керек экенин түшүндүм, тагыраак айтканда, негиздерден баштоо керек. Жөнөкөй жана тез, бирок ошол эле учурда глобалдуу нерсе, оюндардын түзүлүшүн түшүнүү.

Эмне жөнөкөй жана тез? Туура, консол жана 2D. Тагыраак айтканда, консол жана символдор да. Мен дагы интернеттен илхам издеп чыктым (негизинен интернет XNUMX-кылымдын эң революциячыл жана коркунучтуу ойлоп табуусу деп ойлойм). Тетрис консолун жасаган программисттин видеосун казып алдым. Ал эми анын оюнуна окшошуп, мен "жылан" жасоону чечтим. Видеодон мен эки негизги нерсе жөнүндө билдим - оюн цикли (үч негизги функция/бөлүк менен) жана буферге чыгуу.

Оюн цикли төмөнкүдөй көрүнүшү мүмкүн:

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

Код бир эле учурда бүт main() функциясын көрсөтөт. Ал эми оюн цикли тиешелүү комментарийден кийин башталат. Циклде үч негизги функция бар: Input(), Logic(), Draw(). Биринчиден, маалыматтарды киргизүү (негизинен баскычтарды башкаруу), андан кийин киргизилген маалыматтарды иштеп чыгуу Логика, андан кийин экранга чыгаруу - Draw. Жана башка ар бир кадр. Анимация ушундайча түзүлөт. Мультфильмдердегидей. Адатта, киргизилген маалыматтарды иштетүү эң көп убакытты талап кылат жана мен билгендей, оюндун кадр ылдамдыгын аныктайт. Бирок бул жерде Logic() функциясы абдан тез аткарылат. Ошондуктан, сиз бул ылдамдыкты аныктаган gameSpeed ​​параметри менен 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);

Белгилүү бир саптын түз көрсөтүүсү scoreLine (упай дисплей сызыгы):

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

Теориялык жактан алганда, бул оюнда эч кандай татаал эч нерсе жок; Мен бул башталгыч деңгээлдеги жакшы мисал деп ойлойм. Код бир файлда жазылып, бир нече функцияда форматталган. Класстар жок, мурас жок. Сиз GitHub репозиторийине өтүп, оюндун баштапкы кодунан баарын көрө аласыз.

Оюн 2. Crazy Tanks

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Оюн Crazy Tanks

Консолго каармандарды басып чыгаруу, балким, сиз оюнга айландыра турган эң жөнөкөй нерсе. Бирок андан кийин бир кыйынчылык пайда болот: символдордун бийиктиги жана туурасы ар кандай (бийиктиги туурасынан чоңураак). Ошентип, баары пропорциядан чыгып, ылдый же өйдө жылып солго же оңго жылганга караганда алда канча тезирээк көрүнөт. Бул эффект Жыланда (1-оюнда) абдан байкалат. "Танктарда" (2-оюнда) мындай кемчилик жок, анткени ал жерде чыгуу экрандын пикселдерин түрдүү түстөр менен боёо аркылуу уюштурулат. Мен рендерер жаздым деп айтса болот. Ырас, бул бир аз татаалыраак, бирок алда канча кызыктуу.

Бул оюн үчүн, экранда пикселдерди көрсөтүү үчүн менин системамды сүрөттөп берүү жетиштүү болот. Мен муну оюндун негизги бөлүгү деп эсептейм. Ал эми калганынын баарын өзүңүз ойлоп таба аласыз.

Демек, сиз экранда көргөн нерсе - бул кыймылдуу көп түстүү тик бурчтуктардын жыйындысы.

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Төрт бурчтуктар топтому

Ар бир тик бурчтук сандар менен толтурулган матрица менен берилген. Баса, мен бир кызыктуу нюансты баса белгилей алам - оюндагы бардык матрицалар бир өлчөмдүү массив катары программаланган. Эки өлчөмдүү эмес, бир өлчөмдүү! Бир өлчөмдүү массивдер менен иштөө бир топ жеңил жана тезирээк.

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Оюн танкынын матрицасы

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Оюндун танк матрицасын бир өлчөмдүү массив катары көрсөтүү

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Матрицаны бир өлчөмдүү массив катары көрсөтүүнүн визуалдык мисалы

Ал эми массивдин элементтерине жетүү кош циклде болот, ал бир өлчөмдүү массив эмес, эки өлчөмдүү сыяктуу. Бул биз дагы эле матрицалар менен иштегендиктен жасалды.

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Бир өлчөмдүү массивди кош циклде өтүү. Y - сап идентификатору, X - мамычанын идентификатору

Көңүл буруңуз: кадимки матрица идентификаторлорунун ордуна i, j, мен x жана y идентификаторлорун колдоном. Бул, менимче, бул көзгө жагымдуураак жана мээге түшүнүктүү. Мындан тышкары, мындай белгилөө колдонулган матрицаларды эки өлчөмдүү сүрөттүн координат окторуна ыңгайлуу проекциялоого мүмкүндүк берет.

Эми пикселдер, түс жана экран чыгаруу жөнүндө. Чыгуу үчүн StretchDIBits функциясы колдонулат (Таш аты: windows.h; Китепкана: gdi32.lib). Бул функция, башка нерселер менен катар, төмөнкүлөрдү алат: сүрөттөлүш көрсөтүлгөн түзмөк (менин учурда, бул Windows консолу), сүрөт дисплейинин баштапкы координаттары, анын туурасы/бийиктиги жана сүрөттүн өзү. байт массиви менен берилген битмап формасы. Биттик массив катары битмап!

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 битмапын түзүү:

// 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++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Оюн талаасынын санариптик матрицасына негизделген маалымат менен битмапты (пиксел матрицасын) толтуруунун мисалы (түстүү индекстер оюндагы индекстерге дал келбейт)

Мен ошондой эле оюндан чыныгы коддун бир бөлүгүн тартуулайм. Циклдин ар бир итерациясында colorIndex өзгөрмөсүнө оюн талаасынын (mainDigitalMatrix) сандык матрицасынан маани (түс индекси) ыйгарылат. Андан кийин түс өзгөрмө индекстин негизинде түстүн өзүнө коюлат. Андан кийин пайда болгон түс кызыл, жашыл жана көк (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() функциясында баскычтарды басууларды каттагандан жана аларды Logic() функциясында кийинки иштетүүдөн кийин жаңы сүрөт (кадр) түзүлөт. Ырас, оюн объектилери буга чейин оюн талаасында башка позицияга ээ болушу мүмкүн жана, демек, башка жерде тартылган. Анимация (кыймыл) ушундай болот.

Теорияда (эгерде мен эч нерсени унуткан жокмун), биринчи оюндагы оюн циклин ("Жылан") жана экинчи оюндан экранда пикселдерди көрсөтүү тутумун түшүнүү ("Танктар") каалаган нерсени жазуу үчүн жетиштүү. Windows астында 2D оюндарыңыздын. Үнсүз! 😉 Калган бөлүктөрү жөн гана фантазия.

Албетте, "Танктар" оюну "Жыланга" караганда алда канча татаал. Мен буга чейин C++ тилин колдонгон, башкача айтканда, класстар менен ар кандай оюн объектилерин сүрөттөгөн. Мен өзүмдүн коллекциямды түздүм - кодду headers/Box.h менен көрүүгө болот. Айтмакчы, коллекцияда эс тутумдун агып кетиши мүмкүн. Колдонулган көрсөткүчтөр. Эстутум менен иштеген. Китеп мага абдан жардам бергенин айтышым керек Оюн программалоо аркылуу C++ башталышы. Бул C++ тилин баштагандар үчүн эң сонун башталгыч. Бул кичинекей, кызыктуу жана жакшы уюштурулган.

Бул оюнду иштеп чыгуу үчүн алты айга жакын убакыт кетти. Негизинен жумушта түшкү тамактануу учурунда жаздым. Ал кеңсенин ашканасында отуруп, тамак-ашты тебелеп, код жазды. Же үйдө кечки тамакта. Ошентип, мен бул "ашкана согуштары" менен аяктадым. Кадимкидей эле мен блокнотту активдүү колдондум, бардык концептуалдык нерселер анда жаралган.

Практикалык бөлүгүн бүтүрүү үчүн мен дептеримдин бир нече сканерин алам. Эмнени жазганымды, тартканымды, санаганымды, долбоорлогонумду көрсөтүү үчүн...

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Танктардын сүрөттөрүн долбоорлоо. Жана ар бир танк экранда канча пикселди ээлеши керек экендигин аныктоо

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Резервуардын өз огунун айланасында айлануу алгоритмин жана формулаларын эсептөө

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Менин коллекциямдын схемасы (эс тутумдун агып кетиши мүмкүн). Коллекция Шилтемеленген тизме түрүнө ылайык түзүлөт

DevOps C++ жана "ашкана согуштары", же тамактанып жатканда кантип оюндарды жаза баштадым
Ал эми бул оюнга жасалма интеллектти кошууга болгон пайдасыз аракеттер

теория

"Миң чакырымдык жол да биринчи кадамдан башталат" (Байыркы кытай акылмандыгы)

Практикадан теорияга өтөбүз! Хоббиңе кантип убакыт тапса болот?

  1. Чынында эмне каалап жатканыңызды аныктаңыз (тиле, бул эң кыйын бөлүгү).
  2. Приоритеттерди кой.
  3. Жогорку артыкчылыктар үчүн бардыгын "кошумча" курмандыкка чал.
  4. Күн сайын максаттарга умтулуңуз.
  5. Хоббиге өткөрүү үчүн эки же үч саат бош убакытты күтпөңүз.

Бир жагынан, сиз каалаган нерсеңизди аныктап, артыкчылыктуу болушуңуз керек. Экинчи жагынан, бул артыкчылыктардын пайдасына кээ бир иш-аракеттерден/долбоорлордон баш тартууга болот. Башкача айтканда, сиз "кошумча" баарын курмандыкка чалууга туура келет. Жашоодо эң көп дегенде үч негизги иш болушу керек деп бир жерден уктум. Ошондо сиз аларды эң жогорку сапатта жасай аласыз. Ал эми кошумча долбоорлор/багыттар жөн эле ашыкча жүктөй баштайт. Бирок мунун баары, балким, субъективдүү жана жеке.

Белгилүү бир алтын эреже бар: эч качан 0% күн болбойт! Мен бул тууралуу инди иштеп чыгуучунун макаласынан билдим. Эгер сиз кайсы бир долбоордун үстүндө иштеп жатсаңыз, анда ал жөнүндө күн сайын бир нерсе жасаңыз. Жана канча кылганыңыз маанилүү эмес. Бир сөздү же бир сап кодду жазыңыз, бир видеону көрүңүз же доскага бир мык кагыңыз - жөн гана бир нерсе кылыңыз. Эң кыйыны - баштоо. Баштагандан кийин, балким, сиз каалагандан бир аз көбүрөөк иш кылып бүтүрөсүз. Мына ушундай жол менен сиз тынымсыз максатыңызга карай жыласыз жана мага ишениңиз, абдан тез. Анткени, бардык нерсеге кедергисин тийгизген негизги нерсе — создуктурбоо.

Ал эми 5, 10, 15 мүнөттүк убакыттын бекер "талкандарын" баалабашы жана көңүл бурбоо керек экенин эстен чыгарбоо керек, бир же эки саатка созулган чоң "журналдарды" күтүңүз. Сиз кезекте турасызбы? Сиздин долбоор үчүн бир нерсе жөнүндө ойлонуп көр. Эскалатор менен барасызбы? Блокнотко бир нерсе жазыңыз. Сиз автобуста барасызбы? Жакшы, бир нече макаланы оку. Ар бир мүмкүнчүлүктү колдонуңуз. YouTube'да мышыктар менен иттерди көрүүнү токтотуңуз! Мээңди булгаба!

Жана акыркы бир нерсе. Эгер бул макаланы окугандан кийин, сизге оюн кыймылдаткычтарын колдонбостон оюндарды түзүү идеясы жакса, анда Кейси Муратори атын эстеп коюңуз. Бул жигит бар сайты. "Көрүү -> МУРУНКУ Эпизоддор" бөлүмүндө сиз нөлдөн баштап профессионалдык оюн түзүү боюнча эң сонун акысыз видео сабактарды таба аласыз. Беш Intro to C for Windows сабактарында, балким, университетте окуган беш жылдыктан да көбүрөөк үйрөнөсүз (кимдир бирөө бул тууралуу видеонун астындагы комментарийлерде жазган).

Кейси ошондой эле өз оюн кыймылдаткычыңызды иштеп чыгуу менен сиз учурдагы кыймылдаткычтарды жакшыраак түшүнөсүз деп түшүндүрөт. Ар бир адам автоматташтырууга аракет кылган алкактар ​​дүйнөсүндө сиз колдонуунун ордуна түзүүнү үйрөнөсүз. Сиз компьютерлердин табиятын түшүнөсүз. Жана сиз дагы бир топ акылдуу жана жетилген программист болосуз - про.

Тандаган жолунда ийгилик! Ал эми дүйнөнү профессионалдуу кылалы.

Author: Гранкин Андрей, DevOps



Source: www.habr.com