, opbygge en minestryger spil inden for 200 linjer kode,,,,, 8,,,,,,,,,,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss.,, i denne forelæsning, vil vi lære at planlægge og kode en minestryger spil med as3 og flash.kan vi gøre det på 200 linjer?lad os se...,,,, endelige resultat forpremiere, lad os tage et kig på det endelige resultat, vi arbejder hen imod:,, fordi flash spiller ikke støtter right-click, skift klik på pladser, tror du, indeholder miner for at markere dem.,, minestryger regler, hvis du er en minestryger spiller så sikkert, du kender spillets regler, - - men bare hvis du ikke, minestryger spil består af en gruppe af felter, hvor hver square, repræsenterer en region.hver region, enten indeholder en mine eller ej.din mission er at afsløre (eller "åben"), alle mine frie regioner og mærke dem, der indeholder miner.du åbner den region, som forlod du det, og at markere en region af skift klikke.nøglen til bestemmelse af, om en bestemt region indeholder en mine eller ej, er, at der for hver 3x3 net (9 regioner) i kvadrater, tallet skrevet på området i midten er antallet af miner i de 8 andre omgivende områder. så, da du startede din kamp, din første par klik vil afhænge af deres held. at finde min frie områder, men når du åbner en hel del regioner, kan du bruge logik, at finde de regioner, der indeholder miner. et godt eksempel for en minestryger spil, - - er den, at skibe med vinduer (version), en simpel søgning efter [online minestryger spil] vil også direkte til flere versioner, som alle har den samme opfattelse.ellers spil fra den endelige stg fil, indlejrede ovenfor.,, model minestryger et oop måde i en minestryger spil, hvis vi ønsker at tænke på spil fra ups synspunkt, kan vi overveje hver region som et objekt.vi vil kalde dette objekt et område, og alle de spil zoner vil være i en container objekt, som vi kalder "bord". for hver zone objekt, der er en masse ejendomme:,, angive, om det indeholder en mine eller ej.,,,,, hvis: det er afsløret, brugeren har åbnet zone.,, mærket, om brugeren har markeret den zone, som indeholder en mine.,, zonevalue: antallet af skriftlige inden for et område, der repræsenterer antallet af miner i de omkringliggende områder,.,, xcor:, den horisontale position i den pågældende zone i bestyrelsen.,, ycor: den lodrette position i zone i bestyrelsen.,, og det er sådan, vi skal opbygge det spil.der vil være en zone, klasse i forbindelse med en zone, film magasin i biblioteket, og vi vil instantiate størrelsen af de områder, vi har brug for fra vores vigtigste klasse for at gøre kampen.,, til højre klik problem inden for flash, en regelmæssig minestryger spil... en indfødt, der ikke er i - du kan få adgang til både mus knapper, så brugeren spiller kan åbne områder ved venstre klikker og mark dem lige klikke.hvis du var til at offentliggøre de spil, som en ansøgning, så du ville have adgang til alle de mus karakteristika, herunder retten og mellemste mus knapper, og du skal gøre det for bedre brugeroplevelse og spille spillet. men hvis du ønsker at offentliggøre den spil via flash spiller i browseren, så kan du ikke har adgang til de rigtige mus - knappen, idet retten mus knap åbner forbindelse menu for flash - spiller, så vi er nødt til at finde en løsning på dette problem. den løsning, jeg kom med, er ved hjælp af tastatur.jeg har gjort det ved at detektere skift nøgle, og fandt, at den letteste måde at gøre det på er ved at anvende, shiftkey, ejendomsret til, mouseevent, klasse.der er en masse andre egenskaber for nogle særlige tastatur taster som alat (windows) valg (mac) og ctrl (kommando) nøgle.jeg anbefaler, at du tjekke dem ud i den dokumentation, hjælp til mouseevent klasse, hvis du ikke allerede ved.,, indhold af fia, lad os se ned, som vi arbejder med.,, flash - fil indeholder de grafiske elementer kun spillet.,, note:, du kan begynde forfra med at skabe en ny. blp fil og tage dine egne grafik.eller du kan starte med fla indgår i kilde download. først. der er tre ting på scenen:,, gameover_mc:, film, klip, der indeholder de grafiske til kampen over skærmen.,, playagain_btn:, spille igen knap.,, minesleft_txt:, tekstboks, der viser antallet af miner venstre, foruden at det indeholder et symbol, zone, - - det er filmen magasin, der repræsenterer, en zone, objekt.dette symbol skal være knyttet til den zone, klasse, der skaber vi senere at tilføje den zone, funktionalitet og forventes at være 40x40 pixels.denne zone objekt, består af følgende:,, square rektangulær form.,, block_mc: den grafiske for zone objekt, før det er afsløret (åbnet).det er bare en 40x40 square med fasen virkning på det.,, bomb_mc: et enkelt grafisk skal anføres, når zonen er mærket som indeholdende en mine.,, num_txt: en tekst område viser antallet af miner i de omkringliggende områder,.,, highlight_mc: en simpel movieclip med en radial gradient for den virkning,.,,, del 1: fra de vigtigste klasse, skabe en ny klasse og kalder det vigtigste.gem det, som main.as, knytter det til flash - fil, som dokumentet klasse, og lad os dykke ind i koden. for det første: vi vil starte den klasse, ved at udvide den sprite klasse, der importerer de klasser, som vi må - i dette tilfælde vi vil importere, flash.display.sprite, &, flash.events.mouseevent, - om fastsættelse af visse variabler som følger:,, bord:, sprite objekt, der indeholder hele bestyrelsen, som vil indeholde alle de zone objekter.,, boardwidth:, hele tal, der repræsenterer antallet af områder over hele linjen vandret.,, boardheight:, hele tal, der repræsenterer antallet af områder over hele linjen vertikalt.,, numberofmines:, heltal, der repræsenterer antallet af områder, der indeholder miner over hele linjen.,, zoner:, array - objekt, der vil holde en refereiou for alle zone genstande inden for bestyrelsen.,, så indenfor konstruktør, vi vil aktivere de variabler, som vi har defineret nogle værdier.klassen skal se sådan ud:, pakke (import flash.display.sprite; import flash.events.mouseevent; offentlige klasse minesweeper_game udvider sprite {offentlige var zoner: system; offentlige var bord: sprite, offentlige var boardwidth: int; offentlige var boardheight: int; offentlige var numberofmines: int; offentlig funktion main() (//konstruktøren - zoner = nye array(); bord = nye sprite(); boardwidth = 15 boardheight = 15 numberofmines = 30) //ende af konstruktoeren} ////////////////udgangen af klasse) udgangen af næste pakke, vi har brug for for at udføre disse opgaver samt for starter spillet:,, at spillet er slut movieclip fra det stadium, at fjerne. de spiller igen knapper fra scenen., ændring af værdien af den "miner tilbage"i modsætning til antallet af markører endnu., at bestyrelsen objekt til bunden af display - liste med, addchildat() metode.,, og koden til at være organiseret som genanvendelige, vi kan dele en proces med at skabe spillet i tre dele: etablering af bestyrelsen og zoner i bord, at miner, og at de korrekte tal om frizoner (der ikke indeholder "). hvert skridt fra de tre dele vil være i en særskilt funktion; disse funktioner, createboard(),, placebombs(), og placenumbers(), som tidligere nævnt, så disse funktioner, og lader dem tomme for nu, og kalder dem i din konstruktøren henholdsvis inden for de samme. deres vigtigste klasse skal se sådan ud:, -kage (import flash.display.sprite; import flash.events.mouseevent; offentlige klasse minesweeper_game udvider sprite {offentlige var zoner: system; offentlige var bord: sprite, offentlige var boardwidth: int; offentlige var boardheight: int; offentlige var numberofmines: int; offentlig funktion main() (//konstruktøren - zoner = nye array(); bord = nye sprite(); boardwidth = 15 boardheight = 15 numberofmines = 30; gameover_btn.visible = falske again_btn.visible = falske minesleft_txt.text = streng (numberofbombs); addchildat (, 0). createboard(); placemines(); placenumbers();} //ende af konstruktoeren privat funktion createboard(): tomrum {} privat funktion placemines(): ugyldig (} privat funktion placenumbers(): tomrum {}} ////////////////udgangen af klasse) udgangen af pakken, nu vil vi stoppe med denne klasse, og begynde at zone klasse.,, afsnit 2: zone klasse, lad os starte med funktionaliteten i hver enkelt zone.først ned i filen, kæde, zone, film, klip med zone klasse.du kan gøre det med ikke at trykke, zone, film magasin i biblioteket og vælger, egenskaber, så åbner den avancerede del, hvis det ikke allerede åbnet, kontrol af eksport til actionscript og i klassen område maskinskrivning område. for det andet, mens vi er ved at skabe en zone klasse, bliver vi nødt til at test af vores fremskridt.så vil vi få et tilfælde af zonen genstand ved at tilføje disse linjer kode i den pågældende funktion i vores vigtigste klasse fil:, var testzone: zone = nye zone(); addchild (testzone); testzone. x = 150; testzone. y = 150; for det tredje at skabe en ny klasse og redde det, zone.as inden for den samme mappe som fla, så bliver vi nødt til at gøre vores zone klasse udvide movieclip klasse som følger.vi vil også beskæftige sig med en mus begivenheder, så du skal importere denne klasse samt., pakke (import flash.display.movieclip; import flash.events.mouseevent; offentlige klasse zone strækker sig movieclip {offentlige funktion zone() {} ////////////////udgangen af konstruktoeren} udgangen af klasse) //i - pakken, hvis du nu prøve den film du skal se et eksempel på scenen:,, dernæst vil vi definere de egenskaber, som vi har drøftet tidligere, når der er tale om zone formål. disse egenskaber vil være som følger:,,: en boolean - til at bestemme størrelsen af den zone (om den rent faktisk indeholder en mine eller ikke).denne ejendom vil blive fastsat som falsk, når zonen er instantierede, og når markedsføringen af miner, vi vil tilpasse denne ejendom, som er nødvendig, afslørede: en boolean - at afgøre, om brugeren har åbnet den zone eller ej.det vil også være falske, mærket: en boolean - at afgøre, om brugeren har markeret den zone, som indeholder en mine.på været det også vil blive fastsat til falsk.,, zonevalue:, et heltal, der repræsenterer antallet af min indeholder zoner omkring dette område.,, xcor:, et heltal, der repræsenterer den vandrette position i den pågældende zone i bestyrelsen.denne ejendom vil tage sin værdi fra en parameter, som vi vil vedtage, at konstruktøren.,, ycor:, et heltal, der repræsenterer den lodrette position i zone i bestyrelsen.denne ejendom vil også tage sin værdi fra en parameter, som vi vil vedtage, at konstruktøren samt.,, din klasse skal se sådan ud, pakke (import flash.display.movieclip; import flash.events.mouseevent; offentlige klasse zone strækker sig movieclip {offentlige var stat: boolean; //rigtigt, indeholder min, falsk ikke med min offentlige var afsløret. boolean, offentlige var xcor: uint; offentlige var ycor: uint; offentlige var mærket: boolean, offentlige var zonevalue: int; offentlige funktion zone (corx: uint, - uint) (this.state = falske this.revealed = falske this.marked = falske this.zonevalue = 0, this.xcor = corx; this.ycor = cory;} //ende af konstruktoeren -} //ende af klasse) //ende af pakken, note:,siden vi har gjort den pågældende acceptere de værdier, corx og cory, som parametre, er vi nødt til at komme ind i disse parametre i vores test, f.eks. det, vi har gjort, for ellers vil vi få en fejl.så tilpasse denne linje, når vi definerer de tilfælde, ved at tilføje et par positive tal sådan, var testzone: zone = ny zone (5, 6); siden er vi nødt til at skjule det, highlight_mc, movieclip - således at det forekommer kun, når musen er i zone objekt - - og vi skal gem den, bomb_mc, movieclip - således at det synes ikke, medmindre brugeren markerer den zone, som indeholder en mine.så tilføje følgende linjer til din klasse konstruktøren., this.highlight_mc.visible = falske this.bomb_mc.visible = falske, nu skal vi tilføje tilfælde lyttere for svævning funktioner samt mus klikke.så tilføje disse omstændigheder lyttere samt tilsvarende kontaktperson funktioner. din klasse burde se sådan ud:, pakke (import flash.display.movieclip; import flash.events.mouseevent; offentlige klasse zone strækker sig movieclip {offentlige var xcor: uint; offentlige var ycor: uint; offentlige var stat: boolean; //ægte = > indeholder min offentlige var afsløret: boolean, offentlige var mærket: boolean, offentlige var zonevalue: int; offentlige funktion zone (corx: uint, - uint) (this.state = falske this.revealed = falske this.marked = falske this.zonevalue = 0, this.xcor = corx; this.ycor = cory, this.highlight_mc.visible = falske this.bomb_mc.visible = falske. addeventlistener (mouseevent.mouse_over, visfremhæve). addeventlistener (mouseevent.mouse_out, removehighlight). addeventlistener (mouseevent.click, zoneclicked)} //ende af konstruktoeren det private funktion showhighlight (ref.: mouseevent): ugyldig (this.highlight_mc.visible = sandt.} privat funktion removehighlight (ref.: mouseevent): ugyldig (this.highlight_mc.visible = falske} privat funktion zoneclicked (tilfælde: mouseevent): ugyldig (spor ("zone sammen!");) ////////////////udgangen af klasse) udgangen af pakken, hvis du tester de film, du kan se fremhæve funktionalitet.,, lad os arbejde sammen med den, zoneclicked(), funktion, vi har tidligere drøftet problemet med lige klikke inden for flash - spiller, og vi besluttede, at vi vil bruge den. shiftkey, tilhører den mus tilfælde at afgøre, wheather brugeren har skiftet centrale presset til at ligne den højre klik funktioner. så fjerne spor og tilføje en erklæring, hvis anden blok i, zoneclicked(), fungerer som følger: hvis (ref. shiftkey) (//ligner lige klikke) andet (////////normale venstre klikke}, note: hvis du vil tilføje den højre klik funktionalitet i adobe luft, du skal dele. første del af hvis erklæring i ror otte klik begivenhed kontaktperson funktion. nu i højre klik del, er vi nødt til at lade brugerne mark den zone, som indeholder en mine eller fjerne mærkning for zone, hvis den tidligere var markeret.dette omfatter tre trin skal tilbageføres, hver gang:,, at mærket, tilhører den zone, ændrer visibilty, bomb_mc, movieclip., decrementing /forøgelse af værdien, der vises i "mines tilbage" textfield af.,, det er opnået ved anvendelse af følgende linjer.ret enkel. hvis (. mærket) (this.bomb_mc.visible = falske this.marked = falske this.parent.minesleft_txt.text = streng (int (. forælder. minesleft_txt. tekst) + 1)} andre (this.bomb_mc.visible = sandt. this.marked = sandt. this.parent.minesleft_txt.text = streng (int (. forælder. minesleft_txt. tekst) - 1.);}, konstatere, at hvis vi ønsker at kalde et objekt, der er på scenen fra zonen klasse, vi bruger, this.parent, ejendomsret til målet den fase, fra der, og du kan ramme den genstand, du vil have.senere, når vi laver alle de områder, de er pakket ind i en sprite beholder.så du bliver nødt til at komme tilbage og tilpasse disse trin objekter, opfordrer til bliver her. far. far,. (dette er nok ikke god oop praksis, men det er meget nyttigt for holder sig inden for vores 200 linje grænse.test den film og se vores fremskridt.klik på testzone flere gange med din vagt centrale presset.,, i den normale klikke del af hvis erklæring, vi har brug for at prøve, om den zone, indeholder en mine, ved hjælp af statslige, ejendom, - hvis det er sandt, så er det slut.ellers er vi nødt til at åbne den zone. sker dette gennem følgende linjer kode, hvis (!staten) (openzone();} andre (//game over det this.parent.gameover_btn.visible = sandt. this.parent.again_btn.visible = sandt.}, til åbning af zonen, vil vi flytte denne del i sin egen funktion, openzone(), for at holde vores kode organiseret og ren.også vi skal kalde denne funktion fra uden for den klasse, senere.så kalder det, og definere det ved udgangen af klassen. for "game over", vil vi gøre det simpelt, bare med gameover movieclip og spille igen?hvis du ønsker at udvide dette til noget robust, du kan skabe en ny begivenhed, game_over, afsendelse fra her og lytte til denne begivenhed fra deres vigtigste klasse, men det ligger uden for omfanget af denne forelæsning. men der er en lille smule fanget i logikken i den foregående linjer.kan du forstå det?det sker, hvis brugeren på et område, som han allerede har udtalt - den eneste, der ved, hvordan man spiller nok ikke vil gøre det, men det kan ske ved en fejl - - så vi kan forhindre det i at denne del med en betinget af, at kontrollere, om den zone er mærket eller ej, som følger: hvis (!staten) (openzone();} andre (//spillet er slut, - - hvis (!denne. mærket) (this.parent.gameover_btn.visible = sandt. this.parent.again_btn.visible = sandt.}}, så hele din, zoneclicked(), funktion skal være sådan her, privat funktion zoneclicked (ref.: mouseevent): ugyldig (hvis (ref. shiftkey) (//ligner lige klikke - hvis (. mærket) (this.bomb_mc.visible = falske. this.marked = falske this.parent.minesleft_txt.text = streng (int (det. far. far. minesleft_txt. tekst) + 1)} andre (this.bomb_mc.visible = sandt. this.marked = sandt. this.parent.minesleft_txt.text = streng (int (det. far. far. minesleft_txt. tekst) - 1)}} andre (//ligner normale venstre klik - - hvis (!staten) (openzone();} andre (//spillet er slut, - - hvis (!denne. mærket) (this.parent.gameover_btn.visible = sandt. this.parent.again_btn.visible = sandt.}}}}, test filmen for at se vores fremskridt. nu vil vi arbejde på det åbne område, så definere, openzone(), funktion, hvis de ikke allerede har gjort dette, og lad os få vores hoveder med logikken i denne del, til åbning af en zone, som der skal gøres:,, at værdien af de afslørede propery., der skjuler den, block_mc (blå grafisk) movieclip. fjernelse af, highlight_mc, movieclip., invaliderende tilfælde lyttere.,, men vi ønsker at udføre disse foranstaltninger kun, når området er ikke mærket.- ellers, hvis brugeren fejlagtigt markerede en zone, der ikke indeholder mit, så ville det være åbnet, hvis han klikkede på den i mærket stat, hvilket er, hvad vi ikke ønsker.også, hvis det allerede er afsløret, så der er ingen grund til at gentage disse skridt igen.så vil vi undersøge, om disse to betingelser i en, hvis udtalelse, før disse skridt. så den funktion vil se sådan ud:, privat funktion openzone(): ugyldig (hvis (!this.marked & &!denne. afsløret) (this.block_mc.visible = falske this.revealed = sandt. this.highlight_mc.visible = falske. removeeventlistener (mouseevent.mouse_over, showhighlight). removeeventlistener (mouseevent.mouse_out, removehighlight). removeeventlistener (mouseevent.click, zoneclicked)}}, okay, nu har vi fremsat de fleste af de funktioner, vi har brug for til den zone, klasse.vi vil stoppe på dette punkt og vil komme tilbage senere, hvis det er nødvendigt.klassen skal se sådan ud:, pakke (import flash.display.movieclip; import flash.events.mouseevent; offentlige klasse zone strækker sig movieclip {offentlige var stat: boolean; //rigtigt, indeholder min, falsk ikke med min offentlige var afsløret: boolean, offentlige var mærket: boolean, offentlige var xcor: uint; offentlige var ycor: uint; offentlige var. zonevalue: int; offentlige funktion zone (corx: uint, - uint) (this.state = falske this.revealed = falske this.marked = falske this.zonevalue = 0, this.xcor = corx; this.ycor = cory, this.highlight_mc.visible = falske this.bomb_mc.visible = falske. addeventlistener (mouseevent.mouse_over, showhighlight). addeventlistener (mouseevent.mouse_out, removehighlight). addeventlistener (mouseevent.click, zoneclicked)} //ende af konstruktoeren privat funktion showhighlight (ref.: mouseevent): ugyldig (this.highlight_mc.visible = sandt.} privat funktion removehighlight (ref.: mouseevent): ugyldig (this.highlight_mc.visible = falske} privat funktion zoneclicked (ref.: mouseevent): ugyldig (hvis (ref.. shiftkey) (//ligner lige klikke, hvis dette. mærket) (this.bomb_mc.visible = falske this.marked = falske this.parent.minesleft_txt.text = streng (int (. forælder. minesleft_txt. tekst) + 1)} andre (this.bomb_mc.visible = sandt. this.marked = sandt. this.parent.minesleft_txt.text = streng (int (minesleft_txt. forælder.. tekst) - 1);}} andre (//normale venstre klikke, hvis!staten) (openzone();} andre (//spillet er slut, - - hvis (!denne. mærket) (this.parent.gameover_btn.visible = sandt. this.parent.again_btn.visible = sandt.}}}} privat funktion openzone() (hvis (!this.marked & &!denne. afsløret) (this.block_mc.visible = falske this.revealed = sandt. this.highlight_mc.visible = falske. removeeventlistener (mouseevent.mouse_over, showhighlight). removeeventlistener (mouseevent.mouse_out, removehighlight). removeeventlistener (mouseevent.click, zoneclicked)}}} ////////////////udgangen af klasse) udgangen af pakken, 63 linjer kode...godt.kan vi gøre det gennem det, der er tilbage til os, fra 200 - linjer?.:), dernæst vil vi vende tilbage til vores vigtigste klasse.,, der beskæftiger sig med net og indlejrede systemer, nu tilbage til vores vigtigste klasse, glem ikke at fjerne de budgetposter, der gør testen zone.,, at gøre et net eller en serie af genstande i en tabel, struktur, vil vi foretage en system, der vil holde en henvisning til alle de andre genstande.dette system vil repræsentere hele nettet eller tabel - i vores tilfælde, er det system, som vi har defineret zoner på været den vigtigste klasse. dette system vil indeholde de systemer, hvor hver radioteleskop vil repræsentere en fuldstændig række inden for nettet eller tabel.antallet af subarrays inden for det primære system udgør antallet af linjer inden for nettet.denne artikel for mere information. hver eneste af de pågældende systemer vil indeholde en række elementer, hvor hver eneste af disse elementer vil repræsentere et sted eller celle inden for nettet eller tabel (i dette tilfælde vil det være zone).antallet af elementer i hver radioteleskop repræsenterer antallet af søjler inden for nettet eller tabel. dette sker ved hjælp af to satte sig for, løkker, hvor inden for hver udgave af den første løkke, skaber vi et radioteleskop og loop gennem den anden løkke, for at gøre de elementer i den række., note det kan du bruge dette hierarki for de genstande, som de ønsker at arrangere i et kvadratnet.,, afsnit 3: oprettelse af bestyrelsen, nu inden for, createboard(), funktion, vil vi gøre, for at løkker, loop gennem højden af bestyrelsen. inden for hver udgave af det, vi vil gøre en sub - system, der vil være en fuldstændig vandret linje i zoner (, hzones,), at dette system til moderselskabet, zoner, array i indekset for den ro, og såvi vil lave en satte sig for, loop - som følger:, privat funktion createboard(): ugyldig (for (var - jeg: antal = 0. jeg < boardheight; jeg + +) (var - hzones: array = nye array(); zoner [i] = hzones; (var - j: antal = 0. j < boardwidth; j + +) {}}}, nu inden for hver udgave af den anden løkke, skaber vi et nyt område genstand - passerer det, corx, &, cory, parametre - tilføje det til den dermed forbundne /nuværende hzones radioteleskop, og så tilføje det til bestyrelsen sprite objekt container, og justere sin holdning.as follows:, private function createBoard():void{ \tfor(var i:Number = 0; i < boardHeight; i++){ \t\tvar hzones:Array = new Array(); \t\tzones[i] = hzones; \t\tfor(var j:Number = 0; j < boardWidth; j++){ \t\t\tvar newzone:Zone = new Zone(j, i); \t\t\tzones[i][j] = newzone; \t\t\tboard.addChild(zones[i][j]); \t\t\tzones[i][j].x = j*40 + 20; \t\t\tzones[i][j].y = i*40 + 20; \t\t} \t} },,Note that, to access a single element in an array where this array is nested within a second array (making a ,multidimensional array,), we use the double array access operator ,zones[i][j],.,,Also note that, we have made our zones as children within a display object container - which is the ,board, Sprite object - so we need to modify every call to any stage object fra zonen klasse fra, this.parent, til det. far. far, for ellers vil vi få en henvisning fejl.du kan gøre det enten manuelt eller ved hjælp af "og erstatte" element i din redaktør. nu prøve din film at se fremskridt i vores arbejde.,, afsnit 4: placering af miner, godt, vi har gjort med alle områder, men ingen af dem indeholder ingen miner.så er det tid til at sætte nogle miner. tanken om, at miner er at vælge en række tilfældige zoner, og ændre deres tilstand, og ejendom fra falske sand (hvilket betyder, at de indeholder hver en mine). antallet af områder, bliver ændret, vil svare til det, numberofmines ejendom, som vi har fastlagt ved begyndelsen af det vigtigste klasse. så vil vi begynde at fungere med en, mens, loop - selvom jeg altid gerne bruge for, løkker, jeg brugte, mens, loop - af en grund, som der vil blive redegjort kort - og loop vil tælle ned til nummer miner, der er taget fra, numberofmines, ejendom, privat funktion placemines(): ugyldig (var - bombscounter: uint = numberofmines; mens (bombscounter > 0) (bombscounter.;), hvordan får vimålet er en tilfældig zone for vores net af zoner?ja, det er gjort af en række af simpel matematik operationer for at få deres x - og y - poster i bestyrelsen.lad mig vise dig koden for det første, og så vil jeg forklare det i trin, privat funktion placemines(): ugyldig (var - bombscounter: uint = numberofmines; mens (bombscounter > 0) (var - randomnumber: antal = matematik. runde (matematik. random() * (boardheight * boardwidth) - 1) og var rowcount: antal = matematik. etage (randomnumber /boardwidth) var columncount: antal = randomnumber% boardwidth; zoner [rowcount] [columncount]. statens = sandt. bombscounter.;), først:, får vi det samlede antal områder, vil det være den bredde gange højden af bord.da vi har at gøre med array - indeks, og de begynder ved nul, er vi nødt til at trække en fra dette nummer.,, andet: vi får et tilfældigt tal mellem nul og antal og runde det hele, for at få et helt tal.den måde, vi får en tilfældig række mellem nul og sidste område nummer trækkes af et tredje:.,,, ved at dividere de tilfældige tal, som vi har fået fra det forudgående trin af bredden af bord (antal zoner inden for hver linje), vil resultatet være en blandet nummer med en række del og en del.det hele tal repræsenterer linjen tæller for målrettede zone.dvs. indekset for, zoner, system, der repræsenterer den vertikale indeks for zone inden for nettet.vi får det nærmeste hele tal, der er mindre end det angivne antal med, floor(), funktion, matematik klasse.,, 4:, resten fra den tidligere opdeling er kolonnen tæller for målrettede zone.dvs. indekset for radioteleskop i, zoner, system, der repræsenterer den vertikale indeks for zone inden for nettet, f.eks.: hvis vi lavede en 15x10 net af zoner, og lad os gå ud fra, at vi har skabt nummer 83 tilfældigt.derefter dividere 83 i bredden af bestyrelsen, der er 15, vil svare til 5.5333.så rowcount vil være 5, og resten vil være på 8, hvilket er kolonnen regne. nu kan vi target zone let som zoner [rowcount] [columncount], at statens ejendom til korrekt, og så på den fortsatte loop. med henblik på at se effekten af det, kommer til at fungere denne linje, der vil vise, bomb_mc, movieclip for de pågældende zoner - til demonstration og se vores fremskridt - og afprøve den film:, zoner [rowcount] [columncount]. bomb_mc.visible = sandt;,, hvis du klikker på nogen af de miner, som er den, bomb_mc, moviclip synlige, - tag spillet over besked.godt, vi gør det godt. men der er et andet problem, som vi må løse: hvad sker der, hvis et eller flere specifikke tal var, der genereres tilfældigt mere end én gang?da antallet af områder, som vil indeholde miner vil være mindre end det angivne antal.det er nok kommer til at ske, når man skaber en masse tilfældige tal.hvis du testet din film, som den er nu, og med deres nummer, kunne du være heldig at få det nøjagtige antal... hvis du er, så prøv det igen, og jeg kan forsikre dem om, at du vil se dette problem i øjnene, især hvis de har øget antallet af miner. det løser dette problem, vil vi kontrollere, om staten den zone, der er genereret i en, hvis betinget.hvis det er sandt, så denne zone er blevet udarbejdet før og stat, er blevet ændret.i hvis blok, vil vi ikke blot få en erklæring om, at ændringer i området, men også en erklæring om, at bekæmpelse af og formindskelser loop - og kun, hvis den nuværende område ikke allerede har sat til sand.det er derfor, jeg brugte en mens loop i stedet for loop på denne måde modvirke ikke dekrement, medmindre en ny zone er skabt og stat har ændret. yderligere forklaring: normalt er en typisk, mens loop bliver som følger:, var imod: int = 0, mens (mod < 10) {...mod + +), men i at disken ændrede erklæring inden for en betinget, det vil fortsætte med at sløjfe, så længe den betingelse ikke er opfyldt, uden at ændre den strid, som følger:, var imod: int = 0, mens (mod < 10) {...hvis (betingelse) (mod + +), så den endelige, placemines(), funktion vil se sådan ud:, privat funktion placemines(): ugyldig (var - bombscounter: uint = numberofmines; mens (bombscounter > 0) (var - randomnumber: antal = matematik. runde (matematik. random() * (boardheight * boardwidth) - 1) var rowcount: antal = matematik. etage (randomnumber /boardwidth) var columncount: antal = randomnumber% boardwidth; hvis (!zoner [rowcount] [columncount]. statens) {zoner [rowcount] [columncount]. statens = sandt. bombscounter...;}}}, afsnit 5: placering af numre, nu det sidste skridt i den centrale funktioner for en minestryger spil er at give brugeren en anelse om, hvordan du finder zoner indeholder miner, bruger tal.så i stedet for altid, der er forsynet med nummer 7 (som vi brugte under udformningen af for at se, hvordan den zone, ville se), vi vil ændre det i, placenumbers(), funktion. tanken bag, at tallene er at finde antallet af områder omkring en bestemt zone i bestyrelsen, at en stat, sandt - dvs. at indeholde en mine - - fra alle de otte områder omkring dette område. men der er et par små problemer foran os:,, hvordan ville vi mål de omkringliggende områder?ikke alle områder har 8 zoner omkring dem.de fire områder i hjørnerne er kun 3 omgivende områder.de er på fire sider (venstre, højre, top & bunden) andre end de i hjørnerne er 5, omgivende områder.de andre har 8 omgivende områder. for at løse dette problem, vil vi lade, placenumbers(), funktion i et stykke tid, og at man hjælper funktion at få henvisninger til de omkringliggende områder, baseret på et enkelt område, som vi vil komme til at fungere.jeg ringede til denne funktion, getneighbours(),.denne funktion vil acceptere en zone, objekt som en parameter, og det vil vende tilbage til et system, der indeholder henvisninger til de omkringliggende områder for den døde zone.det, vi vil gøre extense anvendelse af, xcor, &, ycor, egenskaber for zonen objekt.(bemærk, at denne funktion vil
bygge en minestryger spil inden for 200 linjer kode
Next Page:forståelse spillet loop