web, hvordan man bygger en pyton bot, der kan spille web - spil,,,,, 86,,,,,,,,, 63,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss.,, i denne forelæsning vil vi undersøge in og out for at bygge en computer vision baseret spil bot i pyton, som vil være i stand til at spille den populære flash spil sushi gå rundt.du kan bruge de teknikker, lærte i denne lektion i at skabe botter til automatisk at teste deres egen hjemmeside spil.,,, endelige resultat forpremiere, lad os tage et kig på det endelige resultat, vi arbejder hen imod:,,, forudsætninger, denne forelæsning, og alle - koden i det, kræver, at et par ekstra pyton biblioteker monteres.de giver en god pyton omlægning til en flok med c - kode, som i høj grad letter processen og hastigheden af bot scripting. nogle af kodeksen og biblioteker er vinduer specifikke.der kan være mac eller linux - ækvivalenter, men vi vil ikke dække dem i denne forelæsning. du får brug for at downloade og indsætte følgende biblioteker:,, python - bibliotek, numpy, pywin, alle de ovennævnte har selv installatører og kører dem automatisk vil installere modulerne i din, jeg l \\ sted pakninger, fortegnelse, i teorien, justere deres, pythonpath, i overensstemmelse hermed.men i praksis er det ikke altid sker.vil du begynde at modtage, import fejl, beskeder efter montering, du får nok brug for manuelt at justere deres miljø variabler.yderligere oplysninger om tilpasning af sti variabler kan ses her.,, den endelige værktøj, vi har brug for, er en anstændig maling - program.jeg foreslår, paint.net som en fremragende fri valg, men et program med magthavere, der viser deres målinger i antal pixels kan anvendes. vi vil bruge et par kampe som eksempler på vejen, indledning, denne lektion er skrevet til gav en grundlæggende introduktion til opbygningen af robotter, der spiller browser baseret på spil.den holdning, som vi tager sandsynligvis lidt anderledes end hvad de fleste ville forvente, når de tænker på en robot.i stedet for at lave et program, der sidder mellem kunden og server intravenøse kode (som et jordskælv eller c /n - bot), vores robot vil sidde alene på "uden for".kan vi stole på edb - vision - agtig teknikker og vinduer api opfordringer til at indsamle nødvendige oplysninger og skabe bevægelighed. med denne tilgang, vi mister lidt raffineret detaljer og kontrol, men at gøre det på kortere dev og brugervenlighed.automatisering af en specifik spil funktion kan ske på et par linjer kode, og en ægte, start til slut bot (for et enkelt spil) kan være sat ud i et par timer, ved denne hurtige fremgangsmåde er af en sådan art, at, når du bliver bekendt med, hvad computeren kan nemt at se, - begynder at lege lidt anderledes.et godt eksempel er fundet i puzzle spil.en fælles konstruktion omfatter udnyttelse af menneskelige hastighedsbegrænsninger på at tvinge dig til en mindre end optimal løsning.det er sjovt og nemt) at ødelægge disse spil af scripting i bevægelser, som aldrig kan ske ved et menneske. disse robotter er også meget nyttigt til afprøvning af enkle spil - i modsætning til et menneske, en bot vil ikke kede dig med den samme situation igen og igen, at kildekoden til alle. læren eksempler, samt for en af de afsluttede eksempel bot, findes her. og have det sjovt!,, trin 1: skabe en ny slange projekt, i en ny mappe, right-click og vælge nye > tekst dokument,.,, når der omdøbe den fil fra nye tekst dokument "til" quickgrab. py '(uden citater) og bekræfte, at de ønsker at ændre filnavnet udvidelse., endelig right-click på vores nye fil og udvælge "klippe med tomgang" fra forbindelse menu til at iværksætte den redaktør, trin 2: oprettelse af din første billede, kan vi begynde at arbejde på vores bot, således at de grundlæggende skærmbillede funktion.når den er oppe at køre, vi går gennem det linie for linie, som denne funktion (og dets mange iterationer) vil udgøre rygraden i vores kodeks. i quickgrab.py anføre følgende kode:, import imagegrab import os importere tid def screengrab(): rubrik = () im = imagegrab. grab() redde (ad ham.. getcwd() + '). full_snap__ + str (int (. time()) +. men heller ikke dér er menneskene sikre, men heller ikke dér er menneskene sikre) def main(): screengrab(), hvis __name__ = = "__main__": main(), at dette program skulle give jer en fuld billede af skærmen, område:,, den nuværende kodeks tager fuld bredde og højde på skærmen - område og lagrer den som en men heller ikke dér er menneskene sikre i deres nuværende arbejde fortegnelse., lad os gå gennem den kode for at se, hvordan det fungerer. de første tre linjer:, import.agegrab import os import, er rammende navngivne import erklæringer.disse fortælle pyton til belastning i de anførte moduler på runtime.det giver os adgang til deres metoder via, module.attribute, syntaks. det første modul er en del af den pyton image bibliotek, indsatte vi tidligere.som navnet antyder, at det giver os den grundlæggende skærm og sludrer funktionalitet vores robot vil stole på, anden linje import os (operativsystemet) modul.dette giver os mulighed for let at navigere rundt om vores styresystem er telefonbøger.det vil komme i handy, når vi begynder at organisere aktiver i forskellige mapper. det endelige indførsel er indbygget tid modul.så brug det meste til stempling af den nuværende situation på billeder, men det kan være meget nyttig som en timer for robotter, der skal begivenheder udløst over et bestemt antal sekunder. de næste fire linjer udgør kernen i vores screengrab(), funktion, def screengrab(): rubrik = ('). grab() im = imagegrab.. - (os. getcwd() + «). full_snap__ + str (int (. time()) +. men heller ikke dér er menneskene sikre, men heller ikke dér er menneskene sikre), første linje, def screengrab(), definerer navnet på vores funktion.den tomme parenteser mener det forventer ingen argumenter., 2, box = (), tildeler en tom tuple til en variabel, der hedder "kasse".vi vil fylde det med argumenter i det næste skridt, linje 3, im = imagegrab. grab(), skaber en fuld billede af skærmen og returnerer en rgb - image for eksempel im, linje 4, kan blive lidt besværligt, hvis du ikke er bekendt med, hvordan den tid, modul fungerer.den første del, im. redde (, kalder "redde" metode fra det billede, klasse.det forventer to argumenter.for det første er det sted, hvor for at redde den fil, og den anden er filformat. her sætter vi den placering af første kald, s. getcwd(),.det bliver den nuværende fortegnelse er koden, der løber fra og returnerer det som en snor.vi tilføjer en, +.dette vil blive anvendt i mellem hvert nyt argument for at concatenate alle trådene sammen. det næste stykke '). full_snap__, give sagen en simpel beskrivende navn.(da backslash 9 er en flugt karakter i pyton, er vi nødt til at tilføje to af dem for at undgå, at en af vores breve). næste er den behårede del:, str. (int (. time())).det udnytter pyton er indbygget type metoder.vi vil forklare dette stykke arbejde indefra:,,. time(), returnerer den række sekunder siden epoke, der er givet som en type flyde.da vi skaber et filnavn, vi kan ikke have decimal derinde, så vi omdanne det til et heltal, ved at pakke det ind, int(),.dette får os tæt på, men pyton kan ikke concatenate type, int, type, snor,, så de sidste skridt er at pakke alt i den, str(), funktion, til at give os et godt anvendelige timestamp for file navn.her er der kun tilbage at tilføje den udvidelse, som en del af den snor: +. men heller ikke dér er menneskene sikre, og at det andet argument, der igen er udvidelse er type: ", men heller ikke dér er menneskene sikre". den sidste del af vores kode definerer den funktion, main(), og fortæller det til, screengrab() når det er fungerer. og her til sidst, er en pyton - konvention, der kontrollerer, om manuskriptet er på højeste niveau, og hvis det gør det muligt at flygte.oversat betyder det simpelt hen, at det kun er ansvarlig for, main(), hvis den drives af sig selv.ellers - hvis f.eks. den er ladt som et modul, som en anden pyton manuskript - det kun leverer sine metoder i stedet for at gennemføre sit kodeks., def main(): screengrab(), hvis __name__ = = "__main__": main(), trin 3: omskreven firkant,, imagegrab. grab(), funktion, accepterer et argument, der definerer en tegnkasse.det er en tuple koordinater efter mønster (x, y, x, y), hvor de første par værdier (x, y. definerer den øverste venstre hjørne i den boks, det andet par... x, y, fastlægger de nederste højre.,,, der kombinerer disse giver os kun at kopiere den del af skærmen, vi har brug for. lad os gøre det i praksis, for det eksempel, vi skal bruge en leg, der hedder sushi gå rundt.(meget, afhængig af det.du er blevet advaret.) åbne spillet i en ny regning og tage et billede af vores eksisterende, screengrab(), kode:,, et billede af den fulde skærmareal.,, trin 4: koordinater, nu er det tid til at udvinde nogle koordinater for vores tegnkasse., åben din seneste snapshot i et billede redaktør.,, (0,0) holdning er altid ligger i den øverste venstre hjørne i billedet.vi ønsker, at blok x - og y - koordinater, således at vores nye øjebliksbillede funktion fastsættes (0,0) til den yderste venstre hjørne af spil spiller område. begrundelsen for dette er dobbelt.for det første er at finde in-game koordinater er meget nemmere, når vi kun skal tilpasse værdier i relation til området og hele området af skærmen beslutning.andet, tager en mindre del af skærmen, reducerer den forarbejdning, generalomkostninger, der kræves.fuld screen - fotos, producerer en del af data, hvilket kan gøre det svært at komme ind på det flere gange pr. sekund, hvis ikke gjort, så hersker, din redaktør, og zoom ind på det øverste hjørne af området, indtil du kan se det i detaljer:,, svæv din markør i første pixel i området og tjek koordinaterne vises på regent.de vil blive de første to værdier i rubrik tuple.på min særlige maskine er disse værdier, 157, 162,., sejle til den nederste kant på området til bunds par koordinater.,, det viser koordinaterne 796 og 641.ved at kombinere dem med vores tidligere par giver en kasse med de koordinater, (157162796641). lad os tilføje det til vores kodeks., import imagegrab import os importere tid def screengrab(): rubrik = (157346796825) im = imagegrab. tag (rubrik) im. redde (os. getcwd() + «). full_snap__ "+ str (int (. time()) +. men heller ikke dér er menneskene sikre, men heller ikke dér er menneskene sikre) def main(): screengrab(), hvis __name__ = =" __main__ ": main() på linje 6. vi har ajourført tuple holde koordinater i området. - og den kode.åbne nye reddede image, og du skal se:, held og lykke!en perfekt ud af området.vi vil ikke altid er nødt til at gøre denne form for intensiv jagt for koordinater.når vi kommer ind i win32api vil vi gennemgå nogle hurtigere metoder til fastsættelse af koordinater, når vi ikke har brug for pixel perfekte præcision.,, løntrin 5: planlægning for fleksibilitet, som det står nu, har vi svært krypterede koordinater i forhold til vores nuværende arrangement, hvis vores browser, og vores beslutning.det er generelt en dårlig idé at svær kode koordinater på denne måde.hvis man f.eks. ønsker at løbe den kode på en anden computer - eller sige et nyt ad på webstedet skift stilling i området lidt - ville vi have manuelt og møjsommeligt løse alle vores koordinere opkald., så vi kommer til at skabe to nye variabler, x_pad, og y_pad,.disse vil blive anvendt til opbevaring af forholdet mellem spillet område og resten af skærmen.det vil gøre det meget let at havn koden fra sted til sted for hver ny koordinere vil være i forhold til de to globale variabler, vil vi skabe, og til at tilpasse sig til ændringer i skærmareal, alt, hvad der er behov for at justere disse to variabler, eftersom vi allerede har gjort de målinger, der fastsætter de puder for vores nuværende system er meget ligetil.vi skal sætte de puder til opbevaring af placeringen af den første pixel uden for området.fra de første par x, y - koordinater i vores bokse, tuple, fratræk a, 1, for hver værdi.So ,157, becomes ,156,, and ,346, becomes ,345,.,Let's add this to our code., Globals ------------------ x_pad = 156 y_pad = 345,Now that these are set, we'll begin to adjust the box tuple to be in relation to these values., def screenGrab(): box = (x_pad+1, y_pad+1, 796, 825) im = ImageGrab.grab() im.save(os.getcwd() + '\\\\full_snap__' + str(int(time.time())) + '.png', 'PNG'),For the second pair, we're going to first subtract the values of the pads (156 and 345) from the coordinates (796, 825), and then use those values in the same ,Pad + Value, format., def screenGrab(): box = (x_pad+1, y_pad+1, x_pad+640, y_pad+479) im = ImageGrab.grab() im.save(os.getcwd() + '\\\\full_snap__' + str(int(time.time()) +. men heller ikke dér er menneskene sikre, men heller ikke dér er menneskene sikre), her, x, koordinere bliver 640 (769-156), og i bliver 480 (825-345), det kan virke en smule overflødigt i starten, men gør det ekstra skridt sikrer nem vedligeholdelse i fremtiden.,, trin 6: at skabe en docstring, før vi går videre, vil vi skabe en docstring på toppen af vores projekt.da de fleste af vores kode vil være baseret på specifikke skærm koordinater og forhold til koordinater, det er vigtigt at vide, under hvilke omstændigheder vil alt sammen korrekt.for eksempel, f.eks. aktuelle beslutning, browser, toolbars mulighed for (da de ændrer browser område), og eventuelle tilpasninger, der er nødvendige for at center området på skærmen, påvirker den relative position af koordinater.under alt dette dokumenteres i høj grad, bidrager til fejlfinding proces, når det kører din kode på tværs af flere browsere og computere, en sidste ting at være opmærksomme på, er de stadig skiftende reklameplads på populære spil lokaliteter.hvis alle dine tag kalder pludselig stop opfører sig som forventet, en ny tilføje lidt at flytte ting på skærmen er et godt væddemål. som et eksempel, jeg har følgende bemærkninger på toppen af min pyton kode: "," "alle koordinater antager en skærm, beslutning af 1280x1024 og krom maksimeres med bookmarks toolbar aktiveret.ned nøgle er blevet ramt 4 gange center spille område i browseren.x_pad = 156 y_pad = 345 spille areal = x_pad + 1, y_pad + 1 796, 825 "" ", falder alle oplysninger i begyndelsen af din pyton - sagen gør det hurtigt og let at kontrollere alle dine indstillinger og skærm tilpasning uden at kikke på din kode forsøger at huske, hvor du er oplagret det specifikke x-coordinate.,, trin 7: drejning, quickgrab.py, til et nyttigt redskab, vi er på vej til bord vores projekt på dette punkt, at skabe to filer: en til at holde alle vores bot er kode, og den anden til at fungere som en generel skærm skød nytteværdi.vi kommer til at tage en del af skærmen skud, som vi på jagt efter koordinaterne, så at have en separat modul klar vil gøre tingene meget hurtigere, redde og tæt på vores nuværende projekt. i din mappe, right-click, quickgrab.py og vælge "kopi" fra menuen.,, og nu right-click vælg "lim" fra menuen, udvælge den kopierede fil og omdøbe den til "kode. py ', fra nu af alle nye kode tilføjelser og ændringer, vil blive foretaget i code.py.quickgrab.py nu vil fungere som et rent billede værktøj.vi er bare nødt til at gøre en sidste ændring: ændre fil - forlængelse fra. og at. pyw og bekræfte de ændringer, er denne udvidelse fortæller pyton løbe manuskriptet, uden at der blev konsol.så nu, quickgrab.pyw lever op til sit navn.dobbeltklik på sagen, og det vil stille udføre sine kode i baggrunden og redde et billede til jeres arbejde fortegnelse., beholde spillet åben i baggrunden (være sikre på, at dæmpe det før med musik driver dig til vanvid, og vi vil vende tilbage til det om lidt.vi har et par idéer /redskaber til at indføre, inden vi kommer til at kontrollere det på skærmen.,, trin 8:, win32api, - en kort oversigt, der arbejder med, win32api, kan være en smule skræmmende i starten.det var de små vinduer, c - kode - der er heldigvis meget veldokumenteret, men en lille som en labyrint at navigere gennem din første par gå arounds. før vi begynder scripting alle nyttige foranstaltninger, kommer vi til at se nærmere på nogle af de api - funktioner, som vi kan stole på.når vi har en klar forståelse af hver parameter, vil det være let at tilpasse dem til det formål har vi brug for in-game.,, win32api. mouse_event():, win32api. mouse_event (dwflags, dx, undersøgelse, dwdata), den første parameter, dwflags, definerer "aktion" af mus.det styrer ting såsom bevægelighed, klikker, scroller, osv. følgende oversigt viser de fælles parametre, mens scripting bevægelighed.,, dwflags:,,, win32con. mouseeventf_leftdown,,, win32con. mouseeventf_leftup,,, win32con. mouseeventf_middledown,,, win32con. mouseeventf_middleup,,, win32con. mouseeventf_rightdown,,, win32con. mouseeventf_rightup,,, win32con. mouseeventf_wheel, hvert navn er selvforklarende.hvis du ville sende et virtuelt right-click, du ville bestå, win32con.mouseeventf_rightdown, til, dwflags parameter. de næste to parametre, brugte, og tør, beskriver de mus er absolut holdning i x - og y - aksen.mens vi kan bruge disse parametre for scripting mus bevægelse, de bruger et koordinatsystem, anderledes end den, vi har brugt.så lader vi dem, der er fastsat til nul, og anvende en anden del af api - for vores mus går behov. den fjerde parameter, dwdata,.denne funktion er anvendt, hvis, og kun hvis), dwflags, indeholder mouseeventf_wheel,.ellers kan udelades eller sat til nul., dwdata, angiver mængden af bevægelse på din mus rullen hjul. et lille eksempel at befæste disse teknikker: hvis vi forestiller os, at en kamp med en våben udvælgelse system svarende til halvdelen af livet, 2 - hvor våben kan udvælges af roterende mus hjul - at vi ville komme med følgende funktion for at tjene på det våben liste:, def browseweapons(): weaponlist = ['crowbar,'gravity pistol,'pistol "... for jeg i weaponlist: win32api. mouse_event (win32con. mouseeventf_mouseeventf_wheel, 0,0120), vi vil simulere nedad mus hjul til at navigere vores teoretiske våben opførelse på listen, så vi har bestået, mouseeventf_wheel, værsgo til dwflag.vi har ikke brug for, brugte eller undersøgelse, positionsdata, så vi lod dem, der er fastsat til nul, og vi ville rulle et klik i fremadgående retning for hver enkelt våben i listen, så vi gik det hele 120 til dwdata (hvert hjul klik er lig med 120), som du kan se. at arbejde med, mouse_event, er blot et spørgsmål om at udfylde de rigtige argumenter i det rigtige sted.lad os nu gå over til nogle mere anvendelige funktioner, løntrin 5: grundlæggende muse klik, vi skal lave tre nye funktioner.en generel forlod klik funktion, og to klare specifikke ned og op. op, code.py med tomgang og tilføje følgende til listen af import - erklæringer:, import win32api, win32con, som før, det giver os adgang til modul indhold via, module.attribute, syntaks, bagefter skal vi gøre. vores første museklik funktion., def leftclick(): win32api. mouse_event (win32con. mouseeventf_leftdown, 0,0). sove, stk. 1) win32api. mouse_event (win32con. mouseeventf_leftup, 0,0), tryk "klik".helt frivilligt.men rart for fejlretning., minde om, at alt, hvad vi gør her, er at tildele en "handlingsplan" for det første argument om, mouse_event,.vi behøver ikke at give nogen positionsoplysninger, så vi forlader koordinere parametre (0,0), og vi behøver ikke at fremsende yderligere oplysninger, så dwdata, er blevet udeladt.den tid. sove, stk. 1), funktion fortæller pyton at standse gennemførelsen for den frist, der er angivet i parentes.vi vil tilføje disse gennem vores kode, som regel for meget korte antal gange.uden disse "klik" kan komme foran sig og skyde før menuer, har en chance for at ajourføre. så, hvad vi har her, er en generel forlod klik.en presse, en overgang.vi tilbringer størstedelen af vores tid med det, men vi skal gøre yderligere to ændringer. de to næste er de samme, men nu hvert skridt er opdelt i sin egen funktion.disse vil blive anvendt, når vi har brug for at holde de mus i et tidsrum (for at trække og skyde osv.), def leftdown(): win32api. mouse_event (win32con. mouseeventf_leftdown, 0,0). sove, stk. 1) og "venstre" def leftup(): win32api. mouse_event (win32con. mouseeventf_leftup, 0,0). sove, stk. 1) og "venstre frigivelse, trin 9: grundlæggende mus bevægelse, med klik væk alt, der er tilbage, er at flytte mus rundt på skærmen, tilføje følgende funktioner, kode. py,:, def mousepos (kabel): win32api. setcursorpos ((x_pad +) [0], y_pad +) [1]) def get_cords(): x, y = win32api. getcursorpos() x = x - x_pad y = y - y_pad trykke x, y, disse to funktioner er vidt forskellige formål.for det første vil blive anvendt til scripting bevægelse i programmet.takket være det fremragende, at konventioner, liget af den funktion, gør præcis, som setcursorpos(), indebærer.kalder denne funktion fastsættes mus til de koordinater, videregives til den som en, x, y, tuple.bemærker, at vi har tilføjet i vores, x og y, puder; det er vigtigt at gøre det hvor som helst en koordinere hedder. det andet er et simpelt redskab, som vi kan bruge, mens pyton interaktivt.det aftryk til konsollen, den nuværende situation i mus som en, x, y, tuple.dette har i høj grad fremskynder processen med at sejle gennem menuer, uden at skulle tage et øjebliksbillede og bryde ud en lineal.vi vil ikke altid være i stand til at bruge det, som en mus aktiviteter skal være pixel specifikke, men når vi kan, det er en fantastisk tid. hej. i løbet af de næste skridt, vi tager nogle af disse nye teknikker til brug og start - in-game menuer.men før vi gør, det nuværende indhold af main() i, code.py og erstatte den med, passere.vi kommer til at arbejde med de interaktive hurtigt til det næste skridt, så har vi ikke brug for den, screengrab(), funktion, trin 10: navigation spil menuer, i denne og næste skridt, vi forsøger at samle så mange tilfælde koordinater, som vi kan bruge vores, get_cords(), metode.det vil vi være i stand til hurtigt at opbygge den kode for ting, som sejler menuer, clearing - tabeller, og lave mad.når vi har dem, vil det kun være et spørgsmål om at trække dem ind i den bot er logik. lad os komme i gang.- og køre din kode til at bringe den pyton shell.da vi har erstattet det organ, main() med, - - i de sidste skridt, bør du ser en tom skal,.,,, før vi overhovedet kommer til at klare en del af spillet er der fire indledende menuer, vi er nødt til at komme igennem.de er som følger:,, indledende "spille" knap, iphone "fortsæt" knap, tutor "skip" knap, dagens mål "fortsæt" knap, vi bliver nødt til at få koordinaterne for hver af disse og tilføjer dem til en ny funktion, startgame(),.stilling ledig shell, så du kan se dem og området.type i, get_cords(), funktion, men ikke tilbage endnu, flyt din mus over knappen, som du behøver koordinater.være sikker på ikke at klikke, som vi vil fokusere på at forblive i skallen.hold din mus over menupunkt og nu presse den tilbage.det vil tage den nuværende placering af mus og tryk til konsollen en tuple indeholdende, x, y, værdier.gentage det for de resterende tre menuer.,, forlade skal åbne og arrangere det, så du kan se den, samt de dovne redaktør.nu skal vi nu tilføje vores, startgame(), funktion og fylder den med vores nyligt erhvervede koordinater., def startgame():placering af første menu mousepos ((182, 225)) leftclick(). sove, stk. 1)placering af anden menu mousepos ((193, 410) leftclick(). søvn (1)placering af tredje menu mousepos (435, 470)) leftclick(). sove, stk. 1)placering af fjerde menu mousepos ((167, 403)) leftclick(). sove, stk. 1, har vi nu en fin opgave at kalde ved begyndelsen af hver kamp.det fastsætter markøren holdning til hvert af de to steder, vi tidligere har defineret, og så siger mus til klik.tid. søvn (1), fortæller pyton at standse gennemførelsen for 1 /10 af et andet mellem hver enkelt klik, som giver menuer tid nok til at ajourføre i mellem., redde og løbe din kode, og du vil se et resultat, som denne:,, som et svagt menneskeligt, det tager lidt længere end en anden til at navigere på menuen i hånden, men vores bot nu kan gøre det i ca. 4 sekunder.slet ikke dårligt!,, trin 11: de får mad koordinater, nu skal vi gentage den samme proces for hver af disse knapper:, endnu en gang i den pyton shell, type i, get_cords(), svæver du mus i fødevarer, rubrik, du har brug for, og tryk på enter til at udføre ordren. som en mulighed for yderligere at fremskynde tingene, hvis du har en anden overvågning, eller er i stand til at arrangere den pyton skal på en sådan måde, at man kan se det som spillet område snarere end at skrive i gang, get_cords(), hver gang, vi har brug for det, kan vi oprette en enkel, loop.brug for en tid. sleep(), en metode til at standse henrettelsen kun længe nok til at flytte mus til næste position, der koordinerer. her er for, loop i aktion:,, vi er ved at skabe en ny klasse, som hedder, snore, og bruge den til at opbevare alle de værdier, vi forstår at koordinere.at være i stand til at ringe, cord.f_rice, giver en stor fordel i forhold til at læse koordinaterne direkte til mousepos(),.som en mulighed, man kan også opbevares alt i en ordbog,, men jeg finder den klasse syntaks mere underholdende. klasse): f_shrimp = (54700) f_rice = (119 701) f_nori = (63 - 745) f_roe = (111 749) f_salmon = (54 815) f_unagi = (111. 812), vi skal opbevare en masse af vores koordinater i denne klasse, og der vil være en vis overlapning, således at tilføje, f_, præfiks lader os vide, at vi henviser til den mad, steder, snarere end en placering i telefonen menu. vi vil vende tilbage til det om lidt.der er en smule mere koordinere jagt at gøre.trin 12:,, at tom tallerken koordinater, hver gang en kunde har spist, de efterlader en plade, der skal være valgte at blive fjernet.så vi er nødt til at få det tomme tallerkener samt.,,, jeg har noteret deres holdning med en stor rød "x".gentager det samme mønster som i de to sidste skridt til at få deres koordinater.opbevarer dem i bemærkning snor for nu. "" "plader tråde: 108, 573, 212, 574 311, 573 574 516 412, 575 618, 573," "". vi er tæt på.kun et par skridt af foreløbige opsætning, før vi kommer til det sjove.,, trin 13: telefon koordinater, ok, det bliver den sidste koordinater, vi har til min i denne specifikke måde. her har meget mere at holde styr på, så du kan gøre det manuelt at, get_cords(), funktion i stedet for det tidligere anvendte for, loop - metode.uanset hvad, skal vi gå igennem alle telefon menuer for at få koordinaterne for hvert punkt på dagsordenen. det er en smule mere involveret i at nå frem til en af køb skærme, vi har brug for, du er nødt til at have penge nok til rent faktisk at købe noget.så du bliver nødt til at komme med et par stykker af sushi, før du går om virksomheden af koordinere jagt.du har højst til to sushi ruller, tror jeg.det kommer du nok til at købe nogle ris, der vil få os til det, vi har brug for. er der seks menuer, vi er nødt til at komme igennem:,, telefon, første menu,, fyld, ris, søtransport, er vi nødt til at få koordinaterne for alt men skyld (selv om det kan du vil have.jeg fandt den bot fungerede fint uden.jeg var villig til at ofre en dårlig in-game revision for ikke at kode i logikken.), at de koordinater, er vi nødt til at tilføje alle disse til vores snor klasse.vi vil anvende præfikset ", t_, angiver, at fødevarer, der er telefon > pynt menu poster. klasse): f_shrimp = (54700) f_rice = (119 701) f_nori = (63 - 745) f_roe = (111 749) f_salmon = (54 815) f_unagi = (111. 812)----------------------------------- telefon = (601, 730) menu_toppings = (567, 638) t_shrimp = (509, 581) t_nori = (507, 645) t_roe = (592, 644) t_salmon = (510 699) t_unagi = (597 585) t_exit = (614, 702) menu_rice = (551, 662) buy_rice = 564, 647 delivery_norm = (510, 664), okay!vi har endelig besluttet at koordinere alle de værdier, vi har brug for.så lad os lave noget nyttigt.,, trin 14: clearing - tabeller, vi tager vores tidligere registrerede koordinater og bruge dem til at udfylde en funktion til clear_tables()., def clear_tables(): mousepos (108 573) leftclick() mousepos (212 574)) leftclick() mousepos (311 573) leftclick() mousepos (412.)) leftclick() mousepos (516, 575) leftclick() mousepos (618, 573) leftclick(). søvn (1), som du kan se, det ser mere eller mindre præcis som vores tidligere, startgame(), funktion.et par små forskelle: vi har ingen tid. sleep(), funktioner mellem de forskellige klik begivenheder.vi behøver ikke at vente på et menukort at ajourføre, så vi behøver ikke at kvæle vores klik hastigheder. vi har imidlertid en lang tid. sleep(), på det sidste.mens der ikke er strengt nødvendige, er det rart at tilføje disse lejlighedsvise pauser i gennemførelsen af vores kodeks, noget længe nok til at give os tid til manuelt at bryde ud af bot vigtigste loop, hvis det er nødvendigt, som vi får).i modsat fald vil fortsætte med at stjæle din mus holdning igen og igen, og du vil ikke være i stand til at flytte fokus til shell længe nok til at stoppe manus, - som kan sjovt første to eller tre gange, du kæmper mod en mus, men det hurtigt mister sin charme, så kan du regne med nogle pålidelige pauser i din egen robot!,,, trin 15: sushi, den første ting, vi skal gøre, er at lære at lave sushi.klik kogebogen åbne brugsanvisning.alle typer i spil på sushi vil blive fundet på dens sider.jeg vil se de første tre nedenfor, men jeg overlader det til dem at katalogisere resten.,, "opskrifter: onigiri 2. ris, 1 ud caliroll: 1, ris, 1 ud af 1. roe gunkan: 1 ris 1 ud, 2 roe ', nu skal vi oprette en funktion, der vil acceptere et argument for" sushi - "og så samle de rette ingredienser, baseret på den døde værdi., def makefood (fødevarer): hvis mad = =" caliroll: tryk "at gøre caliroll" mousepos (snore. f_rice) leftclick(). søvn (05) mousepos (snore. f_nori) leftclick(). søvn (05) mousepos (snore. f_roe) leftclick(). sove, stk. 1) foldmat(). søvn (1.5) elif mad = = "onigirjeg ": tryk" at gøre onigiri "mousepos (snore. f_rice) leftclick(). søvn (05) mousepos (snore. f_rice) leftclick(). søvn (05) mousepos (snore. f_nori) leftclick(). sove, stk. 1) foldmat(). søvn (05). søvn (1, 5) elif mad = =" gunkan ": mousepos (snore. f_rice) leftclick(). søvn (05) mousepos (snore. f_nori) leftclick(). søvn (05) mousepos (snore. f_roe) leftclick(). søvn (05) mousepos (snore. f_roe) leftclick(). sove, stk. 1.) foldmat(). søvn (1.5), det fungerer bare somalle andre, men med en lille ch