суббота, 30 января 2016 г.

EV3 НУ ПОГОДИ

Появление EV3 Basic пришлось для нас весьма кстати, наши последние EV3-проекты  стали слишком сложными для того, чтобы получать удовольствие от программирования в EV3-G. И, раз уж мы взялись за текстовое программирование, мы решили сделать что-нибудь стоящее, показывающее явные преимущества данной среды программирования. На глаза попалась электронная игра "Ну, погоди!", в которой волк ловит яйца и мы подумали - почему нет?

Для справки: «Ну, погоди!» («Электроника ИМ-02») —электронная игра, самая известная и популярная из серии первых советских портативных электронных игр с жидкокристаллическим экраном, производимых под торговой маркой «Электроника». Является неофициальным клоном Nintendo EG-26 Egg из серии Nintendo Game & Watch. Производилась с 1984 года





Инструкцию по сборке в двух форматах (LDD и PDF) можно скачать по ссылке. Для работы игры нужен только блок EV3, ИК-датчик и ИК-маяк - все остальное - не обязательные детали корпуса, который Вы можете собрать по своему вкусу.

Все файлы игры нужно скопировать с помощью EV3 Explorer (который входит в состав среды EV3 Basic) в память блока, в предварительно созданную папку volk.

Мы реализовали две версии игры, оригинальную "Волк яйца ловит" (запускать файл volk):



И версию с переработанной графикой, где Самоделкин ловит шестеренки:(запускать файл ks):


На видео ниже можно посмотреть, как работает наша игра:



В программе, которую Вы видите ниже мы используем массивы и параллельные процессы, которые обмениваются между собой информацией. Возможно вам захочется не только скачать и поиграть в нашу игру, но и изучить - как же она устроена:

player = 1
trigger = "True"
last = 0
Speed = 350  
score = 0
game_over = "False"
over = "True"
life = 3
level = 0
LCD.Clear()

Sensor.SetMode(4,2)

Speaker.Play(100,"/home/root/lms2012/prjs/volk/0")
LCD.BmpFile(1,0,0,"/home/root/lms2012/prjs/volk/1")
Speaker.Wait()

' заполняем массивы нужными значениями
For i = 0 To 4
  m1[i] = 0
  m2[i] = 0
  m3[i] = 0
  m4[i] = 0
EndFor

x1[0] = 26
y1[0] = 44
x1[1] = 34
y1[1] = 49
x1[2] = 42
y1[2] = 54
x1[3] = 52
y1[3] = 61
x1[4] = 52
y1[4] = 120

x2[0] = 26
y2[0] = 72
x2[1] = 34
y2[1] = 77
x2[2] = 42
y2[2] = 82
x2[3] = 52
y2[3] = 89
x2[4] = 52
y2[4] = 120

x3[0] = 151
y3[0] = 44
x3[1] = 143
y3[1] = 49
x3[2] = 135
y3[2] = 54
x3[3] = 126
y3[3] = 61
x3[4] = 126
y3[4] = 120

x4[0] = 150
y4[0] = 73
x4[1] = 143
y4[1] = 77
x4[2] = 136
y4[2] = 82
x4[3] = 126
y4[3] = 89
x4[4] = 126
y4[4] = 120

' Запускаем подпроцесы
Thread.Run = logic
Thread.Run = screen
' отрисовка экрана
Sub screen
  While over
    If trigger = "True" Then    
      If player = 1 Then
        LCD.BmpFile(1,0,0,"/home/root/lms2012/prjs/volk/vl1")
      EndIf
      
      If player = 2 Then
        LCD.BmpFile(1,0,0,"/home/root/lms2012/prjs/volk/vl2")
      EndIf
      
      If player = 3 Then
        LCD.BmpFile(1,0,0,"/home/root/lms2012/prjs/volk/vl3")
      EndIf
      
      If player = 4 Then
        LCD.BmpFile(1,0,0,"/home/root/lms2012/prjs/volk/vl4")
      EndIf
      
      
      For i = 0 To 4
        If m1[i] > 0 Then
          LCD.FillCircle(1,x1[i],y1[i],3)
        EndIf
        
        If m2[i] > 0 Then
          LCD.FillCircle(1,x2[i],y2[i],3)
        EndIf
        
        If m3[i] > 0 Then
          LCD.FillCircle(1,x3[i],y3[i],3)
        EndIf
        
        If m4[i] > 0 Then
          LCD.FillCircle(1,x4[i],y4[i],3)
        EndIf  
      EndFor
      
      LCD.Text(1,40,34,1,"Life-" + life + "   " + score)
      
      If game_over = "True" Then
        LCD.BmpFile(1,0,0,"/home/root/lms2012/prjs/volk/GO")
        Speaker.Note(100,"E4",3000)
        Speaker.Wait()
        Speaker.Note(100,"D4",3000)
        Speaker.Wait()
        Speaker.Note(100,"C4",3000)
        Speaker.Wait()
        Program.End()
      EndIf
      
      trigger = "False"
    EndIf
    
  EndWhile
EndSub
' процедура обработки яйца
Sub logic
  While over
    ' процедура увеличивания сложности игры
    Speed = 1000 / (0.03*score+1)
    
    ' процедура рождения яйца
    If EV3.Time > (last + (Speed*2)) Then
      If m1[0] = 0 And m1[1] = 0 And Math.Round(Math.GetRandomNumber(100)) = 10 Then
        m1[0] = EV3.Time
        last = m1[0]
        trigger = "True"
      EndIf
    EndIf
    
    If EV3.Time > (last + (Speed*2)) Then
      If m2[0] = 0 And m2[1] = 0  And Math.Round(Math.GetRandomNumber(100)) = 20 Then
        m2[0] = EV3.Time
        last = m2[0]
        trigger = "True"
      EndIf 
    EndIf
    
    If EV3.Time > (last + (Speed*2)) Then    
      If m3[0] = 0 And m3[1] = 0  And Math.Round(Math.GetRandomNumber(100)) = 30 Then
        m3[0] = EV3.Time
        last = m3[0]
        trigger = "True"
      EndIf 
    EndIf
    
    If EV3.Time > (last + (Speed*2)) Then      
      If m4[0] = 0 And m4[1] = 0  And Math.Round(Math.GetRandomNumber(100)) = 40 Then
        m4[0] = EV3.Time
        last = m4[0]
        trigger = "True"
      EndIf  
    EndIf
    
    ' цикл для перемещения яйца
    For i = 0 To 4
      If m1[i]  <> 0 And m1[i] + (Speed*(i+1)) < EV3.Time Then
        m1[i+1] = m1[i]
        m1[i] = 0 
        trigger = "True"
        Speaker.Note(100,"C4",150)
      EndIf
      
      If m2[i]  <> 0 And m2[i] + (Speed*(i+1)) < EV3.Time Then
        m2[i+1] = m2[i]
        m2[i] = 0
        trigger = "True"
        Speaker.Note(100,"C4",150)
      EndIf
      
      If m3[i]  <> 0 And m3[i] + (Speed*(i+1)) < EV3.Time Then
        m3[i+1] = m3[i]
        m3[i] = 0
        trigger = "True"
        Speaker.Note(100,"C4",150)
      EndIf
      
      If m4[i]  <> 0 And m4[i] + (Speed*(i+1)) < EV3.Time Then
        m4[i+1] = m4[i]
        m4[i] = 0
        trigger = "True"
        Speaker.Note(100,"C4",150)
      EndIf
    EndFor
    ' Проверка на забирание яйца
    
    If m1[3] > 0 And player = 1 And m1[3] + (Speed*3.5) < EV3.Time Then
      score = score+1
      m1[3] = 0
      trigger = "True"
      Speaker.Note(100,"C5",250)
    EndIf
    
    If m2[3] > 0 And player = 2 And m2[3] + (Speed*3.5) < EV3.Time Then
      score = score+1
      m2[3] = 0
      trigger = "True"
      Speaker.Note(100,"C5",250)
    EndIf
    
    If m3[3] > 0 And player = 3 And m3[3] + (Speed*3.5) < EV3.Time Then
      score = score+1
      m3[3] = 0
      trigger = "True"
      Speaker.Note(100,"C5",250)
    EndIf
    
    If m4[3] > 0 And player = 4 And m4[3] + (Speed*3.5) < EV3.Time Then
      score = score+1
      m4[3] = 0
      trigger = "True"
      Speaker.Note(100,"C5",250)
    EndIf
    ' Проверяем не упалоли яйцо
    
    If m1[4] > 0 Then
      Program.Delay(1500)
      Speaker.Note(100,"E4",500)
      Speaker.Wait()
      Speaker.Note(100,"D4",250)
      Speaker.Wait()
      Speaker.Note(100,"C4",250)
      Speaker.Wait()
      
      life = life - 1
      If life = 0 Then
        game_over = "True"
      EndIf
      m1[4] = 0
      trigger = "True"
      Program.Delay(1500)
    EndIf
    
    If m2[4] > 0 Then
      Program.Delay(1500)
      Speaker.Note(100,"E4",500)
      Speaker.Wait()
      Speaker.Note(100,"D4",250)
      Speaker.Wait()
      Speaker.Note(100,"C4",250)
      Speaker.Wait()
      
      life = life - 1
      If life = 0 Then
        game_over = "True"
      EndIf
      m2[4] = 0
      trigger = "True"
      Program.Delay(1500)
    EndIf
    
    If m3[4] > 0 Then
      Program.Delay(1500)
      Speaker.Note(100,"E4",500)
      Speaker.Wait()
      Speaker.Note(100,"D4",250)
      Speaker.Wait()
      Speaker.Note(100,"C4",250)
      Speaker.Wait()
      
      life = life - 1
      If life = 0 Then
        game_over = "True"
      EndIf
      m3[4] = 0
      trigger = "True"
      Program.Delay(1500)
    EndIf
    
    If m4[4] > 0 Then
      Program.Delay(1500)
      Speaker.Note(100,"E4",500)
      Speaker.Wait()
      Speaker.Note(100,"D4",250)
      Speaker.Wait()
      Speaker.Note(100,"C4",250)
      Speaker.Wait()
      
      life = life - 1
      If life = 0 Then
        game_over = "True"
      EndIf
      m4[4] = 0
      trigger = "True"
      Program.Delay(1500)
    EndIf
  EndWhile
EndSub
' процедура считывания покозаний ИК-датчика

Speaker.Note(100,"E4",1000)
Speaker.Wait()
Speaker.Note(100,"D4",1000)
Speaker.Wait()        

While over
  If Sensor.ReadRawValue(4,0) = 1 Then
    If player <> 1 Then
      player = 1
      trigger = "True"
    EndIf
  EndIf
  
  If Sensor.ReadRawValue(4,0) = 2 Then
    If player <> 2 Then
      player = 2
      trigger = "True"
    EndIf
  EndIf
  
  If Sensor.ReadRawValue(4,0) = 3 Then
    If player <> 3 Then
      player = 3
      trigger = "True"
    EndIf
  EndIf
  
  If Sensor.ReadRawValue(4,0) = 4 Then
    If player <> 4 Then
      player = 4
      trigger = "True"
    EndIf
  EndIf

EndWhile

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

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

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