Kontakty

Ako napísať robota, ktorého nemožno poraziť piškvorkami, alebo Zoznámenie sa s pravidlom minimax. Minimax v akcii

MINISTERSTVO ŠKOLSTVA A VEDY RUSKA

federálna štátna rozpočtová vzdelávacia inštitúcia vyššieho odborného vzdelávania

"Vologdská štátna univerzita"

Katedra automatizácie a počítačovej techniky

Vysvetlivka k projektu kurzu o disciplíne

Programovanie a základy algoritmizácie

"Piškôrky"

Splnenéštudent skupiny EM-21

Butorová L.Yu.

prijatý Ržeutskaja S. Yu.

ÚVOD

1. ANALÝZA PROBLÉMU A STANOVENIE POŽIADAVIEK NA VYPRACOVANÝ PROGRAM

1 Účel programu, jeho používatelia, hlavné funkcie a ciele, ktoré sa sledujú počas vývoja

2 Prehľad známych programov, ktoré vykonávajú podobné funkcie

3 Teoretické základy rozvoja

4 Voľba nástrojov rozvoj

DIZAJNOVÁ ČASŤ VÝVOJA

1 Návrh používateľského rozhrania

2.2 Vývoj dátových štruktúr (v externej a RAM)

2.3 Vývoj a analýza algoritmov

IMPLEMENTÁCIA PROGRAMU V C++

1 Architektúra programu

2 Výber štandardných vizuálnych a nevizuálnych komponentov

VÝSLEDKY TESTU

ZÁVER

Bibliografia

Aplikácie

ÚVOD

Piškvorky – logická hra medzi dvoma súpermi na štvorcovom poli 3 x 3 bunky alebo väčšom (až po „nekonečné pole“). Jeden z hráčov hrá s "krížmi", druhý - s "niemi". Táto hra sa stala populárnou dávno pred príchodom počítačov, len skôr sa hrala s jednoduchým kusom papiera a perom. Tradičná čínska hra využíva čierne a biele kamene.

V tejto práci na kurze sú zachované základné pravidlá a štandardná veľkosť hracieho poľa (3x3 bunky). Pre pohodlie hry je právo prvého ťahu ponechané používateľovi, to znamená „krížiky“.

Tic-tac-toe je program, ktorý je navrhnutý tak, aby bavil používateľa, takže jeho rozhranie je v tomto kurze vytvorené v hernom štýle s kombináciou pozitívnych farieb, ktoré umocňujú emocionálnu časť hry.

V hre sú tri typy: X verzus 0 – používateľ verzus používateľ, „1 úroveň s počítačom“ – pre tých, ktorí sa len učia základy svetovej hry, a úroveň „2 úroveň s počítačom“ – pre tých, ktorí sú si svojim víťazstvom úplne istí. Na úrovniach 1 a 2 sú možné tri výsledky: „výhra“, „prehra“ a „remíza“. Výhra je pevná, ak je vertikála, horizontála alebo diagonála úplne vyplnená krížikmi alebo zárezmi.

Ak sa voľné bunky poľa skončili, ale nikto nevyhral, ​​hra sa považuje za ukončenú „remízou“.

1. ANALÝZA PROBLÉMU A STANOVENIE POŽIADAVIEK NA VYPRACOVANÝ PROGRAM

programové rozhranie

1.1 Účel programu, jeho používatelia, hlavné funkcie a ciele sledované pri vývoji

Účelom tohto programu je predovšetkým pobaviť používateľov, aby spríjemnili čakanie človeka, pretože každá práca potrebuje odpočinok a táto jednoduchá hra vám pomôže oddýchnuť si a odvrátiť pozornosť od každodenných záležitostí. Tiež „tic-tac-toe“ patrí do triedy intelektuálnych a logických hier, ktoré sú určené na trénovanie logického myslenia, umožňujú vám sústrediť sa a rozvíjať pamäť.

Cieľovou skupinou používateľov sú deti a tínedžeri, ako aj dospelí. Hlavným kritériom používania produktu je schopnosť čítať text napísaný v programe a možnosť výberu potrebnej úlohy pre počítač pomocou tlačidiel.

Z toho môžeme usúdiť, že hlavné úlohy sú: úloha zábavy a úloha rozvoja logického potenciálu človeka.

1.2 Prehľad známych programov, ktoré vykonávajú podobné funkcie

Na internete nájdete veľký počet diela, ktoré implementujú túto hru. V súčasnosti existuje veľa analógov tejto hry, ktoré sa odchyľujú od pôvodných štandardov. Príkladmi takýchto programov sú Tic-Tac-Toe na nekonečnom poli a Tic-Tac-Toe 3D. V mnohých hrách sú tiež „kríže“ a „prsty“ nahradené inými symbolmi, ako sú napríklad „kamene“.

Môj projekt kurzu je PC aplikácia. Hra je určená ako pre jedného používateľa, ktorého protivníkom je umelá inteligencia (alebo počítač), tak aj pre dvoch používateľov. Prezentuje sa na klasickom ihrisku 3x3.

Najzaujímavejšia a najneobvyklejšia bola podľa môjho názoru hra „Tic Tac Toe 3D“. Preto som si ho vybral na porovnanie.

Trojrozmerné piškvorky sú oveľa zaujímavejšie ako na papieri alebo na bežnom poli. Príležitostí na výhru a prehru je tu viac a remízy sú zriedkavejšie. Môžete hrať sami – proti počítaču – alebo spolu s kamarátom. A najneobvyklejšie je, že na výhru môžete vytvoriť kombináciu troch guličiek svojej farby (čiernej alebo bielej) nielen na jednej úrovni, ale aj pozdĺž roviny stien a dokonca aj pozdĺž uhlopriečky celej poľa (obr. 1.1).

Ryža. 1.1

Medzi širokou škálou hier na podobnú tému je možné v každej práci rozlíšiť jedinečnú implementáciu plánu. Každý projekt sa od ostatných odlišuje svojou individualitou.

1.3 Teoretické základy rozvoja

Analýza

Pre každú zo strán sú známe algoritmy, ktoré zaručujú remízu v akejkoľvek hre súpera a ak sa pomýli, umožňujú vyhrať. Hra je teda v stave "nikoho smrť"<#"877528.files/image002.gif">

Obr.1.2. Strom herných situácií

Čiastočný strom herných situácií je znázornený na obr. 1.2 pre hru piškvorky. Strom herných situácií pre hru piškvorky, kde hráč za piškvorky ide prvý a koná podľa vyššie uvedeného algoritmu a hráč za piškvorky si môže robiť, čo chce (navyše jeden vrchol je daný pre racionálny a pre iracionálny čin, teda akýkoľvek iný), pozostáva z 50 uzlov.

1.4 Výber vývojových nástrojov

Na implementáciu našich úloh je potrebné integrované vývojové prostredie aplikácií. Preto bol vývoj projektu realizovaný v programovacom prostredí Microsoft vizuálne štúdio 2008.

Microsoft Visual Studio - produktový rad spoločnosti Microsoft vrátane integrovaného vývojového prostredia softvér a množstvo ďalších nástrojov. Tieto produkty vám umožňujú vyvíjať sa ako konzola aplikácie ako aj GUI aplikácie vrátane podpory technológie Windows Forms ako aj webové stránky , webové služby ako v rodnom a v kontrolovanom kódy pre všetky platformy podporované systémom Windows Windows Mobile , Windows CE , .Internetová sieť , Xbox , Windows telefón .NET Compact Framework a Silverlight .

2. NÁVRHOVÁ ČASŤ VÝVOJA

2.1 Návrh používateľského rozhrania

Pri vytváraní hernej aplikácie je potrebné vziať do úvahy jednu z hlavných zložiek úspechu produktu – to je rozhranie. Používateľské rozhranie programu by malo byť v prvom rade zrozumiteľné a atraktívne pre používateľa. Musíte sa pokúsiť odstrániť všetky momenty, ktoré rozptyľujú používateľa alebo mu spôsobujú nepohodlie. Celé rozhranie programu je možné rozdeliť na dve zložky.

) Hlavné menu programu

Ryža. 2.1 - Hlavné menu programu

Hlavné menu je navrhnuté tak, aby umožnilo používateľovi pripojiť sa k hernej atmosfére, takže rozhranie je vyrobené v pestrých, hravých farbách. Cez menu môžete prejsť na hracie pole, pozrieť si pravidlá hry alebo hru opustiť.

) ihrisko

Obr 2.2 - Ihrisko

Hracie pole obsahuje bezprostredný priestor pre hru, kde hráč a počítač umiestnia svoje ikony. Pred spustením hry musí používateľ vybrať typ hry, ako napríklad „X vs. 0“, „1 úroveň s počítačom“ alebo „2 úroveň s počítačom“, v opačnom prípade program zobrazí správu, ktorá vám povie, čo máte robiť. Tlačidlo, ktoré pomôže prehrávaču vrátiť sa do hlavnej ponuky. Na konci vyskočia ďalšie okná, ktoré informujú účastníka o výsledkoch duelu.

Ryža. 2.3 - dodatočné okienka výsledkov hry

2.2 Vývoj dátových štruktúr (v externej a RAM)

RAM sa používa pre jednorozmerné pole pozostávajúce z 9 prvkov, ktoré ukladajú stavy hracieho poľa, kde každá bunka poľa zodpovedá bunke na hracom poli. Pamäť sa míňa aj na statické premenné: číslo úrovne, poradie ťahu.

Na spustenie vyžaduje 803 KB voľnej pamäte.

.3 Vývoj a analýza algoritmov

Ak chcete implementovať algoritmus herného myslenia, musíte zadať pole statického poľa gcnew (9); v ktorom budú uložené stavy hracieho poľa, kde každá bunka poľa zodpovedá bunke. "0" - zodpovedá prázdnej bunke, ak hráč prešiel na bunku, teda "X", zaznamená sa hodnota "1" a ak počítač vykonal ťah, teda "O", hodnota je "2". Na začiatku sa všetky prvky poľa rovnajú "0". Musíte nastaviť statickú premennú lvl, ktorá ukladá údaje o úrovni. V tejto hre sú celkovo 3 úrovne: lvl má hodnotu „1“, ak si používateľ zvolil typ hry „X vs. O“, hodnotu „2“, ak „1 úroveň s počítačom“ a hodnotu „ 3" ak "2 úrovne s počítačom". Premenná hráč – ukladá poradie ťahu („true“ – ťah hráča, „false“ – ťah počítača). Keďže právo prvého ťahu je udelené užívateľovi, na začiatku hry hráč = true. Statická premenná flag ukladá informácie o tom, či sú na hracom poli prázdne bunky alebo nie: ak príznak = true - teda nepravda - nie sú žiadne prázdne bunky. Verifikačný algoritmus musí obsahovať výpočet parametrov poľa x a navrhnúť vlastné riešenie, ktoré bude optimálne pre ďalšiu hru. Tento program predstavuje 2 úrovne hry s počítačom. V úrovni 1 nie je úlohou počítača poraziť súpera. Takže danú funkciu vráti náhodnú hodnotu bunky, kam sa počítač dostane. [Dodatok 1] poskytuje kód tento algoritmus. Obrázok 2.4 zobrazuje blokovú schému implementácie kódu.

Najviac víťazným ťahom na začiatku hry je ťah do stredu poľa. Vo funkcii dif_level() sa na začiatku kontroluje podmienka: ak hráč nešiel do centrálneho poľa, ide tam počítač. V opačnom prípade, ak hráč prešiel do stredu, potom sa zavolá funkcia check(2), ktorá skontroluje kombináciu počítača a ak je možné vyhrať, vráti číslo bunky. Ak počítač nemôže vyhrať v ďalšom ťahu, potom sa zavolá funkcia check(1): kontrola kombinácie hráča. Vráti sa číslo bunky, stávka, v ktorej hráč vyhrá. Ak takáto kombinácia neexistuje, potom sa zavolá funkcia low_level().

Obr.2.4. - Vývojový diagram

Obr.2.5. - Vývojový diagram

3. IMPLEMENTÁCIA PROGRAMU V C++

.1 Architektúra programu

Tento program implementuje 3 formy: hlavné menu (obr.2.1.), hracie pole (obr.2.2) a pole pomocníka (pravidlá hry); 12 panelov, z toho 9 hlavných. Na konci hry sa tiež objaví obrázkový box s výsledkom, celkovo je ich 5 (obrázok 2.3).

Ako základ si môžete vziať panelové klikače, ktorých je na hracom poli presne 9. Každý handler volá niekoľko funkcií. Na začiatku je podmienka, ak si užívateľ zvolí typ hry "X proti 0", akurát sa bunky naplnia hodnotami 1 alebo 2 (krížik alebo nula). Ďalej nasledujú funkcie: indikácia ťahu (CrossZero()), ktorá zmení krížik na nulu a naopak, blokovanie obsadených buniek checkingArray(), nájdenie víťaza winner(). Vo funkcii winner() sa berú do úvahy všetky možné výherné možnosti, preto ak jeden z hráčov postaví 3 svoje figúrky (krížik alebo nulu) za sebou vertikálne, horizontálne alebo diagonálne, vyhrá. V opačnom prípade, ak je pole zaplnené, ale nikto z hráčov sa nezostavil, potom sa zavolá funkcia (_friend()) - kontrola remízy, ktorá skontroluje, či sú na ihrisku voľné bunky alebo nie. Ak fr = true, potom v poli nie sú žiadne voľné bunky. Ak sa hodnota zmenila, v poli je voľná bunka.

Druhá podmienka funguje, ak je vybratý druhý alebo tretí typ hry. Potom sa zavolá funkcia, v ktorej sa vykoná pohyb počítača move(int n). Dostane číslo bunky, na ktorú hráč klikol. Ďalej nasledujú funkcie: indikácia priebehu (CrossZero()), blokovanie obsadených buniek pomocou checkingArray(). Potom sa zavolá funkcia winner(), ktorá skontroluje, či hráč tento ťah vyhral alebo nie. Ak nie, potom sa skontroluje prítomnosť voľných buniek. Ak sú voľné bunky, počítač sa pohne. Ďalej, v závislosti od úrovne, ktorú hráč "1" alebo "2" zvolil, sa volajú nasledujúce funkcie: low_level(), dif_level(). Funkcia low_level() náhodne vyberie, kam umiestniť nulu, a funkcia dif_level() poskytuje špeciálny algoritmus, aby počítač vyhral. Ďalej nasledujú funkcie: indikácia priebehu (CrossZero()), blokovanie obsadených buniek pomocou checkingArray(). Následne sa zavolá funkcia winner(), ktorá skontroluje, či počítač tento ťah vyhral alebo nie. Ak nie, potom sa skontroluje prítomnosť voľných buniek. Ak sú voľné bunky, hráč sa pohne.

.2 Výber štandardných vizuálnych a nevizuálnych komponentov

Na realizáciu tejto práce boli vybrané tieto komponenty:

1) Formulár 1, s dané parametre Text=Tic Tac Toe, ControlBox=Nepravda

2) f2, s nastavenou farbou pozadia, Text=Hra

) comboBox1 s danými možnosťami položiek:

X oproti 0

1. úroveň s počítačom

2. úroveň s počítačom

4) panel s danými parametrami BackColor a rôznymi hodnotami parametrov Visible a Enabled. Pre niektoré panely boli napísané udalosti ako Click.

5) tlačidlo so špecifikovanými parametrami Font, Fore Color, BackColor, Text, pre všetky tlačidlá boli napísané udalosti ako Click.

6) štítok s danými parametrami BackColor, Font, Fore Color, Text.

) pictureBox, s nastavenými parametrami obrázka, SizeMode= StretchImage.

) textBox, s danými parametrami BackColor, Font, Fore Color, Text=” ”.

4. VÝSLEDKY TESTU

Poďme otestovať program tak, že si prejdeme 3 typy hier.

Skúsme akcie tlačidiel hlavného menu. Tlačidlá fungujú správne. Skúsme spustiť hru bez výberu typu hry. Program zobrazí chybové hlásenie a požiada vás o výber typu hry (obr.4.1)

Obr.4.1.

Vyberme si 1 typ hry – „X proti 0“, t.j. používateľ vs používateľ. V tejto fáze hry môže používateľ hrať aj sám so sebou. (Obr.4.2)

Obr.4.2.

Počas hry „1 úroveň s počítačom“ si počítač nestanovuje cieľ vyhrať účastníka. Na voľné miesta poľa jednoducho dáva nuly. V tejto fáze môže používateľ ľahko poraziť počítač. Hoci na tejto úrovni sú možné aj iné scenáre.

Obr.4.3.

Typ hry "Úroveň 2 s počítačom". V tejto fáze hra analyzuje všetky ťahy a snaží sa vybrať ten najoptimálnejší ťah. Aj tu sú možné všetky tri varianty vývoja udalostí, od r Počítač urobí svoj prvý pohyb do ľubovoľnej voľnej bunky. Väčšinou sa hra končí remízou.

Obr.4.4.

Program beží úspešne na všetkých testovacích variantoch, bez chýb.

ZÁVER

Dá sa povedať, že úloha stanovená na začiatku práce bola dokončená. V priebehu vývoja bol plánovaný a vyvinutý remixový projekt slávnej hry Tic-Tac-Toe. Hra spĺňa zadané požiadavky a plní svoje funkcie. Implementované v práci odlišné typy hry a úrovne obtiažnosti.

V priebehu práce boli osvojené nové metódy programovania v integrovanom vývojovom prostredí. Staré znalosti práce s jazykom C++ sú opravené. V rámci prípravy na prácu v kurze boli analyzované rôzne metódy a algoritmy na implementáciu tejto hry.

Napriek zjavnej jednoduchosti tohto programu je plný mnohých ťažkostí, ktoré sa implementujú pomocou všetkých základných techník Visual C ++.

Funkcie tohto programu sú:

Jasne zostavený algoritmus;

Intuitívne rozhranie;

Jednoduchosť použitia;

Úplne prehľadná používateľská príručka;

Žiadne extra extra.

BIBLIOGRAFIA

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

PRÍLOHA 1

private: int low_level()(// postup pre nízkeho súpera;::Náhodné^ rand = gcnew System::Random();(= rand->Ďalší(0,8);

) pričom (x[r] != 0);r;

DODATOK 2

private: bool check(int n)(k = -1;// skontroluje všetky kombinácie a vráti správny ťah(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) return true; else return false;

DODATOK 3

private: int dif_level()(//ťažký protivník

//návrat kontrola(2);(x == 0) návrat (4);(kontrola(2)) návrat k; else (kontrola(1)) return k; else nízka_úroveň();

DODATOK 4

private: void CrossZero()(// zmení krížik na nulu (ukazovateľ postupu)(hráč) (->Visible = true;->Visible = false;

) else (->Viditeľné = pravda;->Viditeľné = nepravda;

): void checkingArray()(// funkcia na kontrolu, či sa v bunke niečo nachádza, ak áno, potom už na túto bunku nemôžete kliknúť. >Povolené = 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->B ackgroundImage = 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()(// skontrolujte víťaza a zablokujte všetky zostávajúce bunky.

//boolov príznak = nepravda;(((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->Visible = true;)(picturePr->Visible = true;)->Enabled = false;->Enabled = false;->Enabled = false;->Enabled = false;-> Povolené = nepravda;->Povolené = nepravda;->Povolené = nepravda;->Povolené = nepravda;->Povolené = nepravda;

)(((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;- > Povolené = nepravda;->Povolené = nepravda;->Povolené = nepravda;->Povolené = nepravda;

): void _friend()(fr = true;(int i = 0; i< 9; i++) if (x[i] == 0) {fr = false; break;}(fr) { pictureN->viditeľné=pravda ;)

): void move(int n)(// funkcia pohybu počítača= nepravda;[n] = 1;= !hráč;();();(víťaz()) () ((int i = 0; i< 9; i++) if (x[i] == 0) flag = true;(flag){(lvl == 2) = 2; = 2;= !player;();();();

): System::Void button1_Click(System::Object^ odosielateľ, System::EventArgs^ e) (// nová hra>Visible = false;>Visible = false;>Visible = false; >Visible = false; >Visible = false; = comboBox1->Text;(typeGame == "")(::Show("Najprv vyberte typ hry!");

) else ((typeGame == "X vs 0") lvl = 1;(typeGame == "Počítačová úroveň 1") lvl = 2; (typeGame == "Počítačová úroveň 2") lvl = 3;(); = true ;(int i = 0; i< 9; i++) x[i] = 0;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12-> BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->BackgroundImage = panel12->BackgroundImage;->Enabled = true;->Enabled = true;->Enabled = true;->Povolené = true;->Enabled = true;->Enabled = true;->Enabled = true;->Enabled = true;->Enabled = true;

): System::Void panel1_MouseClick(System::Object^ odosielateľ, System::Windows::Forms::MouseEventArgs^ e) (n = 0;(lvl == 1)((hráč)( = 1;

)= !hráč;();();();

): System::Void panel2_MouseClick(System::Object^ odosielateľ, System::Windows::Forms::MouseEventArgs^ e) (n = 1;(lvl == 1)((hráč)( = 1;

)= !hráč;();();();

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

): System::Void panel3_MouseClick(System::Object^ odosielateľ, System::Windows::Forms::MouseEventArgs^ e) (n = 2;(lvl == 1)((hráč)( = 1;

)= !hráč;();();();

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

): System::Void panel4_MouseClick(System::Object^ odosielateľ, System::Windows::Forms::MouseEventArgs^ e) (n = 3;(lvl == 1)((hráč)( = 1;

)= !hráč;();();();

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

): System::Void panel5_MouseClick(System::Object^ odosielateľ, System::Windows::Forms::MouseEventArgs^ e) (n = 4;(lvl == 1)((hráč)( = 1;

)= !hráč;();();();

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

): System::Void panel6_MouseClick(System::Object^ odosielateľ, System::Windows::Forms::MouseEventArgs^ e) (n = 5;(lvl == 1) ((hráč)( = 1;

)= !hráč;();();();

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

): System::Void panel7_MouseClick(System::Object^ odosielateľ, System::Windows::Forms::MouseEventArgs^ e) (n = 6;(lvl == 1) ((hráč)( = 1;

)= !hráč;();();();

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

): System::Void panel8_MouseClick(System::Object^ odosielateľ, System::Windows::Forms::MouseEventArgs^ e) (n = 7;(lvl == 1) ((hráč)( = 1;

)= !hráč;();();();

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

): System::Void panel9_MouseClick(System::Object^ odosielateľ, System::Windows::Forms::MouseEventArgs^ e) (n = 8;(lvl == 1) ((hráč)( = 1;

)= !hráč;();();();

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

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

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

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

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

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

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

Pozor! Tu je skúšobná verzia lekcie, ktorej materiály nemusia byť úplné.

Prihláste sa ako študent

Ak chcete získať prístup k obsahu školy, prihláste sa ako študent

Vytváranie konfigurácií 1C: písanie „Tic-tac-toe“ časť 1/3

Budeme sa učiť pri hraní, a preto náš prvý projekt bude tvorenie
známa z detstva hry - "Tic-tac-toe".

Pýtate sa, čo majú hry spoločné s 1C, účtovníctvom a obchodom? Takmer žiadne. Treba ale začať postupne a časom dospejeme k automatizácii skladov. Zatiaľ začnime v malom.

Než začneme programovať hru Tic-Tac-Toe, zamyslime sa.

Už vieme, že formulár má Prvky, z ktorých jeden je Tlačidlo. Tlačidlá sú schopné vykonávať príkazy a zároveň majú vlastnosti, ktoré umožňujú ovládať ich zobrazenie vo formulári (napríklad nadpis).

Môžete napríklad použiť tlačidlo na vytvorenie poľa s deviatimi aktívnymi bodmi (tie bunky, na ktoré klikneme a opravíme akciu, pričom sa zobrazia nápisy v tvare „O“ a „X“). Gombík sa nám na to viac než hodí.

Čo budeme potrebovať? Je zrejmé, že si budeme musieť zapamätať svoj pohyb a zapamätať si pohyb počítača. Musíme tiež zmeniť názvy tlačidiel: keď klikneme, názov tlačidla je vždy "O", keď sa počítač pohybuje - "X".

A najprv musíme vytvoriť novú databázu, v ktorej vytvoríme našu hru. Poďme na to.

Krok #1: Vytvorte prázdnu základňu

Vytvorme prázdnu databázu Tic-Tac-Toe.

Podrobné pokyny

Poďme bežať 1C skratka na otvorenie zoznamu infobáz dostupných v počítači. Čítate skúšobnú verziu lekcie, nájdete úplné lekcie. Potrebujeme vytvoriť novú databázu, takže kliknite na tlačidlo " Pridať":

Otvorí sa okno Pridať informačnú základňu, v ktorom chcete vybrať prvú položku " Vytvorenie informačnej základne a kliknite na tlačidlo "Ďalej":

V ďalšom okne vyberte druhú položku " Vytvára sa informačná báza bez konfigurácie na vývoj novej konfigurácie... a znova kliknite na tlačidlo „Ďalej“:

V ďalšom okne sme vyzvaní na zadanie názvu novej základne, pod ktorým sa bude zobrazovať v zozname základní. Poďme vstúpiť" Piškôrky a kliknite na tlačidlo "Ďalej":

V ďalšom okne musíte zadať cestu k Prázdny priečinok v ktorej bude naša databáza uložená. V tomto prípade som vytvoril priečinok " Piškôrky" v priečinku "Základy 1C" na disku D:

V ďalšom okne ponechajte všetky predvolené nastavenia a kliknite na tlačidlo " Pripravený":

Po krátkej prestávke sa databáza vytvorí a pridá do zoznamu. Existujú dva hlavné režimy práce s databázou: 1C: Podnik a Konfigurátor:

V režime konfigurátora konfigurujeme a programujeme základňu, v režime 1C:Enterprise sa pozrieme na to, čo z toho vzniklo.

Krok 2: otvorte konfigurátor

Stlačíme tlačidlo " Konfigurátor" pre vstup do režimu konfigurátora:

Krok #3: otvorte konfiguračný strom

Vykonajte príkaz ponuky " Konfigurácia"->"Otvorte konfiguráciu":

Pred nami sa otvoril konfiguračný strom, ktorý obsahuje rôzne sekcie konfigurácie. Keďže sme ešte nič nevytvorili, tieto sekcie sú zatiaľ prázdne:

Krok 4: Pridajte spracovanie

Na umiestnenie logiky našej hry použijeme sekciu „Spracovanie“. Stlačíme kliknite pravým tlačidlom myši v sekcii" Spracovanie a vyberte príkaz "Pridať":

Pred nami sa otvorilo okno na vytvorenie nového spracovania. Zadajte meno " Piškôrky". Synonymum bude nahradené samo. To stačí na uloženie nášho spracovania (zatiaľ prázdne) do databázy. Stlačte tlačidlo "Zavrieť":

Krok #5: Prvé ladenie programu

Čo sa stalo, môžete skontrolovať z používateľského režimu ( 1C: Podnik). Aby ste sa k nemu dostali priamo z konfigurátora, vykonajte príkaz ponuky " Ladenie"->"Spustite ladenie":

Keďže sme vykonali zmenu v databáze, pýtame sa, či súhlasíme s prijatím tejto zmeny. Táto otázka nám bude neustále kladená v procese vývoja. Odpovedáme so súhlasom (tlačidlo " Áno"):

Databáza bola spustená v režime 1C:Enterprise. Čítate skúšobnú verziu lekcie, nájdete úplné lekcie. No ako vidíme, aj tak sa s ňou ťažko pracuje – jednoducho nie je z čoho vyberať. Je to zvláštne, pretože spracovanie už máme vytvorené a teoreticky by sa malo objaviť na žltom paneli.

Zdravím vás milí priatelia! V tomto návode vám ukážem, ako môžete vytvoriť hru v prehliadači – piškvorky, v javascripte! Všetci viete, čo je táto hra a ako ju hrať, ale dovoľte mi, aby som vám znova pripomenul:

Tic-tac-toe je logická hra medzi dvoma hráčmi na štvorcovom poli 3 x 3 (prípadne väčšom). Jeden sa hrá s „krížmi“ a druhý s „prstmi na nohách“.

P.S. ako vo všetkých podobných javascriptových tutoriáloch, na konci článku si môžete stiahnuť pôvodný súbor, a tiež si pozrite výsledok práce na ukážkovom príklade!

Popis vytváranej hry

Poďme sa pozrieť na vlastnosti hry:

  • hra sa spustí ihneď po načítaní stránky;
  • právo na prvý pohyb je vybrané náhodne (buď začnete chodiť, alebo počítač);
  • znak, ktorý vložíte, je vybraný náhodne (kríž alebo nula);
  • ak hráč vyhrá, potom sa zvýraznia výherné symboly (prúžok krížikov alebo núl). v zelenej farbe;
  • ak hráč prehrá s počítačom, pruh je zvýraznený červenou farbou;
  • nad poľom je riadok s informáciami, kde je zobrazený výsledok (víťazstvo alebo porážka).

Logika

Neprišiel som na zložité (univerzálne) algoritmy pre hracie pole 3 x 3 bunky, šiel som inou cestou - hrubou silou! (viac o tom neskôr). Identifikoval som tri hlavné postupné fázy, na ktorých spočíva celá logika:

Fáza 1: kontrola – vyhral hráč?

V tejto fáze skontrolujeme, či sú 3 bunky (na rovnakom riadku) vyplnené rovnakými symbolmi hráčov (krížiky alebo nuly). Tie. nech už ide o akýkoľvek ťah (aj prvý), vždy najskôr skontrolujeme, či hráč vyhral. Takto vyzerá víťazstvo:

Fáza 2: kontrola – môže počítač vyhrať pri ďalšom ťahu?

V tejto fáze hľadáme líniu, kde by boli 2 bunky zaplnené počítačom a jedna prázdna bunka – teda snažíme sa vyhrať kvôli nepozornosti hráča. Takto vyzerá porážka (t. j. počítačové víťazstvo):

Fáza 3: nenechajte nás vyhrať!

Tu hľadáme rovnaký riadok ako v druhej fáze, iba 2 bunky musia byť vyplnené znakmi hry hráča, to znamená, že v tejto fáze nenecháme počítač prehrať umiestnením znaku do prázdnej bunky. Každá z fáz je nezávislou funkciou - môžete to vidieť v kóde js nižšie.

Implementácia

Rozloženie hracieho poľa je veľmi jednoduché - hlavný blok obsahuje rad informácií (trieda - výsledok) a 9 blokov, ktoré sú bunkami (trieda - blok) HTML značky bunky:

Si na rade!

Pomocná trieda buniek je potrebná na presnú identifikáciu požadovanej bunky na hracom poli. CSS štýly pre ihrisko:

Krestiki_noliki( šírka: 306px; okraj: 0 auto; ) .krestiki_noliki .block( šírka: 100px; výška: 100px; orámovanie: 1px plné #ccc; kurzor: ukazovateľ; plávajúci: doľava; zarovnanie textu: na stred; veľkosť písma: 100px; výška riadku: 94px; )

Teraz sa pozrime na celý kód JS, po ktorom budem hovoriť o hlavných bodoch:

$(document).ready(function()( var znak_user = "O"; var znak_comp = "X"; var rand_num = Math.round((Math.random() * (9 - 1) + 1)); ak (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"]; //Určenie funkcie víťazstva hráča check_3_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($("."+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; } }); });

Najprv deklarujeme premenné: znak_user - do tejto premennej uložíme znamenie, že užívateľ bude hrať (štandardne je tam uložená nula - to je anglická búdka "O"). znak_comp - do tejto premennej ukladáme znamenie, že počítač bude hrať (štandardne je tam uložený krížik - to je anglická búdka "x").

Logika je takáto: ak je náhodné číslo väčšie ako 3, počítač hrá s nulami a on (počítač) urobí prvý ťah.

Túto logiku si môžete zmeniť podľa seba, napríklad môžete vytvoriť nejaké náhodné čísla, aby ste získali viac možností, kto bude aspoň prvý a aké postavy. exit_flag - tento príznak (premenná) je zodpovedný za ukončenie funkcie, to znamená napríklad vtedy, keď počítač už vykonal svoj ťah a vy musíte funkciu ukončiť a preniesť ťah do prehrávača. win_user_array - toto pole ukladá všetky výherné možnosti na vyplnenie buniek. Aby to bolo jasné, pozrime sa na tento obrázok:

Každý prvok poľa je reťazec troch číslic, čo je výherná kombinácia, to znamená, že ak napríklad vyplníte bunky pod číslami 1, 2 a 3, príde víťazstvo (alebo porážka). Ako vidíte, výherných možností je celkovo 8, našou úlohou je všetky tieto možnosti pretriediť. Nasledujú 3 funkcie:

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

Účel týchto funkcií je popísaný (v troch krokoch) v časti Logika (vyššie). Tieto funkcie sa volajú kliknutím na ktorúkoľvek z buniek poľa. Parameter (znak) sa odovzdá každej z funkcií - je to znak hráča alebo počítača (kríž alebo nula), napríklad vo funkcii, ktorá určuje víťazstvo hráča (check_3_user), odovzdávame znak hráča, aby našiel 3 rovnaké znaky na rovnakom riadku.

Po troch funkciách (ak počítač ešte neurobil ťah) počítač zaplní jednu z voľných buniek. Tu si môžete hru skomplikovať napríklad tak, že ak je centrálna bunka voľná (bunka číslo 5), tak najskôr vsaďte do nej, ak je obsadená, tak vsaďte do jedného z voľných rohov (to sú bunky č. 1, 3, 7 a 9) a tak ďalej - vo všeobecnosti je to na vás.

To je v zásade všetko, čo je potrebné na vytvorenie takejto hry.

Teraz si môžete hru pozrieť na ukážke a stiahnuť si zdrojový súbor (iba 1 súbor).

06.08.2018 - ďakujem za pozornosť autorovi listu: Patvakan Baghdasaryan, chyba bola opravená, keď mal počítač niekoľko možnosti víťazstvá a všetky jeho víťazné ťahy boli premaľované (od 4 do 6 buniek namiesto 3).

To je z mojej strany všetko, dúfam, že tento návod bol pre vás užitočný, prajem vám veľa šťastia, čau!

KROK 1. NASTAVENIE PARAMETROV FORMULÁRA1. Ak chcete formulár prispôsobiť, nastavte jeho veľkosť
510 horizontálnych bodov a 480 vertikálnych bodov
vertikálne. Maximum a minimum
zadajte veľkosť rovnú rovnakým hodnotám.
2. Pomenujte tvar slovom „Tic Tac Toe“.
3. Ako pozadie formulára použite súbor z priečinka
Obrázky pod názvom background.png a umiestnite ho
v strede formulára.
4. Pre ikonu v záhlaví
použite použiť súbor z priečinka
Obrázky s názvom menu4.ico.
5. Je potrebné nastaviť farbu pozadia formulára
Mätový krém.

KROK 2. PRIDAJTE DO FORMULÁRA TLAČIDLO A TRIEDU

1. Pre umiestnené prvky zmeňte
veľkosť písma na 12 a nastavenie pozadia
transparentný.

1. Vytvorte panel s ponukami s položkami
ako je uvedené na obrázku.

KROK 3. PRIDANIE LIŠTY MENU DO FORMULÁRA

1. V položke ponuky Súbor vytvorte príkaz
Východ.
2. Pre
tímov
Východ
predpisovať
kód programu je rovnaký ako v
predchádzajúca aplikácia.

KROK 3. PRIDANIE LIŠTY MENU DO FORMULÁRA

1. V položke ponuky Hra vytvorte tím
Nová hra.
2. Za tím Nová hra napíšte
programový kód v budúcnosti prostredníctvom
pár krokov.

KROK 3. PRIDANIE LIŠTY MENU DO FORMULÁRA

1. V položke ponuky Help vytvorte príkaz
O programe.
2. Pre príkaz About vytvorte nový
formulár a napíšte programový kód
podobne ako v predchádzajúcom
aplikácie.

1. Potiahnutím ovládacieho prvku PictureBox do formulára
zmeniť jeho veľkosť na 100 x 100.
2. Nastavte priehľadné pozadie.
3. Usporiadajte PictureBox podľa obrázka
obrázok nad prvou bunkou hracieho poľa.

KROK 4. PRIDAJTE DO FORMULÁRA PREDMETY PICTUREBOX

1
2
3
4
5
6
7
8
9
1. Nad zvyšok buniek umiestnime
Objekty PictureBox, kópie prvého
objekt, podľa číslovania uvedeného na
Snímky.

1. Pred napísaním kódu
potrebné v priečinku
\Vizuálne štúdio
2010\Projekty\Tic Tac Toe \ Tic Tac Toe
zeros\bin\Debug\ je potrebné presmerovať
x.png, 0.png, none.png z priečinka Obrázky.
2. Dvakrát kliknite ľavým tlačidlom myši na prvú
PictureBox.

KROK 5. PRIDAJTE KÓD PRE OBJEKTY PICTUREBOX

1. Vytvorte dvojrozmerné pole prístupné všetkým prvkom v
vytvorený vo forme prvku 3x3 pozostávajúceho z celých čísel. Hneď
pri deklarovaní doplníme nulami. Pre prázdne bunky my
použijeme 0, pre "krížiky" - 1 a pre "nuly" - -1.

KROK 5. PRIDAJTE KÓD PRE OBJEKTY PICTUREBOX

V postupe pri kliknutí na prvé
PictureBox s pridaním operátora
výber
ktorý
bude
vykonať kontrolu stavu
bunky poľa. Ak je hodnota
bunka poľa bude 0, čo
Znamená to, že v ňom nie je žiadna „nula“.
"kríž", potom v tejto bunke
pole je zapísané 1 a in
PictureBox1
zobrazené
obraz „kríža“ a ak
Hodnota bunky poľa bude
rovná sa 1, potom obsahuje
"kríž" a do neho sa zapíše 0 a
zobrazí sa prázdna bunka.

KROK 5. PRIDAJTE KÓD PRE OBJEKTY PICTUREBOX

1
2
3
4
5
6
7
8
9



Pre zostávajúce bunky poľa pridajte kód
rovnakým spôsobom ako v prvom, len sa mení
Číslo objektu PictureBox a adresa bunky
pole.
PRÍKLAD pre druhú bunku:

Postup kliknutím na tlačidlo
pridať
operátor
cyklu
kto kontroluje
všetky bunky od prvej do
prítomnosť prázdnych buniek. A keď
bunka je prázdna
potom do toho
sa píše „nula“, a to v
bunka poľa sa zapíše -1.
Pre pohodlie pri budúcej práci
premenné
ja
j
ktorý
používa sa na iteráciu slučiek
vyhlásiť za celý formulár.

KROK 6. PRIDAJTE KÓD PROGRAMU PRE TLAČIDLO PRECHÁDZKA

Na zobrazenie núl
hranie
lúka
nevyhnutné
pridajte programový kód do tela
cyklus kontroly prázdnoty buniek.
S vnoreným operátorom
vetvenia
bude
konať
analýza adresy bunky poľa pre
nulový výstup v správnom
PictureBox.
Pridávame aj príkaz break
za predčasné ukončenie
slučka, keď je prázdna
bunky.

KROK 6. PRIDAJTE KÓD PROGRAMU PRE TLAČIDLO PRECHÁDZKA

Na označenie stavu hry
používa sa prvok rozhrania
Označenie1. Keďže hráč sa vždy pohybuje
najprv
potom
pri
K stiahnutiu
aplikácie
nevyhnutné
v
element
Označenie1
nevyhnutné
odrážať
frázy „vaše
pohybovať sa."
Pre
toto
vytvoriť
premenlivý
odpoveď
ktorý
Vezmime si túto frázu. A
pri načítavaní premennej formulára
musí byť priradené k prvku
Label1, vytvoriť potrebné
postupy
nevyhnutné
najprv dvakrát kliknite
informovať

KROK 7. PRIDAJTE KÓD PRE NOVÚ POLOŽKU HRY

Keď kliknete na príkaz nový
hra sa resetuje
všetky bunky v poli, čím sa nahradia všetky
„krížiky“ a „nulky“.
prázdne bunky. Tiež výstup
nápis "Váš krok"

KROK 8. ZOBRAZTE VÝSLEDKY HRY

Na kontrolu výsledkov ťahov
nevyhnutné
analyzovať
obsah riadkov, stĺpcov a
uhlopriečky. Ak všetky tri prvky
sú rovné 1, potom je to pre hráča víťazstvo a
ak tri -1, potom je to prehra
hráč.
Vyžaduje sa kontrola víťazstva
správanie
vpredu
pohybovať sa
počítač,
a
overenie
porážka po.
Posledný príkaz postupu
zobrazí výsledky
pohybovať sa.

KROK 8. ZOBRAZTE VÝSLEDKY HRY

Programový kód na kontrolu výhry používateľa:
if (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Vyhrali ste";
if (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Vyhrali ste";
if (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Vyhrali ste";
if (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Vyhrali ste";
if (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Vyhrali ste";
if (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Vyhrali ste";
if (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Vyhrali ste";
if (znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1 && znacheniyeYacheyki == 1) otvet = "Vyhrali ste";
Programový kód na kontrolu výhry používateľa:
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Prehrali ste";
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Prehrali ste";
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Prehrali ste";
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Prehrali ste";
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Prehrali ste";
if (znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1 & znacheniyeYacheyki == -1) otvet = "Prehrali ste";
label1.text = odpoveď;

KROK 9 ZLEPŠENIE „HRATELNOSTI“

Na zlepšenie hrateľnosti
namiesto sériového výstupu
v prvom prázdnom
bunky "núl", implementujeme
výstup cez náhodný generátor
čísla.
K tomu je potrebné pridať
jedna boolovská premenná
uslovie a zmeňte typ slučky z For
na Kým, pretože nevieme
presný počet opakovaní
generátor náhodných čísel
nespadne do prázdnej cely.

Ako napísať robota, ktorého nemožno poraziť piškvorkami, alebo Úvod do pravidla minimax

Je možné, že po stovkách hier tic-tac-toe ste sa pýtali: aký je optimálny algoritmus? Ale ak ste tu, pravdepodobne ste sa tiež pokúsili napísať implementáciu tejto hry. Pôjdeme ďalej a napíšeme robota, ktorého nebude možné poraziť v piškvorkách. Po očakávaní vašej otázky „prečo?“ odpovieme: vďaka algoritmu.

Podobne ako profesionálny šachista, aj tento algoritmus počíta akcie súpera na niekoľko ťahov dopredu – až do konca partie, či už ide o víťazstvo, prehru alebo remízu. V tomto konečnom stave si AI dá kladné skóre (v našom prípade +10) za víťazstvo, záporné skóre (-10) za prehru a neutrálne skóre (0) za remízu.

Algoritmus zároveň vykonáva podobné výpočty pre hráčove ťahy. Vyberie ťah s najvyšším skóre, ak sa AI pohne, a ťah s najnižším skóre, ak sa hráč pohne. Pomocou tejto stratégie sa minimax vyhne porážke.

Skúste si zahrať túto hru.

Algoritmus minimax je najjednoduchšie opísaný ako rekurzívna funkcia, ktorá:

  1. vráti hodnotu, ak sa nájde koncový stav (+10, 0, -10),
  2. prechádza cez všetky prázdne bunky v poli,
  3. volá funkciu minimax pre každú z nich (rekurzia),
  4. vyhodnocuje prijaté hodnoty
  5. a vráti tú najlepšiu.

Ak nie ste oboznámení s rekurziou, mali by ste si pozrieť túto prednášku z kurzu Harvard CS50:

Aby sme pochopili, ako minimax funguje, napíšme si jeho implementáciu a modelujte jeho správanie. Budeme sa tomu venovať v nasledujúcich dvoch častiach.

Implementácia Minimax

Zvážime situáciu, keď sa hra skončí (pozri obrázok nižšie). Keďže minimax prechádza všetkými možnými hernými stavmi (a sú ich státisíce), má zmysel uvažovať o konci – takto musíme sledovať menej rekurzívnych volaní funkcií (celkovo 9).

Nechajte AI hrať sa s krížikmi, muž - s nulami.

Pre zjednodušenie práce s poľom ho deklarujme ako pole 9 prvkov s hodnotami rovnými obsahu buniek. Vyplňte ju krížikmi a nulami, ako na obrázku vyššie, a nazvime to origBoard .

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

Potom deklarujeme premenné aiPlayer a huPlayer a priradíme im hodnoty „X“ a „O“.

Okrem toho potrebujeme funkciu, ktorá hľadá výherné kombinácie a vráti true, ak je vyhľadávanie úspešné, a funkciu, ktorá ukladá indexy dostupných buniek.

/* počiatočný stav dosky O | | X --------- X | | X --------- | O | O */ var origBoard = [“O”,1 ,”X”,”X”,4 ,”X”, 6 ”O”,”O”]; // ľudská var huPlayer = “O”; // AI var aiPlayer = "X"; // vráti zoznam indexov prázdnych buniek na šachovnici funkcia emptyIndices(board)( return board.filter(s => s != "O" && s != "X"); ) // výherné kombinácie, berúc do úvahy funkcia indexov účtu výhra (doska, hráč)( if((doska == hráč && doska == hráč && doska == hráč) || (doska == hráč && doska == hráč && doska == hráč) || (doska == hráč && doska == hráč && doska == hráč) || (doska == hráč && doska == hráč && doska == hráč) || (doska == hráč && doska == hráč && doska == hráč) || (doska == hráč && doska == hráč && doska == hráč) || (doska == hráč && doska == hráč && doska == hráč) || (doska == hráč && doska == hráč && doska == hráč)) ( návrat true; ) else ( return false; ) )

Poďme teda definovať funkciu minimax s dvoma argumentmi: newBoard (nová doska) a hráč (hráč). Potom nájdeme indexy voľných buniek na poli a prenesieme ich do premennej availSpots.

// hlavná funkcia minimax funkcia minimax(newBoard, player)( //dostupné bunky var availSpots = emptyIndices(newBoard);

Okrem toho musíme sledovať konečné stavy a vracať príslušné hodnoty. Ak vyhrá nula, musíte vrátiť -10 , ak "kríž" - +10 . Ak je veľkosť poľa availSpots nula, potom nie sú žiadne voľné bunky, hra sa skončí remízou a mala by sa vrátiť nula.

// kontrola stavu terminálu (výhra / prehra / remíza) //a zodpovedajúce vrátenie hodnoty if (winning(newBoard, huPlayer))( return (skóre:-10); ) else if (winning(newBoard, aiPlayer)) ( return (skóre:10); ) else if (availSpots.length === 0)( return (skóre:0); )

Potom musíte zbierať body z každej prázdnej bunky. Aby sme to dosiahli, vytvorme pole ťahov a prejdeme cez všetky prázdne bunky, pričom do objektu presunu vložíme indexy a skóre každého ťahu.

Potom nastavíme index prázdnej bunky, ktorá bola uložená ako číslo v origBoard , na vlastnosť index objektu move. Potom prejdeme pre aktuálneho hráča do prázdnej bunky nového poľa newBoard a zavoláme funkciu minimax od iného hráča a výsledné pole newBoard . Potom musíme vložiť vlastnosť skóre objektu vráteného funkciou minimax do vlastnosti skóre objektu move.

Ak minimax nenájde konečný stav, pokračuje rekurzívne v prehlbovaní hry, až kým nedosiahne konečný stav. Potom prejde body tejto „úrovne“ rekurzie o úroveň vyššie.

Nakoniec funkcia resetuje newBoard a umiestni objekt presunu do poľa pohybov.

// pole na uloženie všetkých objektov var moves = ; // cyklus cez dostupné bunky pre (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 potom musí vybrať najlepší ťah z poľa pohybov. Potrebuje ťah s najvyšším skóre, ak ide o pohyb AI, a najmenší, ak ide o ľudský pohyb. Ak je teda hodnota hráča aiPlayer , algoritmus inicializuje premennú bestScore na veľmi malé číslo a prechádza cez pole ťahov: ak má ťah viac skóre ako bestScore , algoritmus si tento ťah zapamätá . V prípade ťahov s rovnakými bodmi si algoritmus pamätá prvý.

V prípade, že sa hráč rovná huPlayer , je všetko rovnaké - len teraz sa bestScore inicializuje s veľkým číslom a minimax hľadá ťahový ťah s najmenším počtom bodov.

Nakoniec minimax vráti objekt uložený v bestMove.

// ak ide o pohyb AI, prezrite si pohyby a vyberte ťah s najvyšším skóre var bestMove; if(player === aiPlayer)( var bestScore = -10000; for(var i = 0; i< moves.length; i++){ if(moves[i].score >najlepšieSkóre)( najlepšieSkóre = ťahy[i].skóre; najlepšíPohyb = i; ) ) )else( // inak prechádzajte ťahmi a vyberte ťah s najnižším skóre var bestScore = 10000; for(var i = 0; i< moves.length; i++){ if(moves[i].score < bestScore){ bestScore = moves[i].score; bestMove = i; } } } // вернуть выбранный ход (объект) из массива ходов return moves; }

V ďalšej časti budeme simulovať náš program, aby sme pochopili, ako funguje.

Minimax v akcii

Pomocou nižšie uvedeného diagramu analyzujeme krok za krokom model algoritmu.

Poznámka: V diagrame veľké čísla označujú poradové číslo volania funkcie a úrovne označujú, koľko krokov vpred algoritmus prešiel.

  1. Algoritmus je napájaný origBoard a aiPlayer. Vytvorí zoznam troch nájdených prázdnych buniek, skontroluje, či je stav konečný, a prejde cez všetky prázdne bunky. Algoritmus potom zmení novú dosku umiestnením prehrávača aiPlayer do prvej prázdnej bunky. Potom sa zavolá z newBoard a huPlayer a čaká na druhé volanie, aby vrátil hodnotu.
  2. Zatiaľ čo prvé volanie funkcie stále beží, spustí sa druhé, čím sa vytvorí zoznam dvoch prázdnych buniek, skontroluje sa, či je stav konečný a prejde sa cez všetky prázdne bunky. Druhé volanie potom zmení newBoard umiestnením huPlayer do prvej prázdnej bunky. Potom sa zavolá z newBoard a aiPlayer a čaká na tretie volanie, aby vrátil hodnotu.

  3. Keďže druhý hovor našiel dve prázdne bunky, minimax upraví newBoard umiestnením huPlayer do druhej voľnej bunky. Potom sa zavolá z newBoard a aiPlayer.

  4. Algoritmus zostaví zoznam prázdnych buniek a po kontrole konečnosti stavu zafixuje hráčovo víťazstvo. Preto vráti objekt s poľom počtu rovným (-10).

    V druhom volaní funkcie dostane algoritmus hodnoty vrátené z nižšej úrovne tretím a štvrtým volaním funkcie. Keďže pohyb huPlayer priniesol tieto dva výsledky, algoritmus vyberie najmenší z nich. Keďže sú rovnaké, algoritmus vyberie prvý a odovzdá ho prvému volaniu funkcie.

    V tomto bode prvé volanie funkcie prijalo odhad pohybu aiPlayeru do prvej prázdnej bunky. Potom upraví newBoard umiestnením prehrávača aiPlayer do druhej prázdnej bunky. Potom sa zavolá z newBoard a huPlayer .

  5. V piatom volaní funkcie algoritmus zostaví zoznam prázdnych buniek a opraví víťazstvo AI po kontrole konečnosti stavu. Takže vráti objekt s poľom počtu +10.

    Potom prvé volanie zmení newBoard umiestnením prehrávača aiPlayer do tretej prázdnej bunky. Potom sa zavolá z newBoard a huPlayer.

  6. Šiesty hovor zostaví zoznam dvoch prázdnych buniek, skontroluje, či je stav konečný, a prejde cez všetky prázdne bunky. Potom upraví newBoard umiestnením huPlayer do prvej prázdnej bunky. Potom sa zavolá z newBoard a aiPlayer a čaká na siedme zavolanie, aby vrátil hodnotu.
  7. Nové volanie zobrazí jednu prázdnu bunku, skontroluje, či je stav konečný, a upraví newBoard umiestnením prehrávača aiPlayer do prázdnej bunky. Potom sa zavolá z newBoard a huPlayer a čaká, kým toto volanie vráti hodnotu.
  8. Ôsmy hovor zostaví prázdny zoznam prázdnych buniek a opraví víťazstvo aiPlayeru po kontrole konečnosti stavu. Preto vráti objekt s poľom počtu rovným (+10), o jednu úroveň vyššie, do siedmeho volania.

    Siedma výzva získala iba jednu, kladnú hodnotu z nižších úrovní. Keďže táto hodnota bola prijatá v priebehu hry aiPlayer, algoritmus vráti najväčšiu z prijatých hodnôt. Takže vráti kladnú hodnotu (+10) o úroveň vyššie, do šiesteho volania.

    Pretože šiesty hovor našiel dve prázdne bunky, minimax upraví newBoard umiestnením huPlayer do druhej prázdnej bunky. Potom sa zavolá z newBoard a aiPlayer.

  9. Potom algoritmus zostaví zoznam prázdnych buniek a po kontrole konečnosti stavu opraví víťazstvo aiPlayeru. Preto vráti objekt s poľom počtu rovným (+10) o jednu úroveň vyššie.

    V tomto bode si šiesta výzva musí vybrať medzi skóre (+10) vráteným siedmym hlásením a skóre (-10) vráteným deviatym hlásením. Keďže pohyb huPlayer priniesol tieto dva výsledky, algoritmus vyberie najmenší z nich a vráti ho o úroveň vyššie ako objekt s poliami skóre a indexu.

    Nakoniec sa vyhodnotia všetky tri vetvy prvého hovoru (-10, +10, -10). Keďže pohyb aiPlayer priniesol tieto tri výsledky, algoritmus vyberie objekt s najvyšším skóre (+10) a jeho index (4).

Vo vyššie diskutovanom scenári minimax rozhodne, že najlepšou voľbou je presunúť sa na centrálne pole poľa.

Koniec!

Teraz by ste mali pochopiť, ako funguje algoritmus minimax. Skúste si implementáciu napísať sami, alebo si pozrite príklad na GitHub alebo CodePen a optimalizujte ju.

Ak vás zaujíma téma AI v hrách, odporúčame vám prečítať si naše materiály na túto tému.



Páčil sa vám článok? Zdieľaj to