Создавање игра на tic-tac-toe. Теоретски основи на развојот

Поздрав драги пријатели! Во овој туторијал, ќе ви покажам како можете да направите игра за прелистувач - 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 код, по што ќе зборувам за главните точки:

$(document).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“ соодветно.

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

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

Значи, ајде да дефинираме минимакс функција со два аргументи: newBoard (нова табла) и играч (плеер). Потоа ги наоѓаме индексите на слободните ќелии на теренот и ги пренесуваме на променливата 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. После тоа, треба да го ставиме својството за бод на објектот вратено од функцијата минимакс во својството score на објектот потег.

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

Конечно, функцијата го ресетира 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, креирајте нова
формирајте и напишете го програмскиот код
слично како и во претходниот
апликација.

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 \ Tic Tac Toe
zeros\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. ДОДАЈТЕ КОД ЗА НОВАТА МЕНИ НА ИГРА

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

ЧЕКОР 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.text = одговор;

ЧЕКОР 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 ниво со компјутер“ - за оние кои штотуку ги учат основите на светската игра и ниво „2 ниво со компјутер“ - за оние кои се апсолутно сигурни во својата победа. На нивоа 1 и 2, можни се три исходи: „победа“, „изгуби“ и „реми“. Победата е фиксирана ако вертикалната, хоризонталната или дијагоналата е целосно исполнета со крстови или ноути.

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

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

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

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

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

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

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

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

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

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

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

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

Ориз. 1.1

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

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

Анализа

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

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

Делумно стебло на ситуации на игра е прикажано на сл. 1.2 за играта tic-tac-toe. Дрвото на играта ситуации за играта tic-tac-toe, каде што играчот за „tic-tac-toe“ оди прв и постапува според горенаведениот алгоритам, а играчот за „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 телефон .NET Compact Framework и Силверлајт .

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

2.1 Дизајнирање на корисничкиот интерфејс

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

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

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

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

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

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

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

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

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

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

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

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

За да го имплементирате алгоритмот за размислување на играта, мора да ја наведете статичката низа gcnew низа (9); во кој ќе се складираат состојбите на полето за играње, каде што секоја ќелија од низата одговара на ќелија. „0“ - одговара на празна ќелија, ако играчот отишол во ќелијата, односно „Х“, се запишува вредноста „1“ и ако компјутерот го направил потегот, односно „О“, вредноста е „2“. Првично, сите елементи на низата се еднакви на "0". Мора да ја поставите статичката променлива lvl, која ги складира податоците за нивото. Во оваа игра има вкупно 3 нивоа: lvl ја зема вредноста „1“ ако корисникот го избрал типот на играта „X vs. O“, вредноста „2“ ако „1 ниво со компјутерот“ и вредноста „ 3“ ако „2 ниво со компјутерот“. Променливиот плеер - го зачувува редоследот на потегот („точно“ - потег на играчот, „неточно“ - потег на компјутерот). Бидејќи правото на првото движење му се дава на корисникот, на почетокот на играта играчот = точно. Статичката променлива на знаменцето складира информации за тоа дали има празни ќелии на полето за играње или не: ако знамето = точно - односно неточно - нема празни ќелии. Алгоритмот за верификација мора да го содржи набројувањето на параметрите на низата 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 на полето за играње. Секој управувач повикува повеќе функции. На почетокот постои услов, доколку корисникот го избере типот на игра „Х против 0“, само ќелиите се пополнуваат со вредностите 1 или 2 (крст или нула). Следуваат функциите: укажување на потегот (CrossZero()), кој го менува крстот на нула и обратно, блокирајќи ги окупираните ќелии со проверка наArray(), наоѓање на победникот победник(). Во функцијата winner() се земаат предвид сите можни опции за победа, па затоа, ако некој од играчите пореди 3 од нивните фигури (крст или нула) по ред вертикално, хоризонтално или дијагонално, тој ќе победи. Во спротивно, ако полето е пополнето, но никој од играчите не се наредил, тогаш се повикува функцијата (_friend()) - проверка за нерешено, со што се проверува дали има слободни ќелии на теренот или не. Ако fr = точно, тогаш нема слободни ќелии на полето. Ако вредноста е променета, тогаш има бесплатна ќелија на полето.

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

private: int low_level()(// постапка за низок противник;::Случаен^ rand = gcnew Систем::Random();(= 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()(// го менува крстот во нула(индикатор за напредок)(плеер) (->Visible = true;->Visible = false;

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

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

): 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 = true;(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 vs 0“) lvl = 1; (typeGame == „Компјутерско ниво 1“) lvl = 2; (typeGame == „Ниво на компјутер 2“) 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“). Копче ни повеќе од погодни за ова.

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

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

Чекор # 1: Создадете празна основа

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пред нас отвори прозорец за создавање нова обработка. Внесете го името " Икс точка„.

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

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

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

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




Врв