Журнал LinuxFormat - перейти на главную

LXF161:Хакерство: Raspberry Pi

Материал из Linuxformat
Перейти к: навигация, поиск


Raspberry Pi Нач­ни­те зна­ком­ст­во с Linux и но­вым кар­ман­ным ком­пь­ю­те­ром

Содержание

Raspberry Pi: Ру­лим Guido

Raspberry Pi был соз­дан, что­бы нау­чить де­тей про­грам­ми­ро­ва­нию. Джо­на­тан Ро­бертс пред­став­ля­ет иде­аль­ную сре­ду для на­чи­наю­щих: Guido van Robot.

(thumbnail)
Наш эксперт. Су­пер-скрыт­ный Джо­на­тан Ро­бертс ко­па­ет­ся в Linux с дет­ских лет. Ины­ми сло­ва­ми, не так уж дол­го.

В двух на­ших пер­вых ру­ко­во­дствах по Raspberry Pi мы за­да­ли вам раз­гон. Мы объ­яс­ни­ли, как на­стро­ить RPi и убе­дить­ся, что все ра­бо­та­ет нор­маль­но. Мы так­же по­зна­ко­ми­ли вас с основ­ны­ми на­вы­ка­ми ра­бо­ты в Linux, вклю­чая управ­ление па­ке­та­ми и уда­лен­ный доступ к SSH и VNC. Ес­ли у вас толь­ко по­явил­ся Raspberry Pi и вам не тер­пит­ся на­чать, вы смо­же­те най­ти эти два ру­ко­во­дства на дис­ке это­го ме­ся­ца.

На этом уро­ке мы хо­тим сде­лать нечто иное. Мы рас­смот­рим Raspberry Pi в ка­че­­ст­ве плат­фор­мы для обу­чения про­грам­ми­ро­ванию, а для это­го восполь­зу­ем­ся при­ло­жением под на­званием Guido van Robot (со­кра­щен­но – GvR).

Че­ре­паш­ки и ро­бо­ты

Ес­ли вы вы­росли в Ве­ли­ко­бри­тании и учи­лись в шко­ле в ком­пь­ю­тер­ную эпо­ху BBC, вы, воз­мож­но, помните че­ре­па­шек и LOGO, неслож­ный язык про­грам­ми­ро­вания, в ко­то­ром бы­ло все­го несколь­ко команд. У че­ре­паш­ки бы­ла руч­ка для ри­со­вания раз­ных фи­гур, и с по­мо­щью пра­виль­ных команд в LOGO вы мог­ли на­ри­со­вать лю­бую фи­гу­ру (су­ще­ст­во­ва­ли да­же фи­зи­че­­ские вер­сии, ко­то­рые раз­гу­ли­ва­ли по сто­лам и по­лам).

На­ри­со­вать квад­рат в LOGO можно бы­ло ко­ман­дами

FORWARD 100

LEFT 90

FORWARD 100

LEFT 90

FORWARD 100

LEFT 90

FORWARD 100

LEFT 90

Этот язык про­грам­ми­ро­вания учил де­тей осно­вам – как раз­би­вать ре­шение про­бле­мы на ша­ги, необ­хо­ди­мые для ее ре­шения, то есть мыс­лить в ви­де про­це­дур. Имен­но это­му мы обу­чим вас на на­шем уро­ке, толь­ко вме­сто LOGO у нас бу­дет Guido van Robot.

Пре­ж­де чем при­сту­пать к че­му бы то ни бы­ло, уста­но­ви­те GvR на ваш Raspberry Pi, что­бы вы мог­ли сле­до­вать ин­ст­рук­ци­ям на­ше­го ру­ко­во­дства. Это де­лается за­пуском LXTerminal из ме­ню при­ло­жений и вво­дом

sudo apt-get install gvrng pythongtksourceview2

Ес­ли, взгля­нув на эту ко­ман­ду, вы ре­ши­ли, что она бес­смыс­лен­на, за­гляните во вто­рое ру­ко­во­дство по Raspberry Pi на дис­ке: «Стро­им NAS».

Зна­комь­тесь: Guido

Ус­та­но­вив GvR, мо­же­те за­пускать его из ме­ню при­ло­жений в ниж­ней ле­вой час­ти эк­ра­на – оно на­хо­дит­ся пониже под­ме­ню Education. В поя­вив­шем­ся окне вы уви­ди­те ме­сто для Guido и его ми­ра в ле­вой час­ти, и ме­сто для ин­ст­рук­ций, ко­то­рые вы бу­де­те ему да­вать, и для соз­дания его ми­ра в пра­вой час­ти.

Да­вай­те начнем со зна­ком­ст­ва с ми­ром Guido. Пер­вое, что на­до сде­лать – ско­пи­ро­вать фай­лы в пап­ке GvR на дис­ке это­го ме­ся­ца в ваш Raspberry Pi. Мо­же­те ис­поль­зо­вать для это­го лю­бой удоб­ный для вас спо­соб, но са­мым про­стым бу­дет USB-бре­лок, ес­ли вы ис­поль­зуе­те для досту­па SSH или VNC, по­сколь­ку в этом слу­чае один из пор­тов USB оста­ет­ся сво­бод­ным. За­тем пе­ре­клю­чи­тесь на вклад­ку World Editor в пра­вой час­ти ок­на, вы­бе­ри­те File > Open [Файл > От­крыть] и GvR1.wld. Ле­вая часть ми­ра за­полнит­ся изо­бра­жения­ми, пред­став­ляю­щи­ми мир Guido, а сам Guido сим­во­ли­зи­ру­ет­ся тре­угольником с бу­к­вой G.

Мир Guido по­хож на наш (ну, на аме­ри­кан­ский го­род точ­но по­хож): он со­сто­ит из улиц (про­тя­нув­ших­ся с восто­ка на за­пад) и аве­ню (иду­щих с се­ве­ра на юг), и ок­ру­жен креп­кими внешними сте­нами, че­рез ко­то­рые Guido не мо­жет пе­ре­брать­ся. На пе­ре­се­чении ка­ж­дой ули­цы и аве­ню рас­по­ла­га­ет­ся угол.

В этом ми­ре есть еще па­ра ве­щей. Beeper – это та­кой ма­лень­кий маячок-пи­щал­ка, ко­то­рый мож­но по­мес­тить на уг­лу. Он издает сиг­на­лы, которые Guido мо­жет рас­слы­шать, толь­ко на­хо­дясь на том же уг­лу. Име­ют­ся так­же внут­ренние сте­ны – они, как и внешние, для Guido непро­хо­ди­мы. В ми­ре GvR1, по­ми­мо Guido, есть един­ст­вен­ный маячок, пред­став­лен­ный го­лу­бым круж­ком.

Пер­вые ша­ги

Guido – не са­мый про­дви­ну­тый ро­бот. Он умеет вы­пол­нять толь­ко пять дей­ст­вий:

  • move [дви­гать­ся]
  • turnleft [по­вер­нуть на­ле­во]
  • pickbeeper [взять маячок]
  • putbeeper [по­ста­вить маячок]
  • turnoff [вы­клю­чить]

Ко­ман­да move за­став­ля­ет Guido дви­гать­ся по един­ст­вен­ной ули­це или аве­ню впе­ред, а ко­ман­да turnleft за­став­ля­ет его по­вер­нуть­ся на 90 гра­ду­сов вле­во. Ес­ли вы, на­при­мер, хо­ти­те, что­бы Guido пе­ре­дви­нул­ся впе­ред на три аве­ню, вам нуж­но по­за­бо­тить­ся, что­бы он смот­рел в нуж­ном на­прав­лении (за­дав нуж­ное чис­ло в ко­ман­дах turnleft) и за­тем за­дать три ко­ман­ды move.

В этом пер­вом ми­ре все, что нам от вас нуж­но, ог­раничи­ва­ет­ся пе­ре­ме­щением Guido к маячку, воз­мож­но­стью его взять, пе­ре­мес­тить его на один угол даль­ше и за­тем вы­клю­чить его. Это оз­на­ча­ет, что Guido остано­вит­ся на уг­лу 4-й аве­ню и 2-й ули­цы.

Что­бы сде­лать это, пе­ре­клю­чи­тесь со вклад­ки World Editor на вклад­ку Code Editor. За­тем мо­же­те вве­сти лю­бую ком­би­на­цию из вы­ше­при­ве­ден­ных команд в тек­сто­вое по­ле спра­ва, по­ста­вив ка­ж­дую из них на соб­ст­вен­ную стро­ку, что­бы Guido пе­ре­мес­тил­ся к маячку и взял его. Когда у вас бу­дет на­бор команд, ко­то­рый, по ва­ше­му мнению, дол­жен бу­дет сра­бо­тать, на­жми­те на Execute и по­смот­ри­те, что про­изой­дет.

Помните, что Guido мо­жет слы­шать маячок, толь­ко на­хо­дясь на од­ном уг­лу с ним – а ко­ман­да pickbeeper сра­батывает толь­ко тогда, когда маячок есть в наличии. Ес­ли вы по­пы­тае­тесь ис­поль­зо­вать pickbeeper при от­сут­ст­вии маячка, то по­лу­чи­те со­об­щение об ошиб­ке, и вам при­дет­ся пе­ре­за­пустить про­грам­му, что де­ла­ет­ся по­сред­ст­вом на­жа­тия Reload.

Ком­пактнее — удобнее

Как де­ла? Ес­ли все сра­бо­та­ло, зна­чит, у вас дол­жен по­лу­чить­ся при­мер­но та­кой на­бор ин­ст­рук­ций:

move

turnleft

turnleft

turnleft

move

move

pickbeeper

move

turnoff

Са­мая хит­рая часть этой про­бле­мы – по­вер­нуть на­пра­во. По­сколь­ку Guido не зна­ет, как это сде­лать, вам при­дет­ся осоз­нать, что один по­во­рот на­пра­во ра­вен трем по­во­ро­там на­ле­во.

Это до­воль­но гро­мозд­ко и за­трудняет чтение на­шей про­грам­мы: ес­ли бы у на­шей про­грам­мы бы­ла про­бле­ма – на­при­мер, Guido непра­виль­но по­вер­нул­ся и при­шел к стене, от ко­то­рой он и на­чал – бы­ло бы труд­но по­нять, что под­ра­зу­ме­ва­лось под все­ми эти­ми turnleft и что один был яв­но лишним. Это так­же оз­на­ча­ет, что нам при­дет­ся пи­сать одно и то же мно­го раз, а по­сколь­ку мы – ленивые про­грам­ми­сты, нам это со­всем не нра­вит­ся!

К сча­стью, Guido не так глуп, как ка­жет­ся на пер­вый взгляд. Хо­тя на дан­ный мо­мент он зна­ет толь­ко пять команд, он бы­ст­ро учит­ся, и он го­тов, что­бы мы нау­чи­ли его че­му-то но­во­му на осно­ве то­го, что ему уже из­вест­но. Ины­ми сло­ва­ми, мы мо­жем сде­лать под­бор­ку ин­ст­рук­ций, та­ких, как три turnlefts, дать ей на­звание, и Guido бу­дет ис­пол­нять ее ка­ж­дый раз, когда мы вве­дем это на­звание.

Со­тво­рение ми­ра

Не­про­стую за­дач­ку мы по­ста­ви­ли пе­ред ва­ми в этой ста­тье, а? Или вы хо­ти­те соз­дать соб­ст­вен­ные гад­кие ми­ры для сво­их дру­зей по про­грам­ми­ро­ванию GvR? Тогда вам по­вез­ло, по­сколь­ку GvR как раз и по­зво­ля­ет соз­да­вать ин­ди­ви­ду­аль­ные ми­ры, и для это­го у вас есть целых два спо­со­ба.

Пер­вый – ин­те­рак­тив­ный ме­тод point-and-click [на­ве­ди-и-щелкни], ко­то­рый за­пустит­ся, ес­ли вы­брать GvR > Open World Builder на ле­вой панели. Поя­вит­ся пустой мир, ок­ра­шен­ный в го­лу­бой цвет. Мо­же­те до­бав­лять сте­ны, щелк­нув ле­вой кноп­кой там, где вы хо­ти­те их раз­мес­тить, или маячки, щелк­нув пра­вой кноп­кой по пусто­му уг­лу и вве­дя же­лае­мое ко­ли­че­­ст­во. Ес­ли хо­ти­те от­ре­гу­ли­ро­вать на­чаль­ные па­ра­мет­ры Gudio, на­при­мер. его рас­по­ло­жение, на­прав­лении или ко­ли­че­­ст­во маячков, ко­то­рые он несет, щелкните средней кноп­кой по лю­бо­му мес­ту в ми­ре и вве­ди­те нуж­ную ин­фор­ма­цию.

Вся эта ин­фор­ма­ция хранит­ся в тек­сто­вом фай­ле и по­доб­на ин­ст­рук­ци­ям, ко­то­рые вы дае­те Guido в этом ру­ко­во­дстве. Вы мо­же­те про­смот­реть со­дер­жание это­го фай­ла для лю­бо­го ми­ра, ко­то­рый вы от­кры­вае­те, щелк­нув по вклад­ке World Editor в пра­вой сто­роне. Опи­сание ро­бо­та за­да­ет на­чаль­ные на­строй­ки Guido: ули­цу, аве­ню, на­прав­ление и ко­ли­че­­ст­во маячков. Ка­ж­дое опи­сание сте­ны оп­ре­де­ля­ет угол, где поя­вит­ся сте­на, и на­прав­ление, ко­то­рое она бло­ки­ру­ет, а ка­ж­дое оп­ре­де­ление маячка вы­де­ля­ет угол, где бу­дет рас­по­ла­гать­ся некое ко­ли­че­­ст­во маячков.

Схва­ты­ва­ет на ле­ту

Что­бы это про­де­мон­ст­ри­ро­вать, и что­бы сде­лать наш код бо­лее лег­ким для чтения, менее оши­боч­ным и бо­лее бы­ст­рым для вво­да, да­вай­те нау­чим Guido по­во­ра­чи­вать на­пра­во. Для это­го нам на­до бу­дет ис­поль­зо­вать но­вый вид ин­ст­рук­ции:

define turnright:

turnleft

turnleft

turnleft

Пер­вая стро­ка со­об­ща­ет Guido, что мы оп­ре­де­ли­ли но­вую ин­ст­рук­цию под на­званием turnright. Стро­ки с от­сту­пом, сле­дую­щие за двое­то­чи­ем – это уже су­ще­ст­вую­щие ко­ман­ды в том по­ряд­ке, в ко­то­ром они долж­ны вы­пол­нять­ся, когда мы хо­тим, что­бы Guido по­вер­нул на­пра­во.

От­ступ иг­ра­ет важ­ную роль. Все стро­ки с от­сту­пом счи­та­ют­ся ча­стью оп­ре­де­ления define. Как толь­ко вы вве­де­те стро­ку без от­сту­па, GvR бу­дет счи­тать, что вве­ден­ное боль­ше не яв­ля­ет­ся ча­стью оп­ре­де­ления.

Что­бы ис­поль­зо­вать это в про­грам­ме, вам нуж­но по­ста­вить оп­ре­де­ление на­верх, а все осталь­ные ко­ман­ды раз­мес­тить внизу, та­ким об­ра­зом:

define turnright:

turnleft

turnleft

turnleft

move

turnright

move

По­про­буй­те пе­ре­пи­сать на­шу пер­вую про­грам­му, но ис­поль­зуй­те ин­ст­рук­цию turnright вме­сто трех turnleft. Раз­ве не про­ще ста­ло чи­тать?

По­вто­ря­ем­ся

К это­му мо­мен­ту вы освои­ли пер­вый мир, так что да­вай­те пе­рей­дем к че­му-нибудь по­ин­те­реснее. Пе­ре­клю­чи­тесь сно­ва на вклад­ку World Editor на пра­вой сто­роне и вы­бе­ри­те File > Open, на сей раз от­крыв файл GvR2.wld. Это по­хо­жий мир, за ис­клю­чением то­го, что здесь нет сте­ны по­за­ди маячка, и все рас­стояния уве­ли­че­ны (воз­мож­но, вам при­дет­ся рас­ши­рить ок­но и пе­ре­та­щить линию, раз­де­ляю­щую панели ми­ра и ре­дак­то­ра, что­бы уви­деть маячок).

Цель та же: Guido дол­жен пе­ре­мес­тить­ся к маячку, взять его, пе­ре­мес­тить на один угол даль­ше и вы­клю­чить. Мы мо­жет сде­лать это точ­но так же, как рань­ше, от­дель­но ука­зы­вая ка­ж­дое дви­жение и ка­ж­дый по­во­рот, но, по­сколь­ку сей­час все на­хо­дит­ся на боль­шем рас­стоянии, это бу­дет вы­гля­деть так же пу­та­но, как рань­ше все эти мно­го­чис­лен­ные turnleft.

К сча­стью, Guido зна­ет еще несколь­ко команд, ко­то­рые несколь­ко об­лег­чат на­шу за­да­чу. Пер­вая из тех, ко­то­рые мы со­би­ра­ем­ся рас­смот­реть – ко­ман­да do. Вы­гля­дит она так:

do <number>:

<instructions>

Как ви­ди­те, по фор­ма­ту она по­доб­на ко­ман­де define. Сна­ча­ла мы со­об­щим Guido, что это ко­ман­да do, соз­дан­ная для по­вто­рения лю­бых <instructions> [ин­ст­рук­ций] ука­зан­ное <number> [ко­ли­че­­ст­во] раз. В GvR2 мы мо­жем ис­поль­зо­вать ее, что­бы на­чать на­шу про­грам­му так:

do 4:

move

Это на­мно­го бы­ст­рее, чем вво­дить че­ты­ре от­дель­ных ко­ман­ды move. Бо­лее то­го, ес­ли нам нуж­но вы­полнить 100 пе­ре­ме­щений, на это по­тре­бу­ет­ся ров­но та­кое же ко­ли­че­­ст­во ин­ст­рук­ций. По­про­буй­те на­пи­сать остав­шую­ся часть про­грам­мы для GvR2 с по­мо­щью от­дель­ных команд move, а по­том с по­мо­щью команд do, и об­ра­ти­те внимание, на­сколь­ко по­след­няя ко­ро­че.

Про­грам­ми­ро­вание для удо­воль­ст­вия

Guido van Robot – не един­ст­вен­ная имею­щаяся воз­мож­ность для по­даю­щих на­де­ж­ды про­грам­ми­стов, ко­то­рым не тер­пит­ся сде­лать свои пер­вые ша­ги в Raspberry Pi. Об­раз Debian на SD-card, на ко­то­ром мы осно­вы­ва­ем на­ши ру­ко­во­дства, так­же идет со Scratch, гра­фи­че­­ским язы­ком про­грам­ми­ро­вания, ко­то­рый ра­бо­та­ет, со­еди­няя раз­ные ком­понен­ты про­грам­мы вме­сте.

Он ис­поль­зу­ет мно­гие из тех же основ­ных про­цес­сов управ­ления, о ко­то­рых мы рас­ска­за­ли в этом ру­ко­во­дстве, в том чис­ле усло­вия и цик­лы, но вво­дит так­же и мно­же­ст­во но­вых функ­ций. Это по­зво­лит вам вы­пол­нять са­мые раз­ные дей­ст­вия, в т. ч. за­ста­вить гра­фи­ку от­ве­чать на щелч­ки мы­шью и на­жа­тия кла­виш кла­виа­ту­ры, и мно­гое дру­гое.

Вме­сто то­го, что­бы управ­лять примитивным ро­бо­том, ком­понен­ты про­грам­мы Scratch управ­ля­ют раз­лич­ны­ми спрай­та­ми и изо­бра­жения­ми и мо­гут быть ис­поль­зо­ва­ны для соз­дания пре­крас­ных ин­те­рак­тив­ных ис­то­рий, игр, му­зы­ки и изоб­ра­зи­тель­но­го ис­кусст­ва. Од­на­ко сре­ди глав­ных досто­инств Scratch – ог­ром­ное со­об­ще­ст­во тех, кто де­лит­ся свои­ми про­из­ве­дения­ми на http://scratch.mit.edu. Здесь вы мо­же­те не толь­ко по­иг­рать с про­из­ве­дения­ми дру­гих, но и уз­нать, как они ра­бо­та­ют, и ин­тег­ри­ро­вать их идеи в свои про­ек­ты.

Же­лаю­щим при­сту­пить к де­лу со Scratch ре­ко­мен­ду­ем оз­на­ко­мить­ся с изо­бра­жения­ми и ау­дио­эф­фек­та­ми их сай­та, пре­ж­де чем пе­рей­ти к ви­део­уро­кам на http://info.scratch.mit.edu/Video_Tutorials.

Вре­мя при­ня­тия ре­шений

Еще од­на спо­соб­ность Guido – принимать ре­шения. На­при­мер, Guido мо­жет спро­сить: «На этом уг­лу есть маячок?» и ре­шить ис­пол­нять pickbeepers толь­ко при его на­ли­чии. Или он мо­жет спро­сить, есть ли пе­ред ним сте­на, и дви­нуть­ся впе­ред, толь­ко ес­ли путь сво­бо­ден. Фор­мат для это­го ти­па ко­ман­ды та­ков:

if <condition>:

<instructions>

Здесь вам все зна­ко­мо, за ис­клю­чением усло­вия. Это – во­прос, ко­то­рый за­да­ет Guido, и есть под­бор­ка во­про­сов, ко­то­рые он уме­ет за­да­вать. Их 18, и все они пе­ре­чис­ле­ны во вклад­ке Language Reference ин­тер­фей­са GvR.

Вы уви­ди­те, что все они яв­ля­ют­ся во­про­са­ми ти­па Да/Нет, с от­ве­та­ми true [ис­тин­но] или false [лож­но] – это един­ст­вен­ный тип во­про­сов, с ко­то­ры­ми Guido (и боль­шин­ст­во ком­пь­ю­те­ров) мо­гут ра­бо­тать.

Вот при­мер то­го, как мож­но на­пи­сать код, ко­то­рый обес­пе­чит дви­жение впе­ред толь­ко при от­сут­ст­вии сте­ны пе­ред Guido.

if front_is_clear:

move

Иногда вы, воз­мож­но, ре­ши­те про­ве­рить, яв­ля­ет­ся ли усло­вие ис­тин­ным, и вы­полнить дей­ст­вие, ес­ли оно та­ко­во, или дру­гое дей­ст­вие, ес­ли усло­вие лож­но. Это мож­но сде­лать с по­мо­щью ко­ман­ды if ... else ..., ко­то­рая ис­поль­зу­ет­ся так:

if front_is_clear:

move

else:

turnoff

Мож­но да­же про­ве­рять мно­же­ст­вен­ные ус­ло­вия, с по­мо­щью ко­ман­ды if ... elif ...

else:

if front_is_clear:

move

elif right_is_clear:

turnright

move

elif left_is_clear:

turnleft

move

else:

turnoff

Конеч­ное else яв­ля­ет­ся оп­цио­наль­ным. Оно обес­пе­чи­ва­ет от­вет на си­туа­цию по умол­чанию: ес­ли все осталь­ное лож­но, де­лай­те это – так что обыч­но его сто­ит ис­поль­зо­вать.

По­ми­мо про­сто­го пре­достав­ления Guido воз­мож­но­сти принимать са­мо­стоя­тель­ные ре­шения, вы мо­же­те уви­деть, на­сколь­ко это мо­жет быть удоб­но. Где-то в на­ча­ле это­го ру­ко­во­дства вы уви­де­ли, что, ес­ли вы по­пы­тае­тесь вы­полнить ко­ман­ду pickbeeper при от­сут­ст­вии маячка на уг­лу, где на­хо­дит­ся Guido, вы по­лу­чи­те ошиб­ку, и про­грам­ма оста­но­вит­ся. Ес­ли бы вы сде­ла­ли ошиб­ки в дру­гих час­тях про­грам­мы, вы, воз­мож­но, уви­де­ли бы то же са­мое, по­пы­тав­шись про­вес­ти Guido че­рез сте­ну. Ус­лов­ные ин­ст­рук­ции по­зво­ля­ют нам до­бав­лять безо­пас­ную про­вер­ку на­ше­го ко­да, что­бы про­грам­ма не за­вер­ша­ла свою ра­бо­ту из-за та­кой ошиб­ки.

Еще раз по­вто­рим­ся

Мож­но так­же ис­поль­зо­вать услов­ные ин­ст­рук­ции с по­мо­щью дру­гой ко­ман­ды по­вто­рения: while. Эта ин­ст­рук­ция про­ве­ря­ет, ис­тин­но ли усло­вие, ис­пол­ня­ет ко­ман­ду – или последовательность команд – в сво­ем те­ле (час­ти с от­сту­пом), а за­тем еще раз про­ве­ря­ет ис­тин­ность усло­вия. Ес­ли да, она сно­ва ис­полнит «те­ло», и бу­дет по­вто­рять это до тех пор, по­ка усло­вие не ока­жет­ся лож­ным. Мы го­во­рим, что она бу­дет за­цик­ле­на на те­ле ко­ман­ды.

С ко­ман­дой while сто­ит быть поосто­рожнее. Ес­ли вы ука­же­те усло­вие, ко­то­рое никогда не станет лож­ным, есть риск за­стрять в бес­конеч­ном цик­ле. Как и боль­шин­ст­ва дру­гих бес­конеч­ных ве­щей, бес­конеч­ных цик­лов луч­ше из­бе­гать

С по­мо­щью цик­ла while мы мо­жем далее усо­вер­шен­ст­во­вать на­шу про­грам­му GvR2, сде­лав ее безо­паснее и дав боль­ше управ­ления Guido. По­сле пер­вой пар­тии команд move для пе­ре­ме­щения Guido на нуж­ную ули­цу и раз­во­ро­та его на восток, мы мо­жем ис­поль­зо­вать ко­ман­ду while, что­бы пе­ре­ме­щать его впе­ред, по­ка он не ока­жет­ся на том же уг­лу, что и маячок:

while not_next_to_a_beeper:

move

pickbeepers

move

Со­брав во­еди­но все, че­му мы нау­чи­лись, мы мо­жем за­вер­шить про­грам­му GvR2 все­го за 10 строк. Ис­поль­зуй мы толь­ко основ­ные ко­ман­ды, у нас это за­ня­ло бы 20 строк. На­ша про­грам­ма ста­ла не толь­ко ко­ро­че – она ста­ла бо­лее яс­ной, и ее мож­но с лег­ко­стью рас­ши­рить для бо­лее круп­ных и слож­ных ми­ров.

Мы рас­ска­за­ли вам все, что нуж­но знать о Guido. То, че­му вы нау­чи­лись на на­шем уро­ке, по­мо­жет вам за­ста­вить его де­лать бо­лее ум­ные ве­щи, на­при­мер, на­хо­дить вы­ход из ла­би­рин­та, что­бы най­ти в кон­це маячок в ка­че­­ст­ве при­за.

Дру­гие про­ек­ты

Для ре­шения про­бле­мы лабиринта у вас дол­жен быть файл maze.wld, поставляемый с уста­нов­кой GvR по умол­чанию. Как и в пре­ды­ду­щих про­бле­мах, вариантов ее ре­шения мно­же­ст­во: на­при­мер, ука­зать ка­ж­дый шаг по от­дель­но­сти, или по­сту­пить бо­лее ра­зум­но и дать Guido шанс са­мо­стоя­тель­но принимать со­от­вет­ст­вую­щие ре­шения. Совету­ем по­про­бо­вать оба спо­со­ба.

Если ла­би­ринт по­ка­жет­ся вам нуд­ным, и вы за­хо­ти­те соз­дать собственные ми­ры, за­гляните в наш раз­дел «Соз­дание Ми­ров [World building]» – там есть ин­ст­рук­ции для это­го.

Что даль­ше?

Guido van Robot по­зна­ко­мил вас с са­мы­ми осно­ва­ми про­грам­ми­ро­вания: как раз­бить про­бле­му на от­дель­ные ша­ги, соз­дать но­вые ин­ст­рук­ции и управ­лять по­то­ком про­грам­мы (с по­мо­щью команд if, while и do). Но кое-че­му вы в GvR нау­чить­ся не мо­же­те, хо­тя для боль­шин­ст­ва ком­пь­ю­тер­ных про­грамм это об­щее ме­сто.

К сча­стью, все в Guido van Robot осно­ва­но на язы­ке про­грам­ми­ро­вания Python, ко­то­рый ис­поль­зу­ют мно­гие про­фес­сио­наль­ные раз­ра­бот­чи­ки.

Python мо­жет де­лать все то же, что и GvR, и мно­гое другое. Он мо­жет за­про­сить у поль­зо­ва­те­ля вво­д ин­фор­ма­ции и дать на нее со­от­вет­ст­вую­щий от­вет или за­по­мнить то, что про­ис­хо­ди­ло рань­ше, он зна­ет все о дан­ных са­мых раз­ных ти­пов (та­ких как стро­ко­вые, чи­сло­вые, бу­ле­вские и спи­ски), а так­же по­зво­ля­ет вам оп­ре­де­лять соб­ст­вен­ный тип дан­ных – мо­жно да­же восполь­зо­вать­ся им для соз­дания соб­ст­вен­но­го усо­вер­шен­ст­во­ван­но­го Guido.

По­сколь­ку GvR осно­ван на Python, пе­ре­ход от управ­ления Guido к соб­ст­вен­но про­грам­ми­ро­ванию на Python не дол­жен пред­став­лять со­бой осо­бой слож­но­сти, по­сколь­ку син­так­сис, то есть струк­ту­ри­ро­вание и рас­по­ло­жение тек­ста и струк­ту­ра про­грамм, тот же са­мый. Бо­лее то­го, есть пре­восход­ные сво­бод­ные ре­сур­сы, ко­то­рые по­мо­гут вам на­чать. С ва­ше­го раз­ре­шения, мы бы ре­ко­мен­до­ва­ли на­чать с Think Python: How to think like a computer Scientist [Ду­май­те на Python: учим­ся ду­мать, как ком­пь­ю­тер­ный спе­циа­лист] (www.greenteapress.com/thinkpython). По ме­ре ва­ше­го обу­чения вы най­де­те нема­лое ко­ли­че­­ст­во про­ек­тов и идей, ко­то­рые сумеют вас захватить.

А ес­ли вы ре­ши­те, что Python не для вас, есть и дру­гие от­лич­ные язы­ки про­грам­ми­ро­вания, ко­то­рые мо­гут осво­ить на­чи­наю­щие. Одним из по­пу­ляр­ных яв­ля­ет­ся Scheme, и мы на­стоя­тель­но ре­ко­мен­ду­ем вам книги Little Schemer [здесь иг­ра слов: мож­но пе­ре­вес­ти как «Юный про­грам­мист на язы­ке Scheme» или «Ма­лень­кий ин­три­ган», прим. ред.] и How To Design Programs [Как соз­да­вать про­грам­мы]. |

Персональные инструменты
купить
подписаться
Яндекс.Метрика