tic-tac-toe oyununun yaradılması. İnkişafın nəzəri əsasları

Salam, əziz dostlar! Bu dərsdə mən javascript-də brauzer oyununu - tic-tac-toe necə edə biləcəyinizi göstərəcəyəm! Bu oyunun nə olduğunu və necə oynanacağını hamınız bilirsiniz, amma sizə bir daha xatırlatmağa icazə verin:

Tic-tac-toe, 3-ə 3 hücrədən (bəlkə də daha böyük) kvadrat sahədə iki oyunçu arasında məntiqi oyundur. Biri “xaçlarla”, ikincisi isə “ayaq barmaqları” ilə oynayır.

P.S. Bütün oxşar javascript dərslərində olduğu kimi, məqalənin sonunda mənbə faylı yükləyə, həmçinin işin nəticəsini demo nümunəsində görə bilərsiniz!

Yaradılan oyunun təsviri

Oyunun xüsusiyyətlərinə baxaq:

  • oyun səhifə yükləndikdən dərhal sonra başlayır;
  • əvvəlcə getmək hüququ təsadüfi olaraq seçilir (ya gəzməyə başlayırsınız, ya da kompüter);
  • mərc edəcəyiniz işarə təsadüfi olaraq seçilir (xaç və ya sıfır);
  • oyunçu qalib gələrsə, qalibiyyət simvolları (xaç və ya sıfır zolağı) yaşıl rənglə vurğulanır;
  • oyunçu kompüterə uduzsa, bar qırmızı rənglə vurğulanır;
  • Sahənin üstündə nəticənin göstərildiyi məlumat xətti var (qələbə və ya məğlubiyyət).

Məntiqlər

3 ilə 3 kvadrat ölçülü bir oyun sahəsi üçün mürəkkəb (universal) alqoritmlər tapmadım, başqa yolla getdim - kobud güc! (bu haqda bir az sonra daha ətraflı). Mən bütün məntiqin dayandığı üç əsas ardıcıl mərhələ müəyyən etdim:

Mərhələ 1: oyunçunun qalib olub olmadığını yoxlamaq?

Bu mərhələdə eyni oyunçu simvolları (xaç və ya sıfır) ilə doldurulmuş 3 xananın (eyni sətirdə) olub olmadığını yoxlayırıq. Bunlar. Hərəkətin nə olmasından asılı olmayaraq (hətta birinci), biz həmişə əvvəlcə oyunçunun qalib olub-olmadığını yoxlayırıq. Qələbə belə görünür:

Mərhələ 2: yoxlayın - kompüter növbəti hərəkətlə qalib gələ bilərmi?

Bu mərhələdə kompüter tərəfindən doldurulmuş 2 hüceyrə və bir boş hüceyrənin olacağı bir xətt axtarırıq - yəni oyunçunun diqqətsizliyi səbəbindən qalib gəlməyə çalışırıq. Məğlubiyyət belə görünür (yəni, kompüter qələbəsi):

Mərhələ 3: Biz sizə qalib gəlməyinizə imkan vermirik!

Burada ikinci mərhələdə olduğu kimi eyni xətti axtarırıq, yalnız 2 xana oyunçunun oyun işarələri ilə doldurulmalıdır, yəni bu mərhələdə boş bir xanaya işarə qoyaraq kompüterin itirməsinə icazə vermirik. Mərhələlərin hər biri müstəqil funksiyanı təmsil edir - bunu aşağıdakı js kodunda görə bilərsiniz.

İcra

Oyun sahəsinin tərtibatı çox sadədir - əsas blok məlumat xəttini (sinif - nəticə) və xanaların HTML düzümü olan hüceyrələr (sinif - blok) olan 9 blokdan ibarətdir:

Sənin növbən!

Köməkçi sinif hücrəsi oyun sahəsində istədiyiniz hüceyrəni dəqiq müəyyən etmək üçün lazımdır. Oyun sahəsi üçün CSS üslubları:

Krestiki_noliki( en: 306px; kənar: 0 avtomatik; ) .krestiki_noliki .block( en: 100px; hündürlük: 100px; haşiyə: 1px bərk #ccc; kursor: göstərici; float: sola; mətni düzən: mərkəzə; şrift ölçüsü: 100px; xətt hündürlüyü: 94px; )

İndi bütün JS koduna baxaq, bundan sonra əsas məqamlar haqqında danışacağam:

$(sənəd).ready(function())( var znak_user = "O"; var znak_comp = "X"; var rand_num = Math.round((Math.random() * (9 - 1) + 1)); if (rand_num > 3)( var znak_comp = "O"; var znak_user = "X"; $(".cell"+rand_num).text(znak_comp); ) var exit_flag = false; var win_user_array = ["123", " 456","789","147","258","369","159","357"]; //Oyunçunun qələbə funksiyasını təyin edin check_3_user(znak)( üçün (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; } }); });

Əvvəlcə dəyişənləri elan edirik: znak_user - bu dəyişəndə ​​istifadəçinin oynayacağı işarəni saxlayırıq (default olaraq orada sıfır saxlanılır - bu, ingiliscə "O" qutusudur). znak_comp - bu dəyişəndə ​​biz kompüterin oynayacağı işarəni saxlayırıq (standart olaraq, orada xaç saxlanılır - bu "X" İngilis qutusudur).

Məntiq belədir: təsadüfi ədəd 3-dən böyükdürsə, o zaman kompüter sıfırlarla oynayır və ilk hərəkəti o (kompüter) edir.

Bu məntiqi özünüzə uyğun dəyişə bilərsiniz, məsələn, kimin birinci olacağına və hansı işarələrə daha çox seçim etmək üçün bir neçə təsadüfi ədəd yarada bilərsiniz. exit_flag - bu bayraq (dəyişən) funksiyadan çıxmaq üçün cavabdehdir, yəni, məsələn, kompüter artıq hərəkətini etdikdə və siz funksiyadan çıxmaq və hərəkəti oyunçuya ötürmək lazımdır. win_user_array - bu massiv xanaları doldurmaq üçün bütün qalib variantları saxlayır. Bunu aydınlaşdırmaq üçün bu şəkilə nəzər salaq:

Massivin hər bir elementi üç rəqəmdən ibarət bir sətirdir, bu, qalib birləşmədir, yəni məsələn, 1, 2 və 3 rəqəmlərinin altındakı xanaları doldursanız, qələbə (və ya məğlubiyyət) baş verəcəkdir. Gördüyünüz kimi, cəmi 8 uduş variantı var, bizim vəzifəmiz bütün bu seçimlərdən keçməkdir. Sonra 3 funksiya gəlir:

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

Bu funksiyaların məqsədi Məntiq bölməsində (yuxarıda) təsvir edilmişdir (üç addımda). Bu funksiyalar sahədəki xanalardan hər hansı birinin üzərinə klikləməklə çağırılır. Funksiyaların hər birinə parametr (znak) ötürülür - bu oyunçunun və ya kompüterin işarəsidir (xaç və ya sıfır), məsələn, oyunçunun qələbəsini təyin edən funksiyaya (check_3_user), biz oyunçu işarəsini ardıcıllıqla keçirik. eyni sətirdə 3 eyni işarəni tapmaq.

Üç funksiyadan sonra (kompüter hələ hərəkət etməyibsə) kompüter boş xanalardan birini doldurur. Burada oyunu çətinləşdirə bilərsiniz, məsələn, mərkəzi hücrə boşdursa (hüceyrə nömrəsi 5), əvvəlcə ona mərc edin; əgər işğal olunubsa, sərbəst künclərdən birinə mərc edin (bunlar bunlardır) xanalar № 1, 3, 7 və 9) və sair - ümumiyyətlə, burada bu sizin ixtiyarınızdadır.

Prinsipcə, belə bir oyunu yaratmaq üçün tələb olunan hər şey budur.

İndi siz demo nümunəsindən istifadə edərək oyunu izləyə və mənbə faylı yükləyə bilərsiniz (cəmi 1 fayl).

06/08/2018 - məktubun müəllifinə diqqətinizə görə təşəkkür edirik: Patvakan Baghdasaryan, kompüterdə bir neçə səhv olduqda bir səhv düzəldildi. mümkün variantlar qələbələri və bütün qazanan hərəkətləri (3 yerinə 4-dən 6-ya qədər) rəngləndi.

Mənim üçün hamısı budur, ümid edirəm bu dərs sizin üçün faydalı oldu, sizə uğurlar arzulayıram, əlvida!

tic-tac-toe ilə məğlub edilə bilməyən bir botu necə yazmaq olar və ya minimax qaydasına giriş

Tamamilə mümkündür ki, yüzlərlə tic-tac-toe oyunundan sonra sizi maraqlandırır: optimal alqoritm nədir? Ancaq buradasınızsa, yəqin ki, bu oyunun tətbiqini də yazmağa çalışdınız. Daha da irəli gedəcəyik və tic-tac-toe ilə məğlub etmək mümkün olmayan bir bot yazacağıq. “Niyə?” Sualınızı gözləyərək cavab verəcəyik: alqoritm sayəsində.

Peşəkar şahmatçı kimi, bu alqoritm rəqibin bir neçə gediş irəlidəki hərəkətlərini hesablayır - oyunun sonuna çatana qədər, istər qələbə, istər məğlubiyyət, istərsə də heç-heçə. Bu son vəziyyətdə bir dəfə AI qalibiyyət üçün müsbət sayda (bizim vəziyyətimizdə +10), məğlubiyyət üçün mənfi (-10) və heç-heçə üçün neytral (0) xal verəcəkdir.

Eyni zamanda, alqoritm oyunçunun hərəkətləri üçün oxşar hesablamalar aparır. Süni intellekt hərəkət edərsə, ən yüksək xal toplayan hərəkəti, oyunçu hərəkət edərsə, ən aşağı balla hərəkəti seçəcəkdir. Bu strategiyadan istifadə edərək, minimaks məğlubiyyətdən qaçır.

Bu oyunu oynamağa çalışın.

Minimaks alqoritmi ən asan rekursiv funksiya kimi təsvir olunur:

  1. son vəziyyət tapıldıqda dəyəri qaytarır (+10, 0, -10),
  2. sahədəki bütün boş hüceyrələrdən keçir,
  3. onların hər biri üçün minimax funksiyasını çağırır (rekursiya),
  4. alınan dəyərləri qiymətləndirir
  5. və ən yaxşısını qaytarır.

Əgər rekursiya ilə tanış deyilsinizsə, Harvard CS50 kursundan bu mühazirəyə baxmalısınız:

Minimax-ın necə işlədiyini başa düşmək üçün onun tətbiqini yazaq və davranışını modelləşdirək. Növbəti iki hissədə bununla məşğul olacağıq.

Minimax tətbiqi

Oyunun sona çatdığı bir vəziyyətə baxacağıq (aşağıdakı şəkilə baxın). Minimax bütün mümkün oyun vəziyyətlərindən keçdiyi üçün (və onlardan yüz minlərlə var), oyunun sonunu nəzərdən keçirməyin mənası var - bu yolla biz daha az sayda rekursiv funksiya çağırışlarını izləməli olacağıq (cəmi 9).

Qoy AI xaçlarla, insan isə sıfırlarla oynasın.

Sahə ilə işləməyi asanlaşdırmaq üçün onu dəyərləri xanaların məzmununa bərabər olan 9 elementdən ibarət massiv kimi elan edək. Gəlin yuxarıdakı şəkildəki kimi xaç və ayaq barmaqları ilə dolduraq və onu origBoard adlandıraq.

Var origBoard = ["O",1,"X","X",4,"X",6,"O","O"];

Sonra aiPlayer və huPlayer dəyişənlərini elan edəcəyik və onlara müvafiq olaraq "X" və "O" dəyərlərini təyin edəcəyik.

Bundan əlavə, bizə qalib kombinasiyaları axtaran və axtarış uğurlu olarsa həqiqi dəyəri qaytaran funksiyaya və mövcud xanaların indekslərini saxlayan funksiyaya ehtiyacımız olacaq.

/* ilkin vəziyyət lövhələr O | | X --------- X | | X --------- | O | O */ var origBoard = [“O”,1 ,”X”,”X”,4 ,”X”, 6 ,”O”,”O”]; // şəxs var huPlayer = “O”; // AI var aiPlayer = “X”; // lövhə funksiyasında boş xanaların indekslərinin siyahısını qaytarır emptyIndices(board)( return board.filter(s => s != "O" && s != "X"); ) // nəzərə alınmaqla qalib kombinasiyalar indekslər funksiyası qalib(board, oyunçu)( if((board == oyunçu && board == oyunçu && board == oyunçu) || (board == oyunçu && board == oyunçu && board == oyunçu) || (board = = oyunçu && lövhə == oyunçu && lövhə == oyunçu) || (board == oyunçu && lövhə == oyunçu && lövhə == oyunçu) || (board == oyunçu && lövhə == oyunçu && lövhə == oyunçu) | | (lövhə == oyunçu && lövhə == oyunçu && lövhə == oyunçu) || (lövhə == oyunçu && lövhə == oyunçu && lövhə == oyunçu) || (lövhə == oyunçu && lövhə == oyunçu && lövhə = = oyunçu)) ( doğru qaytarın; ) başqa ( yalanı qaytarın; ) )

Beləliklə, minimax funksiyasını iki arqumentlə təyin edək: newBoard və player. Sonra sahədə boş xanaların indekslərini tapıb availSpots dəyişəninə ötürəcəyik.

// əsas minimax funksiya funksiyası minimax(newBoard, player)( // mövcud xanalar var availSpots = emptyIndices(newBoard);

Əlavə olaraq, son vəziyyətləri izləməli və müvafiq dəyərləri qaytarmalıyıq. "Sıfır" qalib gələrsə, -10, "xaç" olduqda - +10 qayıtmalısınız. Əgər availSpots massivinin ölçüsü sıfırdırsa, o zaman boş xanalar yoxdur, oyun heç-heçə ilə bitəcək və sıfır qaytarılmalıdır.

// terminal vəziyyətinin yoxlanılması (qazanma/itirmə/heçə-heçə) //və uyğun olaraq dəyərin qaytarılması (winning(newBoard, huPlayer))( return (hesab:-10); ) else if (winning(newBoard, aiPlayer)) ( return (bal:10); ) else if (availSpots.length === 0)( qaytarılması (bal:0); )

Bundan sonra, boş hüceyrələrin hər birindən xal toplamaq lazımdır. Bunun üçün bir sıra hərəkətlər yaradacağıq və hər bir hərəkətin indekslərini və nöqtələrini hərəkət obyektində yerləşdirərək, döngənin bütün boş xanalarını keçəcəyik.

Sonra origBoard-da nömrə kimi saxlanılan boş xananın indeksini daşınan obyektin indeks xassəsinə bərabər qoyduq. Sonra biz cari oyunçu kimi newBoard sahəsinin boş xanasına keçəcəyik və digər oyunçudan minimax funksiyasını və nəticədə newBoard sahəsini çağıracağıq. Bundan sonra siz minimax funksiyası ilə qaytarılan obyektin hesab xassəsini köçürmə obyektinin hesab xassəsinə daxil etməlisiniz.

Minimax bir terminal vəziyyəti tapmazsa, o, terminal vəziyyətə çatana qədər rekursiv olaraq oyunun dərinliyinə getməyə davam edir. Bundan sonra, bu rekursiyanın "səviyyəsi" nin nöqtələrini bir səviyyə yuxarıya köçürür.

Nəhayət, funksiya dəyişiklikləri newBoard-a sıfırlayır və hərəkət obyektini hərəkətlər massivinə yerləşdirir.

// bütün obyektləri saxlamaq üçün massiv var moves = ; // üçün mövcud xanalar arasında döngə (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 sonra hərəkətlər sırasından ən yaxşı hərəkəti seçməlidir. O, süni intellekt hərəkət edirsə, ən yüksək balla, insan hərəkətidirsə, ən aşağı nəticəyə ehtiyac duyur. Beləliklə, əgər oyunçunun dəyəri aiPlayer olarsa, alqoritm bestScore dəyişənini çox kiçik bir rəqəmə inisiallaşdırır və hərəkətlər massivində dövr edir: əgər hərəkət balı bestScore-dan daha çox bala dəyərsə, alqoritm həmin hərəkəti xatırlayır. Bərabər xallı hərəkətlər zamanı alqoritm birincini xatırlayır.

Oyunçu huPlayer-ə bərabər olduqda, hər şey oxşardır - yalnız indi bestScore çox sayda işə salınır və minimax ən az xalla hərəkət axtarır.

Nəticədə, minimax bestMove-da saxlanılan obyekti qaytarır.

// əgər bu süni intellektlə hərəkətdirsə, hərəkətlər arasında dövr edin və ən çox xal toplayan hərəkəti seçin 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( // əks halda hərəkətlər arasında dövr edin və ən az xalla hərəkəti seçin var bestScore = 10000; for(var i = 0; i)< moves.length; i++){ if(moves[i].score < bestScore){ bestScore = moves[i].score; bestMove = i; } } } // вернуть выбранный ход (объект) из массива ходов return moves; }

Növbəti hissədə onun necə işlədiyini başa düşmək üçün proqramımızı simulyasiya edəcəyik.

Minimax fəaliyyətdədir

Aşağıdakı diaqramdan istifadə edərək, alqoritmin addım-addım modelini təhlil edəcəyik.

Qeyd: Diaqramda böyük rəqəmlər funksiya çağırışının seriya nömrəsini, səviyyələr isə alqoritmin nə qədər irəli getdiyini göstərir.

  1. OrigBoard və aiPlayer alqoritmə qidalanır. O, tapılan üç boş xananın siyahısını tərtib edir, vəziyyətin sonluğunu yoxlayır və bütün boş xanalar arasında dövr edir. Alqoritm daha sonra aiPlayer-i ilk boş kvadrata yerləşdirərək newBoard-ı dəyişir. Bundan sonra o, özünü newBoard və huPlayer-dən çağırır və dəyəri qaytarmaq üçün ikinci zəngi gözləyir.
  2. Birinci funksiya çağırışı hələ də işləyərkən, ikincisi işləyir, iki boş xananın siyahısını yaradır, sonlu vəziyyəti yoxlayır və bütün boş xanalar arasında dövr edir. İkinci zəng daha sonra huPlayer-i birinci boş kvadrata yerləşdirməklə newBoard-ı dəyişdirir. Bundan sonra o, özünü newBoard və aiPlayer-dən çağırır və dəyəri qaytarmaq üçün üçüncü zəngi gözləyir.

  3. İkinci zəngdə iki boş xana tapıldığı üçün minimax huPlayer-i ikinci boş xanaya yerləşdirməklə newBoard-ı dəyişdirir. Sonra o, özünü newBoard və aiPlayer-dən çağırır.

  4. Alqoritm boş xanaların siyahısını tərtib edir və vəziyyətin sonluğunu yoxladıqdan sonra oyunçunun qələbəsini qeyd edir. Beləliklə, (-10) hesab sahəsi olan bir obyekti qaytarır.

    İkinci funksiya çağırışında alqoritm üçüncü və dördüncü funksiya çağırışları ilə aşağı səviyyədən qaytarılan dəyərləri alır. huPlayer-in hərəkəti bu iki nəticəni verdiyi üçün alqoritm daha kiçik olanı seçir. Onlar eyni olduğundan, alqoritm birincini seçir və onu birinci funksiya çağırışına ötürür.

    Bu nöqtədə, ilk funksiya çağırışı aiPlayer-in ilk boş xanaya köçməsinin təxminini aldı. Sonra aiPlayer-i ikinci boş kvadrata yerləşdirərək newBoard-ı dəyişdirir. Bundan sonra o, özünü newBoard və huPlayer-dən çağırır.

  5. Beşinci funksiya çağırışında alqoritm boş hüceyrələrin siyahısını tərtib edir və vəziyyətin sonluğunu yoxladıqdan sonra AI-nin qələbəsini qeyd edir. Beləliklə, +10 xal sahəsi olan obyekti qaytarır.

    Bundan sonra ilk zəng aiPlayer-i üçüncü boş xanaya yerləşdirməklə newBoard-ı dəyişdirir. Sonra o, özünü newBoard və huPlayer-dən çağırır.

  6. Altıncı zəng iki boş xananın siyahısını tərtib edir, vəziyyətin sonluğunu yoxlayır və bütün boş xanalar arasında dövr edir. Daha sonra huPlayer-i ilk boş kvadrata yerləşdirərək newBoard-ı dəyişdirir. Sonra o, özünü newBoard və aiPlayer-dən çağırır və dəyəri qaytarmaq üçün yeddinci zəngi gözləyir.
  7. Yeni zəng bir boş xananın siyahısını yaradır, sonlu vəziyyəti yoxlayır və aiPlayer-i boş xanaya yerləşdirmək üçün newBoard-ı dəyişdirir. Bundan sonra o, özünü newBoard və huPlayer-dən çağırır və bu zəngin dəyəri qaytarmasını gözləyir.
  8. Səkkizinci çağırışdır boş siyahı boş hüceyrələr və əza vəziyyətini yoxladıqdan sonra aiPlayer-in qələbəsini qeyd edir. Buna görə də, o, yuxarıdakı səviyyəyə, yeddinci çağırışa (+10) bərabər sayma sahəsi olan obyekti qaytarır.

    Yeddinci zəng aşağı səviyyələrdən yalnız bir müsbət qiymət aldı. Bu dəyər aiPlayer-in növbəsi zamanı əldə edildiyi üçün alqoritm əldə edilən ən böyük dəyəri qaytarır. Beləliklə, yuxarı səviyyəyə, altıncı zəngə müsbət dəyər (+10) qaytarır.

    Altıncı zəngdə iki boş xana tapıldığı üçün minimax huPlayer-i ikinci boş xanaya yerləşdirməklə newBoard-ı dəyişdirir. Sonra o, özünü newBoard və aiPlayer-dən çağırır.

  9. Bundan sonra alqoritm boş hüceyrələrin siyahısını tərtib edir və vəziyyətin sonluğunu yoxladıqdan sonra aiPlayer-in qələbəsini qeyd edir. Buna görə də, yuxarıdakı səviyyəyə (+10) bərabər xal sahəsi olan obyekti qaytarır.

    Bu zaman altıncı çağırış yeddinci çağırışın qaytardığı xal (+10) və doqquzuncu çağırışın qaytardığı xal (-10) arasında seçim etməlidir. huPlayer-in hərəkəti bu iki nəticəni verdiyi üçün alqoritm kiçik olanı seçir və onu xal və indeks sahələri olan obyekt kimi növbəti səviyyəyə qaytarır.

    Nəhayət, ilk zəngin hər üç qolu qiymətləndirilir (-10, +10, -10). aiPlayer-in hərəkəti bu üç nəticəni verdiyi üçün alqoritm ən çox xal (+10) və onun indeksini (4) ehtiva edən obyekti seçir.

Yuxarıdakı ssenaridə minimax buna qərar verir optimal seçim meydanın mərkəzi meydanına gediş olacaq.

Bitsin!

İndiyə qədər siz minimax alqoritminin necə işlədiyini başa düşməlisiniz. Özünüz bir tətbiq yazmağa çalışın və ya GitHub və ya CodePen-də nümunəyə baxın və onu optimallaşdırın.

Oyunlarda AI mövzusu ilə maraqlanırsınızsa, bu mövzuda materiallarımızı oxumağı məsləhət görürük.

ADDIM 1. FORM PARAMETRELERININ KONFIQURASI1. Formanı fərdiləşdirmək üçün onun ölçüsünü təyin edin
Üfüqi olaraq 510 nöqtə və üfüqi olaraq 480 nöqtə
şaquli. Maksimum və minimum
eyni dəyərlərə bərabər olan ölçüsü göstərin.
2. Formaya “Tic Tac Toe” adını verin.
3. Formanın fonu üçün qovluqdakı fayldan istifadə edin
Şəkilləri background.png adı altında yerləşdirin və yerləşdirin
formanın mərkəzində.
4. Başlıq sətirində işarə üçün
qovluqdakı fayldan istifadə edin
menu4.ico adı altında şəkillər.
5. Formanın fon rəngi təyin edilməlidir
Nanə kremi.

ADDIM 2. FORMUNA DÜYME VƏ ETİKET ƏLAVƏ EDİLMƏSİ

1. Yerləşdirilmiş elementlər üçün dəyişdirin
şrift ölçüsü 12 və fon dəsti
şəffaf.

1. İçərisində maddələr olan menyu çubuğu yaradın
şəkildə göstərildiyi kimi.

ADDIM 3. FORMAYA MENYU SABANININ ƏLAVƏ EDİLMƏSİ

1. Fayl menyusunda əmr yaradın
Çıx.
2. Üçün
komandalar
Çıx
təyin edək
proqram kodu ilə eynidir
əvvəlki tətbiq.

ADDIM 3. FORMAYA MENYU SABANININ ƏLAVƏ EDİLMƏSİ

1. Oyun menyusunda komanda yaradın
Yeni oyun.
2. Yeni oyun əmri üçün yazacağıq
proqram kodu gələcəkdə vasitəsilə
bir neçə addım.

ADDIM 3. FORMAYA MENYU SABANININ ƏLAVƏ EDİLMƏSİ

1. Help menyu bəndində əmr yaradın
Proqram haqqında.
2. Proqram haqqında əmri üçün yenisini yaradın
proqram kodunu formalaşdırın və yazın
əvvəlki kimi oxşardır
tətbiq.

1. PictureBox obyektini forma üzərinə sürükləməklə
ölçüsünü 100x100-ə dəyişdirin.
2. Şəffaf fon qurun.
3. PictureBox-u göstərildiyi kimi yerləşdirin
oyun sahəsinin ilk xanasının yuxarısındakı şəkil.

ADDIM 4. FORMAYA PICTUREBOX OBYEKTLƏRİNİN ƏLAVƏ EDİLMƏSİ

1
2
3
4
5
6
7
8
9
1. Qalan hüceyrələrin üstünə yerləşdiririk
PictureBox obyektləri, birincilərin surətləri
göstərilən nömrələnməyə uyğun olaraq obyekt
Şəkillər.

1. Kod yazmadan əvvəl
qovluğunda lazımdır
\Visual Studio
2010\Projects\Tic Tac Toe\X's
sıfırlar\bin\Debug\ yenidən yuvarlanmalıdır
Şəkillər qovluğundan x.png, 0.png, none.png faylları.
2. Birincidə sol siçan ilə iki dəfə klikləyin
PictureBox.

ADDIM 5. PICTUREBOX OBYEKTLƏRİ ÜÇÜN KODU ƏLAVƏ EDİLMƏSİ

1. Bütün elementlər üçün əlçatan olan ikiölçülü massiv yaradın
tam ədədlərdən ibarət 3x3 elementlər şəklində yaradılmışdır. Dərhal
elan edərkən onu sıfırlarla doldururuq. Boş hüceyrələr üçün biz
0, "xaçlar" üçün - 1 və "sıfırlar" üçün -1 istifadə edəcəyik.

ADDIM 5. PICTUREBOX OBYEKTLƏRİ ÜÇÜN KODU ƏLAVƏ EDİLMƏSİ

Prosedurda ilk kliklədiyiniz zaman
PictureBox, operator əlavə edin
seçim
hansı
olacaq
vəziyyəti yoxlayın
massiv hüceyrələri. Əgər dəyər
massiv hüceyrələri 0-a bərabər olacaq
bu o deməkdir ki, nə “sıfır” var, nə də
"çarpaz", sonra bu hüceyrədə
massiv 1 və içərisində yazılır
PictureBox1
göstərilir
"xaç" şəkli və əgər
massiv xanasının qiyməti olacaq
1-ə bərabərdir, onda ehtiva edir
"xaç" və 0 yazılır, və
Boş xana göstərilir.

ADDIM 5. PICTUREBOX OBYEKTLƏRİ ÜÇÜN KODU ƏLAVƏ EDİLMƏSİ

1
2
3
4
5
6
7
8
9



Sahənin qalan xanaları üçün kodu əlavə edin
birincidə olduğu kimi yalnız dəyişir
PictureBox obyekt nömrəsi və xana ünvanı
massiv.
İkinci xana üçün NÜMUNƏ:

Bir düyməni basdığınız zaman prosedurda
əlavə edin
operator
dövrü
kim yoxlayır
birincidən başlayaraq bütün hüceyrələr
boş hüceyrələrin olması. Və əgər
hüceyrə boşdur,
sonra onun içinə
“sıfır” yazılır, yəni
massiv hüceyrəsi -1 yazılır.
Gələcək işlərdə rahatlıq üçün
dəyişənlər
mən,
j
hansı
döngələri təkrarlamaq üçün istifadə olunur
Bütün forma üçün elan edəcəyik.

ADDIM 6. GƏRİŞ DÜYMƏSİ ÜÇÜN KODU ƏLAVƏ EDİLMƏSİ

Sıfırları göstərmək üçün
oyun
sahə
zəruri
bədənə proqram kodu əlavə edin
hüceyrələrin boşluğunu yoxlamaq dövrü.
Yuvalanmış ifadədən istifadə
budaqlanma
olacaq
baş tutsun
üçün massiv hüceyrə ünvanının təhlili
düzgün çıxış sıfır
PictureBox.
Biz həmçinin fasilə ifadəsi əlavə edirik
vaxtından əvvəl bitirmək üçün
boş tapdıqda döngə
hüceyrələr.

ADDIM 6. GƏRİŞ DÜYMƏSİ ÜÇÜN KODU ƏLAVƏ EDİLMƏSİ

Oyun statusunu göstərmək üçün
interfeys elementindən istifadə olunur
Etiket1. Çünki oyunçu həmişə hərəkət edir
birinci
Bu
saat
endirmələr
tətbiqlər
zəruri
V
element
Etiket1
zəruri
əks etdirmək
ifadələr “Sənin
hərəkət et."
üçün
bu
yaradaq
dəyişən
cavab
hansı
Gəlin bu ifadəni təyin edək. A
formanı dəyişən yükləyərkən
elementə təyin edilməlidir
Label1, lazımlı yaratmaq üçün
prosedurlar
zəruri
əvvəlcə iki dəfə vurun
formaya görə

ADDIM 7. YENİ OYUN MEYYUSUNUN ÜÇÜN PROQRAM KODUNU ƏLAVƏ EDİLMƏSİ

Yeni əmrinə basıldığında
oyun sıfırlanacaq
massivin bütün hüceyrələri, hamısını əvəz edir
"xaçlar" və "ayaq barmaqları" üzərində
boş hüceyrələr. Həm də nəticə
"Hərəkətiniz" işarələri

ADDIM 8. OYUN NƏTİCƏLƏRİNİ ÇIXARIN

Hərəkətlərin nəticələrini yoxlamaq üçün
zəruri
təhlil etmək
sətirlərin, sütunların və məzmunu
diaqonallar. Hər üç element varsa
1-ə bərabərdir, onda bu oyunçu üçün bir qələbədir və
üç -1 olarsa, bu məğlubiyyətdir
oyunçu.
Qələbə yoxlaması tələb olunur
davranış
əvvəl
tərəqqi
kompüter,
A
yoxlayın
sonra məğlubiyyət.
Prosedurun son əmri
nəticələr ekranda görünəcək
tərəqqi.

ADDIM 8. OYUN NƏTİCƏLƏRİNİ ÇIXARIN

İstifadəçinin qələbəsini yoxlamaq üçün proqram kodu:
əgər (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Sən qalib gəlirsən";
əgər (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Sən qalib gəlirsən";
əgər (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Sən qalib gəlirsən";
əgər (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Sən qalib gəlirsən";
əgər (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Sən qalib gəlirsən";
əgər (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Sən qalib gəlirsən";
əgər (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Sən qalib gəlirsən";
əgər (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Sən qalib gəlirsən";
İstifadəçinin qələbəsini yoxlamaq üçün proqram kodu:
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Siz itirdiniz";
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Siz itirdiniz";
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Siz itirdiniz";
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Siz itirdiniz";
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Siz itirdiniz";
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Siz itirdiniz";
label1.Text = cavab;

ADDIM 9 OYNAMAQLILIĞIN TƏKMİL EDİLMƏSİ

Oynama qabiliyyətini yaxşılaşdırmaq üçün
serial çıxış əvəzinə
ilk boş olanlara
“sıfırların” hüceyrələrini həyata keçiririk
təsadüfi generator vasitəsilə çıxış
nömrələri.
Bunu etmək üçün əlavə etməlisiniz
bir məntiqi dəyişən
uslovie seçin və Döngə növünü For-dan dəyişdirin
On while, çünki biz bilmirik
təkrarların dəqiq sayı
generator təsadüfi ədədlər sağol
boş hücrəyə düşməyəcək.

RUSİYA TƏHSİL VƏ ELM NAZİRLİYİ

federal dövlət büdcəli ali peşə təhsili müəssisəsi

"Vologda Dövlət Universiteti"

Avtomatlaşdırma və kompüter mühəndisliyi kafedrası

İntizam üzrə kurs layihəsinə izahlı qeyd

Proqramlaşdırma və alqoritmik əsaslar

"X O oyunu"

Tamamlandı EM-21 qrupunun tələbəsi

Butorova L.Yu.

Qəbul edildi Rzheutskaya S. Yu.

GİRİŞ

1. PROBLEMİN TƏHLİLİ VƏ İŞLƏNƏCƏK PROQRAMA TƏLƏBLƏRİN MÜƏYYƏNLƏNMƏSİ

1 Proqramın məqsədi, istifadəçiləri, əsas funksiyaları və işlənib hazırlanması zamanı qarşıya qoyulan məqsədlər

2 Oxşar funksiyaları yerinə yetirən tanınmış proqramların nəzərdən keçirilməsi

3 İnkişafın nəzəri əsasları

4 İnkişaf vasitələrinin seçilməsi

İNKİŞAFIN DİZAYN HİSSƏSİ

1 İstifadəçi interfeysinin inkişafı

2.2 Məlumat strukturlarının inkişafı (xarici və operativ yaddaşda)

2.3 Alqoritmlərin işlənib hazırlanması və təhlili

PROQRAMIN C++ DİLİNDƏ TƏTBİQ EDİLMƏSİ

1 Proqram memarlığı

2 Standart vizual və qeyri-vizual komponentlərin seçilməsi

SINAQ NƏTİCƏLƏRİ

NƏTİCƏ

Biblioqrafiya

Proqramlar

GİRİŞ

Tic-tac-toe 3-ə 3 hücrə və ya daha böyük ("sonsuz sahəyə" qədər) kvadrat sahədə iki rəqib arasında məntiqi oyundur. Oyunçulardan biri "xaçlarla", ikincisi "ayaq barmaqları" ilə oynayır. Bu oyun kompüterlərin meydana çıxmasından çox əvvəl populyarlaşdı, yalnız adi kağız parçası və qələmlə oynanmazdan əvvəl. Ənənəvi Çin oyunu qara və ağ daşlardan istifadə edir.

Bunda kurs işiƏsas qaydalar və oyun sahəsinin standart ölçüsü (3x3 hüceyrə) qorunur. Oyunun rahatlığı üçün ilk hərəkət etmək hüququ istifadəçiyə, yəni "xaçlara" qalır.

Tic Tac Toe istifadəçini əyləndirmək üçün nəzərdə tutulmuş proqramdır, ona görə də onun interfeysi bu kurs işində oyun prosesinin emosional hissəsini yüksəldən müsbət rənglərin kombinasiyası ilə oyun üslubunda hazırlanmışdır.

Oyunun üç növü var: X qarşı 0 - istifadəçiyə qarşı istifadəçi, "kompüterlə 1-ci səviyyə" - dünya oyununun əsaslarını yenicə öyrənənlər üçün və "kompüterlə 2-ci səviyyə" - səviyyəlilər üçün qələbələrinə tam əmindirlər. 1 və 2-ci səviyyələrdə üç mümkün nəticə var: “qazanmaq”, “uduzmaq” və “heç-heçə”. Şaquli, üfüqi və ya diaqonal xətlər tamamilə xaç və ya sıfırlarla doldurularsa, uduşlar müəyyən edilir.

Meydançanın boş xanaları bitibsə, lakin heç kim qalib gəlmirsə, oyun “heçə-heçə” ilə başa çatmış sayılır.

1. PROBLEMİN TƏHLİLİ VƏ İŞLƏNƏCƏK PROQRAMA TƏLƏBLƏRİN MÜƏYYƏNLƏNMƏSİ

proqramın çarpaz interfeysi

1.1 Proqramın məqsədi, istifadəçiləri, əsas funksiyaları və işlənib hazırlanması zamanı qarşıya qoyulan məqsədlər

Bu proqramın məqsədi, ilk növbədə, istifadəçiləri əyləndirmək, insanın gözləmə vaxtını işıqlandırmaqdır, çünki hər hansı bir iş istirahət tələb edir və bu sadə oyun rahatlamağa və gündəlik işlərdən uzaqlaşmağa kömək edəcəkdir. “Tic Tac Toe” həm də məntiqi təfəkkürün inkişafı üçün nəzərdə tutulmuş, diqqəti cəmləşdirməyə və yaddaşı inkişaf etdirməyə imkan verən intellektual və məntiqi oyunlar sinfinə aiddir.

İstifadəçilərin hədəf auditoriyası uşaqlar və yeniyetmələr, həmçinin böyüklərdir. Məhsuldan istifadənin əsas meyarları proqramda yazılmış mətni oxumaq bacarığı və düymələrdən istifadə edərək kompüter üçün lazım olan tapşırığı seçmək bacarığıdır.

Buradan belə nəticəyə gələ bilərik ki, əsas vəzifələr bunlardır: əyləncə vəzifəsi və insanın məntiqi potensialını inkişaf etdirmək vəzifəsi.

1.2 Oxşar funksiyaları yerinə yetirən tanınmış proqramların nəzərdən keçirilməsi

İnternetdə bu oyunu həyata keçirən çoxlu sayda əsər tapa bilərsiniz. Hal-hazırda, bu oyunun bir çox analoqları var ki, onlar orijinal standartlardan uzaqlaşıblar. Belə proqramlara misal olaraq “Tic-tac-toe on an sonsuz sahədə” və “Tic-tac-toe 3D” proqramlarını göstərmək olar. Həmçinin, bir çox oyunlarda "xaçlar" və "ayaq barmaqları" digər simvollarla, məsələn, "daşlar" ilə əvəz olunur.

Mənim kurs layihəm PC proqramıdır. Oyun həm rəqibi süni intellekt (və ya kompüter) olan bir istifadəçi, həm də iki istifadəçi üçün nəzərdə tutulub. Klassik 3x3 sahəsində təqdim olunur.

Məncə, ən maraqlı və qeyri-adi oyun “Tic Tac Toe 3D” idi. Ona görə də müqayisə üçün onu seçdim.

3D tic-tac-toe kağız üzərində və ya adi lövhədə olduğundan daha maraqlıdır. Qazanmaq və uduzmaq üçün daha çox fürsət var və heç-heçə daha az olur. Siz tək başına - kompüterə qarşı - və ya dostunuzla birlikdə oynaya bilərsiniz. Və burada ən qeyri-adi şey odur ki, qalib gəlmək üçün siz öz rənginizdə olan üç topun (qara və ya ağ) birləşməsini yalnız hər hansı bir səviyyədə deyil, həm də divarların müstəvisi boyunca və hətta bütün sahə boyunca diaqonal olaraq edə bilərsiniz ( Şəkil 1.1).

düyü. 1.1

Bənzər mövzuda müxtəlif oyunlar arasında hər bir işdə planın unikal həyata keçirilməsini vurğulaya bilərik. Hər bir layihə digərlərindən öz fərdiliyi ilə fərqlənir.

1.3 İnkişafın nəzəri əsasları

Təhlil

Tərəflərin hər biri üçün hər hansı bir rəqibin oyununda heç-heçəyə zəmanət verən tanınmış alqoritmlər var və rəqibi səhv edərsə, ona qalib gəlməyə imkan verir. Beləliklə, oyun bir vəziyyətdədir "heç kimin ölümü"<#"877528.files/image002.gif">

Şəkil 1.2. Oyun vəziyyətləri ağacı

Oyun vəziyyətlərinin qismən ağacı tic-tac-toe oyunu üçün Şəkil 1.2-də göstərilmişdir. “Tic-tac-toe” oyunu üçün oyun vəziyyətləri ağacı, burada “xaçlar” üçün oyunçu əvvəlcə gedir və yuxarıdakı alqoritmə uyğun hərəkət edir, “ayaq barmaqları” üçün oyunçu isə istədiyi hər şeyi edə bilər (və bir zirvə rasional və irrasional hərəkət üçün verilmiş, yəni hər hansı digər), 50 qovşaqdan ibarətdir.

1.4 İnkişaf vasitələrinin seçilməsi

Məqsədlərimizə çatmaq üçün bizə inteqrasiya olunmuş proqram inkişaf mühiti lazımdır. Buna görə də layihənin inkişafı Microsoft Visual Studio 2008 proqramlaşdırma mühitində həyata keçirilmişdir.

Microsoft Visual Studio Microsoft məhsulları xəttidir inteqrasiya olunmuş inkişaf mühiti də daxil olmaqla proqram təminatı və bir sıra digər alətlər. Bu məhsullar konsol əsaslı olaraq inkişaf etdirməyə imkan verir tətbiqlər və GUI proqramları , o cümlədən Windows Forms texnologiyasına dəstək , həmçinin internet saytları , veb xidmətləri yerli kimi , və nəzarət olunur Windows tərəfindən dəstəklənən bütün platformalar üçün kodlar , Windows Mobile , Windows CE , .NET Framework , Xbox , Windows Phone .NET Compact Framework və Silverlight .

2. İNKİŞAFIN DİZAYN HİSSƏSİ

2.1 İstifadəçi interfeysinin inkişafı

Oyun proqramı yaradarkən, məhsulun uğurunun əsas komponentlərindən birini - interfeysi nəzərə almaq lazımdır. Proqramın istifadəçi interfeysi, ilk növbədə, istifadəçi üçün başa düşülən və cəlbedici olmalıdır. İstifadəçinin diqqətini yayındıracaq və ya ona narahatlıq yaradacaq bütün məqamları aradan qaldırmağa çalışmaq lazımdır. Bütün proqram interfeysi iki komponentə bölünə bilər.

) Proqramın əsas menyusu

düyü. 2.1 - Proqramın əsas menyusu

Əsas menyu istifadəçiyə oyun atmosferinə qoşulmaq üçün nəzərdə tutulmuşdur, ona görə də interfeys rəngarəng, oynaq rənglərlə işlənib. Menyu vasitəsilə siz oyun sahəsinə keçə, oyun qaydalarına baxa və ya oyundan çıxa bilərsiniz.

) Oyun sahəsi

Şəkil 2.2 - Oyun sahəsi

Oyun meydançası oyunçu və kompüterin öz nişanlarını yerləşdirdiyi oyun üçün bilavasitə ərazini ehtiva edir. Oyuna başlamazdan əvvəl istifadəçi "X vs 0", "Kompüterlə 1 səviyyə" və ya "Kompüterlə 2 səviyyə" kimi oyun növünü seçməlidir, əks halda proqram nə etməli olduğu barədə mesaj verəcək. Oyunçuya əsas menyuya qayıtmağa kömək edəcək bir düymə. Sonda iştirakçını matçın nəticələri barədə məlumatlandırmaq üçün əlavə pəncərələr açılacaq.

düyü. 2.3 - əlavə oyun nəticələri pəncərələri

2.2 Məlumat strukturlarının inkişafı (xarici və operativ yaddaşda)

RAM oyun sahəsinin vəziyyətlərini saxlayan 9 elementdən ibarət birölçülü massiv üçün istifadə olunur, burada massivin hər bir xanası oyun sahəsindəki hüceyrəyə uyğundur. Yaddaş həm də statik dəyişənlərə sərf olunur: səviyyə nömrəsi, növbə sırası.

Onun işləməsi üçün 803 KB boş yaddaş tələb olunur.

.3 Alqoritmlərin işlənib hazırlanması və təhlili

Oyunun düşünmə alqoritmini həyata keçirmək üçün statik massiv gcnew massivi təyin etməlisiniz. (9); oyun sahəsinin vəziyyətlərinin saxlanacağı, massivin hər bir xanasının bir hüceyrəyə uyğun olduğu. “0” - boş hücrəyə uyğundur, əgər oyunçu xanaya keçibsə, yəni “X”, “1” dəyəri qeyd olunur və kompüter hərəkət edibsə, yəni “O” dəyəri “2”. Başlanğıcda massivin bütün elementləri “0”-a bərabərdir. Səviyyə məlumatlarını saxlayan lvl statik dəyişənini təyin etmək lazımdır. Bu oyunda cəmi 3 səviyyə var: istifadəçi “X vs O” oyun növünü seçibsə lvl “1” dəyərini, “Kompüterlə 1-ci səviyyə” olarsa “2” dəyərini və “3” dəyərini alır. ” əgər “kompüterlə 2-ci səviyyə” Oyunçu dəyişəni növbə sırasını saxlayır (“doğru” oyunçunun növbəsidir, “yanlış” kompüterin növbəsidir). İlk hərəkət etmək hüququ istifadəçiyə verildiyi üçün oyunun əvvəlində oyunçu = doğrudur. Bayraq statik dəyişəni oyun meydançasında boş xanaların olub-olmaması haqqında məlumatı saxlayır: əgər bayraq = doğrudursa - yəni yanlışdır - boş xanalar yoxdur. Doğrulama alqoritmi x massivinin parametrlərinin iterasiyasını ehtiva etməli və sonrakı oyun üçün optimal olacaq öz həllini irəli sürməlidir. Bu proqram kompüterlə oynamağın 2 səviyyəsinə malikdir. 1-ci səviyyədə kompüterin vəzifəsi rəqibi məğlub etmək deyil. Buna görə də bu funksiya kompüterin gedəcəyi xananın təsadüfi dəyərini qaytarır. Bu alqoritmin kodu [Əlavə 1]-də təqdim olunur. Şəkil 2.4 kodun həyata keçirilməsinin blok diaqramını göstərir.

Oyunun əvvəlində ən çox qazanan hərəkət meydanın mərkəzinə doğru hərəkət etməkdir. dif_level() funksiyasında başlanğıcda şərt yoxlanılır: əgər oyunçu mərkəzi sahəyə getməyibsə, o zaman kompüter ora gedir. Əks halda, əgər oyunçu mərkəzə getmişsə, onda kompüter kombinasiyasını yoxlamaq üçün check(2) funksiyası çağırılır və qalib gəlmək imkanı varsa, xana nömrəsini qaytarır. Əgər kompüter növbəti gedişdə qalib gələ bilmirsə, yoxlama (1) funksiyası çağırılır: oyunçunun kombinasiyasını yoxlamaq. Oyunçunun mərc etdiyi təqdirdə qazanacağı xananın nömrəsi qaytarılır. Əgər belə kombinasiya yoxdursa, o zaman low_level() funksiyası çağırılır.

Şəkil 2.4. - Blok diaqram

Şəkil 2.5. - Blok diaqram

3. PROQRAMIN C++ DİLİNDƏ TƏTBİQ EDİLMƏSİ

.1 Proqram arxitekturası

Bu proqram 3 formanı həyata keçirir: əsas menyu (şək. 2.1.), oyun sahəsi (şək. 2.2) və yardım sahəsi (oyun qaydaları); 9-u əsas olmaqla 12 panel. Həmçinin, oyunun sonunda nəticə ilə bir pictureBox görünür, cəmi 5 var (Şəkil 2.3).

Siz əsas olaraq panel klik işləyicilərindən istifadə edə bilərsiniz, bunlardan oyun sahəsində tam olaraq 9-u var. Hər bir işləyici bir neçə funksiyanı çağırır. Başlanğıcda bir şərt var, əgər istifadəçi "X qarşı 0" oyun növünü seçərsə, xanalar sadəcə olaraq 1 və ya 2 (xaç və ya sıfır) dəyərləri ilə doldurulur. Sonra funksiyalar gəlir: irəliləyiş göstəricisi (CrossZero()), xaçı sıfıra və əksinə dəyişdirir, işğal edilmiş hüceyrələri bloklayır checkingArray(), qalibi tapmaq(). Winner() funksiyası bütün mümkün uduş variantlarını nəzərə alır, ona görə də oyunçulardan biri şaquli, üfüqi və ya diaqonal olaraq 3 ədəd (xaç və ya sıfır) düzülürsə, o, qalib gələcək. Əks halda, meydança doludursa, lakin oyunçulardan heç biri düzülməyibsə, o zaman sahədə boş xanaların qalıb-qalmamasını yoxlayan tie check funksiyası (_friend()) çağırılır. Əgər fr = doğrudursa, o zaman sahədə boş xanalar yoxdur. Əgər dəyər dəyişibsə, bu, sahədə boş bir xana var deməkdir.

İkinci və ya üçüncü oyun növü seçildikdə ikinci şərt işləyir. Sonra kompüterin hərəkətinin edildiyi funksiya deyilir: move(int n). O, oyunçunun klik etdiyi xananın nömrəsini ötürür. Sonra funksiyalar gəlir: irəliləyiş göstəricisi (CrossZero()), işğal edilmiş hüceyrələrin bloklanması checkingArray(). Sonra winner() funksiyası çağırılır ki, bu da oyunçunun bu hərəkətlə qalib olub-olmadığını yoxlayır. Əgər yoxsa, onda sərbəst hüceyrələrin olması yoxlanılır. Əgər boş hüceyrələr varsa, o zaman kompüter hərəkət edir. Sonra, “1” və ya “2” səviyyəli oyunçunun seçilməsindən asılı olaraq, aşağıdakı funksiyalar çağırılır: low_level(), dif_level(). Low_level() funksiyası təsadüfi olaraq sıfırın harada yerləşdiriləcəyini seçir və dif_level() funksiyası kompüterin qalib gəlməsi üçün xüsusi alqoritm təqdim edir. Sonra funksiyalar gəlir: irəliləyiş göstəricisi (CrossZero()), işğal edilmiş hüceyrələrin bloklanması checkingArray(). Sonra winner() funksiyası çağırılır ki, bu da kompüterin bu gedişlə qalib olub-olmadığını yoxlayır. Əgər yoxsa, onda sərbəst hüceyrələrin olması yoxlanılır. Pulsuz hüceyrələr varsa, oyunçu hərəkət edir.

.2 Standart vizual və qeyri-vizual komponentlərin seçilməsi

Bu işi həyata keçirmək üçün aşağıdakı komponentlər seçilmişdir:

1) Form1, ilə verilmiş parametrlər Text=Tic-Tac-Toe, ControlBox=False

2) f2, göstərilən parametrlərlə BackColor, Text=Game

) göstərilən elementlər parametrləri ilə comboBox1:

X vs 0

Kompyuterlə 1-ci səviyyə

Səviyyə 2 kompüter ilə

4) göstərilən BackColor parametrləri və Visible və Enabled parametrləri üçün fərqli dəyərlər olan panel. Bəzi panellər üçün Click kimi hadisələr yazılmışdır.

5) düyməsi, göstərilən parametrlərlə Font, Fore Color, BackColor, Text kimi bütün düymələr üçün Click kimi hadisələr yazılmışdır.

6) BackColor, Font, Fore Color, Text göstərilən parametrləri ilə etiket.

) imageBox, müəyyən parametrlərlə Image, SizeMode= StretchImage.

) textBox, göstərilən parametrlərlə BackColor, Font, Fore Color, Text=” ”.

4. SINAQ NƏTİCƏLƏRİ

3 növ oyundan keçərək proqramı sınaqdan keçirək.

Əsas menyu düymələrinin hərəkətlərini sınayaq. Düymələr düzgün işləyir. Oyun növünü seçmədən oyuna başlamağa çalışaq. Proqram səhv mesajı göstərir və sizdən oyun növünü seçməyi xahiş edir (şək. 4.1).

Şəkil 4.1.

Gəlin 1 oyun növünü seçək - “X qarşı 0”, yəni. istifadəçiyə qarşı istifadəçi. Oyunun bu mərhələsində istifadəçi özü ilə də oynaya bilər. (Şəkil 4.2)

Şəkil 4.2.

“Kompüterlə 1-ci səviyyə” oyunu zamanı kompüter iştirakçını qazanmağı qarşısına məqsəd qoymur. Sadəcə sıfırlar qoyur pulsuz yerlər sahələr. Bu mərhələdə istifadəçi kompüteri asanlıqla məğlub edə bilər. Baxmayaraq ki, bu səviyyədə hadisələrin inkişafı üçün başqa variantlar da mümkündür.

Şəkil 4.3.

Oyun növü: “Kompüterlə 2-ci səviyyə”. Bu mərhələdə oyun bütün gedişləri təhlil edir və ən optimal gedişi seçməyə çalışır. Burada da hər üç ssenari mümkündür, çünki Kompüter ilk hərəkətini istənilən boş hüceyrəyə edir. Çox vaxt oyun heç-heçə ilə nəticələnir.

Şəkil 4.4.

Proqram bütün test variantlarında səhvsiz uğurla işləyir.

NƏTİCƏ

Əminliklə deyə bilərik ki, işin əvvəlində qarşıya qoyulan vəzifə yerinə yetirilib. İnkişaf zamanı məşhur "Tic Tac Toe" oyununun remiksi üçün bir layihə planlaşdırılır və hazırlanmışdır. Oyun müəyyən edilmiş tələblərə cavab verir və öz funksiyalarını yerinə yetirir. Əsərdə həyata keçirilir Müxtəlif növlər oyunlar və çətinlik səviyyəsi.

İş zamanı inteqrasiya olunmuş inkişaf mühitində yeni proqramlaşdırma üsulları mənimsənilib. C++ dili ilə işləmək üzrə köhnə biliklər möhkəmləndirilib. Kurs işinə hazırlıq zamanı bu oyunun həyata keçirilməsi üçün müxtəlif üsullar və alqoritmlər təhlil edilmişdir.

Bu proqramın görünən sadəliyinə baxmayaraq, o, Visual C++-ın bütün əsas texnikalarından istifadə etməklə həyata keçirilən bir sıra çətinliklərlə doludur.

Bu proqramın xüsusiyyətləri bunlardır:

Aydın şəkildə qurulmuş alqoritm;

İntuitiv interfeys;

İstifadəsi asan;

Olduqca aydın istifadəçi təlimatı;

Lazımsız əlavələr yoxdur.

BİBLİOQRAFİYA

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

ƏLAVƏ 1

private: int low_level())(// yüngül rəqib üçün prosedur;::Random^ rand = gcnew System::Random();(= rand->Next(0,8);

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

ƏLAVƏ 2

private: bool check(int n)(k = -1;// bütün kombinasiyaları yoxlayır və düzgün hərəkəti qaytarır(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) doğru qaytarın; əks halda yalanı qaytarın;

ƏLAVƏ 3

şəxsi: int dif_level())(//çətin düşmən

//çek (2);(x == 0) qaytarın (4);(yoxlayın(2)) qaytarın k; başqa (yoxlayın(1)) k qaytarın; başqa aşağı_səviyyə();

TƏTBİQ 4

özəl: void CrossZero())(// xaçı sıfıra dəyişir (proqres göstəricisi)(oyunçu) (->Görünən = doğru;->Görünən = yanlış;

) else (->Görünən = doğru;->Görünən = yanlış;

): void checkingArray())(// xanada nəyinsə olub-olmadığını yoxlamaq funksiyası, əgər varsa, onda siz artıq bu xanaya klikləyə bilməzsiniz.(x == 1) (panel1->BackgroundImage = panel11->BackgroundImage) ;panel1- >Enabled = false;)(x == 2) (panel1->BackgroundImage = panel10->BackgroundImage;panel1->Enabled = false;)(x == 1) (panel2->BackgroundImage = panel11->BackgroundImage ;panel2- >Enabled = false;)(x == 2) (panel2->BackgroundImage = panel10->BackgroundImage;panel2->Enabled = false;)(x == 1) (panel3->BackgroundImage = panel11->BackgroundImage ;panel3- >Enabled = false;)(x == 2) (panel3->BackgroundImage = panel10->BackgroundImage;panel3->Enabled = false;)(x == 1) (panel4->BackgroundImage = panel11->BackgroundImage ;panel4- >Enabled = false;)(x == 2) (panel4->BackgroundImage = panel10->BackgroundImage;panel4->Enabled = false;)(x == 1) (panel5->BackgroundImage = panel11->BackgroundImage ;panel5- >Enabled = false;)(x == 2) (panel5->BackgroundImage = panel10->BackgroundImage;panel5->Enabled = false;)(x == 1) (panel6->BackgroundImage = panel11->BackgroundImage ;panel6- >Enabled = false;)(x == 2) (panel6->BackgroundImage = panel10->BackgroundImage;panel6->Enabled = false;)(x == 1) (panel7->BackgroundImage = panel11->BackgroundImage ;panel7- >Enabled = false;)(x == 2) (panel7->BackgroundImage = panel10->BackgroundImage;panel7->Enabled = false;)(x == 1) (panel8->BackgroundImage = panel11->BackgroundImage ;panel8- >Enabled = false;)(x == 2) (panel8->BackgroundImage = panel10->BackgroundImage;panel8->Enabled = false;)(x == 1) (panel9->BackgroundImage = panel11->BackgroundImage ;panel9- >Enabled = false;)(x == 2) (panel9->BackgroundImage = panel10->BackgroundImage;panel9->Enabled = false;)

): bool winner())(// qalibin yoxlanılması və bütün qalan xanaların bloklanması.

//bool bayrağı = false;(((x == x)&&(x == x)&&(x == 2)) || ((x == x)&&(x == x)&&(x = = 2)) || ((x == x)&&(x == x)&&(x == 2)) || ((x == x)&&(x == x)&&(x == 2) )) || ((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->Görünən = doğru;)(picturePr->Görünən = doğru;)->Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;-> Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;true;

)(((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) ( picturePx->Visible = true;)(picturePobeda->Visible = true;)->Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;-> Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;true;

): void _friend())(fr = true;(int i = 0; i< 9; i++) if (x[i] == 0) {fr = false; break;}(fr) { pictureN->Görünən = doğru;)

): void move(int n)(// kompüterin hərəkət funksiyası= false;[n] = 1;= !player;();();(qalib()) () ((int i = 0; i)< 9; i++) if (x[i] == 0) flag = true;(flag){(lvl == 2) = 2; = 2;= !player;();();();

): System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) (// new game>Visible = false;>Visible = false;>Visible = false; >Visible = false; >Visible = false; = comboBox1->Text;(typeGame == "")(::Show("Əvvəlcə oyun növünüzü seçin!");

) başqa ((typeGame == "X qarşı 0") lvl = 1;(typeGame == "Kompüterlə 1-ci səviyyə") lvl = 2;(typeGame == "Kompüter ilə 2-ci səviyyə") lvl = 3;( ); = doğru;(int i = 0; i< 9; i++) x[i] = 0;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->Background-Image = panel12-BackgroundImage; 2-> BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->Enabled = true;->Enabled = true;-;-Enable = Enabled = true;->Enabled = true;->Enabled = true;->Enabled = true;->Enabled = true;->Enabled = true;

): System::Void panel1_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) (n = 0;(lvl == 1)((player)( = 1;

)= !oyunçu;();();();

): System::Void panel2_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) (n = 1;(lvl == 1)((player)( = 1;

)= !oyunçu;();();();

) else if ((lvl == 2)||(lvl == 3))((n);

): System::Void panel3_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) (n = 2;(lvl == 1)((player)( = 1;

)= !oyunçu;();();();

) else if ((lvl == 2)||(lvl == 3))((n);

): System::Void panel4_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) (n = 3;(lvl == 1)((player)( = 1;

)= !oyunçu;();();();

) else if ((lvl == 2)||(lvl == 3))((n);

): System::Void panel5_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) (n = 4;(lvl == 1)((player)( = 1;

)= !oyunçu;();();();

) else if ((lvl == 2)||(lvl == 3))((n);

): System::Void panel6_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) (n = 5;(lvl == 1) ((player)( = 1;

)= !oyunçu;();();();

) else if ((lvl == 2)||(lvl == 3))((n);

): System::Void panel7_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) (n = 6;(lvl == 1) ((player)( = 1;

)= !oyunçu;();();();

) else if ((lvl == 2)||(lvl == 3))((n);

): System::Void panel8_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) (n = 7;(lvl == 1) ((player)( = 1;

)= !oyunçu;();();();

) else if ((lvl == 2)||(lvl == 3))((n);

): System::Void panel9_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) (n = 8;(lvl == 1) ((player)( = 1;

)= !oyunçu;();();();

) else if ((lvl == 2)||(lvl == 3))((n);

): System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) (();

): System::Void picturePx_Click(System::Object^ sender, System::EventArgs^ e) (>Visible = false;

): System::Void picturePo_Click(System::Object^ sender, System::EventArgs^ e) (>Visible = false;

): System::Void picturePobeda_Click(System::Object^ sender, System::EventArgs^ e) (>Visible = false;

): System::Void picturePr_Click(System::Object^ sender, System::EventArgs^ e) (>Visible = false;

): System::Void pictureN_Click(System::Object^ sender, System::EventArgs^ e) (>Visible = false;

Diqqət! Bu dərsin giriş versiyasıdır, materialları natamam ola bilər.

Sayta tələbə kimi daxil olun

Məktəb materiallarına daxil olmaq üçün tələbə kimi daxil olun

1C konfiqurasiyalarının yaradılması: “Tic Tac Toe” 1/3 hissəsinin yazılması

Oyun vasitəsilə öyrənəcəyik və buna görə də ilk layihəmiz hər kəs üçün yaratmaq olacaq
uşaqlıqdan tanış olan oyun - "Tic Tac Toe".

Soruşa bilərsiniz ki, oyunların 1C, mühasibatlıq və ticarətlə nə əlaqəsi var? Demək olar ki, heç biri. Amma biz tədricən başlamalıyıq və zaman keçdikcə anbarların avtomatlaşdırılmasına çatacağıq. Hələlik kiçikdən başlayaq.

Tic-Tac-Toe oyununu proqramlaşdırmağa başlamazdan əvvəl bu barədə düşünək.

Biz artıq bilirik ki, formada elementlər var, onlardan biri Düymədir. Düymələr əmrləri yerinə yetirməyə qadirdir və eyni zamanda, onların formada göstərilməsini idarə etməyə imkan verən xüsusiyyətlərə malikdir (məsələn, başlıq).

Məsələn, doqquz aktiv sahəsi olan bir sahə yaratmaq üçün bir düymədən istifadə edə bilərsiniz ("O" və "X" şəklində yazıları eyni vaxtda göstərərkən üzərinə kliklədiyimiz və hərəkəti qeyd etdiyimiz xanalar). Düymə bunun üçün daha uyğundur.

Bizə nə lazımdır? Aydındır ki, hərəkətimizi xatırlamalı və kompüterin hərəkətini xatırlamalıyıq. Düymələrin başlıqlarını da dəyişməli olacağıq: kliklədikdə düymənin başlığı həmişə “O”, kompüter hərəkət etdikdə isə “X” olur.

Əvvəlcə oyunumuzu yaradacağımız yeni verilənlər bazası yaratmalıyıq. Gəlin, bunu edək.

Addım №1: boş verilənlər bazası yaratmaq

Boş Tic-Tac-Toe verilənlər bazası yaradaq.

Ətraflı təlimatlar

başlayaq Kompüterdə mövcud olan məlumat bazalarının siyahısını açmaq üçün 1C qısayolu. Siz dərsin sınaq versiyasını oxuyursunuz, tam dərslər mövcuddur. Bizə yaradılış lazımdır yeni baza, buna görə də düyməni basın " əlavə et":

Əlavə pəncərəsi açılacaq məlumat bazası, ilk elementi seçməli olduğunuz " İnformasiya bazasının yaradılması" və "Növbəti" düyməsini basın:

Növbəti pəncərədə ikinci elementi seçin " Yeni konfiqurasiya hazırlamaq üçün konfiqurasiya olmadan məlumat bazasının yaradılması..." və yenidən "Növbəti" düyməsini basın:

Növbəti pəncərədə bizdən yeni verilənlər bazasının adını daxil etməyimiz xahiş olunur, onun altında verilənlər bazaları siyahısında göstəriləcək. girək" X O oyunu" və "Növbəti" düyməsini basın:

Növbəti pəncərədə verilənlər bazamızın saxlanacağı boş qovluğa gedən yolu göstərməlisiniz. Bu halda mən qovluğu yaratdım " X O oyunu" D diskindəki "1C Databases" qovluğunda:

Növbəti pəncərədə bütün parametrləri standart olaraq buraxın və " Hazır":

Qısa fasilədən sonra verilənlər bazası yaradıldı və siyahıya əlavə edildi. Verilənlər bazası ilə işləməyin iki əsas rejimi var: 1C: MüəssisəKonfiqurator:

Konfiqurator rejimində verilənlər bazasını konfiqurasiya edir və proqramlaşdırırıq, 1C: Müəssisə rejimində bunun nə olduğunu görürük.

Addım №2: konfiquratoru açın

düyməni basaq” Konfiqurator" konfiqurator rejiminə daxil olmaq üçün:

Addım №3: konfiqurasiya ağacını açın

Menyu əmrini yerinə yetirin " Konfiqurasiya"->"Açıq konfiqurasiya":

Qarşımızda müxtəlif konfiqurasiya bölmələrini ehtiva edən bir konfiqurasiya ağacı açıldı. Hələ heç nə yaratmadığımız üçün bu bölmələr boşdur:

Addım # 4: emal əlavə edin

Oyunumuzun məntiqini yerləşdirmək üçün biz “Emal” bölməsindən istifadə edəcəyik. Gəlin klikləyək sağ basın bölməsində " Müalicələr" və "Əlavə et" əmrini seçin:

Qarşımızda yeni emal yaratmaq üçün pəncərə açıldı. adını daxil edək" X O oyunu". Sinonim öz-özünə daxil ediləcək. Bu, emalımızı (hələ də boş) verilənlər bazasında saxlamaq üçün kifayətdir. "Bağla" düyməsini basın:

Addım № 5: proqramın ilk sazlanması

İstifadəçi rejimindən nə baş verdiyini yoxlaya bilərsiniz ( 1C: Müəssisə). Birbaşa konfiquratordan daxil olmaq üçün menyu əmrini yerinə yetirin " Sazlama"->"Sazlamağa başlayın":

Verilənlər bazasında dəyişiklik etdiyimiz üçün bizdən bu dəyişikliyi qəbul edib-etməməyimiz soruşulur. İnkişaf prosesində bizə bu sual mütəmadi olaraq veriləcək. Razıyıq (düymə " Bəli"):

Verilənlər bazası "1C: Müəssisə" rejimində başladı. Siz dərsin sınaq versiyasını oxuyursunuz, tam dərslər mövcuddur. Ancaq gördüyümüz kimi, onunla işləmək hələ də çətindir - seçmək üçün sadəcə heç bir şey yoxdur. Qəribədir, çünki biz artıq emal yaratmışıq və nəzəri olaraq o, sarı paneldə görünməlidir.




Üst