Кіріспе

Бит-тақта – әр біті ойын тақтасының бір жасушасына немесе фигурасына сәйкес келетін, үстел ойындарын ойнайтын компьютерлік жүйелерде кеңінен қолданылатын арнайы биттік массив дерек құрылымы. Бұл ойын күйін орнатуға немесе сұрауға, сондай-ақ ойынның әрекеттерін немесе ойынды анықтауға мүмкіндік береді. Бір бит-тақтадағы биттер ойын ережелеріне сәйкес бір-бірімен байланысты, көбінесе біріктірілгенде ойын позициясын құрайды. Басқа бит-тақталар әдетте позициялар туралы сұрауларға жауап беру немесе түрлендіру үшін маска ретінде қолданылады. Бит-тақталар ойын тақтасының дискретті жасушаларындағы фигуралардың күйі немесе болуы арқылы, кеңістіктік күйлерді дерек құрылымындағы биттерге бейнелеу арқылы, кез келген ойынға қолданылады. Бит-тақталар – бұл дәстүрлі «пошта жәшігі» тәсіліне қарағанда тиімді балама, онда тақтадағы әр фигура немесе жасуша массив элементі болып табылады. Бит-тақталар, әсіресе, тақтадағы байланысты күйлердің биттері процессор архитектурасының бір немесе екі сөзіне сыйып қана қоймай, AND және OR сияқты биттік операторларды қолдану арқылы ойын күйлерін құруға немесе сұрауға мүмкіндік береді. Бит-тақталарды шахмат, шашка, Othello және сөз ойындары сияқты компьютерлік ойындарда қолдануға болады. Бұл схема алғаш рет 1950 жылдары шашка бағдарламаларында пайда болды, ал 1970 жылдардың ортасынан бері компьютерлік автоматтарда ойын тақтасын бейнелеудің де-факто стандарты болып табылады.

Сипаттама

Бит-тақта, арнайы биттік өріс, – бір машина сөзінде бірнеше байланысты логикалық айнымалыларды біріктіретін формат, әдетте тақта ойынындағы позицияны немесе ойынның күйін көрсетеді. Әр бит бір кеңістікті білдіреді; егер бит мәні оң болса, онда сол кеңістіктің қасиеті рас болады. Бит-тақталар компьютерге ойын күйі туралы кейбір сұрақтарға бір ғана биттік операция арқылы жауап беруге мүмкіндік береді. Мысалы, шахмат бағдарламасы ақ ойыншының тақтаның ортасында (ортадағы төрт шаршы) пешкалары бар-жоғын білгісі келсе, ол ойыншының пешкаларына арналған бит-тақтаны тақтаның ортасына арналған бит-тақтамен биттік АНД (ЖӘНЕ) операциясын қолдана отырып салыстыра алады. Егер ортада пешкалар болмаса, нәтижесінде барлық биттер нөлге тең болады (яғни нөлге). Бірнеше бит-тақта тақтадағы кеңістіктердің әртүрлі қасиеттерін көрсете алады, ал арнайы немесе уақытша бит-тақталар (уақытша айнымалылар сияқты) жергілікті қасиеттерді көрсете алады немесе аралық жиынтықталған нәтижелерді сақтай алады. Бит-тақталардың тиімділігін іске асырудың тағы екі қасиеті арттырады. Біріншіден, бит-тақталарды инкрементті түрде жаңарту жылдам, мысалы, бір фигураны жылжытқанда фигура орналасқан жерге арналған бит-тақтадағы бастапқы және соңғы орындардың биттерін аудару. Екіншіден, шахмат тақтасындағы әрбір позиция үшін әр түрдің барлық фигуралары шабуылдайтын барлық кеңістіктер сияқты статикалық қасиеттерді көрсететін биттік карталарды алдын ала жинақтап, кестеде сақтауға болады, сондықтан "e4 кеңістігіндегі жылқының қандай заңды қимылдары бар?" деген сұраққа жауап беру үшін бір ғана жадтан алу жеткілікті. Биттік өріс іске асырылуы тиімді болу үшін қазіргі заманғы процессор архитектураларында АНД, ИЛИ, ЖОҚ және басқалар сияқты толық сөздік (32 бит немесе 64 бит) биттік логикалық операциялардың болуын пайдаланады. Бит-тақталар ескі 8 және 16 биттік миникомпьютерлер мен микропроцессор архитектураларында тиімді болмауы мүмкін.

Орындау мәселелері

Массивті кестелердің мазмұнын қажетті түрде ықшамдау және кодтау, сондай-ақ транскрипция немесе кодтау қателерінің болу мүмкіндігі бітборд бағдарламаларын бағдарламалық жасақтаманы әзірлеушілер үшін жазуды немесе жөндеуді қиын жасайды. Кестелерді құру үшін көбінесе қолданба құрамына кірмейтін қосымша генеративтік әдістер қажет болады.

Артықшылықтары

Бит-тақталық бейнелеулер дерлік барлық процессорларда бір циклде орындалатын, толық құбырланған және кэштелген біттік қатарлы операцияларды пайдаланады. Көбінесе процессорларда AND, OR, NOR және XOR операциялары қолдау көрсетіледі. Сонымен қатар, қазіргі заманғы процессорларда орындалуы тиіс нұсқауларды кезекке қоятын нұсқаулар құбыры бар. Егер құбырда бірнеше нұсқау болса, бірнеше орындау бірліктері бар процессор бір циклде бірнеше нұсқауды орындай алады. Бұтақтармен бірге жүретін қалыпты нұсқау тізбектері, егер бұтақ дұрыс болжалмаса, құбырдың толуына себеп болуы мүмкін. Көптеген бит-тақта операцияларына аз шарттар қажет, сондықтан құбырдың тиімділігі артады және көптеген процессорлардағы бірнеше орындау бірліктерін тиімді пайдалануға мүмкіндік береді. Процессорлардың біт ені болады, олар осы енде біттік операцияларды бір циклде орындай алады. Сондықтан, 64 биттік немесе одан да жоғары процессорда 64 биттік операциялар бір нұсқау арқылы орындалуы мүмкін. Жоғары немесе төмен енді нұсқауларға қолдау көрсетілуі мүмкін. Көптеген 32 биттік процессорларда 64 биттік нұсқаулар болуы мүмкін, бірақ олар бір циклден көп уақыт алады немесе 32 биттік нұсқауларымен салыстырғанда нашар жұмыс істеуі мүмкін. Егер бит-тақта нұсқаулар жиынтығының енінен үлкен болса, толық енде операция орындау үшін бірнеше нұсқау қажет болады. Сондықтан, 64 биттік бит-тақталарды пайдаланатын бағдарлама 32 биттік процессорға қарағанда 64 биттік процессорда жылдам жұмыс істейді.

Кемшіліктері

Битбордтарды бейнелеуде бастапқы және машиналық кодтың ұзындығы айтарлықтай артық. Ұзақ біттерді өңдеу тізбектерін жазу және оларды жөндеу техникалық тұрғыдан қиынға соғады. Битбордтардың өзі сирек болады, кейде 64 биттің ішінде тек бір ғана бит кездеседі, сондықтан битбордтарды жүзеге асыру көп жадты қажет етеді. Бұл екі мәселе де кэштен қате деректерді алу жиілігін арттыруы немесе кэштің тұрақсыз жұмысына себеп болуы мүмкін. Егер процессорда "бірінші битті табу" (немесе "алдыңғы нөлдерді санау") және "бірліктерді санау" (немесе "нөлдерді санау") үшін аппараттық командалар болмаса, іске асыру мүмкіндігі шектеледі, себебі бұл операцияларды ассемблер тілінде циклдар түрінде кодтау өте тиімсіз.

Артықшылықтары

Бит-тақталар бөлшектер тізімі тақта деректері құрылымынан көбірек жадты қажет етеді, бірақ орындалу тиімділігі жоғары, себебі көптеген циклдық және салыстыру операциялары бір (немесе аздаған) биттік операцияға дейін азайттырылады. Мысалы, "пошта жәшігі" жүйесінде бөлшектің қандай-да бір кеңістікке шабуыл жасайтынын анықтау үшін, бөлшектің мүмкін қозғалыстарын жасау және оларды қайталау арқылы, соңғы кеңістікті ізделіп отырған кеңістікпен салыстыру қажет. Ал бит-тақталарда бөлшектің мүмкін қозғалыстары биттік картада сақталады, және бұл карта ізделіп отырған кеңістіктің биттік картасымен логикалық "ЖӘНЕ" (AND) операциясы жасалады. Нөлден өзге нәтиже болса, бұл бөлшектің аталған кеңістікке шабуыл жасағанын көрсетеді.

Кемшіліктері

Кейбір ойындар үшін битборд қозғалтқышын жазу үшін көп көлемде код, соның ішінде дерек кестелерін жазу қажет, бұл ықшам пошта жәшігі/санау әдісінен гөрі ұзақ болады. Шешілген сандағы регистрлері немесе процессордың нұсқаулар кэші бар мобильді құрылғылар (мысалы, ұялы телефондар) үшін бұл қиындық тудыруы мүмкін. Үлкен компьютерлер үшін бұл бірінші және екінші деңгейлі кэш арасында кэш қателіктеріне (cache misses) әкелуі мүмкін. Бұл тек мүмкін болатын мәселе, маңызды кемшілік емес, себебі көптеген машиналарда бұл мәселе тумауы үшін жеткілікті нұсқаулар кэші болады.

Өрттену жаңарту

Кейбір бит доңғалақтары басқаларынан күрделі өзара корреляция процесі арқылы туындайды, мысалы, шахматтағы шабуыл карталары. Ойын күйінің әрбір өзгеруінде (мысалы, жүргізілген қозғалыс) барлық карталарды қайта жасау тым қымбатқа түсуі мүмкін, сондықтан туынды бит карталары біртіндеп жаңартылады, бұл процеске күрделі және нақты код қажет. Бұл орындалу жылдамдығы бойынша әлдеқайда тиімді, себебі тек өзгерген жайлармен байланысты бит карталары ғана өзгеруі керек, доңғалақтағы барлық бит карталары емес. Біртіндеп жаңарту болмаса, бит картасымен бейнелеу, жаңарту өзінен-өзі локальды және біртіндеп болатын ескі пошта жәшігі бейнелеуінен тиімді болмауы мүмкін.

Алдын ала есептелген бит карталары мен кестелерді іздеу

Кейбір биттік карталар тақта конфигурациясына тәуелді болмағандықтан, тақтаның қозғалысы немесе күйі өзгергеннен кейін жинақталмай, кестеден іздеу арқылы алдын ала есептеліп, алынуы мүмкін. Мысалы, шахмат тақтасының 64 шаршысының әрқайсысында орналасқан ат немесе корольдың шабуылдай алатын шаршылары, әйтпесе оларды санау қажет болар еді.

Шахмат тақталары

Шахмат тақтасындағы фигуралардың орналасуын ең айқын және қарапайым түрде бейнелеу – әр фигураны тақтадағы орнына сәйкестендіретін, іздеуге ыңғайлы ретпен (мысалы, құндылығы бойынша кішіден үлкенге қарай) фигуралардың тізімі (массив). Сол сияқты, әр фигураның шабуылдайтын қысқырларын біріктіру үшін осындай қысқырлардың реттік тізімі қажет. Бұл схема пошта жәшігіне адрестеу деп аталады. Ақ және қара фигуралар, сондай-ақ ақ және қара пілдер үшін жеке тізімдер сақталады. Карталар әр қимыл сайын жаңартылады, бұл фигуралар тізімі бойынша сызықтық іздеуді (немесе фигура алынған жағдайда екі) талап етеді. Пошта жәшігінің артықшылығы – қарапайым код; кемшілігі – сызықтық іздеулер баяу. Фигураларды орналасуларына байланысты карталайтын, жылдам, бірақ күрделірек дерек құрылымдары битбордтар деп аталады.

Стандартты

Бит-тақталық бейнелеулерде 64 биттік сөздің (немесе 32 биттік архитектурадағы қос сөздің) әрбір биті шахмат тақтасының бір шаршысымен байланыстырылады. Биттерді шаршыларға кез келген түрде сәйкестендіруге болады, бірақ қалыпты жағдайда, биттер солдан оңға және төменнен жоғарыға қарай шаршылармен байланыстырылады, сондықтан 0 биті a1 шаршысын, 7 биті h1 шаршысын, 56 биті a8 шаршысын және 63 биті h8 шаршысын көрсетеді. Көптеген түрлі тақта конфигурациялары әдетте өздерінің бит-тақталарымен бейнеленеді, оның ішінде патшалардың орналасқан жерлері, барлық ақ пешкалар, барлық қара пешкалар, сондай-ақ басқа фигура түрлерінің әрқайсысы немесе барлық ақ фигуралар сияқты фигуралардың комбинациялары. Екі шабуыл бит-тақтасы да әмбебап: бір бит-тақта шаршыға шабуыл жасайтын барлық фигуралар үшін, ал фигура бар әрбір шаршы үшін – сол фигура шабуылдайтын барлық шаршылар үшін кері бит-тақта. Бит-тақталар сонымен қатар тұрақты шамалар бола алады, мысалы, бірінші қатарды көрсететін, 0–7 орындарында бірлік биті бар бит-тақта. Басқа жергілікті немесе уақытша бит-тақталар, мысалы, "оппонент фигуралары шабуылдаған патшаға жақын барлық орындар" қажет болғанда немесе ыңғайлы болғанда жинақталуы мүмкін.

Код үлгілері

Frenzee қозғалтқышының авторы бірнеше бастапқы код мысалдары жариялаған. Бит-тақталарды пайдалануды көрсеткен 155 жолды Java Connect 4 бағдарламасы.

Отелло

Othello (Reversi) қозғалтқыштарын толық қарастыру, соның ішінде C және тіркеме тіліндегі Othello битбордысын қамтитын кейбір бастапқы кодтар. Edax (есептеу) – Edax туралы мақаланы қараңыз. Битборд негізінде жасалған бастапқы коды бар Othello (Reversi) қозғалтқышы.

Сөздік ойындар

Сөздік ойындарда бит-тақталарды қолдануға шолу.