мини-игра проблема с циклом 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