суббота, 6 февраля 2016 г.

Small Basic. Виртуальный робот в лабиринте

Если Вы уже успели попробовать EV3 Basic, то наверное обратили внимание на то, что это не самостоятельный продукт, а расширение для Microsoft Small Basic. Попрограммировав роботов на EV3 Basic мы решили попробовать и другие возможности среды Small Basic, в частности задействовать ее компоненты для исполнения программы на компьютере..

Давайте запрограммируем виртуального робота для движения в лабиринте по правилу правой руки. Робот будет иметь три датчика-дальномера и бесконечно перемещаться по неизвестному для него лабиринту.


Карту лабиринта мы зададим в двумерном массиве. 0 - ячейка свободна, 1 - занята. Массив может иметь любую размерность, но должен быть со всех сторон быть ограничен занятыми ячейками (стенками).

В начале программы робот размещается на заданной начальной позиции, в свободной ячейке и ему задается начальное направление (куда он развернут). Робота мы нарисуем круглым, а направление его взгляда - линией-радиусом.

В бесконечном цикле робот опрашивает три датчика:
1) Если справа ячейка свободна, робот разворачивается направо (меняет направление) и движется вперед на 1 клетку (меняет позицию)
2) Если справа ячейка занята, робот проверяет ячейку спереди - если оан свободна - он движется вперед ан 1 клетку (меняет позицию)
3) Если и справа и спереди ячейки заняты - робот проверяет ячейку слева и, если она свободна разворачивается налево (меняет направление), если занята - разворачивается на 180 градусов (дважды меняет направление)



Используя EV3 Basic можно создавать гибридные программы, которые будут исполняться частично ан роботе, частично на компьютере, свободно обмениваясь информацией по Bluetooth или Wi-Fi. Например, реальный EV3 робот двигаясь в лабиринте может строить карту своих перемещений на экране компьютера.

Исходный код нашего виртуального робота в лабиринте можно посмотреть ниже.

GraphicsWindow.Width = 500
GraphicsWindow.Height = 500

m[1][1]=0
m[1][2]=1
m[2][1]=0
m[1][3]=1
m[3][1]=1
m[2][2]=0
m[2][3]=0
m[3][2]=0
m[3][3]=1
m[1][4]=1
m[2][4]=1
m[3][4]=1
m[4][4]=0
m[4][1]=0
m[4][2]=0
m[4][3]=0
m[1][5]=0
m[2][5]=0
m[3][5]=0
m[4][5]=0
m[5][1]=1
m[5][2]=1
m[5][3]=1
m[5][4]=0
m[5][5]=1
m[1][6]=0
m[2][6]=1
m[3][6]=1
m[4][6]=1
m[5][6]=1
m[6][1]=1
m[6][2]=1
m[6][3]=0
m[6][4]=0
m[6][5]=0
m[6][6]=0
m[1][7]=0
m[2][7]=1
m[3][7]=0
m[4][7]=0
m[5][7]=0
m[6][7]=0
m[7][7]=1
m[7][1]=0
m[7][2]=0
m[7][3]=0
m[7][4]=1
m[7][5]=0
m[7][6]=1
m[1][8]=0
m[2][8]=0
m[3][8]=0
m[4][8]=1
m[5][8]=1
m[6][8]=0
m[7][8]=0
m[8][8]=0
m[8][1]=0
m[8][2]=0
m[8][3]=1
m[8][4]=1
m[8][5]=1
m[8][6]=1

For e = 0 To 9
  m[e][0] = 1
  m[0][e] = 1
  m[9][e] = 1
  m[e][9] = 1
EndFor

a = 1
b = 1
n = 3

Sub ris
  GraphicsWindow.Clear()  
  GraphicsWindow.PenColor = 0
  GraphicsWindow.BrushColor = 0
  GraphicsWindow.Show()
  GraphicsWindow.DrawRectangle(0,0,500,500)
  For y = 0 To 9
    For x = 0 To 9
      If m[x][y] = 1 Then
        GraphicsWindow.FillRectangle(x * 50,y * 50,50,50)
      EndIf
    EndFor
  EndFor
  
  GraphicsWindow.DrawEllipse(a*50,b*50,50,50)
  If n = 1 Then
    GraphicsWindow.DrawLine(25+(a*50),25+(b*50),25+(a*50),25+(b*50)-25)
  EndIf  
  If n = 2 Then
    GraphicsWindow.DrawLine(25+(a*50),25+(b*50),25+(a*50)+25,25+(b*50))
  EndIf 
  If n = 3 Then
    GraphicsWindow.DrawLine(25+(a*50),25+(b*50),25+(a*50),25+(b*50)+25)
  EndIf  
  If n = 4 Then
    GraphicsWindow.DrawLine(25+(a*50),25+(b*50),25+(a*50)-25,25+(b*50))
  EndIf
  Program.Delay(1000)
EndSub

While "True"
  
  If n = 1 Then
    If m[a + 1][b] = 0 Then
      n = 2
      ris()
      a = a + 1
      ris()
    ElseIf m[a][b - 1] = 0 Then
      b = b - 1
      ris()
    ElseIf 1 = 1 Then
      n = 4
      ris()     
    EndIf    
  EndIf
  
  If n = 2 Then
    If m[a][b + 1] = 0 Then
      n = 3
      ris()
      b = b + 1
      ris()
    ElseIf m[a + 1][b] = 0 Then
      a = a + 1
      ris()
    ElseIf 1 = 1 Then
      n = 1
      ris()    
    EndIf    
  EndIf
  
  If n = 3 Then
    If m[a - 1][b] = 0 Then
      n = 4
      ris()
      a = a - 1
      ris()
    ElseIf m[a][b + 1] = 0 Then
      b = b + 1
      ris()
    ElseIf 1 = 1 Then
      n = 2
      ris()       
    EndIf    
  EndIf
  
  If n = 4 Then
    If m[a][b - 1] = 0 Then
      n = 1
      ris()
      b = b - 1
      ris()
    ElseIf m[a - 1][b] = 0 Then
      a = a - 1
      ris()
    ElseIf 1 = 1 Then
      n = 3
      ris()    
    EndIf    
  EndIf

EndWhile

Комментариев нет:

Отправить комментарий

Самое популярное