Если Вы уже успели попробовать 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
Давайте запрограммируем виртуального робота для движения в лабиринте по правилу правой руки. Робот будет иметь три датчика-дальномера и бесконечно перемещаться по неизвестному для него лабиринту.
Карту лабиринта мы зададим в двумерном массиве. 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
Комментариев нет:
Отправить комментарий