Build en minesveiper spill Innen 200 linjer med kode
8
Del
Del
Del
Denne Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
I denne opplæringen vil vi lære å planlegge og kode en minesveiper spill med AS3 og Flash. Kan vi gjøre det på bare 200 linjer ?! La oss se ...
Endelig resultat Forhåndsvisning
La oss ta en titt på det endelige resultatet vi skal jobbe mot:
Fordi Flash Player støtter ikke høyreklikk, shift-klikk på rutene tror du inneholder miner for å markere dem.
Minesveiper Regler
Hvis du er en minesveiper-spiller , da trolig du kjenner spillets regler - men bare i tilfelle du ikke er:
Minesveiper Spillet består av en gruppe på rutene der hver rute representerer en region. Hver region enten inneholder en mine eller ikke. Ditt oppdrag er å avdekke (eller "åpne") alle minefrie områder og markere de som inneholder miner. Du åpner regionen i venstreklikke på det, og merker en region av skift-klikke. Nøkkelen for å avgjøre om en bestemt region inneholder en mine eller ikke, er at for hver 3x3 rutenett (9 regioner) av kvadrater, nummeret skrevet på regionen i sentrum representerer antall gruver i de 8 andre omkringliggende regioner. Anmeldelser
Så, når du starter spillet, de første par klikk vil avhenge av lykken å finne minefrie områder, men når du åpner en god del områder, kan du bruke logikk for å finne de regionene som inneholder miner.
Et godt eksempel på en minesveiper spillet, er den som leveres med Windows (alle versjoner); et enkelt søk på [online minesveiper spillet] vil også henvise deg til flere versjoner, som alle har det samme konseptet. Ellers spille spillet fra den endelige SWF-fil, embedded ovenfor.
Modellering Minesveiper den OOP Way
I en minesveiper spillet, hvis vi ønsker å tenke på spillet fra OOP synspunkt, kan vi vurdere hver region som et objekt. Vi vil kalle dette objektet en "sone", og alle spill soner vil være i en container objekt som vi vil kalle "bord"
For hver sone objekt, er det en haug med egenskaper som.:
tilstand. om den inneholder en mine eller ikke
avslørt: hvis det er avslørt, har brukeren åpnet sonen
merket. om brukeren har merket sonen som inneholder en gruve
zoneValue:.. nummeret skrevet inne i sonen representerer antall gruver i de omkringliggende soner
xcor: horisontal posisjon av sonen i styret.
ycor. vertikal posisjon av sonen i styret
Og det er hvordan vi skal bygge spillet. det vil være en sone klasse koblet med en sonen For en vanlig minesveiper spill - opprinnelig en som ikke er i nettleseren - du kan ha tilgang til begge museknappene, slik at brukeren å spille spillet kan åpne regioner ved å venstreklikke og markere dem ved å høyreklikke. Hvis du skulle publisere spillet som en AIR applikasjon, så ville du ha tilgang til alle de muse funksjoner, inkludert høyre og midtre museknapp, og du bør gjøre det for bedre brukeropplevelsen mens du spiller spillet. Men hvis du ønsker å publisere spillet via Flash Player i nettleseren, så du ikke har tilgang til på høyre museknapp, siden høyre museknapp vil åpne hurtigmenyen for Flash Player; så vi må finne en løsning på dette problemet. Den løsningen som jeg kom opp med, er gjennom å bruke tastaturet. Jeg gjorde det ved å registrere skift-tasten, og funnet ut at den enkleste måten å gjøre det på er ved hjelp av Skift-tast eiendom for MouseEvent klassen. det er en haug med andre egenskaper for noen spesielle taster på tastaturet som Alt (for Windows), Tilvalg (for mac), og Ctrl (Command) tasten. Jeg anbefaler at du sjekker dem ut i dokumentasjonen hjelp for MouseEvent klassen hvis du ikke allerede kjenner dem. La oss ta en titt på FLA at vi skal jobbe med Flash-fil inneholder de grafiske elementene bare for spillet Merk:.. Først:. er det tre objekter på scenen: I tillegg til det, inneholder biblioteket annen symbol kalt sonen Z - det er filmklippet som representerer Zone objekt. Dette symbolet vil være knyttet til Zone klassen som vi vil skape senere for å legge til i sonen funksjonalitet, og er satt til å være 40x40 piksler. denne sonen objekt består av følgende:. Opprett en ny klasse og kaller det Main. lagre det som Main.as, koble den til Flash-fil som dokumentet klassen og la oss dykke inn koden For det første:. Deretter inne i konstruktøren, vi vil initialisere disse variablene som vi har definert med noen verdier. Klassen din skal se slik ut: Neste vi trenger for å utføre disse oppgavene, så vel for initialisering av spillet: Og for koden til å være organisert så vel som gjenbrukbar, vil vi dele prosessen med å lage spillet i tre deler:. skaper styret og soner i styret, plassere gruvene, og plassere de riktige tallene på de frie soner (som ikke inneholder gruver) Hvert trinn fra disse tre delene vil være i en egen funksjon; disse funksjonene er createBoard (), placeBombs (), og placeNumbers () henholdsvis, som tidligere nevnt. Så gjør disse funksjonene og la dem tom for nå, og ringe dem i konstruktør henholdsvis i samme rekkefølge. Hoved klasse skal se slik ut: Nå er vi vil ta en pause med denne klassen, og begynne å gjøre Zone klassen La oss nå begynne å lage funksjonaliteten til hver sone. Først i FLA fil, link sonen For det andre mens vi skaper den Zone klassen, vi trenger å teste vår fremgang. Så vi vil gjøre en forekomst av Zone objekt ved å legge til disse linjene med kode i konstruktør funksjon innenfor våre hoved klassen filen: For det tredje opprette en ny klasse og lagre det som Zone.as innenfor samme mappe som FLA Da må vi gjøre vårt Zone klasse forlenge MovieClip klasse som følger . Vi vil også ta noen mus hendelser, så du bør importere denne klassen også Hvis du nå teste filmen du bør se en forekomst på scenen: Neste vi vil definere de egenskapene som vi har diskutert tidligere når vi snakker om sonen objektet Disse egenskapene vil være som følger:. Klassen skal se slik ut Merk: Neste vi trenger å skjule highlight_mc MovieClip - slik at det vises kun når musen er over sonen objekt - og vi trenger å skjule bomb_mc MovieClip også - slik at det ikke vises med mindre brukeren markerer sone som inneholder en mine. Så legge til følgende linjer i din klasse konstruktør Neste vi trenger å legge hendelsen lyttere for hover funksjonalitet samt museklikking. Så legger de hendelsen lyttere samt tilhørende handler funksjoner Klassen sould se slik ut:. Hvis du tester filmen du kan se høydepunkt funksjonaliteten fungerer. Nå, la oss jobbe med zoneClicked () -funksjonen. Merk: Hvis du vil legge til høyreklikk funksjonaliteten i Adobe AIR, bør du dele den første delen av hvis setningen inn høyreklikk hendelseshåndterer funksjon Nå innenfor høyreklikk delen, må vi la. brukeren markere sonen som inneholder en gruve eller fjerne merkingen for sonen hvis det var tidligere merket. Dette inkluderer tre trinn for å bli reversert hver gang:.. Dette oppnås ved hjelp av følgende linjer .. ganske enkel. Legg merke til at hvis vi ønsker å kalle et objekt som er på scenen fra Zone klassen, vi bruker denne .parent eiendom for å målrette scenen; derfra og du kan målrette objektet du vil. Senere når vi gjør alle sonene, vil de bli pakket inn i en sprite container. så må du komme tilbake og justere disse scene stedene samtaler skal this.parent.parent. (Dette er uten tvil ikke stor OOP praksis, men det er veldig nyttig for å holde seg innenfor våre 200 linje grense! ) Test filmen og se vår fremgang. Klikk på testsonen flere ganger med shift-tasten nede Neste, i normal klikke delen av hvis setningen, må vi teste om sonen inneholder en gruve ved hjelp av statlig eiendom. - hvis det er sant, så er det game over. ellers så må vi åpne sonen Dette er gjort gjennom følgende linjer med kode For å åpne sonen, vil vi flytte denne delen inn i sin egen funksjon kalt Openzone () for å holde vår kode organisert og rent. Også vi må kalle denne funksjonen fra utenfor klassen senere. Så kaller det, og definere det på slutten av klassen. For "game over" del, vil vi gjøre det enkelt ved å bare vise game MovieClip og stykket igjen knappen. Hvis du ønsker å utvide dette til noe robust, kan du opprette en ny hendelse som heter GAME_OVER, sende det fra her og lytte til denne hendelsen fra hovedklassen, men dette er utenfor omfanget av denne opplæringen. Men det er en liten gotcha i logikken i løpet av de foregående linjer. kan du finne det? vel, det skjer hvis brukeren trykket på en sone som han allerede har merket - den som vet hvordan man spiller spillet sannsynligvis ikke vil gjøre det, men det kan gjøres ved en feil - så vi vil forhindre dette ved å pakke denne delen med en betinget for å sjekke om sonen er merket eller ikke, som følger: Så hele zoneclicked () funksjonen skal være sånn Test filmen for å se vår fremgang. Nå ønsker vi å jobbe på åpningssonen del, så definerer Openzone () funksjonen hvis du ikke allerede har gjort . dette, og la oss bryte hodet rundt logikken i denne delen For å åpne en sone, kan fremgangsmåten må gjøres. Men vi ønsker å utføre disse trinnene bare når sonen ikke er merket. - Ellers hvis brukeren feilaktig merket en sone som ikke inneholder mine, så det vil bli åpnet om han klikket på den i den markerte staten, som er det vi ikke ønsker. også, hvis det er allerede avslørt, så er det ikke nødvendig å gjenta disse trinnene igjen. så vi vil se etter disse par forhold i en hvis setningen før du gjør disse trinnene Så funksjonen vil se slik ut:. Ok, nå har vi gjort det meste av funksjonaliteten vi trenger for sonen klassen. vi vil stoppe på dette punktet, og vil komme tilbake senere hvis vi må. klassen din skal se slik ut: 63 linjer med kode .. stor. Kan vi gjøre det gjennom det som er igjen for oss fra 200 linjer ?! :) Neste vi vil gå tilbake til hovedklassen. Nå, tilbake til vår hovedklassen, ikke glem å fjerne linjene som gjør testen sonen. For å gjøre et rutenett eller en serie av objekter i en tabell struktur, vil vi gjøre en matrise som vil holde en referanse til alle andre objekter. denne matrisen vil representere hele rutenettet eller bordet - i vårt tilfelle er det soner array som vi har definert i begynnelsen av hovedklassen Denne rekken vil inneholde deloppstillinger hvor hver deloppstillingen vil representere. en komplett rad i grid eller bord. antallet av undergrupper innenfor hoved for matrisen representerer antall rader innenfor gitteret. Se denne artikkelen for mer informasjon. Hver og en av disse deloppstillinger vil inneholde en rekke elementer der hver enkelt av disse elementene vil representere ett sted eller celle i rutenettet eller bordet (i vårt tilfelle vil det være Sone). antall elementer innen hver deloppstilling vil representere antall kolonner i grid eller bord. Dette gjøres ved å bruke to nestede for looper, hvor, innenfor hver iterasjon av den første sløyfen, skaper vi deloppstillingen og sløyfe gjennom andre sløyfen for å gjøre elementene i raden. Merk at du kan bruke dette hierarkiet for eventuelle gjenstander som du ønsker å arrangere i et rutenett. Nå i createBoard () -funksjonen, vi vil gjøre en for løkke som looper gjennom høyden på styret Innenfor hver iterasjon av loopen, vi. vil gjøre en sub-matrise som vil representere en fullstendig horisontal rekke av soner (hzones), presser denne matrisen til foreldre soner matrise på indeks over plasseringen av raden, og da vil vi gjøre en annen nestet for loop, som følger: Nå innenfor hver iterasjon av den andre loop, skaper vi en ny sone objekt - passerer til det corx & Cory parametere - legg den til den relaterte /kortsiktig hzones sub-array, og deretter legge den til styret sprite objekt container, og justere sin posisjon. som følger: Merk at for å få tilgang til et enkelt element i en matrise der denne matrisen er nestet innen et sekund array (lage en flerdimensjonal array Vær også oppmerksom på at vi har gjort våre soner som barn innenfor en skjerm objekt container -. som er brettet Sprite objekt - så vi må endre hver samtale til ethvert stadium objekt fra sonen klasse fra dette. forelder inn this.parent.parent, ellers vil vi få en referanse feil. du kan gjøre dette enten manuelt eller ved hjelp av "finne og erstatte" funksjonen i din redaktør Nå teste filmen for å se fremdriften av arbeidet vårt Great, har vi gjort brettet med alle soner, men ingen av dem inneholder noen gruver. så det er på tide å plassere noen gruver. Ideen i å plassere miner er å velge et antall tilfeldige soner, og endre deres tilstand eiendom fra usann til sann (noe som betyr at de hver inneholder en mine). Antall soner som skal endres, vil være lik den numberOfMines eiendommen som vi har definert i begynnelsen av hovedklassen Så, vi vil starte funksjonen med en stund sløyfe - selv Jeg liker alltid å bruke for looper, jeg brukte en stund løkke av en grunn som vil bli forklart om kort tid - mens loop vil telle ned for antall miner som er tatt fra numberOfMines eiendommen Nå, hvordan kan vi målrette en tilfeldig sone for våre rutenett av soner? Vel, det er gjort av en serie enkle matematiske operasjoner for å få sin x og y stillinger i styret. la meg vise deg koden for denne første og så skal jeg forklare det i trinn Først: Second:. Tredje:. Fjerde:. For eksempel:. Nå kan vi målrette sonen lett som soner [ROWCOUNT] [Kolonner], endre statlig eiendom til sann og så på å fortsette sløyfen For å se effekten av dette, legge til funksjonen denne linjen som skal vise bomb_mc MovieClip for målrettede soner -. bare for demonstrasjon og se vår fremgang - og deretter teste filmen : Nå hvis du klikker på en av gruvene som har bomb_mc moviclip synlig, får du det game over meldingen. stor, gjør vi vel Men det er et annet problem som vi må løse. hva hvis en eller flere spesifikke tall ble generert tilfeldig mer enn én gang? Da det antall soner som skal inneholde miner vil være mindre enn det spesifiserte antallet. Dette er trolig kommer til å skje når du genererer masse tilfeldige tall. Hvis du testet filmen som det er nå, og telte sine tall, kan du være heldig å få det nøyaktige antallet - hvis ja, så prøve det igjen, og jeg kan forsikre deg at du vil møte problemet, spesielt hvis du økt antall gruver . Vel, for å løse dette problemet vi vil sjekke for staten sonen genereres innen en hvis betinget. hvis det er sant, så denne sonen har blitt generert før og staten har blitt endret. Innenfor hvis blokken, vil vi ikke bare sette den uttalelsen som endrer sonen staten, men også påstanden om at dekrementerer telleren av mens loop - og bare hvis tilstanden til gjeldende sone ikke allerede er satt til true. Det er derfor jeg brukte en stund løkke i stedet for for loop; på denne måten vil telleren ikke dekrementere med mindre en ny sone generert og tilstand endres Ytterligere forklaring: normalt en typisk mens sløyfen vil være som følger: Men ved å pakke disken endrer uttalelse innen en betinget, vil sløyfen fortsette å løkken så lenge betingelsen er ikke fornøyd uten å endre disken, slik: Så de endelige placeMines () -funksjonen vil se slik ut: Flott, nå det siste trinnet i kjernen funksjonaliteten til en minesveiper spillet er å gi brukeren en anelse om hvordan å finne soner som inneholder gruver, ved hjelp av tall. så i stedet for alltid å vise nummer 7 (som vi brukte mens utforme for å se hvordan sonen ville se), vil vi endre på det i løpet av de placeNumbers () -funksjonen. Ideen bak å plassere tallene er å finne . antall soner rundt en gitt sone i styret som har en tilstand av sann - dvs. som inneholder en mine - fra alle de åtte soner rundt den sonen Men det er et par små problemer foran oss:
filmklipp i biblioteket, og vi vil instantiate mengden soner vi trenger fra vår hovedklassen for å gjøre spillbrettet.
Adressering høyreklikk Problem innen Flash
Innhold i FLA
du kan starte fra scratch skape en ny FLA fil og lage din egen grafikk. eller du kan starte med FLA inkludert i kilde nedlasting
gameover_mc:
filmklipp som inneholder grafikken for Game Over skjermen
playagain_btn:..
Play Again knappen
minesleft_txt:
tekstboksen som viser antall miner igjen .
firkantet rektangulær form
block_mc:
grafikken for sonen objektet før det er avslørt (åpnet). Det er bare en 40x40 firkant med en skråkant effekt på det
bomb_mc:..
En enkel grafisk skal vises når sonen er markert som en gruve
num_txt:
et tekstfelt for å vise antall gruver i de omkringliggende soner
highlight_mc:..
en enkel MovieClip med en radial gradient for hover effekt
Seksjon 1: Starte Den største klassen
vi vil starte klassen ved å utvide Sprite klasse, import klassene som vi trenger - i dette tilfellet vil vi importere flash.display.Sprite & flash.events.mouseEvent - og definere noen variabler som følger:
board:
Sprite objekt som inneholder hele brettet som skal inneholde alle sone gjenstander
heltall som representerer antall soner over hele linja horisontalt
boardHeight:..
heltall som representerer antall soner over hele linja vertikalt
numberOfMines.
heltall som representerer antall soner som inneholder gruver over hele brettet
soner:
Array objekt som vil holde en referanse for alle sone objektene i styret.
pakke {import flash.display.Sprite; import flash.events.MouseEvent; public class minesweeper_game strekker Sprite {offentlig Var soner: Array; offentlig Var bord: Sprite; offentlig Var boardWidth: int; offentlig Var boardHeight: int; offentlige Var numberOfMines: int; offentlig funksjon main () {//konstruktør ---- soner = new Array (); board = new Sprite (); boardWidth = 15; boardHeight = 15; numberOfMines = 30; } //End of konstruktør} //end of class} //slutt pakken
fjerne spillet over MovieClip fra scenen.
fjerne stykket igjen knapper fra scenen.
endre verdien av "miner" counter vise antall markører ennå til sted.
tilsette styret objekt til nederst på skjermen listen ved hjelp av addChildAt () -metoden.
pakke {import flash.display.Sprite; import flash.events.MouseEvent; public class minesweeper_game strekker Sprite {offentlig Var soner: Array; offentlig Var bord: Sprite; offentlig Var boardWidth: int; offentlig Var boardHeight: int; offentlige Var numberofMines: int; offentlig funksjon main () {//konstruktør ---- soner = new Array (); board = new Sprite (); boardWidth = 15; boardHeight = 15; numberOfMines = 30; gameover_btn.visible = false; again_btn.visible = false; minesleft_txt.text = String (numberofbombs); addChildAt (bord, 0); createBoard (); placeMines (); placeNumbers (); } //End of konstruktør privat funksjon createBoard (): void {} private funksjons placeMines (): void {} private funksjons placeNumbers (): void {}} //end of class} //slutt pakken
Seksjon 2:. Making the Zone Class
filmklipp med Zone klassen. Du kan gjøre det ved å høyreklikke på sonen
filmklipp i biblioteket og velger Egenskaper
, deretter åpne den avanserte delen hvis det ikke allerede er åpnet, sjekke 'Export for Action' og i klassen feltet skrive "Zone".
Var testZone: Zone = new Zone (); addChild (testZone); testZone.x = 150; testZone.y = 150;.
pakke {import flash.display.MovieClip.; import flash.events.MouseEvent; public class Zone strekker MovieClip {offentlig funksjon Zone () {} //slutt konstruktør} //end of class} //slutt pakken
tilstand:
en boolsk å fastslå tilstanden til sonen (om det faktisk inneholder en mine eller ikke). Denne eiendommen vil bli satt som falsk når sonen startes, og deretter når du plasserer gruvene vil vi justere denne egenskapen som trengs
avslørt.
En boolsk å avgjøre om brukeren har åpnet sone eller ikke. Det vil også bli satt til false
merket.
En boolsk å avgjøre om brukeren har merket sone som inneholder en mine. På begynnelsen det også vil bli satt til false
zoneValue:..
Et heltall som representerer antall mineholdige soner rundt denne sonen
xcor:
et heltall som representerer den horisontale posisjonen sonen i styret. Denne eiendommen vil ta sin verdi fra en parameter som vi vil passere til konstruktøren
ycor.
et heltall som representerer den vertikale plasseringen av sonen i styret. Denne eiendommen vil også ta sin verdi fra en parameter som vi vil passere til konstruktøren samt
pakke {import flash.display.MovieClip..; import flash.events.MouseEvent; public class Zone strekker MovieClip {public Var tilstand: Boolean; //sant inneholder mine, falsk ikke inneholder gruven offentlig Var avslørt: Boolean; offentlig Var xcor: UINT; offentlig Var ycor: UINT; offentlig Var merket: Boolean; offentlig Var zoneValue: int; offentlig funksjon Zone (corx: uint, Cory: uint) {this.state = false; this.revealed = false; this.marked = false; this.zonevalue = 0; this.xcor = corx; this.ycor = Cory; } //End of konstruktør ----} //end of class} //slutt pakken
siden vi har gjort konstruktøren akseptere verdiene av corx og Cory som parametere, vi må skrive inn disse parametrene inn i vår test eksempel at vi har gjort, ellers vil vi få en feilmelding. Så justere denne linjen der vi definerer eksempel ved å legge til noen par av positive heltall som dette:
Var testZone: Zone = new Zone (5, 6);
this.highlight_mc.visible = false;. This.bomb_mc.visible = false;
Pakke {import flash.display.MovieClip; import flash.events.MouseEvent; public class sonen strekker MovieClip {public Var xcor: UINT; offentlig Var ycor: UINT; offentlig Var tilstand: Boolean; //sant = > inneholder gruven offentlig Var avslørt: Boolean; offentlig Var merket: Boolean; offentlig Var zonevalue: int; offentlig funksjon sone (corx: uint, Cory: uint) {this.state = false; this.revealed = false; this.marked = false; this.zoneValue = 0; this.xcor = corx; this.ycor = Cory; this.highlight_mc.visible = false; this.bomb_mc.visible = false; this.addEventListener (MouseEvent.MOUSE_OVER, showHighlight); this.addEventListener (MouseEvent.MOUSE_OUT, removeHighlight); this.addEventListener (MouseEvent.CLICK, zoneClicked); } //End of konstruktør ---- privat funksjon showHighlight (event: MouseEvent): void {this.highlight_mc.visible = true; } Private funksjon removeHighlight (event: MouseEvent): void {this.highlight_mc.visible = false; } Private funksjon zoneClicked (event: MouseEvent): void {trace ("sone klikket!"); }} //End of class} //slutt pakken
< p> Vi har tidligere diskutert problemet med å høyreklikke i Flash Player, og vi bestemte oss for at vi vil bruke Skift-tast eiendom musen begivenhet å bestemme wheather brukeren har shift-tasten nede, for å ligne høyreklikk funksjonalitet.
< p> Så fjerne spor uttalelse og legge en if-else blokk inne i zoneClicked () -funksjonen som følger:
if (event.shiftKey) {//ligne høyreklikke} else {//normal venstreklikke}
endre visibilty av bomb_mc MovieClip
minking /inkrementere verdien som vises i "miner" tekstfeltet etter en.
if (this.marked) {this.bomb_mc.visible = false; this.marked = false; this.parent.minesleft_txt.text = String (int (this.parent.minesleft_txt.text) + 1);} else {this.bomb_mc.visible = true; this.marked = true; this.parent.minesleft_txt.text = String (int (this.parent.minesleft_txt.text) - 1);}
if (state!) {Openzone ();}.. else {//game over ---- dette .parent.gameover_btn.visible = true; this.parent.again_btn.visible = true;}
hvis {Openzone ();} else {//game over ---- if (this.marked!) {this.parent (stat!). gameover_btn.visible = true; this.parent.again_btn.visible = true; }}
privat funksjon zoneclicked. (event: MouseEvent): void {if (event.shiftKey) {//ligne høyreklikke ---- if (denne .marked) {this.bomb_mc.visible = false; this.marked = false; this.parent.minesleft_txt.text = String (int (this.parent.parent.minesleft_txt.text) + 1); } Else {this.bomb_mc.visible = true; this.marked = true; this.parent.minesleft_txt.text = String (int (this.parent.parent.minesleft_txt.text) - 1); }} Else {//likne normal venstreklikke ---- if (state!) {Openzone (); } Else {//game over ---- if (this.marked!) {This.parent.gameover_btn.visible = true; this.parent.again_btn.visible = true; }}}}
Endre verdien på det åpenbarte ordentlig
Skjule block_mc (blå grafikk) MovieClip.
Fjerne highlight_mc MovieClip.
Deaktivering av hendelsen lyttere.
privat funksjon Openzone (): void {if (this.marked &!; &! this.revealed) {this.block_mc.visible = false; this.revealed = true; this.highlight_mc.visible = false; this.removeEventListener (MouseEvent.MOUSE_OVER, showHighlight); this.removeEventListener (MouseEvent.MOUSE_OUT, removeHighlight); this.removeEventListener (MouseEvent.CLICK, zoneClicked); }}
pakke {import flash.display.MovieClip; import flash.events.MouseEvent; public class Zone strekker MovieClip {public Var tilstand: Boolean; //sant inneholder mine, falsk ikke inneholder gruven offentlig Var avslørt: Boolean; offentlig Var merket: Boolean; offentlig Var xcor: UINT; offentlig Var ycor: UINT; offentlig Var zoneValue: int; offentlig funksjon Zone (corx: uint, Cory: uint) {this.state = false; this.revealed = false; this.marked = false; this.zoneValue = 0; this.xcor = corx; this.ycor = Cory; this.highlight_mc.visible = false; this.bomb_mc.visible = false; this.addEventListener (MouseEvent.MOUSE_OVER, showHighlight); this.addEventListener (MouseEvent.MOUSE_OUT, removeHighlight); this.addEventListener (MouseEvent.CLICK, zoneClicked); } //End of konstruktør privat funksjon showHighlight (event: MouseEvent): void {this.highlight_mc.visible = true; } Private funksjon removeHighlight (event: MouseEvent): void {this.highlight_mc.visible = false; } Private funksjon zoneClicked (event: MouseEvent): void {if (event.shiftKey) {//ligne høyreklikke if (this.marked) {this.bomb_mc.visible = false; this.marked = false; this.parent.minesleft_txt.text = String (int (this.parent.minesleft_txt.text) + 1); } Else {this.bomb_mc.visible = true; this.marked = true; this.parent.minesleft_txt.text = String (int (this.parent.minesleft_txt.text) - 1); }} Else {//normal venstreklikke if (state!) {Openzone (); } Else {//game over ---- if (this.marked!) {This.parent.gameover_btn.visible = true; this.parent.again_btn.visible = true; }}}} Privat funksjon Openzone () {if (! This.marked & &! This.revealed) {this.block_mc.visible = false; this.revealed = true; this.highlight_mc.visible = false; this.removeEventListener (MouseEvent.MOUSE_OVER, showHighlight); this.removeEventListener (MouseEvent.MOUSE_OUT, removeHighlight); this.removeEventListener (MouseEvent.CLICK, zoneClicked); }}} //End of class} //slutt pakken
Dealing med Rister og Nøstet Arrays
Seksjon 3: Lage styret
privat funksjon createBoard (): void {for (var i: Antall = 0; i < boardHeight; i ++) {var hzones: Array = new Array (); soner [i] = hzones; for (var j: Antall = 0; j < boardWidth; j ++) {}}}
privat funksjon createBoard (): void {for (var i: Antall = 0; i < boardHeight; i ++) {var hzones: Array = new Array (); soner [i] = hzones; for (var j: Antall = 0; j < boardWidth; j ++) {var newzone: Zone = new Zone (j, i); soner [i] [j] = newzone; board.addChild (soner [i] [j]); soner [i] [j] .x = j * 40 + 20; soner [i] [j] .Y = i * 40 + 20; }}}
), bruker vi dobbel rekke tilgangsoperatørsoner [i] [ ,,,0],j]
Seksjon 4:.. Plassering Mines
privat funksjons placeMines (). void {var bombsCounter: uint = numberOfMines; while (bombsCounter > 0) {bombsCounter--; }}
privat funksjons placeMines (): void {var bombsCounter: UINT = numberOfMines;. while (bombsCounter > 0) {var randomNumber: Number = Math.round (Math.random () * ((boardHeight * boardWidth) - 1)); Var ROWCOUNT: Number = Math.floor (randomNumber /boardWidth); Var Kolonner: Number = randomNumber% boardWidth; soner [ROWCOUNT] [Kolonner] .state = true; bombsCounter--; }}
vi få det totale antall soner, det ville være bredde ganger høyden av styret. siden vi har å gjøre med tabellindekser og de begynner med null, må vi trekke en fra dette nummeret
vi får et tilfeldig tall mellom null og den forrige nummer, og runde hele greia å få en hel heltall. denne måten får vi et tilfeldig heltall mellom null og den siste sonenummer trekkes av en
ved å dele tilfeldig tall som vi har fått fra forrige trinn ved bredden av styret (antall soner i hver rad), vil resultatet bli et blandet tall med en hel rekke del og en brøk. Det hele tall representerer det antall rader for målrettet sonen. det vil si indeksen for det soner matrise som representerer den vertikale indeksen for sonen innenfor gitteret. Vi får det nærmeste heltall som er mindre enn angitt antall bruker gulvet () funksjon av Math klassen
Resten fra forrige divisjonen vil være kolonnen telle for målrettet sone. dvs. indeksen for deloppstillingen inne i soner matrise som representerer den vertikale indeks for sonen i grid
anta at vi har gjort en 15x10 rutenett av soner, og kan anta at vi har generert nummer 83 tilfeldig. deretter dele 83 over bredden av styret, som er 15, vil være lik 5,5333. så ROWCOUNT vil være 5, og resten vil være 8, som er teller kolonnen.
soner [ROWCOUNT] [Kolonner] .bomb_mc.visible = true;
Var telleren: int = 0; while (teller. < 10) {..... teller ++}
Var teller: int = 0; while (teller < 10) {..... if (betingelse) {teller ++}}
private funksjons placeMines (): void {var bombsCounter: uint = numberOfMines; while (bombsCounter > 0) {var randomNumber: Number = Math.round (Math.random () * ((boardHeight * boardWidth) - 1)); Var ROWCOUNT: Number = Math.floor (randomNumber /boardWidth); Var Kolonner: Number = randomNumber% boardWidth; hvis {soner [ROWCOUNT] [Kolonner] .state = sant (soner [ROWCOUNT] [Kolonner] .state!); bombsCounter--; }}}
Seksjon 5: Plassering Numbers
Hvordan ville vi målrette de omkringliggende soner?
Ikke alle sonene har 8 soner som omgir dem. de fire soner i hjørnene har bare tre soner som omgir hver. import flash.events.MouseEvent; import flash.events.MouseEvent;