Официальный сайт компании Arduino по адресу arduino.cc
мини-игра проблема с циклом for()
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 24/05/2020 - 23:22
#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); }
35 строка чтоли???
103
в комментариях описал проблему
falgik, а если учебник почитать?
http://arduino.ru/Reference/For
читай внимательно, сравни со своей строкой и ищи ошибку
103
строки 35, 81 и 103 - все неправильные
byte n; не подходит? обязательно byte n = 0;? больше никакой разницы с примерами не вижу
мда, так и есть, начальное значение обязательно,извиняюсь за глупый вопрос, думал что здесь как и с обычной переменной по умолчанию = 0
мда, так и есть, начальное значение обязательно,извиняюсь за глупый вопрос, думал что здесь как и с обычной переменной по умолчанию = 0