Зациклить программу

Neket777
Offline
Зарегистрирован: 27.01.2016

Доброго времени суток!)

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

все получается, но не могу зациклить программу. после нажатия кнопки судьи светодиод гаснет, но дальше ничего не происходит, программа не возвращается в начало

 





#define BUZZER_PIN 12 // пин с пищалкой 
#define J_PIN 11 // пин судьи 
#define J_LED 6 //led судьи 
#define PLAYER_COUNT 4 // количество игроков 
int buttonPins[PLAYER_COUNT] = {7, 8, 9, 10}; 
int ledPins[PLAYER_COUNT] = {2, 3, 4, 5}; 



void setup() { 
pinMode(BUZZER_PIN, OUTPUT); 
pinMode(J_PIN, INPUT_PULLUP); 
pinMode(J_LED, OUTPUT); 
//pinMode(LED_0, OUTPUT); 
//pinMode(LED_1, OUTPUT); 
//pinMode(PLAYER_0, INPUT_PULLUP); 
//pinMode(PLAYER_1, INPUT_PULLUP); 
for (int player = 0; player < PLAYER_COUNT; ++player) { 
// при помощи квадратных скобок получают значение в массиве 
// под указанным в них номером. Нумерация начинается с нуля 
pinMode(ledPins[player], OUTPUT); 
pinMode(buttonPins[player], INPUT_PULLUP); 
} 
} 

void loop()  

 {
	
	 digitalWrite(J_LED, HIGH);
	 while (!digitalRead(J_PIN)){
		 //tone(BUZZER_PIN, 3000, 250);
		 delay(100);
		 digitalWrite(J_LED, LOW);
		 delay(100);
		 tone(BUZZER_PIN, 3000, 250); // 3 килогерца, 250 миллисекунд

		 for (int player = 0; ; player = (player+1) % PLAYER_COUNT) {
			 // если игрок номер «player» нажал кнопку...
			 if (!digitalRead(buttonPins[player])) {
				 // ...включаем его светодиод и сигнал победы на 1 сек
				 digitalWrite(ledPins[player], HIGH);

				 for (int player = 0; ; player = (player+1) % PLAYER_COUNT) {
					 // если светодиод победителя включен
					 if (digitalRead(ledPins[player] == HIGH)) {
						 // ждём нажатия кнопки судьи и гасим светодиод
						 while (!digitalRead(J_PIN)){
							 digitalWrite(ledPins[player], LOW);
							 break;
 


						 }
					 }
				 }

			 }
		 }
		 
	 }
 }
 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Строки с 48 по 54, Вы думаете, что Вы ждете чего то (судя по комментарию), однако вместо while можно было смело написать if и убрать внутри break. Т.е. если J_PIN == LOW, то войдем внутрь while, выполним digitalWrite и тут же выйдем из этого while, а если J_PIN == HIGH, то мы ждать ничего не будем и перейдем сразу на строку 55.

Зацикливание возможно в строках 38 - 59, потому что там нет условия выхода. Возможно Вы предполагаете, что break в строке 50 это сделает, ан нет, я уже выше написал, где он сработает. А если никто не нажал кнопку, то будем крутиться вечно и на кнопку судьи будет наплевать, потому что проверка её нажатия стоит только после нажатия кнопки игрока. Тогда, хотя бы вставьте, для начала, условие выхода в строку 38, а то будете вечно крутиться.

Вообще алгоритм плохой, здесь есть приоритет у кнопок игроков, номера которых в массиве в начале, а также существует вариант, когда мы в массиве проверяем кнопку 3, а в этот момент нажата кнопка 2, затем кнопка 4, в этом случае получится так, что кнопка 2 пролетает как фанера, потому что после кнопки 3 мы проверим кнопку 4, а она нажата позже кнопки 2, но программа этого не словит. Такие задачи, на мой взгляд, нужно решать так, чтобы фиксировать нажатие кнопки одной командой считывания, например, все кнопки располагать на один порт и считывать его состояние, а уже потом выделять из него состояния кнопок, тогда будут ситуации одновременного нажатия и описанных выше ситуаций не будет. Впрочем это всё философия, возможно Вам не нужна такая особая точность, тогда на последний абзац забейте ;)

 

sva1509
Offline
Зарегистрирован: 07.12.2012

Доброго времени суток !

В строках 38 и 44 у вас ошибка - нет условия выхода из цикла.

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

sva1509 пишет:

Доброго времени суток !

В строках 38 и 44 у вас ошибка - нет условия выхода из цикла.

 

Строго говоря, совсем не обязательно задавать условия выхода, есть возможность прервать цикл через break. Другое дело, что этого нет, точнее некорректный алгоритм.