Создавање игра со „тик-так-пети“. Теоретски основи на развојот

Поздрав, драги пријатели! Во оваа лекција ќе покажам како можете да направите игра на прелистувач - tic-tac-toe, во Javascript! Сите знаете што е оваа игра и како да ја играте, но дозволете ми повторно да ве потсетам:

Tic-tac-toe е логична игра помеѓу двајца играчи на квадратно поле од 3 на 3 ќелии (можеби и поголеми). Едниот си игра со „крстови“, а вториот со „прсти“.

П.С. како и во сите слични лекции за Javascript, на крајот од статијата можете да ја преземете изворната датотека, а исто така да го видите резултатот од работата во демо пример!

Опис на играта што се создава

Ајде да ги погледнеме карактеристиките на играта:

  • играта започнува веднаш по вчитувањето на страницата;
  • правото да се оди прв се избира по случаен избор (или почнуваш да одиш или компјутерот);
  • знакот што ќе се обложите е избран по случаен избор (крст или нула);
  • ако играчот победи, победничките симболи (лента со крстови или нули) се означени со зелено;
  • ако играчот загуби од компјутерот, лентата е означена со црвено;
  • Над полето има линија со информации каде што се прикажува резултатот (победа или пораз).

Логики

Не смислив сложени (универзални) алгоритми за квадратно поле за играње 3 на 3, отидов на друг начин - брутална сила! (повеќе за ова малку подоцна). Идентификував три главни последователни фази на кои почива целата логика:

Фаза 1: проверка дали играчот победил?

Во оваа фаза, проверуваме дали има 3 ќелии (на иста линија) исполнети со исти симболи на играчот (крстови или нули). Оние. без разлика каков е потегот (дури и првиот), секогаш прво проверуваме дали играчот победил. Вака изгледа победата:

Фаза 2: проверка - дали компјутерот може да победи со следниот потег?

Во оваа фаза, бараме линија каде што ќе има 2 ќелии исполнети од компјутерот и една празна ќелија - односно се обидуваме да победиме поради невнимание на играчот. Вака изгледа поразот (т.е. компјутерска победа):

Фаза 3: не дозволуваме да победите!

Овде ја бараме истата линија како во втората фаза, само 2 ќелии мора да се пополнат со знаците за игра на играчот, односно во оваа фаза не дозволуваме компјутерот да изгуби со ставање знак во празна ќелија. Секоја од фазите претставува независна функција - ова можете да го видите во кодот js подолу.

Имплементација

Распоредот на полето за играње е многу едноставен - главниот блок содржи линија на информации (класа - резултат) и 9 блокови, кои се ќелии (класа - блок) HTML распоред на ќелиите:

Ти си на ред!

Ќелијата за помошна класа е неопходна за точно да се идентификува саканата ќелија на полето за играње. CSS стилови за полето за играње:

Krestiki_noliki( ширина: 306 px; маргина: 0 автоматски; ) .krestiki_noliki .block( ширина: 100 px; висина: 100 px; граница: 1 px солидна #cccc; курсор: покажувач; плови: лево; порамнување на текстот: центар; големина на фонтот: 100 px; висина на линијата: 94 px;)

Сега да го погледнеме целиот JS код, по што ќе зборувам за главните точки:

$(документ).ready(function())( var znak_user = "O"; var znak_comp = "X"; var rand_num = Math.round((Math.random() * (9 - 1) + 1)); ако (rand_num > 3) ( var znak_comp = "O"; var znak_user = "X"; $(".cell"+rand_num).text(znak_comp); ) var exit_flag = неточно; var win_user_array = ["123", " 456", "789", "147", "258", "369", "159", "357"]; //Одреди ја функцијата за победа на играчот check_3_user(znak) (за (var i = 0; i< 8; i++) { var first = "cell" + win_user_array[i].substr(0,1); var second = "cell" + win_user_array[i].substr(1,1); var third = "cell" + win_user_array[i].substr(2,1); if($("."+first).text() == znak && $("."+second).text() == znak && $("."+third).text() == znak){ $("."+first+",."+second+",."+third).css("background-color", "#83e2c3"); $(".result").text("Вы выиграли!"); $(".krestiki_noliki .block").unbind("click"); exit_flag = true; } } } //Определяем возможность победы компьютера function check_2_comp(znak){ for (var i = 0; i < 8; i++) { var first = "cell" + win_user_array[i].substr(0,1); var second = "cell" + win_user_array[i].substr(1,1); var third = "cell" + win_user_array[i].substr(2,1); if($("."+first).text() == znak && $("."+second).text() == znak && $("."+third).text() == "" && exit_flag == false){ $("."+third).text(znak); $("."+first+",."+second+",."+third).css("background-color", "#EF7C7C"); $(".result").text("Вы проиграли!"); $(".krestiki_noliki .block").unbind("click"); exit_flag = true; } if($("."+first).text() == znak && $("."+second).text() == "" && $("."+third).text() == znak && exit_flag == false){ $("."+second).text(znak); $("."+first+",."+second+",."+third).css("background-color", "#EF7C7C"); $(".result").text("Вы проиграли!"); $(".krestiki_noliki .block").unbind("click"); exit_flag = true; } if($("."+first).text() == "" && $("."+second).text() == znak && $("."+third).text() == znak && exit_flag == false){ $("."+first).text(znak); $("."+first+",."+second+",."+third).css("background-color", "#EF7C7C"); $(".result").text("Вы проиграли!"); $(".krestiki_noliki .block").unbind("click"); exit_flag = true; } } } //Определяем ход компьютера function check_2_user(znak){ for (var i = 0; i < 8; i++) { var first = "cell" + win_user_array[i].substr(0,1); var second = "cell" + win_user_array[i].substr(1,1); var third = "cell" + win_user_array[i].substr(2,1); if(exit_flag == false){ if($("."+first).text() == znak && $("."+second).text() == znak && $("."+third).text() == ""){ $("."+third).text(znak_comp); exit_flag = true; } } if(exit_flag == false){ if($("."+first).text() == znak && $("."+second).text() == "" && $("."+third).text() == znak){ $("."+second).text(znak_comp); exit_flag = true; } } if($("."+first).text() == "" && $("."+second).text() == znak && $("."+third).text() == znak){ $("."+first).text(znak_comp); exit_flag = true; } if(exit_flag) break; } } $(".krestiki_noliki .block").click(function(){ //Если клетка пустая if($(this).text() == ""){ $(this).text(znak_user); check_3_user(znak_user); check_2_comp(znak_comp); check_2_user(znak_user); if(exit_flag == false){ for (var i = 1; i < 10; i++) { if($(".cell"+i).text() == ""){ $(".cell"+i).text(znak_comp); break; } } }else exit_flag = false; } }); });

Прво, ги декларираме променливите: znak_user - во оваа променлива го складираме знакот со кој корисникот ќе игра (по дифолт, таму е зачувана нула - ова е англиското поле „О“). znak_comp - во оваа променлива го складираме знакот со кој компјутерот ќе игра (по дифолт, таму е зачуван крст - ова е англиската кутија "X").

Логиката е следна: ако случајниот број е поголем од 3, тогаш компјутерот игра со нули, а тој (компјутерот) го прави првиот потег.

Можете да ја промените оваа логика како што ви одговара, на пример, можете да креирате неколку случајни броеви за да направите повеќе опции за тоа кој ќе биде прв и какви знаци. exit_flag - ова знаме (променлива) е одговорно за излегување од функцијата, односно, на пример, кога компјутерот веќе го направил својот потег, а вие треба да излезете од функцијата и да го пренесете потегот на плеерот. win_user_array - оваа низа ги складира сите победнички опции за пополнување на ќелиите. За да биде јасно, ајде да ја погледнеме оваа слика:

Секој елемент од низата е низа од три броеви, што е добитна комбинација, односно, на пример, ако ги пополните ќелиите под броевите 1, 2 и 3, тогаш ќе се случи победа (или пораз). Како што можете да видите, има вкупно 8 победнички опции; нашата задача е да ги поминеме сите овие опции. Следуваат 3 функции:

  1. check_3_user();
  2. check_2_comp();
  3. check_2_user();

Целта на овие функции е опишана (во три чекори) во делот Логика (погоре). Овие функции се повикуваат со кликнување на која било од ќелиите во полето. Параметар (znak) се пренесува на секоја од функциите - ова е знак на играчот или компјутерот (крст или нула), на пример, на функцијата што ја одредува победата на играчот (check_3_user), го пренесуваме знакот на играчот по ред да се најдат 3 идентични знаци на иста линија.

По три функции (ако компјутерот сè уште не направил потег), компјутерот пополнува една од слободните ќелии. Овде можете да ја комплицирате играта, на пример, така што ако централната ќелија е слободна (ќелија број 5), тогаш прво обложувајте се во неа; ако е зафатена, тогаш обложувајте се во еден од слободните агли (овие се ќелии бр. 1, 3, 7 и 9) и така натаму - во принцип, тука зависи од ваша дискреција.

Тоа, во принцип, е сè што е потребно за да се создаде таква игра.

Сега можете да ја гледате играта користејќи демо пример и да ја преземете изворната датотека (вкупно 1 датотека).

08.06.2018 - благодарам за вашето внимание до авторот на писмото: Патвакан ​​Багдасаријан, поправена е грешка кога компјутерот имаше неколку можни опциибеа обоени победите и сите негови победнички потези (од 4 до 6 ќелии, наместо 3).

Тоа е сè за мене, се надевам дека оваа лекција беше корисна за вас, ви посакувам среќа, чао!

Како да напишете бот што не може да се победи на tic-tac-toe или Вовед во правилото за минималец

Сосема е можно по стотици игри на tic-tac-toe да сте се запрашале: кој е оптималниот алгоритам? Но, ако сте тука, тогаш веројатно сте се обиделе и да напишете имплементација на оваа игра. Ќе одиме понатаму и ќе напишеме бот што ќе биде невозможно да се победи на tic-tac-toe. Предвидувајќи го вашето прашање „зошто?“, ќе одговориме: благодарение на алгоритмот.

Како професионален шахист, овој алгоритам ги пресметува акциите на противникот неколку потези напред - додека не стигне до крајот на играта, било да е тоа победа, пораз или нерешено. Откако во оваа конечна состојба, вештачката интелигенција ќе си додели позитивен број на поени (во нашиот случај +10) за победа, негатива (-10) за пораз и неутрална (0) за нерешено.

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

Обидете се да ја играте оваа игра.

Алгоритмот минимакс најлесно се опишува како рекурзивна функција која:

  1. враќа вредност ако се најде конечната состојба (+10, 0, -10),
  2. поминува низ сите празни ќелии на теренот,
  3. ја повикува функцијата минимакс за секоја од нив (рекурзија),
  4. ги оценува добиените вредности
  5. и го враќа најдоброто.

Ако не сте запознаени со рекурзијата, тогаш треба да го гледате ова предавање од курсот Харвард CS50:

За да разбереме како функционира минимакс, ајде да ја напишеме неговата имплементација и да го моделираме неговото однесување. Ќе се занимаваме со ова во следните два дела.

Минимакс имплементација

Ќе погледнеме во ситуација кога играта се приближува кон крајот (видете ја сликата подолу). Бидејќи минимакс поминува низ сите можни состојби на играта (а има стотици илјади од нив), има смисла да се земе предвид крајната игра - на овој начин ќе треба да следиме помал број рекурзивни повици на функции (вкупно 9).

Нека вештачката интелигенција си игра со крстови, личноста - со нули.

За да ја олесниме работата со полето, да го декларираме како низа од 9 елементи со вредности еднакви на содржината на ќелиите. Ајде да го наполниме со крстови и прсти, како на сликата погоре, и да го наречеме origBoard.

Var origBoard = ["О",1"Х","Х",4,"Х",6"О","О"];

Следно, ќе ги прогласиме променливите aiPlayer и huPlayer и ќе им ги доделиме вредностите „X“ и „O“ соодветно.

Дополнително, ќе ни треба функција која бара победнички комбинации и враќа вистинска вредност доколку пребарувањето е успешно, и функција која ги складира индексите на достапните ќелии.

/* почетна состојбатабли О | | X --------- X | | X --------- | О | O */ var origBoard = [“O”,1 ,”X”,”X”,4,”X”, 6,”O”,”O”]; // лице var huPlayer = „O“; // AI var aiPlayer = „X“; // враќа список на индекси на празни ќелии на функцијата табла празниИндиции(табла)( врати табла.филтер(и => с != "О" && != "Х"); ) // победничките комбинации земајќи ги предвид индекси функција победничка(табла, играч)( ако((табла == играч && табла == играч && табла == играч) || (табла == играч && табла == играч && табла == играч) || (табла = = играч && табла == играч && табла == играч) || (табла == играч && табла == играч && табла == играч) || (табла == играч && табла == играч && табла == играч) | | (табла == играч && табла == играч && табла == играч) || (табла == играч && табла == играч && табла == играч) || (табла == играч && табла == играч && табла = = играч)) (врати точно; ) друго (врати неточно;) )

Значи, ајде да дефинираме минимакс функција со два аргументи: newBoard и player. Потоа ќе ги најдеме индексите на слободните ќелии на теренот и ќе ги пренесеме на променливата availSpots.

// функцијата на главната минимакс функција minimax(newBoard, player)( // достапни ќелии var availSpots = празни Индекси(newBoard);

Дополнително, треба да ги следиме конечните состојби и да ги вратиме соодветните вредности. Ако победи „нулата“, треба да вратите -10, ако „крстот“ - +10. Ако големината на низата availSpots е нула, тогаш нема слободни ќелии, играта ќе заврши нерешено, а нулата мора да се врати.

// проверка на состојбата на терминалот (победа/пораза/реми) //и враќање на вредноста соодветно ако (победник (newBoard, huPlayer)) (враќање (резултат:-10); ) друго ако (победник (newBoard, aiPlayer)) ( врати (резултат: 10); ) друго ако (availSpots.length === 0)( врати (резултат: 0); )

По ова, треба да соберете поени од секоја од празните ќелии. За да го направите ова, ќе создадеме низа од потези и ќе поминеме низ сите празни ќелии во јамка, поставувајќи ги индексите и точките на секое движење во објектот за движење.

Потоа го поставивме индексот на празната ќелија, која беше зачувана како број во origBoard, еднаква на својството индекс на објектот move. Потоа ќе одиме како тековен играч во празна ќелија од новото поле newBoard и ќе ја повикаме функцијата minimax од другиот играч и добиеното поле newBoard. По ова, треба да го ставите својството за бод на објектот вратено од функцијата минимакс во својството за бод на објектот поместување.

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

Конечно, функцијата ги ресетира промените на newBoard и го става објектот за движење во низата поместувања.

// низа за складирање на сите објекти var moves = ; // јамка низ достапните ќелии за (var i = 0; i< availSpots.length; i++){ //create an object for each and store the index of that spot var move = {}; move.index = newBoard]; // совершить ход за текущего игрока newBoard] = player; //получить очки, заработанные после вызова минимакса от противника текущего игрока if (player == aiPlayer){ var result = minimax(newBoard, huPlayer); move.score = result.score; } else{ var result = minimax(newBoard, aiPlayer); move.score = result.score; } // очистить клетку newBoard] = move.index; // положить объект в массив moves.push(move); }

Minimax потоа треба да го избере најдобриот потег од низата потези. Потегот со највисока оценка му треба ако вештачката интелигенција се движи, а со најниската ако е човечки потег. Така, ако вредноста на играчот е aiPlayer, алгоритмот ја иницијализира променливата bestScore на многу мал број и се превртува низ низата потези: ако резултатот од потегот вреди повеќе резултат од bestScore, алгоритмот го памети тој потег. Во случај на потези со еднакви точки, алгоритмот го памети првиот.

Во случај кога играчот е еднаков на huPlayer, сè е слично - само сега bestScore е иницијализиран на голем број, а minimax го бара потегот со најмалку поени.

Како резултат на тоа, minimax го враќа објектот зачуван во bestMove.

// ако ова е потег со вештачка интелигенција, прелистајте ги потезите и изберете го потегот со најмногу поени var bestMove; if(player === aiPlayer)( var bestScore = -10000; for(var i = 0; i< moves.length; i++){ if(moves[i].score >bestScore)( bestScore = moves[i].score; bestMove = i; ) ) )else( // инаку вртете низ потезите и изберете го потегот со најмалку поени var bestScore = 10000; for(var i = 0; i< moves.length; i++){ if(moves[i].score < bestScore){ bestScore = moves[i].score; bestMove = i; } } } // вернуть выбранный ход (объект) из массива ходов return moves; }

Во следниот дел, ќе ја симулираме нашата програма за да разбереме како функционира.

Минимакс во акција

Користејќи го дијаграмот подолу, ќе го анализираме чекор-по-чекор моделот на алгоритмот.

Забелешка: Во дијаграмот, големите броеви го означуваат серискиот број на повикот на функцијата, а нивоата покажуваат колку потези алгоритмот отишол напред.

  1. OrigBoard и aiPlayer се внесуваат во алгоритмот. Прави листа на пронајдените три празни ќелии, ја проверува конечноста на состојбата и се врти низ сите празни ќелии. Алгоритмот потоа го менува newBoard, ставајќи го aiPlayer на првиот празен квадрат. После тоа, се јавува од newBoard и huPlayer и чека вториот повик да врати вредност.
  2. Додека првиот повик на функција сè уште работи, вториот се извршува, создавајќи листа од две празни ќелии, проверувајќи ја конечната состојба и вртејќи низ сите празни ќелии. Вториот повик потоа го менува newBoard со поставување на huPlayer на првиот празен квадрат. После тоа, се јавува од newBoard и aiPlayer и чека третиот повик да врати вредност.

  3. Бидејќи вториот повик најде две празни ќелии, minimax го менува newBoard со ставање на huPlayer во втората празна ќелија. Потоа се повикува од newBoard и aiPlayer.

  4. Алгоритмот составува листа на празни ќелии и ја снима победата на играчот откако ќе ја провери конечноста на состојбата. Значи, враќа објект со поле за резултат од (-10).

    Во вториот функциски повик, алгоритмот ги прима вредностите вратени од пониското ниво со третото и четвртото повици на функцијата. Бидејќи потегот на huPlayer ги произведе овие два резултати, алгоритмот го избира помалиот. Бидејќи се исти, алгоритмот го избира првиот и го пренесува на првиот повик на функција.

    Во овој момент, првиот повик за функција доби проценка за движењето на aiPlayer до првата празна ќелија. Потоа го модифицира newBoard со поставување на aiPlayer на вториот празен квадрат. После тоа, се јавува од newBoard и huPlayer.

  5. Во петтиот повик на функција, алгоритмот составува листа на празни ќелии и ја евидентира победата на вештачката интелигенција откако ќе ја провери конечноста на состојбата. Значи, враќа објект со поле за резултат +10.

    После ова, првиот повик го менува newBoard со ставање на aiPlayer во третата празна ќелија. Потоа се повикува од newBoard и huPlayer.

  6. Шестиот повик прави листа од две празни ќелии, ја проверува конечноста на состојбата и се врти низ сите празни ќелии. Потоа го модифицира newBoard со поставување на huPlayer на првиот празен квадрат. Потоа се јавува од newBoard и aiPlayer и чека седмиот повик да врати вредност.
  7. Новиот повик конструира листа на една празна ќелија, проверува за конечна состојба и го модифицира newBoard за да го постави aiPlayer во празната ќелија. После тоа, се јавува од newBoard и huPlayer и чека овој повик да врати вредност.
  8. Осмиот предизвик е празна листапразни ќелии и ја бележи победата на aiPlayer по проверка на состојбата на екстремитетот. Затоа, враќа објект со поле за броење еднакво на (+10) на нивото погоре, седмиот повик.

    Седмиот повик доби само една, позитивна вредност од пониските нивоа. Бидејќи оваа вредност е добиена за време на пресвртот на aiPlayer, алгоритмот ја враќа најголемата добиена вредност. Така, враќа позитивна вредност (+10) на нивото нагоре, шестиот повик.

    Бидејќи шестиот повик најде две празни ќелии, minimax го менува newBoard со ставање на huPlayer во втората празна ќелија. Потоа се повикува од newBoard и aiPlayer.

  9. По ова, алгоритмот составува листа на празни ќелии и ја снима победата на aiPlayer откако ќе ја провери конечноста на состојбата. Затоа, враќа објект со поле за резултати еднакво на (+10) на горното ниво.

    Во овој момент, шестиот предизвик мора да избере помеѓу резултатот (+10) што го врати седмиот предизвик и резултатот (-10) што го врати деветтиот предизвик. Бидејќи потегот на huPlayer ги произведе овие два резултати, алгоритмот го избира помалиот и го враќа на следното ниво како објект со полиња за резултати и индекс.

    Конечно, се оценуваат сите три гранки од првиот повик (-10, +10, -10). Бидејќи потегот на aiPlayer ги произведе овие три резултати, алгоритмот го избира објектот што содржи најголем број точки (+10) и неговиот индекс (4).

Во горното сценарио, минимакс одлучува за тоа оптимален изборќе има поместување на централниот плоштад на теренот.

Крај!

Досега требаше да сфатите како функционира алгоритмот за минимална максимум. Обидете се сами да напишете имплементација или погледнете пример на GitHub или CodePen и оптимизирајте ја.

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

ЧЕКОР 1. КОНФИГУРИРАЊЕ НА ПАРАМЕТРИ НА ФОРМАТА1. За да приспособите форма, поставете ја нејзината големина
510 точки хоризонтално и 480 точки хоризонтално
вертикално. Максимум и минимум
означете ја големината еднаква на истите вредности.
2. Именувајте ја формата „Tic Tac Toe“.
3. За позадината на формуларот, користете датотека од папката
Сликите под името background.png и поставете ги
во центарот на формата.
4. За икона во насловната линија
користете користете датотека од папка
Слики под името menu4.ico.
5. Бојата на позадината на формуларот мора да биде поставена
Крем од нане.

ЧЕКОР 2. ДОДАВАЊЕ КОПЧЕ И етикета ВО ФОРМУЛАРОТ

1. За поставени елементи, промена
големина на фонтот до 12 и поставена заднина
транспарентен.

1. Направете лента со мени со ставки внатре
како што е прикажано на сликата.

ЧЕКОР 3. ДОДАВАЊЕ ЛЕНТА МЕНИ ВО ФОРМУЛАРОТ

1. Во менито Датотека, креирајте команда
Излезете.
2. За
тимови
Излезете
ајде да препишеме
програмскиот код е ист како во
претходна апликација.

ЧЕКОР 3. ДОДАВАЊЕ ЛЕНТА МЕНИ ВО ФОРМУЛАРОТ

1. Во ставката од менито Игра, креирајте тим
Нова игра.
2. За наредбата Нова игра ќе напишеме
програмскиот код во иднина преку
неколку чекори.

ЧЕКОР 3. ДОДАВАЊЕ ЛЕНТА МЕНИ ВО ФОРМУЛАРОТ

1. Во ставката од менито Помош, креирајте команда
За програмата.
2. За командата About the program, креирајте нова
формирајте и напишете го програмскиот код
слично како и во претходниот
апликација.

1. Со влечење објект PictureBox на формуларот
сменете ја нејзината големина на 100x100.
2. Поставете проѕирна позадина.
3. Поставете го PictureBox како што е прикажано на
слика над првата ќелија од полето за игра.

ЧЕКОР 4. ДОДАВАЊЕ ПРЕДМЕТИ ВО ФОРМУЛАРОТ НА ПРЕДМЕТИ НА СЛИКИ

1
2
3
4
5
6
7
8
9
1. Над преостанатите ќелии ги поставуваме
Објекти PictureBox, копии од првиот
објект, според нумерирањето наведено на
Слики.

1. Пред да напишете код
потребни во папката
\Visual Studio
2010\Projects\Tic Tac Toe\X's
нули\bin\Debug\ мора повторно да се превртат
датотеки x.png, 0.png, none.png од папката Images.
2. Кликнете двапати со левото глувче на првиот
Кутија со слика.

ЧЕКОР 5. ДОДАВАЊЕ КОД ЗА ОБЈЕКТИ ВО СЛИКУВАЊЕ

1. Направете дводимензионална низа достапна за сите елементи во
создадени во форма на 3x3 елементи составени од цели броеви. Веднаш
го пополнуваме со нули при декларирање. За празни ќелии ние
Ќе користиме 0, за „крстови“ - 1, а за „нули“ - -1.

ЧЕКОР 5. ДОДАВАЊЕ КОД ЗА ОБЈЕКТИ ВО СЛИКУВАЊЕ

Во постапката кога ќе кликнете на првиот
PictureBox, додадете оператор
избор
кои
ќе
проверете го статусот
низа ќелии. Доколку вредноста
ќелиите од низата ќе бидат еднакви на 0, што
тоа значи дека нема ниту „нула“, ниту
„крст“, потоа во оваа ќелија
низата е напишана 1 и во
Кутија со слика 1
прикажани
слика на „крст“ и ако
вредноста на ќелијата на низата ќе биде
е еднакво на 1 тогаш содржи
„крст“ и во него е напишано 0, и
Се прикажува празна ќелија.

ЧЕКОР 5. ДОДАВАЊЕ КОД ЗА ОБЈЕКТИ ВО СЛИКУВАЊЕ

1
2
3
4
5
6
7
8
9



За преостанатите ќелии од полето, додадете го кодот
исто како и во првиот само се менува
Број на објектот PictureBox и адреса на ќелијата
низа.
ПРИМЕР за втората ќелија:

Во постапката кога ќе кликнете на копче
додадете
оператор
циклус
кој проверува
сите клетки почнувајќи од првиот до
присуство на празни ќелии. И ако
ќелијата е празна,
потоа во неа
Напишано е „нула“, имено во
ќелијата на низата се пишува -1.
За погодност во идната работа
променливи
јас,
ј
кои
се користи за повторување на јамки
Ќе објавиме за целиот формулар.

ЧЕКОР 6. ДОДАВАЊЕ НА КОД ЗА КОПЧЕТО ЗА ПЕШАЊЕ

За прикажување на нули на
играње
Поле
неопходно
додадете програмски код во телото
циклус на проверка на ќелиите за празнина.
Користење на вгнездена изјава
разгранување
ќе
завземи место
анализа на адресата на ќелијата на низата за
излез нула во правилен
Кутија со слика.
Додаваме и изјава за пауза
за предвремено завршување
јамка кога се наоѓа празно
клетки.

ЧЕКОР 6. ДОДАВАЊЕ НА КОД ЗА КОПЧЕТО ЗА ПЕШАЊЕ

За означување на статусот на играта
се користи интерфејс елемент
Ознака 1. Бидејќи играчот секогаш се движи
прво
Тоа
на
преземања
апликации
неопходно
В
елемент
Ознака 1
неопходно
одразуваат
фрази „Вашиот
се движи“.
За
ова
ајде да создадеме
променлива
одговори
кои
Ајде да ја доделиме оваа фраза. А
при вчитување на формата променлива
мора да се додели на елементот
Label1, за да се создаде потребното
процедури
неопходно
прво кликнете двапати
според формата

ЧЕКОР 7. ДОДАВАЊЕ НА КОД НА ПРОГРАМАТА ЗА НОВАТА СТАВКА од МЕНИТО НА ИГРА

Кога ќе се притисне на командата ново
играта ќе се ресетира
сите ќелии од низата, заменувајќи ги сите
„крстови“ и „прсти“ на
празни ќелии. Исто така заклучокот
Знаци „Твој потег“.

ЧЕКОР 8. ИЗЛЕЗЕТЕ ГО РЕЗУЛТАТОТ НА ИГРАТА

За да ги проверите резултатите од потезите
неопходно
анализирајте
содржина на редови, колони и
дијагонали. Ако сите три елементи
се еднакви на 1, тогаш ова е победа за играчот, и
ако три -1 тогаш ова е пораз
играч.
Потребна е проверка на победата
однесување
пред
напредок
компјутер,
А
провери
пораз после.
Последната команда на постапката
резултатите ќе се прикажат на екранот
напредок.

ЧЕКОР 8. ИЗЛЕЗЕТЕ ГО РЕЗУЛТАТОТ НА ИГРАТА

Програмски код за проверка на победата на корисникот:
ако (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Ти победиш";
ако (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Ти победиш";
ако (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Ти победиш";
ако (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Ти победиш";
ако (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Ти победиш";
ако (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Ти победиш";
ако (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Ти победиш";
ако (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Ти победиш";
Програмски код за проверка на победата на корисникот:
ако (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Изгубивте";
ако (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Изгубивте";
ако (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Изгубивте";
ако (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Изгубивте";
ако (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Изгубивте";
ако (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Изгубивте";
label1.Текст = одговор;

ЧЕКОР 9 ПОДОБРУВАЊЕ НА ИГРАЛИВОСТА

За да се подобри репродукцијата
наместо сериски излез
до првите празни
ќелии од „нули“, ги имплементираме
излез преку случаен генератор
броеви.
За да го направите ова, треба да додадете
една логичка променлива
uslovie, и сменете го типот на јамка од For
на Додека, бидејќи не знаеме
точен број на повторувања
генератор случајни броевиЧао
нема да падне во празна ќелија.

МИНИСТЕРСТВО ЗА ОБРАЗОВАНИЕ И НАУКА НА РУСИЈА

сојузна државна буџетска образовна институција за високо стручно образование

„Државен универзитет Вологда“

Катедра за автоматизација и компјутерско инженерство

Објаснување на предметниот проект во дисциплината

Програмски и алгоритамски основи

"Икс точка"

Завршеноученик од групата ЕМ-21

Буторова Л.Ју.

Прифатено Rzheutskaya S. Yu.

ВОВЕД

1. АНАЛИЗА НА ПРОБЛЕМОТ И ОПРЕДЕЛУВАЊЕ НА БАРАЊАТА ЗА ПРОГРАМАТА КОЈ ЌЕ СЕ ИЗРАВИ

1 Цел на програмата, нејзините корисници, главни функции и цели кои се стремат за време на развојот

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

3 Теоретска основа на развојот

4 Избор на алатки за развој

ДИЗАЈН ДЕЛ ОД РАЗВОЈОТ

1 Развој на кориснички интерфејс

2.2 Развој на структури на податоци (во надворешна и RAM меморија)

2.3 Развој и анализа на алгоритми

ИМПЛЕМЕНТАЦИЈА НА ПРОГРАМАТА НА ЈАЗИК C++

1 Програмска архитектура

2 Избор на стандардни визуелни и невизуелни компоненти

РЕЗУЛТАТИ ОД ТЕСТОТ

ЗАКЛУЧОК

Библиографија

Апликации

ВОВЕД

Tic-tac-toe е логична игра помеѓу двајца противници на квадратно поле од 3 на 3 ќелии или поголемо (до „бесконечно поле“). Еден од играчите игра со „крстови“, вториот - со „прсти“. Оваа игра стана популарна долго пред појавата на компјутерите, дури пред да се игра со обично парче хартија и пенкало. Традиционалната кинеска игра користи црни и бели камења.

Во ова работа на курсотЗачувани се основните правила и стандардната големина на полето за игра (3x3 ќелии). За погодност на играта, правото да се направи првиот потег е оставено на корисникот, односно „крстови“.

Tic Tac Toe е програма која е дизајнирана да го забавува корисникот, затоа нејзиниот интерфејс, во оваа работа на курсот, е направен во гејмерски стил со комбинација на позитивни бои кои го зголемуваат емотивниот дел од процесот на играта.

Има три типа во играта: X наспроти 0 - корисник наспроти корисник, „1-во ниво со компјутер“ - за оние кои штотуку ги учат основите на светската игра и ниво „второ ниво со компјутер“ - за оние кои се апсолутно сигурни во својата победа. На нивоа 1 и 2, постојат три можни исходи: „победи“, „изгуби“ и „реми“. Добивките се фиксираат ако вертикалните, хоризонталните или дијагоналните линии се целосно исполнети со крстови или нули.

Ако слободните ќелии на теренот се завршени, но никој не победи, тогаш се смета дека играта заврши со „нерешено“.

1. АНАЛИЗА НА ПРОБЛЕМОТ И ОПРЕДЕЛУВАЊЕ НА БАРАЊАТА ЗА ПРОГРАМАТА КОЈ ЌЕ СЕ ИЗРАВИ

програмски вкрстен интерфејс

1.1 Цел на програмата, нејзините корисници, главните функции и цели кои се стремат за време на развојот

Целта на оваа програма е, пред сè, да ги забавува корисниците, да го разубави времето на чекање на една личност, бидејќи секоја работа бара одмор, а оваа едноставна игра ќе ви помогне да се опуштите и да го тргнете умот од секојдневните работи. „Tic Tac Toe“ исто така припаѓа на класата на интелектуални и логички игри, кои се дизајнирани да тренираат логично размислување, да ви овозможат да го концентрирате вниманието и да развиете меморија.

Целната публика на корисниците се деца и тинејџери, како и возрасни. Главните критериуми за користење на производот се способноста да се чита текст напишан во програмата и можноста да се избере потребната задача за компјутерот користејќи копчиња.

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

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

На интернет можете да најдете голем број дела кои ја спроведуваат оваа игра. Во моментов, има многу аналози на оваа игра кои отстапија од оригиналните стандарди. Пример за такви програми се „Tic-tac-toe на бескрајно поле“ и „Tic-tac-toe 3D“. Исто така, во многу игри, „крстовите“ и „прстите“ се заменуваат со други симболи, како што се, на пример, „камења“.

Мојот проект за курсеви е апликација за компјутер. Играта е наменета и за еден корисник, чиј противник е вештачката интелигенција (или компјутер), и за двајца корисници. Претставен е на класично поле 3x3.

Најинтересна и невообичаена, според мое мислење, беше играта „Tic Tac Toe 3D“. Затоа го избрав за споредба.

3D tic-tac-toe е многу поинтересен отколку на хартија или на обична табла. Има повеќе можности за победа и пораз, а нерешените се поретки. Можете да играте сами - против компјутерот - или заедно со пријател. И најнеобичното нешто овде е тоа што за да победите, можете да направите комбинација од три топчиња од вашата боја (црна или бела) не само на кое било ниво, туку и по должината на рамнината на ѕидовите, па дури и дијагонално низ целото поле ( Сл. 1.1).

Ориз. 1.1

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

1.3 Теоретска основа на развој

Анализа

За секоја од страните, постојат добро познати алгоритми кои гарантираат нерешено во играта на секој противник, а ако неговиот противник погреши, му дозволуваат да победи. Значи играта е во состојба „Ничија смрт“<#"877528.files/image002.gif">

Сл.1.2. Ситуации со дрво на игра

Делумно дрво на ситуации на игра е прикажано на сл. 1.2 за играта tic-tac-toe. Дрво на ситуации на игра за играта tic-tac-toe, каде играчот за „крстовите“ оди прв и постапува според горенаведениот алгоритам, а играчот за „прсти“ може да прави што сака (а едно теме е дадена за рационално и за ирационално дејство, односно за кое било друго), се состои од 50 јазли.

1.4 Избор на развојни алатки

За да ги постигнеме нашите цели, потребна ни е интегрирана околина за развој на апликации. Затоа, развојот на проектот беше спроведен во програмската средина на Microsoft Visual Studio 2008.

Microsoft Visual Studio е линија на производи на Microsoft , вклучувајќи интегрирана развојна средина софтвер и голем број други алатки. Овие производи ви дозволуваат да се развивате како базирани на конзоли апликации и GUI апликации , вклучувајќи поддршка за технологијата Windows Forms , како и веб-страниците , веб услуги како во мајчин , и контролирани кодови за сите платформи поддржани од Windows , Windows Mobile ,Windows CE , .NET Framework , Xbox , Windows Phone .NET Compact Framework и Силверлајт .

2. ДИЗАЈН ДЕЛ ОД РАЗВОЈОТ

2.1 Развој на кориснички интерфејс

Кога креирате апликација за игри, неопходно е да се земе предвид една од главните компоненти на успехот на производот - интерфејсот. Корисничкиот интерфејс на програмата, пред сè, мора да биде разбирлив и привлечен за корисникот. Треба да се обидете да ги отстраните сите моменти што ќе го одвлечат вниманието на корисникот или ќе му предизвикаат непријатност. Целиот програмски интерфејс може да се подели на две компоненти.

) Главно мени на програмата

Ориз. 2.1 - Главно мени на програмата

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

) Поле за играње

Сл. 2.2 - Поле за играње

Полето за играње ја содржи непосредната област за игра, каде што играчот и компјутерот ги поставуваат своите икони. Пред да започне играта, корисникот мора да го избере типот на играта како што се „X vs 0“, „1 ниво со компјутер“ или „2 нивоа со компјутер“, во спротивно програмата ќе даде порака за тоа што да прави. Копче што ќе му помогне на играчот да се врати во главното мени. На крајот, ќе се појават дополнителни прозорци за да го информираат учесникот за резултатите од натпреварот.

Ориз. 2.3 - дополнителни прозорци за исходот на играта

2.2 Развој на структури на податоци (во надворешна и RAM меморија)

RAM меморијата се користи за еднодимензионална низа која се состои од 9 елементи што ги складира состојбите на полето за играње, каде што секоја ќелија од низата одговара на ќелија на полето за играње. Меморијата се троши и на статични променливи: број на ниво, редослед на вртење.

Потребни се 803 KB слободна меморија за да работи.

.3 Развој и анализа на алгоритми

За да го имплементирате алгоритамот за размислување на играта, треба да поставите статична низа gcnew низа (9); во кој ќе се складираат состојбите на полето за играње, каде што секоја ќелија од низата одговара на ќелија. „0“ - одговара на празна ќелија, ако играчот се преселил во ќелијата, односно „X“, вредноста „1“ се запишува и ако компјутерот направил потег, односно „О“, вредноста е „2“. Првично, сите елементи на низата се еднакви на "0". Неопходно е да се постави статичката променлива lvl, која ги складира податоците за нивото. Во оваа игра има вкупно 3 нивоа: lvl ја зема вредноста „1“ ако корисникот го избрал типот на играта „X vs O“, вредноста „2“ ако „прво ниво со компјутер“ и вредноста „3 " ако "второ ниво со компјутер" " Променливата на плеерот го складира редоследот на вртење („точно“ е редот на играчот, „неточно“ е редот на компјутерот). Бидејќи правото да го направи првиот потег му се дава на корисникот, на почетокот на играта играчот = точно. Статичката променлива на знаменцето складира информации за тоа дали има празни ќелии на полето за играње или не: ако знамето = точно - односно неточно - нема празни ќелии. Алгоритмот за верификација мора да содржи повторување на параметрите на низата x и да даде свое решение, кое ќе биде оптимално за понатамошна игра. Оваа програма има 2 нивоа на играње со компјутер. На ниво 1, задачата на компјутерот не е да го победи противникот. Затоа оваа функцијавраќа случајна вредност на ќелијата каде што ќе оди компјутерот. Кодот за овој алгоритам е претставен во [Прилог 1]. Слика 2.4 го прикажува блок дијаграмот на имплементацијата на кодот.

Најпобедничкиот потег на почетокот на играта е да се преселите во центарот на теренот. Во функцијата dif_level(), на почетокот се проверува услов: ако играчот не отиде на централното поле, тогаш компјутерот оди таму. Во спротивно, ако играчот отиде во центарот, тогаш се повикува функцијата check(2) за да се провери комбинацијата на компјутерот и, ако има можност да се победи, тогаш вратете го бројот на ќелијата. Ако компјутерот не може да победи на следниот потег, тогаш се повикува функцијата check(1): проверка на комбинацијата на играчот. Се враќа бројот на ќелијата во која играчот би победил доколку се обложил. Ако не постои таква комбинација, тогаш се повикува функцијата low_level().

Сл.2.4. - Блок дијаграм

Сл.2.5. - Блок дијаграм

3. ИМПЛЕМЕНТАЦИЈА НА ПРОГРАМАТА НА ЈАЗИК C++

.1 Програмска архитектура

Оваа програма имплементира 3 форми: главното мени (сл. 2.1.), полето за играње (сл. 2.2) и полето за помош (правилата на играта); 12 панели, од кои 9 се главни. Исто така, на крајот од играта се појавува pictureBox со резултатот, има вкупно 5 (Слика 2.3).

Можете да користите управувачи со кликнување на панели како основа, од кои има точно 9 на полето за играње. Секој управувач повикува неколку функции. На почетокот постои услов, ако корисникот го избере типот на игра „X наспроти 0“, ќелиите едноставно се пополнуваат со вредностите 1 или 2 (крст или нула). Следуваат функциите: индикација за напредок (CrossZero()), која го менува крстот на нула и обратно, блокирање на окупираните ќелии checkingArray(), наоѓање на победникот победник(). Функцијата Winner() ги разгледува сите можни опции за победа, па ако некој од играчите подреди 3 од неговите фигури (крст или нула) вертикално, хоризонтално или дијагонално, тој ќе победи. Во спротивно, ако полето е полно, но никој од играчите не се наредил, тогаш се повикува (_friend()) функцијата за проверка на врзувањето, која проверува дали на теренот останале слободни ќелии или не. Ако fr = точно, тогаш нема слободни ќелии на полето. Ако вредноста е променета, тоа значи дека има слободна ќелија на теренот.

Вториот услов работи ако е избран вториот или третиот тип на игра. Тогаш функцијата во која е направен потегот на компјутерот се вика: move(int n). Го пренесува бројот на ќелијата на која кликнал играчот. Следуваат функциите: индикација за напредок (CrossZero()), блокирање на окупираните ќелии checkingArray(). Потоа се повикува функцијата winner() која проверува дали играчот победил со овој потег или не. Ако не, тогаш се проверува присуството на слободни ќелии. Ако има слободни ќелии, тогаш компјутерот се движи. Следно, во зависност од тоа кое ниво играч „1“ или „2“ го избрал, се нарекуваат следните функции: low_level(), dif_level(). Функцијата low_level() избира каде да ја постави нулата по случаен избор, а функцијата dif_level() претставува специјален алгоритам за победа на компјутерот. Следуваат функциите: индикација за напредок (CrossZero()), блокирање на окупираните ќелии checkingArray(). Потоа се повикува функцијата winner() која проверува дали компјутерот победил со овој потег или не. Ако не, тогаш се проверува присуството на слободни ќелии. Ако има слободни ќелии, тогаш играчот се движи.

.2 Избор на стандардни визуелни и невизуелни компоненти

За спроведување на оваа работа, беа избрани следниве компоненти:

1) Форма1, со дадени параметриТекст=Tic-Tac-Toe, ControlBox=Неточно

2) f2, со наведените параметри BackColor, Text=Game

) comboBox1 со наведените параметри на ставки:

X наспроти 0

1 ниво со компјутер

Ниво 2 со компјутер

4) панел, со наведени параметри BackColor и различни вредности за параметрите Visible и Enabled. За некои панели беа напишани настани како што е Кликни.

5) копче, со наведените параметри Font, Fore Color, BackColor, Text, за сите копчиња се напишани настани како Клик.

6) етикета, со наведените параметри BackColor, Font, Fore Color, Text.

) pictureBox, со наведени параметри Image, SizeMode= StretchImage.

) textBox, со наведените параметри BackColor, Font, Fore Color, Text=” “.

4. РЕЗУЛТАТИ од ТЕСТОТ

Ајде да ја тестираме програмата со поминување низ 3 типа на игри.

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

Сл.4.1.

Ајде да избереме 1 тип на игра - „Х наспроти 0“, т.е. корисник наспроти корисник. Во оваа фаза од играта, корисникот може да си игра и со себе. (Сл.4.2)

Сл.4.2.

За време на играта „Ниво 1 со компјутер“ компјутерот не си поставува цел да го освои учесникот. Тој само става нули слободни местаполиња. Во оваа фаза, корисникот лесно може да го победи компјутерот. Иако на ова ниво се можни и други опции за развој на настаните.

Сл.4.3.

Тип на игра: „Ниво 2 со компјутер“. Во оваа фаза, играта ги анализира сите потези и се обидува да го избере најоптималниот потег. И тука се можни сите три сценарија, бидејќи Компјутерот го прави своето прво движење до која било слободна ќелија. Најчесто играта се сведува на нерешено.

Сл.4.4.

Програмата работи успешно на сите тест варијанти, без грешки.

ЗАКЛУЧОК

Можеме со сигурност да кажеме дека задачата поставена на почетокот на работата е завршена. Во текот на развојот беше планиран и развиен проект за ремикс на познатата игра „Tic Tac Toe“. Играта ги исполнува наведените барања и ги исполнува своите функции. Имплементирано во работата Различни видовиигри и нивоа на тежина.

Во текот на работата беа совладани нови методи на програмирање во интегрирана развојна средина. Консолидирано е старото знаење за работа со јазикот C++. Како подготовка за работа на курсот, беа анализирани различни методи и алгоритми за имплементација на оваа игра.

И покрај очигледната едноставност на оваа програма, таа е полн со голем број тешкотии што се имплементираат со користење на сите основни техники на Visual C++.

Карактеристиките на оваа програма се:

Јасно конструиран алгоритам;

Интуитивен интерфејс;

Лесен за користење;

Сосема јасно упатство за употреба;

Нема непотребни додатоци.

БИБЛИОГРАФИЈА

1. http://www.pravilaigr.ru/xo.php

2. http://2igroka.com/stuff/sportivnye/krestiki_noliki_3d/15-1-0-14

3. https://www.draw.io/

Http://pol-video.ru/QPW9QHEO2GU/uroki_s_krestiki-noliki_ch1.html

АНЕКС 1

приватно: int low_level())(// постапка за лесен противник;::Случаен^ rand = gcnew Систем::Случајно();(= rand->Next(0,8);

) while (x[r] != 0);r;

ПРИЛОГ 2

приватно: bool check(int n)(k = -1;// ги проверува сите комбинации и го враќа точниот потег(x == n) ((x == n)&&(x == 0)) k =2; ((x == n)&&(x == 0)) k =1;((x == n)&&(x == 0)) k =6;((x == n)&&(x == 0)) k =3;((x == n)&&(x == 0)) k =8;((x == n)&&(x == 0)) k =4;

)(x == n) (((x == n)&&(x == 0)) k =0;((x == n)&&(x == 0)) k =7;((x == = n)&&(x == 0)) k =4;

)(x == n) (((x == n)&&(x == 0)) k =4;((x == n)&&(x == 0)) k =6;((x == = n)&&(x == 0)) k =8;((x == n)&&(x == 0)) k =5;

)(x == n) (((x == n)&&(x == 0)) k =0;((x == n)&&(x == 0)) k =5;((x == = n)&&(x == 0)) k =4;

)(x == n) (((x == n)&&(x == 0)) k =0;((x == n)&&(x == 0)) k =3;((x == = n)&&(x == 0)) k =1;((x == n)&&(x == 0)) k =2;

)(x == n) (((x == n)&&(x == 0)) k =2;

)(x == n) (((x == n)&&(x == 0)) k =8;((x == n)&&(x == 0)) k =7;

)(x == n) (((x == n)&&(x == 0)) k =6;

)(k!=-1) врати точно;друго врати неточно;

ПРИЛОГ 3

приватно: int dif_level())(//тежок непријател

//проверка за враќање (2);(x == 0) врати (4);(проверка(2)) врати k; друго (проверете(1)) врати k; else low_level();

ПРИМЕНА 4

приватно: void CrossZero())(// го менува крстот во нула (индикатор за напредок) (плеер) (-> Видливо = точно;-> Видливо = неточно;

) друго (-> Видливо = точно;-> Видливо = неточно;

): void checkingArray())(// функција за проверка дали има нешто во ќелијата, ако има, тогаш не можете повеќе да кликнете на оваа ќелија.(x == 1) (panel1->BackgroundImage = panel11->BackgroundImage ;panel1- >Овозможено = неточно;) (x == 2) (panel1->BackgroundImage = panel10->BackgroundImage;panel1->Onable = false;)(x == 1) (panel2->BackgroundImage = panel11->BackgroundImage ;panel2- >Овозможено = неточно;)(x == 2) (panel2->BackgroundImage = panel10->BackgroundImage;panel2->Onable = false;)(x == 1) (panel3->BackgroundImage = panel11->BackgroundImage ;panel3- >Овозможено = неточно;)(x == 2) (panel3->BackgroundImage = panel10->BackgroundImage;panel3->Onable = false;)(x == 1) (panel4->BackgroundImage = panel11->BackgroundImage ;panel4- >Овозможено = неточно;)(x == 2) (panel4->BackgroundImage = panel10->BackgroundImage;panel4->Onable = false;)(x == 1) (panel5->BackgroundImage = panel11->BackgroundImage ;panel5- >Овозможено = неточно;)(x == 2) (panel5->BackgroundImage = panel10->BackgroundImage;panel5->Onable = false;)(x == 1) (panel6->BackgroundImage = panel11->BackgroundImage ;panel6- >Овозможено = неточно;) (x == 2) (panel6->BackgroundImage = panel10->BackgroundImage;panel6->Onable = false;)(x == 1) (panel7->BackgroundImage = panel11->BackgroundImage ;panel7- >Овозможено = неточно;) (x == 2) (panel7->BackgroundImage = panel10->BackgroundImage;panel7->Onable = false;)(x == 1) (panel8->BackgroundImage = panel11->BackgroundImage ;panel8- >Овозможено = неточно;) (x == 2) (panel8->BackgroundImage = panel10->BackgroundImage;panel8->Onable = false;)(x == 1) (panel9->BackgroundImage = panel11->BackgroundImage ;panel9- >Овозможено = неточно;)(x == 2) (panel9->BackgroundImage = panel10->BackgroundImage;panel9->Enabled = false;)

): bool winner())(// проверка на победникот и блокирање на сите преостанати ќелии.

//бул знаменце = неточно;(((x == x)&&(x == x)&&(x == 2)) || ((x == x)&&(x == x)&&(x == x) = 2)) ||||((x == x)&&(x == x)&&(x == 2)) || ((x == x) )) || ((x == x)&&(x == x)&&(x == 2)) || ((x == x)&&(x == x)&&(x == 2) || ((x == x)&&(x == x)&&(x == 2)) || ((x == x)&&(x == x)&&(x == 2)))( (lvl==1) ( picturePo-> Видливо = точно;) (picturePr-> Видливо = точно;)->Овозможено = неточно;->Овозможено = неточно;->Овозможено = неточно;->Овозможено = неточно;-> Овозможено = неточно;->Овозможено = неточно;->Овозможено = неточно;->Овозможено = неточно;->Овозможено = неточно;точно;

)(((x == x)&&(x == x)&&(x == 1)) || ((x == x)&&(x == x)&&(x == 1)) || ((x == x)&&(x == x)&&(x == 1)) || ((x == x)&&(x == x)&&(x == 1)) || (( x == x)&&(x == x)&&(x == 1)) || ((x == x)&&(x == x)&&(x == 1)) || ((x = = x)&&(x == x)&&(x == 1)) || ((x == x)&&(x == x)&&(x == 1)))((lvl==1) ( сликаPx->Видливо = точно;)(picturePobeda-> Видливо = точно;)->Овозможено = неточно;->Овозможено = неточно;->Овозможено = неточно;->Овозможено = неточно;->Овозможено = неточно;-> Овозможено = неточно;->Овозможено = неточно;->Овозможено = неточно;->Овозможено = неточно;точно;

): void _friend())(fr = точно;(int i = 0; i< 9; i++) if (x[i] == 0) {fr = false; break;}(fr) { pictureN->Видливо = точно;)

): void move(int n)(// функција за движење на компјутер= неточно;[n] = 1;= !player;();();(winner()) () ((int i = 0; i< 9; i++) if (x[i] == 0) flag = true;(flag){(lvl == 2) = 2; = 2;= !player;();();();

): System:: Void button1_Click(System::Object^ испраќач, System::EventArgs^ e) (// нова игра>Visible = false;>Visible = false;>Visible = false; >Visible = false; >Visible = false; = comboBox1->Text;(typeGame == "")(::Show("Прво изберете го типот на играта!");

) else ((typeGame == "X наспроти 0") lvl = 1; (typeGame == "1-во ниво со компјутер") lvl = 2; (typeGame == "второ ниво со компјутер") lvl = 3;( ); = точно; (int i = 0; i< 9; i++) x[i] = 0;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage =panelBackgroundImage->BackgroundImage = panelImaggroundI->->BackgroundImage = panelImageground->-> BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->Овозможено = true;->Овозможено = true;->Овозможено = true;->Овозможено = true; = true;->Овозможено = точно;->Овозможено = точно;->Овозможено = точно;->Овозможено = точно;->Овозможено = точно;

): Систем::Неважечки панел1_MouseClick(Систем::Објект^ испраќач, Систем::Windows::Форми::MouseEventArgs^ e) (n = 0;(lvl == 1)((плеер)( = 1;

)= !плеер;();();();

): System:: Void panel2_MouseClick(System::Object^ испраќач, System::Windows::Forms::MouseEventArgs^ e) (n = 1;(lvl == 1)((player)( = 1;

)= !плеер;();();();

) друго ако ((lvl == 2)||(lvl == 3))((n);

): Систем::Неважечки панел3_MouseClick(Систем::Објект^ испраќач, Систем::Windows::Форми::MouseEventArgs^ e) (n = 2;(lvl == 1)((плеер)( = 1;

)= !плеер;();();();

) друго ако ((lvl == 2)||(lvl == 3))((n);

): System::Void panel4_MouseClick(System::Object^ испраќач, System::Windows::Forms::MouseEventArgs^ e) (n = 3;(lvl == 1)((player)( = 1;

)= !плеер;();();();

) друго ако ((lvl == 2)||(lvl == 3))((n);

): System::Void panel5_MouseClick(System::Object^ испраќач, System::Windows::Forms::MouseEventArgs^ e) (n = 4;(lvl == 1)((player)( = 1;

)= !плеер;();();();

) друго ако ((lvl == 2)||(lvl == 3))((n);

): System::Void panel6_MouseClick(System::Object^ испраќач, System::Windows::Forms::MouseEventArgs^ e) (n = 5;(lvl == 1) ((player)( = 1;

)= !плеер;();();();

) друго ако ((lvl == 2)||(lvl == 3))((n);

): System::Void panel7_MouseClick(System::Object^ испраќач, System::Windows::Forms::MouseEventArgs^ e) (n = 6;(lvl == 1) ((плеер)( = 1;

)= !плеер;();();();

) друго ако ((lvl == 2)||(lvl == 3))((n);

): System::Void panel8_MouseClick(System::Object^ испраќач, System::Windows::Forms::MouseEventArgs^ e) (n = 7;(lvl == 1) ((player)( = 1;

)= !плеер;();();();

) друго ако ((lvl == 2)||(lvl == 3))((n);

): System::Void panel9_MouseClick(System::Object^ испраќач, System::Windows::Forms::MouseEventArgs^ e) (n = 8;(lvl == 1) ((player)( = 1;

)= !плеер;();();();

) друго ако ((lvl == 2)||(lvl == 3))((n);

): Систем::Неважечко копче2_Кликни(Систем::Објект^ испраќач, Систем::EventArgs^ e) (();

): Систем::Неважечка сликаPx_Click(System::Object^ испраќач, System::EventArgs^ e) (>Visible = false;

): System::Void picturePo_Click(System::Object^ испраќач, System::EventArgs^ e) (>Visible = false;

): Систем::Неважечка сликаPobeda_Click(Систем::Објект^ испраќач, Систем::EventArgs^ e) (>Видливо = неточно;

): System::Void picturePr_Click(System::Object^ испраќач, System::EventArgs^ e) (>Visible = false;

): Систем::Неважечка сликаN_Click(System::Object^ испраќач, System::EventArgs^ e) (>Visible = false;

Внимание! Ова е воведна верзија на лекцијата, чии материјали може да бидат нецелосни.

Најавете се на страницата како студент

Најавете се како ученик за да пристапите до училишните материјали

Создавање конфигурации 1C: пишување „Tic Tac Toe“ дел 1/3

Ќе учиме низ игра и затоа нашиот прв проект ќе биде да создаваме за секого
игра позната од детството - „Tic Tac Toe“.

Можеби ќе прашате, каква врска имаат игрите со 1C, сметководството и тргувањето? Речиси ниту еден. Но, треба да почнеме постепено и со тек на време ќе стигнеме до автоматизација на магацините. Засега, да почнеме со мали димензии.

Пред да започнеме со програмирање на играта Tic-Tac-Toe, ајде да размислиме за тоа.

Веќе знаеме дека формата има Елементи, од кои еден е Копчето. Копчињата се способни да извршуваат команди и, во исто време, имаат својства што ви дозволуваат да го контролирате нивното прикажување на формуларот (на пример, наслов).

На пример, можете да користите копче за да креирате поле со девет активни области (оние ќелии на кои кликнуваме и снимаме дејство, а истовремено прикажуваме натписи во форма на „O“ и „X“). Копчето е повеќе од погодно за ова.

Што ни треба? Очигледно, ќе треба да се сеќаваме на нашиот потег и да го запаметиме потегот на компјутерот. Ќе треба да ги смениме и насловите на копчињата: кога кликнуваме, насловот на копчето е секогаш „О“, кога компјутерот се движи, тој е „Х“.

Прво, ќе треба да создадеме нова база на податоци во која ќе ја креираме нашата игра. Да го направиме ова.

Чекор # 1: создавање празна база на податоци

Ајде да создадеме празна база на податоци Tic-Tac-Toe.

Детални инструкции

Ајде да започнеме 1C кратенка за отворање листа на инфо-бази достапни на компјутерот. Читате пробна верзија на лекцијата, достапни се целосни лекции. Ни треба создавање нова база, па притиснете го копчето " Додадете":

Ќе се отвори прозорецот за додавање информативна база, во која треба да ја изберете првата ставка " Создавање на информативна базаи кликнете на копчето „Следно“:

Во следниот прозорец, изберете ја втората ставка " Создавање информативна база без конфигурација за развој на нова конфигурација..." и повторно кликнете на копчето "Следно":

Во следниот прозорец од нас се бара да го внесеме името на новата база на податоци, под кое таа ќе биде прикажана во листата на бази на податоци. Ајде да влеземе“ Икс точкаи кликнете на копчето „Следно“:

Во следниот прозорец треба да ја наведете патеката до празната папка во која ќе се чува нашата база на податоци. Во овој случај, ја создадов папката " Икс точкаво папката „1C Databases“ на уредот D:

Во следниот прозорец, оставете ги сите поставки како стандардни и кликнете на " Подготвени":

По кратка пауза, базата на податоци беше креирана и додадена на листата. Постојат два главни начини на работа со базата на податоци: 1C: ПретпријатиеИ Конфигуратор:

Во режимот на конфигуратор ја конфигурираме и програмираме базата на податоци, во режимот 1C: Enterprise гледаме што доаѓа од тоа.

Чекор 2: отворете го конфигураторот

Ајде да го притиснеме копчето " Конфигуратор" за да влезете во режимот на конфигуратор:

Чекор # 3: отворете го конфигурациското дрво

Извршете ја командата од менито " Конфигурација"->"Отворете ја конфигурацијата":

Пред нас се отвори дрво за конфигурација, кое содржи различни конфигурациски делови. Бидејќи сè уште не сме создале ништо, овие делови се празни:

Чекор # 4: додадете обработка

За да ја поставиме логиката на нашата игра, ќе го користиме делот „Обработка“. Ајде да кликнеме десен кликна делот " Третмании изберете ја командата „Додај“:

Пред нас се отвори прозорец за создавање нова обработка. Ајде да го внесеме името“ Икс точка". Синонимот ќе се вметне сам. Ова е доволно за да ја зачуваме нашата обработка (сè уште празна) во базата на податоци. Кликнете на копчето "Затвори":

Чекор бр. 5: прво дебагирање на програмата

Можете да проверите што се случило од корисничкиот режим ( 1C: Претпријатие). За да влезете во него директно од конфигураторот, извршете ја командата од менито " Дебагирање"->"Започнете со дебагирање":

Бидејќи направивме промена во базата на податоци, сме прашани дали се согласуваме да ја прифатиме оваа промена. Ова прашање постојано ќе ни се поставува во текот на процесот на развој. Се согласуваме (копче" Да"):

Базата на податоци започна во режимот „1C: Enterprise“. Читате пробна верзија на лекцијата, достапни се целосни лекции. Но, како што гледаме, работата со него е сè уште тешко - едноставно нема од што да се избере. Чудно е, бидејќи веќе ја создадовме обработката и, теоретски, треба да се појави на жолтиот панел.




Врв