Tic Tac Toe -pelin ohjelmointi Visual Basiciin

Ohjelmointi tietokonepelit voi olla teknisesti haastavin (ja mahdollisesti parhaiten maksava) työ, joka a ohjelmoija voi olla. Ylimmän tason pelit vaativat parasta sekä ohjelmoijilta että tietokoneilta.

Visual Basic 6 on nyt ohitettu perusteellisesti pelien ohjelmoinnin alustaksi. (Se ei oikeastaan ​​koskaan ollut yksi. Jopa "vanhoina päivinä", vakavat peliohjelmoijat eivät koskaan käyttäisi korkean tason kieltä, kuten VB 6, koska et vain saanut leikkausta reunan suorituskyky, jota useimmat pelit vaativat.) Mutta yksinkertainen "Tic Tac Toe" -peli on hieno johdanto ohjelmointiin, joka on hiukan edistyneempi. kuin "Hei maailma!"

Tämä on loistava johdanto moniin ohjelmoinnin peruskäsitteisiin, koska siinä yhdistyvät tekniikat, kuten:

  • Käyttö taulukot. X- ja O-merkinnät pidetään erillisissä ryhmissä ja koko taulukot siirretään toimintojen välillä pelin etenemisen seuraamiseksi.
  • VB 6 -tason grafiikan käyttäminen: VB 6 ei tarjoa suurta graafista ominaisuutta, mutta peli on hyvä johdanto käytettävissä olevalle. Suuri osa tämän sarjan tuotteista on tutkimusta siitä, kuinka Microsoftin seuraavan sukupolven GDI + korvaa VB 6 -tason grafiikan.
    instagram viewer
  • Matemaattisten laskelmien käyttäminen ohjelman ohjaamiseen: Ohjelma käyttää fiksua modulo (Mod) ja kokonaisluku jakolaskelmat käyttämällä kahden pelimerkin matriiseja sen määrittämiseksi, milloin kolmen elementin "voitto" on tapahtunut.

Tämän artikkelin ohjelmointiluokka on kenties vain vähän alkuasteen ohi, mutta sen pitäisi olla hyvä "keskitason" ohjelmoijille. Mutta aloitetaan alatasolla valaisemaan joitain käsitteitä ja päästä alkuun Visual Basic pelin ohjelmointiuran. Jopa edistyneemmät opiskelijat saattavat huomata, että on hieman haastavaa saada esineet oikeassa muodossa.

Kuinka pelata Tic Tac Toe

Jos et ole koskaan pelannut Ristinolla, tässä ovat säännöt. Kaksi pelaajaa vuorotellen asettamalla X: n ja Os: n 3 x 3 -pelikilpailuun.

Ennen pelin alkamista molempien pelaajien on sovittava siitä, kuka menee ensin ja kuka merkitsee liikkeensä millä symbolilla. Ensimmäisen siirron jälkeen pelaajat sijoittavat vuorotellen merkkinsä mihin tahansa tyhjään soluun. Pelin tavoitteena on olla ensimmäinen pelaaja, jolla on kolme merkkiä vaaka-, vino- tai pystysuunnassa. Jos tyhjiä soluja ei ole eikä kummallakaan pelaajalla ole voittavaa yhdistelmää, peli on tasapeli.

Ennen varsinaisen koodauksen aloittamista on aina hyvä idea muuttaa käyttämiesi komponenttien nimet. Kun aloitat koodaus, nimeä Visual Basic käyttää automaattisesti, joten haluat sen olevan oikea nimi. Käytämme lomakkeen nimeä frmTicTacToe ja muutamme kuvatekstiksi myös "About Tic Tac Toe".

Kun muoto on määritetty, piirrä 3 x 3 -ruudukko linjatyökalurivin ohjaimella. Napsauta viivatyökalua ja vedä sitten viiva haluamaasi kohtaan. Sinun täytyy luoda neljä riviä tällä tavalla ja säätää niiden pituutta ja sijaintia, jotta ne näyttävät oikeilta. Visual Basicissa on myös Muoto-valikon alla joitain käteviä työkaluja, jotka auttavat. Tämä on loistava mahdollisuus harjoitella heidän kanssaan.

Pelikenttien lisäksi tarvitsemme joitain esineitä X- ja O-symboleille, jotka asetetaan ruudukkoon. Koska ruudukossa on yhdeksän välilyöntiä, luomme objektiryhmän, jossa on yhdeksän välilyöntiä, nimeltään elementtejä Visual Basicissa.

On olemassa useita tapoja tehdä melkein kaikki Visual Basic -kehitysympäristössä, ja ohjausryhmien luominen ei ole poikkeus. Todennäköisesti helpoin tapa on luoda ensimmäinen tarra (napsauttaa ja piirtää aivan kuten rivityökalu), nimetä se, asettaa kaikki määritteet (kuten Font ja ForeColor) ja tehdä siitä kopioita. VB 6 kysyy, haluatko luoda ohjausryhmän. Käytä ensimmäisessä otsikossa nimeä lblPlayGround.

Jos haluat luoda ruudukon muut kahdeksan elementtiä, valitse ensimmäinen tarraobjekti, aseta Hakemisto-ominaisuudeksi nolla ja paina CTRL + C (kopio). Nyt voit painaa CTRL + V (liitä) luodaksesi uuden tarraobjektin. Kun kopioit tällaisia ​​objekteja, jokainen kopio perii kaikki ominaisuudet paitsi hakemisto ensimmäisestä. Hakemisto nousee yhdellä jokaista kopiota kohti. Tämä on ohjausryhmä, koska niillä kaikilla on sama nimi, mutta eri indeksiarvot.

Jos luot taulukon tällä tavalla, kaikki kopiot pinotaan päällekkäin lomakkeen vasempaan yläkulmaan. Vedä jokainen tarra johonkin pelaavaan ruudukon sijaintiin. Varmista, että indeksiarvot ovat peräkkäisiä ruudukossa. Ohjelman logiikka riippuu siitä. Tarraobjektin, jonka indeksiarvo on 0, tulisi olla vasemmassa yläkulmassa ja oikeassa alareunassa olevan hakemiston tulisi olla indeksi 8. Jos tarrat peittävät pelaavan ruudukon, valitse jokainen tarra, napsauta hiiren kakkospainikkeella ja valitse Lähetä takaisin.

Koska pelin voittamiseen on kahdeksan mahdollista tapaa, tarvitsemme kahdeksan erilaista riviä voiton näyttämiseksi pelikentällä. Käytät samaa tekniikkaa luodaksesi uuden ohjausryhmän. Piirrä ensin viiva, nimeä se linWin ja aseta Indeksi-ominaisuus nollaan. Käytä sitten copy-paste tekniikkaa seitsemän uuden rivin tuottamiseksi. Seuraava kuva osoittaa, kuinka indeksinumerot asetetaan oikein.

Tarra- ja rivikohtien lisäksi tarvitset joitain komentopainikkeita pelin pelaamiseen ja lisää tarroja pisteet pitämiseksi. Näiden luomisvaiheet eivät ole yksityiskohtaisia, mutta nämä ovat tarvitsemasi objektit.

Kaksi painiketta esineet:

  • cmdNewGame
  • cmdResetScore

Kehysobjekti fraPlayFirst, joka sisältää kaksi vaihtoehtoista painiketta:

  • optXPlayer
  • optOPlayer

Kehysobjekti fraScoreBoard, joka sisältää kuusi tarraa. Vain lblXScore ja lblOScore muuttuvat ohjelmakoodissa.

  • lblX
  • lblXScore
  • lblO
  • lblOScore
  • lblMinus
  • lblColon

Lopuksi tarvitset myös tarraobjektin lblStartMsg 'peittääksesi' cmdNewGame-painikkeen, kun sitä ei pitäisi napsauttaa. Tämä ei ole näkyvissä alla olevassa kuvassa, koska se vie muodossa saman tilan kuin komentopainike. Saatat joutua siirtämään komentopainiketta väliaikaisesti piirtääksesi tämän tarran lomakkeelle.

Toistaiseksi VB-koodausta ei ole tehty, mutta olemme vihdoin valmiita tekemään sen.

alustus

Nyt voit lopulta aloittaa ohjelman koodaamisen. Jos et ole jo tehnyt, voit ladata lähdekoodin seuraamaan sitä, kun ohjelman toiminta selitetään.

Yksi ensimmäisistä suunnittelupäätöksistä on, kuinka seurata pelin nykytilaa. Toisin sanoen, mitkä ovat nykyiset X: t ja Os: t ruudukossa ja kuka siirtyy seuraavaksi. 'Tilan' käsite on kriittinen monessa ohjelmoinnissa, ja se on tärkeä erityisesti ASP: n ja ASP.NET: n ohjelmoinnissa webille

Tämä voidaan tehdä monella tapaa, joten se on kriittinen vaihe analyysissä. Jos ratkaisit tämän ongelman yksin, kannattaa ehkä piirtää vuokaavio ja kokeilla erilaisia ​​vaihtoehtoja 'tyhjästä paperista' ennen koodauksen aloittamista.

Ratkaisumme käyttää kahta "kaksiulotteista taulukkoa", koska se auttaa seuraamaan tilaa "muuttamalla yksinkertaisesti taulukon hakemistoja ohjelmasilmukoissa. Vasemman yläkulman tila on taulukkoelementissä, jolla on hakemisto (1, 1), oikeassa yläkulmassa on (1, 3), oikeassa alakulmassa (3,3) ja niin edelleen. Kaksi tätä tekevää taulukkoa ovat:

iXPos (x, y)

ja

iOPos (x, y)

Tätä voidaan tehdä monella eri tavalla, ja tämän sarjan lopullinen VB.NET-ratkaisu näyttää kuinka tehdä se vain yhdellä yhden ulotteisella taulukolla.

Ohjelmointi näiden ryhmien kääntämiseksi pelaajien voittopäätöksiksi ja lomakkeen näkyvät näytöt ovat seuraavalla sivulla.

Tarvitset myös muutaman globaalin muuttujan seuraavasti. Huomaa, että nämä ovat lomakkeen yleisessä ja julistuskoodissa. Tämä tekee heistä "moduulitaso" muuttujat, joihin voidaan viitata missä tahansa tämän lomakkeen koodissa. Lisätietoja tästä on Visual Basic -ohjeen Muuttujien laajuuden ymmärtäminen -kohdassa.

On olemassa kaksi aluetta, joilla muuttujat alustetaan ohjelmassamme. Ensin muutama muuttuja alustetaan, kun muoto frmTicTacToe latautuu.

Yksityinen alimuoto_lataus ()

Toiseksi, ennen jokaista uutta peliä, kaikki muuttujat, jotka on palautettava lähtöarvoihin, määritetään alustusohjelmassa.

Sub InitPlayGround ()

Huomaa, että lomakkeen latauksen alustaminen vaatii myös leikkikenttäalustusta.

Yksi ohjelmoijan kriittisistä taidoista on kyky käyttää virheenkorjausominaisuuksia ymmärtää, mitä koodi tekee. Voit käyttää tätä ohjelmaa kokeillaksesi:

  • Selaa koodi F8-näppäimellä
  • Kellon asettaminen avainmuuttujille, kuten sPlaySign tai iMove
    Mittauskohdan asettaminen ja muuttujien arvon kysely. Esimerkiksi alustuksen sisäsilmukassa:
lblPlayGround ((i - 1) * 3 + j - 1) .Caption = ""

Huomaa, että tämä ohjelma osoittaa selvästi, miksi on hyvä ohjelmointikäytäntö pitää tietoja taulukkoissa aina kun mahdollista. Jos sinulla ei ollut taulukkoja tässä ohjelmassa, joudut kirjoittamaan koodin jotain tällaista:

Line0.Visible = Väärä
Line1.Visible = Väärä
Line2.Visible = Väärä
Rivi3.Visible = Väärä
Rivi4.Visible = Väärä
Line5.Visible = Väärä
Line6.Visible = Väärä
Line7.Visible = Väärä

tämän sijaan:

Jos i = 0 - 7
linWin (i) .Visible = Väärä
Seuraavaksi minä

Liikkeen tekeminen

Jos mitä tahansa järjestelmän osaa voidaan ajatella 'sydämenä', se on aliohjelma lblPlayGround_Click. Tätä aliohjelmaa kutsutaan joka kerta, kun pelaaja napsauttaa pelikentää. (Napsautuksien on oltava yhden yhdeksästä lblPlayGround-elementistä.) Huomaa, että tällä aliohjelmalla on argumentti: (Hakemisto Kokonaislukuna). Suurin osa muista 'tapahtuman aliohjelmista', kuten cmdNewGame_Click (), eivät. Hakemisto osoittaa, mitä tarraobjektia on napsautettu. Hakemisto sisältää esimerkiksi arvon nolla ruudukon vasemmassa yläkulmassa ja arvo kahdeksassa alakulman oikeassa alakulmassa.

Kun pelaaja napsauttaa ruutua ruudukossa, toisen pelin käynnistämisen komentopainike, cmdNewGame, "otetaan käyttöön" tekemällä siitä näkyvä. Tämän komentopainikkeen tila suorittaa kaksinkertaisen velvollisuuden, koska sitä käytetään myös boolen päätösmuuttujana myöhemmin ohjelmassa. Kiinteistön arvon käyttäminen päätösmuuttujana on yleensä lannistunut, koska jos on tarpeen muuttaa ohjelmaa (sanoa esimerkiksi tehdä cmdNewGame-komentopainike näkyy koko ajan), ohjelma epäonnistuu epäonnistuneesti, koska et ehkä muista, että sitä käytetään myös osana ohjelmaa logiikka. Tästä syystä on aina hyvä idea etsiä ohjelmakoodia ja tarkistaa kaiken, mitä muutat ohjelman ylläpidossa, jopa omaisuuden arvot. Tämä ohjelma rikkoo sääntöä osittain huomauttaakseen tästä ja osittain siksi, että tämä on suhteellisen yksinkertainen koodi, jossa on helpompi nähdä mitä tehdään ja välttää ongelmat myöhemmin.

Pelin neliön pelaajavalinta käsitellään kutsumalla GamePlay-aliohjelma, jonka argumentti on Index.

Siirton käsittely

Ensin tarkistat, onko napsautettu tyhjää neliötä.

Jos lblPlayGround (xo_Move) .Caption = "" Sitten

Kun olemme varmoja, että tämä on laillinen siirto, siirtolaskuria (iMove) lisätään. Seuraavat kaksi riviä ovat erittäin mielenkiintoisia, koska ne kääntävät koordinaatit yhdenulotteisesta Jos lblPlayGround-komponenttiryhmä kaksidimensionaalisiin hakemistoihin, joita voit käyttää joko iXPos- tai iOPos-ohjelmissa. Mod ja kokonaislukujako ('takaisinviiva') ovat matemaattisia toimintoja, joita et käytä päivittäin, mutta tässä on hieno esimerkki siitä, kuinka ne voivat olla erittäin hyödyllisiä.

Jos lblPlayGround (xo_Move) .Caption = "" Sitten
iMove = iMove + 1
x = Int (xo_Move / 3) + 1
y = (xo_Move Mod 3) + 1

Xo_Move-arvo 0 käännetään (1, 1), 1 - (1, 2)... 3 - (2, 1)... 8 - (3, 3).

SPlaySignissa, moduulin laajuudella varustetulla arvolla, seurataan, mikä pelaaja siirtyi. Kun siirrettävät taulukot on päivitetty, pelaavan ruudukon tarrakomponentit voidaan päivittää asianmukaisella merkillä.

Jos sPlaySign = "O" Sitten
iOPos (x, y) = 1
iWin = CheckWin (iOPos ())
muu
iXPos (x, y) = 1
iWin = CheckWin (iXPos ())
Loppu Jos
lblPlayGround (xo_Move) .Caption = sPlaySign

Esimerkiksi, kun X-soitin napsauttaa ruudukon vasenta yläkulmaa, muuttujilla on seuraavat arvot:

Käyttäjäruudussa näkyy vain X vasemmassa yläkulmassa, kun taas iXPosissa on 1 vasemmassa yläkulmassa ja 0 kaikissa muissa. IOPos-laitteissa on 0 jokaisessa laatikossa.

Arvot muuttuvat, kun O-pelaaja napsauttaa ruudukon keskimmäistä neliötä. Nyt th iOPos näyttää yhden keskikentässä, kun taas käyttäjän näytössä on X vasemmassa yläkulmassa ja O keskimmäisessä ruudussa. IXPos näyttää vain yhden vasemmassa yläkulmassa ja 0 kaikissa muissa ruuduissa.

Nyt kun tiedät missä pelaaja napsautti ja mikä pelaaja napsautti (käyttämällä arvoa sPlaySign), sinun tarvitsee vain selvittää, onko joku voittanut pelin, ja selvittää, kuinka osoittaa se näyttö.

Voittajan löytäminen

Jokaisen siirron jälkeen CheckWin-toiminto tarkistaa voittavan yhdistelmän. CheckWin toimii lisäämällä jokainen rivi alas, jokaiseen sarakkeeseen ja jokaiseen diagonaaliin. Vaiheiden jäljittäminen CheckWinin kautta Visual Basicin Debug-ominaisuuden avulla voi olla erittäin opettavaista. Voiton löytäminen on ensin kysymys. Tarkistetaan, löydettiinkö kolme 1: ta jokaisesta yksittäisestä tarkastuksesta muuttujan iScore kohdalla, ja sitten palautetaan Checkwinissa yksilöivä "allekirjoitus" -arvo, jota käytetään taulukkoindeksinä linWinin yhden elementin Visible-ominaisuuden muuttamiseen komponenttiryhmä. Jos voittajaa ei ole, CheckWin sisältää arvon -1. Jos voittaja on, näyttö päivitetään, tulostaulua vaihdetaan, onnitteluviesti näytetään ja peli käynnistetään uudelleen.

Tutkitaan yksityiskohtaisesti yksi tarkastuksista, miten se toimii. Muut ovat samanlaisia.

'Tarkista rivit 3
Jolle i = 1 - 3
iScore = 0
CheckWin = CheckWin + 1
J = 1 - 3
iScore = iScore + iPos (i, j)
Seuraava j
Jos iScore = 3 Sitten
Poistu toiminnosta
Loppu Jos
Seuraavaksi minä

Ensimmäinen huomionarvoinen asia on, että ensimmäinen hakemistolaskuri i laskee rivit alas ja toinen j laskee sarakkeiden yli. Ulkosilmukka siirtyy sitten yksinkertaisesti riviltä toiselle. Sisäinen silmukka laskee nykyisen rivin 1: n. Jos niitä on kolme, sinulla on voittaja.

Huomaa, että seuraat myös muuttujassa CheckWin testattujen neliöiden kokonaismäärää, joka on arvo, joka palautetaan, kun tämä toiminto loppuu. Jokaisella voittavalla yhdistelmällä saadaan CheckWin-yksikössä ainutlaatuinen arvo välillä 0 - 7, jota käytetään valitsemaan yksi linWin () -komponenttiryhmän elementeistä. Tämä tekee myös koodin järjestyksen CheckWin-toiminnossa! Jos olet siirtänyt yhden korttelin silmukkoodi (kuten yllä), väärään viivaan vedetään pelikenttään, kun joku voittaa. Kokeile ja katso!

Viimeistely yksityiskohdat

Ainoa koodi, josta ei vielä keskusteltu, on uuden pelin aliohjelma ja aliohjelma, joka nollaa pisteet. Järjestelmän muu logiikka tekee niiden luomisesta melko helpon. Uuden pelin aloittamiseksi sinun on vain soitettava InitPlayGround-aliohjelmaan. Pelaajien mukavuuden vuoksi, koska painiketta voidaan napsauttaa pelin keskellä, pyydä vahvistus ennen siirtymistä eteenpäin. Pyydämme myös vahvistusta ennen tulostaulun uudelleen käynnistämistä.

instagram story viewer