мини-игра проблема с циклом for()

falgik
Offline
Зарегистрирован: 24.05.2020
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
byte pleyer[8] = {
  0b01100,
  0b01100,
  0b00000,
  0b01110,
  0b11100,
  0b01100,
  0b11010,
  0b10011
};

byte wall[8] = {
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111
};

uint32_t speed_p  = 400;
int y_p, x_p, last_x_p, last_y_p = 1;
uint32_t timer, timer2;
int x_w[4] = {7, 11, 4, 14};    // массив координат стен по x
int y_w[4] = {1, 0, 0, 1};      // и по y
void setup() {
  lcd.begin(16, 2);
  lcd.createChar(1, pleyer);
  lcd.createChar(2, wall);
  Serial.begin(9600);
  for (byte n; n <= 3; n++) {              // рисуем стены
    lcd.setCursor(x_w[n], y_w[n]);         // по координатам из массивов
    lcd.write(2);
  }
}

void loop() {
  if (analogRead(7) < 300 && timer < millis() - speed_p ) {  // если джойстик наклонен вправо и
    if (x_p < 15 && colision_righ()) {                       // это не крайняя правая координата и  нет столкновений со стенами (в будущем и с врагами и с другими игроками)
      last_x_p = x_p;     // запоминаем предыдущее координаты игрока
      last_y_p = y_p;     // что бы поставить там пробел
      x_p++;                                                 // прибавляем к координате персонажа по х +1
      timer = millis();
    }
  }
  if (analogRead(7)  > 800 && timer < millis() - speed_p ) { // то же самое, только координату уменьшаем
    if (x_p > 0 && colision_left()) {
      last_x_p = x_p;
      last_y_p = y_p;
      x_p--;
      timer = millis();
    }
  }
  if (analogRead(3)  > 800 && timer < millis() - speed_p ) { // идинтично для у
    if (y_p < 1 && colision_down()) {
      last_x_p = x_p;
      last_y_p = y_p;
      y_p++;
      timer = millis();
    }
  }
  if (analogRead(3) < 300 && timer < millis() - speed_p ) {
    if (y_p > 0 && colision_up()) {
      last_x_p = x_p;
      last_y_p = y_p;
      y_p--;
      timer = millis();
    }
  }


  lcd.setCursor(x_p, y_p);                  // рисуем игрока на его координатах
  lcd.write(1);
  lcd.setCursor(last_x_p, last_y_p);        // рисуем пробел на предыдущих координатах
  lcd.print(' ');

  //  for (byte n; n <= 3; n++) {           // если прописать отрисовку стен в лупе а не в сетапе и отключить столкновения игрока со стенами    
  //    lcd.setCursor(x_w[n], y_w[n]);      // то при прохождении игрока сквозь стену она пропадает и потом не появляется  
  //    lcd.write(2);                       // хотя должна,ведь стены рисуются постоянно,
  //}                                       // ещё интересно то что если после lcd.write(2) прописать Serial.println(n) то всё начинает работать как задумано, а если delay(даже большое значение) всеровно не работает


}
bool colision_righ() {  // предотвращаем возможные колизии при движении вправо
  bool go = true;                                  // разрешаем движение

  if (x_p + 1 == x_w[0] && y_p == y_w[0])          // если найдено
    go = false;                                    // хоть одна
  if (x_p + 1 == x_w[1] && y_p == y_w[1])          // колизия
    go = false;                                    // запрещаем
  if (x_p + 1 == x_w[2] && y_p == y_w[2])          // движение,
    go = false;                                    // если нет
  if (x_p + 1 == x_w[3] && y_p == y_w[3])          // то движение
    go = false;                                    // остается разрешенным

  return (go);                                     // возвращаем результат (так все работает отлично)
}

//bool colision_righ() {                           // хотел бы крутить это всё в цикле
//  bool go = true;                                // неохота прописывать колизии с десятками объектов вручную
//  for (byte n; n <= 3; n++) {
//    if (x_p + 1 == x_w[n] && y_p == y_w[n])      // но так почему то не работает (в этом вся проблема)
//      go = false;
//  }
//  return (go);
//}

bool colision_left() {
  bool go = true;
  if (x_p - 1 == x_w[0] && y_p == y_w[0])
    go = false;
  if (x_p - 1 == x_w[1] && y_p == y_w[1])
    go = false;
  if (x_p - 1 == x_w[2] && y_p == y_w[2])
    go = false;
  if (x_p - 1 == x_w[3] && y_p == y_w[3])
    go = false;
  return (go);
}
bool colision_down() {
  bool go = true;
  if (x_p == x_w[0] && y_p + 1 == y_w[0] )
    go = false;
  if (x_p == x_w[1] && y_p + 1 == y_w[1] )
    go = false;
  if (x_p == x_w[2] && y_p + 1 == y_w[2] )
    go = false;
  if (x_p == x_w[3] && y_p + 1 == y_w[3] )
    go = false;

  return (go);
}
bool colision_up() {
  bool go = true;
  if (x_p == x_w[0] && y_p - 1 == y_w[0] )
    go = false;
  if (x_p == x_w[1] && y_p - 1 == y_w[1] )
    go = false;
  if (x_p == x_w[2] && y_p - 1 == y_w[2] )
    go = false;
  if (x_p == x_w[3] && y_p - 1 == y_w[3] )
    go = false;

  return (go);
}

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

35 строка чтоли???

falgik
Offline
Зарегистрирован: 24.05.2020

103

falgik
Offline
Зарегистрирован: 24.05.2020

в комментариях описал проблему

b707
Онлайн
Зарегистрирован: 26.05.2017

falgik, а если учебник почитать?

http://arduino.ru/Reference/For

читай внимательно, сравни со своей строкой и ищи ошибку

b707
Онлайн
Зарегистрирован: 26.05.2017

falgik пишет:

103

строки 35, 81 и 103 - все неправильные

falgik
Offline
Зарегистрирован: 24.05.2020

byte n; не подходит? обязательно  byte n = 0;? больше никакой разницы с примерами не вижу

falgik
Offline
Зарегистрирован: 24.05.2020

мда, так и есть, начальное значение обязательно,извиняюсь за глупый вопрос, думал что здесь как и с обычной переменной по умолчанию = 0

 

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

falgik пишет:

мда, так и есть, начальное значение обязательно,извиняюсь за глупый вопрос, думал что здесь как и с обычной переменной по умолчанию = 0

 

Нету такого умолчания, чтобы обычная переменная была заранее равна 0.