Програмирање Тиц Тац Тое игре у Висуал Басиц

click fraud protection

Програмирање компјутерске игре може бити технички најзахтјевнији (а можда и најбоље плаћени) посао који а програмер могу имати. Игре на највишем нивоу захтевају оно најбоље од програмера и рачунара.

Вижуал бејзик 6 је сада потпуно заобиђен као платформа за програмирање игара. (То заиста никада није био један. Чак иу „добрим данима“ озбиљни програмери игара никада не би користили језик високог нивоа као што је ВБ 6, јер једноставно нисте могли да решите рубне перформансе које захтева већина игара.) Али једноставна игра "Тиц Тац Тое" одличан је увод у програмирање које је мало напредније него "Здраво Свете!"

Ово је сјајан увод у многе основне концепте програмирања, јер комбинира технике које укључују:

  • Употреба низови. Кс и О маркери се држе у одвојеним низовима, а читави низови се преносе између функција како би се пратио напредак игре.
  • Кориштење графике на нивоу ВБ 6: ВБ 6 не нуди велике графичке могућности, али игра је добар увод у оно што је доступно. Велики део остатка ове серије је истраживање како ГДИ +, нова генерација Мицрософтове графике, замењује графику на нивоу ВБ 6.
  • instagram viewer
  • Кориштење математичких израчуна за контролу програма: Програм користи паметни модуло (Мод) и цијели број израчунавање подела помоћу матричних поља за две игре да би се утврдило када је „победа“ од три елемента дошло.

Класа програмирања у овом чланку можда је мало прешла почетни ниво, али то би требало бити добро за "средње" програмере. Али кренимо на основном нивоу да илуструјемо неке концепте и да започнемо са својим Вижуал бејзик каријера програмирања игара Чак и студенти напреднији од тога могу сматрати да је помало изазовно да предмете поставите у тачан облик.

Како играти Тиц Тац Тое

Ако никада нисте играли Тиц Тац Тое, ево правила. Два играча се наизменично постављају Ксс и Ос у 3 к 3 игралиште.

Пре почетка игре, оба играча се морају договорити ко ће први кренути и ко ће обележити његове потезе којим симболом. Након првог потеза, играчи наизменично стављају своје трагове у било коју празну ћелију. Циљ игре је бити први играч који има три марке у водоравној, дијагоналној или вертикалној линији. Ако нема празних ћелија и ниједан играч нема добитну комбинацију, игра је нерешена.

Пре него што започнете било какво стварно кодирање, увек је добра идеја променити имена било којих компоненти које користите. Једном кад почнете кодирање, Висуал Басиц ће име аутоматски користити тако да желите да то буде право име. Користићемо назив обрасца фрмТицТацТое а променит ћемо и наслов у „О Тиц Тац Тое“.

Када је образац успостављен, користите линијску контролу алата да бисте нацртали мрежу 3 к 3. Кликните алатку за линију, а затим нацртајте линију тамо где желите. На овај начин ћете морати да направите четири линије и прилагодите њихову дужину и положај како би изгледали исправно. Висуал Басиц такође има неке погодне алате испод менија Формат који ће вам помоћи. Ово је велика шанса за вежбање са њима.

Поред решетке за играње, требат ће нам и неки предмети за Кс и О симболе који ће бити постављени на мрежи. Пошто је девет размака у мрежи, креираћемо објектни низ с девет размака, који се називају елементи у Висуал Басиц-у.

Постоји неколико начина да се постигне баш све у развојном окружењу Висуал Басиц-а, а стварање контролних низова није изузетак. Вероватно је најлакши начин да направите прву етикету (кликните и нацртајте баш као алат за линију), дајте јој име, поставите све атрибуте (као што су Фонт и ФореЦолор), а затим их направите. ВБ 6 ће вас питати да ли желите да створите контролни низ. За прву ознаку користите назив лблПлаиГроунд.

Да бисте креирали осталих осам елемената решетке, изаберите први објекат са ознаком, поставите својство Индек на нулу и притисните ЦТРЛ + Ц (копирај). Сада можете да притиснете ЦТРЛ + В (налепите) да бисте створили још један објект налепнице. Када копирате објекте као што је овај, свака копија ће наследити сва својства осим индекса од прве. Индекс ће се повећавати за један за сваку копију. Ово је контролни низ јер сви имају исти назив, али различите вредности индекса.

Ако овако креирате низ, све копије ће бити постављене једна на другу у горњем левом углу обрасца. Повуците сваку етикету на једно од положаја решетке за репродукцију. Будите сигурни да су вредности индекса секвенцијалне у мрежи. Логика програма зависи од тога. Објект ознаке са вриједношћу индекса 0 треба бити у горњем лијевом углу, а доња десна ознака треба имати индекс 8. Ако налепнице покривају мрежу за репродукцију, изаберите сваку налепницу, кликните десним тастером миша и изаберите Сенд то Бацк.

Пошто је осам могућих начина да се победи у игри, требаће нам осам различитих линија да бисмо приказали победу на мрежи. Исту технику користићете за креирање другог контролног поља. Прво нацртајте линију, именовајте је линВин и поставите својство Индек на нулу. Затим користите технику копирања и копирања да бисте произвели још седам линија. Следећа илустрација показује како правилно поставити бројеве индекса.

Поред објеката и линија, потребни су вам и неки командни тастери за игру и више налепница да бисте постигли резултат. Кораци за њихово креирање нису овде детаљно описани, али ово су предмети који су вам потребни.

Два дугмета објеката:

  • цмдНевГаме
  • цмдРесетСцоре

Објект оквира фраПлаиФирст садржи два тастера са опцијама:

  • оптКСПлаиер
  • оптОПлаиер

Оквирни објект фраСцореБоард који садржи шест налепница. У програмском коду се мењају само лблКССцоре и лблОСцоре.

  • лблКс
  • лблКССцоре
  • лблО
  • лблОСцоре
  • лблМинус
  • лблЦолон

Коначно, треба вам и објект ознаке лблСтартМсг да бисте маскирали дугме цмдНевГаме када га не треба кликнути. Ово се не види на доњој слици јер заузима исти простор у форми као и командно дугме. Можда ћете морати да померате командно дугме да бисте привремено нацртали ову ознаку на обрасцу.

За сада није извршено ВБ кодирање, али коначно смо спремни за то.

Иницијализација

Сада морате коначно започети кодирање програма. Ако то још нисте учинили, можда бисте требали преузети изворни код који ће пратити како се објашњава рад програма.

Једна од првих дизајнерских одлука коју треба донети је како пратити тренутно „стање“ игре. Другим речима, шта су тренутни Кс и Ос на мрежи за играње и ко следи следеће. Концепт државе је критичан у великом броју програма, а посебно је важан у програмирању АСП-а и АСП.НЕТ-а за веб

Неколико је начина на које се то може учинити, па је то пресудан корак у анализи. Ако сте самостално решавали овај проблем, можда бисте желели да нацртате дијаграм тока и испробате различите опције са „гребањем папира“ пре него што започнете било које кодирање.

Наше решење користи два "дводимензионална поља", јер то помаже у праћењу "стања" једноставном променом индекса матрице у програмским петљама. Стање горњег левог угла ће бити у елементу поља са индексом (1, 1), горњи десни угао ће бити у (1, 3), доњи десни у (3,3), и тако даље. Два низа која то раде су:

иКСПос (к, и)

и

иОПос (к, и)

Постоји пуно различитих начина на које се то може постићи, а коначно ВБ.НЕТ решење из ове серије показује вам како то можете урадити са само једним једнодимензионалним низом.

Програми за превођење ових низова у одлуке о победи играча и видљиви прикази у обрасцу налазе се на следећој страници.

Такође вам је потребно неколико глобалних променљивих на следећи начин. Примјетите да се оне налазе у општем и декларативном коду за образац. Ово их чини "ниво модула" променљиве на које се овај образац може упутити било где у коду. Више о томе потражите у Разумевање обима променљивих у Висуал Басиц Хелп-у.

Постоје два подручја где се променљиве иницијализирају у нашем програму. Прво се неколико варијабли иницијализира док се облик фрмТицТацТое учитава.

Привате Суб Форм_Лоад ()

Друго, пре сваке нове игре, све променљиве које треба вратити на почетне вредности додељују се у потпрограму за иницијализацију.

Суб ИнитПлаиГроунд ()

Имајте на уму да иницијализација учитавања обрасца такође позива иницијализацију игралишта.

Једна од критичних вештина програмера је способност да користи уређаје за уклањање погрешака како би разумео о чему се ради у коду. Овим програмом можете да испробате:

  • Пролазак кроз код помоћу тастера Ф8
  • Постављање сата на кључне варијабле, попут сПлаиСигн или иМове
    Постављање тачке прекида и испитивање вредности променљивих. На пример, у унутрашњој петљи иницијализације:
лблПлаиГроунд ((и - 1) * 3 + ј - 1) .Цаптион = ""

Имајте на уму да овај програм јасно показује зашто је добра програмска пракса да податке чува у низовима кад год је то могуће. Ако у овом програму нисте имали низове, морали бисте написати код овако нешто:

Лине0.Висибле = Нетачно
Лине1.Висибле = Нетачно
Лине2.Висибле = Нетачно
Лине3.Висибле = Нетачно
Лине4.Висибле = Нетачно
Лине5.Висибле = Лажно
Лине6.Висибле = Нетачно
Лине7.Висибле = Нетачно

уместо тога:

За и = 0 до 7
линВин (и) .Висибле = Нетачно
Затим сам

Покретање

Ако било који део система може да се сматра „срцем“, то је подпрограм лблПлаиГроунд_Цлицк. Ова подпрограм се позива сваки пут када играч кликне на мрежу за играње. (Кликови морају бити унутар једног од девет елемената лблПлаиГроунд.) Примјетите да овај подпрограм има аргумент: (Индек Ас Интегер). Већина осталих "подпрограма" догађаја, попут цмдНевГаме_Цлицк (), не раде. Индекс означава на који је објекат ознаке кликнут. На пример, индекс би садржавао нулу за горњи леви угао решетке и вредност осам за доњи десни угао.

Након што играч кликне на квадрат у мрежи мреже, командно дугме за покретање друге игре, цмдНевГаме, „укључује се“ чинећи га видљивим. Стање овог командног дугмета врши двоструку обавезу јер се користи и као логична варијабла одлуке касније у програму. Коришћење вредности својства као променљиве одлуке обично се обесхрабрује, јер ако је икада неопходно променити програм (рецимо, на пример, направити командно дугме цмдНевГаме видљиво све време), тада ће програм неочекивано пропасти јер се можда нећете сјетити да се користи и као дио програма логика. Из тог разлога, увек је добра идеја претраживати програмски код и проверити употребу било чега што промените приликом одржавања програма, чак и вредности својстава. Овај програм крши правило дијелом да би се направила тачка, а дијелом и зато што је ово релативно једноставан дио кода гдје је лакше видјети о чему се ради и избјећи проблеме касније.

Избор играча играчког квадрата обрађује се позивањем подпрограма ГамеПлаи са аргументом Индексом.

Обрада потеза

Прво проверите да ли је кликнут незаузет квадрат.

Ако је лблПлаиГроунд (ко_Мове) .Цаптион = "" Тада

Једном када смо сигурни да је ово легитиман потез, бројач потеза (иМове) се повећава. Следећа два ретка су веома занимљива јер преводе координате из једнодимензионалног Ако се лблПлаиГроунд компонента низује на дводимензионалне индексе које можете користити или у иКСПос или иОПос. Мод и цела подјела („црта уназад“) су математичке операције које не користите сваки дан, али ево одличног примера који показује како могу бити веома корисни.

Ако је лблПлаиГроунд (ко_Мове) .Цаптион = "" Тада
иМове = иМове + 1
к = Инт (ко_Мове / 3) + 1
и = (ко_Мове мод 3) + 1

Вредност ко_Мове 0 биће преведена у (1, 1), 1 у (1, 2)... 3 до (2, 1)... 8 до (3, 3).

Вредност у сПлаиСигн, променљива са опсегом модула, прати који играч је направио потез. Једном када се ажурирају потези поља, компоненте налепница у мрежи за репродукцију могу се ажурирати одговарајућим знаком.

Ако је сПлаиСигн = "О" онда
иОПос (к, и) = 1
иВин = ЦхецкВин (иОПос ())
Остало
иКСПос (к, и) = 1
иВин = ЦхецкВин (иКСПос ())
Енд Иф
лблПлаиГроунд (ко_Мове) .Цаптион = сПлаиСигн

На пример, када Кс играч кликне на горњи леви угао мреже, променљиве ће имати следеће вредности:

Кориснички екран приказује само Кс у горњем левом пољу, док иКСПос има 1 у горњем левом пољу и 0 у свим осталим. ИОПос има 0 у свакој кутији.

Вриједности се мијењају када О играч кликне на средњи квадрат решетке. Сада иОПос приказује 1 у централном оквиру, док кориснички екран приказује Кс у горњем левом и О у централном оквиру. ИКСПос приказује само 1 у горњем левом углу, са 0 у свим осталим оквирима.

Сада када знате где је играч кликнуо и који играч је извршио кликање (користећи вредност у сПлаиСигн), све што морате да урадите је да откријете да ли је неко победио у некој игри и смислите како да то прикажете у приказ.

Проналажење победника

Након сваког потеза, функција ЦхецкВин проверава добитну комбинацију. ЦхецкВин делује додавањем доњег реда, преко сваког ступца и кроз сваку дијагоналу. Праћење корака кроз ЦхецкВин помоћу функције за отклањање грешака Висуал Басиц може бити врло едукативно. Проналажење победе прво је провјеравање да ли су пронађене три ознаке у свакој од појединачних провјера у варијабли иСцоре, а затим враћа јединствену вредност "потписа" у Цхецквину која се користи као индекс поља за промену видљивог својства једног елемента у линВин-у компонентни низ. Ако нема победника, ЦхецкВин ће садржати вредност -1. Ако победник има, приказ се ажурира, табла се мења, приказује се честитка и игра се поново покреће.

Провјеримо детаљно једну од провјера да видимо како то функционише. Остале су сличне.

'Проверите редове за 3
За и = 1 до 3
иСцоре = 0
ЦхецкВин = ЦхецкВин + 1
За ј = 1 до 3
иСцоре = иСцоре + иПос (и, ј)
Следећи ј
Ако је иСцоре = 3 Тада
Излаз из функције
Енд Иф
Затим сам

Прво што треба приметити је да први бројач индекса и одбројава редове, а други ј броји преко ступаца. Вањска петља затим једноставно прелази из једног у други ред. Унутрашња петља броји 1 у тренутном реду. Ако су три, онда имате победника.

Имајте на уму да такође пратите укупан број квадрата тестираних у променљивој ЦхецкВин, која је вредност прослеђена када се ова функција прекине. Свака добитна комбинација завршит ће јединственом вриједношћу у ЦхецкВин-у од 0 до 7 која се користи за одабир једног од елемената у низу компоненти линВин (). Због тога је редослед кода у функцији ЦхецкВин такође битан! Ако сте преместили један од блокова код петље (попут оне горе), погрешна линија ће бити исцртана на мрежи за играње када неко победи. Пробајте и видите!

Детаљи завршне обраде

Једини код који још није разматран је подпрограм за нову игру и подпрограм који ће ресетовати резултат. Остатак логике у систему чини њихово стварање прилично једноставним. Да бисте покренули нову игру, морате само позвати ИнитПлаиГроунд потпрограм. Као погодност за играче будући да се на дугме могло кликнути усред игре, тражите потврду пре него што наставите. Такође тражите потврду пре поновног покретања табеле.

instagram story viewer