Mail.ru
Почта
Мой Мир
Одноклассники
ВКонтакте
Игры
Знакомства
Новости
Календарь
Облако
Заметки
Все проекты
Все проекты
выход
Регистрация
Вход
Категории
Все вопросы проекта
Компьютеры, Интернет
Темы для взрослых
Авто, Мото
Красота и Здоровье
Товары и Услуги
Бизнес, Финансы
Наука, Техника, Языки
Философия, Непознанное
Города и Страны
Образование
Фотография, Видеосъемка
Гороскопы, Магия, Гадания
Общество, Политика, СМИ
Юридическая консультация
Досуг, Развлечения
Путешествия, Туризм
Юмор
Еда, Кулинария
Работа, Карьера
О проектах Mail
Животные, Растения
Семья, Дом, Дети
Другое
Знакомства, Любовь, Отношения
Спорт
Золотой фонд
Искусство и Культура
Стиль, Мода, Звезды
Полный список
Спросить
Лидеры
Поиск по вопросам
Ответы Mail
Программирование
Android
C/C++
C#
iOS
Java
JavaScript
jQuery
SQL
Perl
PHP
Python
Веб-дизайн
Верстка, CSS, HTML, SVG
Системное администрирование
Другие языки и технологии
Вопросы - лидеры.
Python выдаёт ошибку
1 ставка
Как сделать анимацию бега и ходьбы в Roblox Studio раздельно?
1 ставка
Лидеры категории
Лена-пена
Искусственный Интеллект
М.И.
Искусственный Интеллект
Y.Nine
Искусственный Интеллект
•••
Arduino Flappy Bird
-
Ученик
(113), на голосовании
1 год назад
#include <LedControl.h>
#define PIN_BUTTON 2
#define PIN_CS 10
#define PIN_CLK 11
#define PIN_DIN 12
#define ADDR 0
#define GAME_STATE_RUNNING 1
#define GAME_STATE_END 2
#define FIELD_WIDTH 8
#define FIELD_HEIGHT 8
#define FIELD_SIZE FIELD_WIDTH*FIELD_HEIGHT
#define BIRD_SPEED 200 // delay in ms
const byte endScreen[] = {B10000001, B01000010, B00100100, B00011000, B00011000, B00100100, B01000010, B10000001};
const byte obstacleTypes[] = {B11000011, B10001111, B11000111, B11100011, B10011111, B11001111, B11100111, B11110011};
LedControl ledMatrix = LedControl(PIN_DIN, PIN_CLK, PIN_CS, 1);
bool buttonState;
byte birdPos, obstacles[8], gameState, nextObstacle;
unsigned long currentMillis, lastBirdAction, lastLevelAction;
int levelSpeed, gameScore;
void setup()
{
randomSeed(analogRead(0));
pinMode(PIN_BUTTON, INPUT);
ledMatrix.shutdown(ADDR, false);
ledMatrix.setIntensity(ADDR, 8);
ledMatrix.clearDisplay(ADDR);
Serial.begin(9600);
initGame();
}
void loop()
{
switch (gameState) {
case GAME_STATE_RUNNING:
for (byte row = 0; row < FIELD_WIDTH; row++) {
if (row == 2) {
ledMatrix.setRow(ADDR, row, obstacles[row] | birdPos);
} else {
ledMatrix.setRow(ADDR, row, obstacles[row]);
}
}
if (birdPos <= 0 || birdPos >= 255) {
endGame();
break;
}
currentMillis = millis();
processObstacles();
if (currentMillis - lastBirdAction > BIRD_SPEED) {
setBirdPos(true);
}
if (isButtonPressed()) {
setBirdPos(false);
}
break;
case GAME_STATE_END:
if (isButtonPressed()) {
initGame();
}
break;
}
}
void initGame()
{
buttonState = false;
lastBirdAction = millis();
lastLevelAction = millis();
levelSpeed = 500;
birdPos = B00001000;
nextObstacle = 1;
gameState = GAME_STATE_RUNNING;
gameScore = 0;
ledMatrix.clearDisplay(ADDR);
for (byte i = 0; i < 8; i++) {
obstacles[i] = B00000000;
}
}
void endGame()
{
gameState = GAME_STATE_END;
Serial.println("Game over! You score = " + String(gameScore));
for (byte row = 0; row < 8; row++) {
ledMatrix.setRow(ADDR, row, endScreen[row]);
}
delay(1000);
}
void setBirdPos(bool leftShift)
{
if (leftShift) {
birdPos <<= 1;
} else {
birdPos >>= 1;
}
for (byte i = 0; i < 8; i++) {
if (bitRead(birdPos, i) == 1 && bitRead(obstacles[2], i) == 1) {
endGame();
return;
}
}
lastBirdAction = currentMillis;
}
void processObstacles()
{
if (currentMillis - lastLevelAction <= levelSpeed) {
return;
}
for (byte i = 1; i < FIELD_WIDTH; i++) {
obstacles[i - 1] = obstacles[i];
}
if (nextObstacle <= 0) {
obstacles[FIELD_WIDTH - 1] = obstacleTypes[random(sizeof(obstacleTypes))];
nextObstacle = 3;
if (levelSpeed > 50) {
levelSpeed -= 20;
}
} else {
obstacles[FIELD_WIDTH - 1] = B00000000;
nextObstacle--;
}
if (bitRead(obstacles[2], 0) == 0 && bitRead(obstacles[1], 0) == 1) {
gameScore++;
}
lastLevelAction = currentMillis;
}
bool isButtonPressed()
{
if (!buttonState) {
if (digitalRead(PIN_BUTTON) == LOW) {
buttonState = true;
return true;
}
} else {
if (digitalRead(PIN_BUTTON) == HIGH) {
buttonState = false;
}
}
return false;
}
Дополнен 1 год назад
Требуется исправить код, чтобы при окончании игры на экран матричного модуля выводилось число пройденных препятствий
Голосование за лучший ответ
Kabachok19
Мудрец
(10233)
1 год назад
Ок
Виктор Кадышев
Оракул
(60928)
1 год назад
Продолжай держать нас в курсе
-
Ученик (113)
1 год назад
ограничение по количеству слов, держу в курсе, а так мне код исправить надо
Виктор Кадышев
Оракул (60928) -, когда получится?
Руслан Бушев
Ученик
(230)
1 год назад
По методичке
-
Ученик (113)
1 год назад
точно
Похожие вопросы
#define PIN_BUTTON 2
#define PIN_CS 10
#define PIN_CLK 11
#define PIN_DIN 12
#define ADDR 0
#define GAME_STATE_RUNNING 1
#define GAME_STATE_END 2
#define FIELD_WIDTH 8
#define FIELD_HEIGHT 8
#define FIELD_SIZE FIELD_WIDTH*FIELD_HEIGHT
#define BIRD_SPEED 200 // delay in ms
const byte endScreen[] = {B10000001, B01000010, B00100100, B00011000, B00011000, B00100100, B01000010, B10000001};
const byte obstacleTypes[] = {B11000011, B10001111, B11000111, B11100011, B10011111, B11001111, B11100111, B11110011};
LedControl ledMatrix = LedControl(PIN_DIN, PIN_CLK, PIN_CS, 1);
bool buttonState;
byte birdPos, obstacles[8], gameState, nextObstacle;
unsigned long currentMillis, lastBirdAction, lastLevelAction;
int levelSpeed, gameScore;
void setup()
{
randomSeed(analogRead(0));
pinMode(PIN_BUTTON, INPUT);
ledMatrix.shutdown(ADDR, false);
ledMatrix.setIntensity(ADDR, 8);
ledMatrix.clearDisplay(ADDR);
Serial.begin(9600);
initGame();
}
void loop()
{
switch (gameState) {
case GAME_STATE_RUNNING:
for (byte row = 0; row < FIELD_WIDTH; row++) {
if (row == 2) {
ledMatrix.setRow(ADDR, row, obstacles[row] | birdPos);
} else {
ledMatrix.setRow(ADDR, row, obstacles[row]);
}
}
if (birdPos <= 0 || birdPos >= 255) {
endGame();
break;
}
currentMillis = millis();
processObstacles();
if (currentMillis - lastBirdAction > BIRD_SPEED) {
setBirdPos(true);
}
if (isButtonPressed()) {
setBirdPos(false);
}
break;
case GAME_STATE_END:
if (isButtonPressed()) {
initGame();
}
break;
}
}
void initGame()
{
buttonState = false;
lastBirdAction = millis();
lastLevelAction = millis();
levelSpeed = 500;
birdPos = B00001000;
nextObstacle = 1;
gameState = GAME_STATE_RUNNING;
gameScore = 0;
ledMatrix.clearDisplay(ADDR);
for (byte i = 0; i < 8; i++) {
obstacles[i] = B00000000;
}
}
void endGame()
{
gameState = GAME_STATE_END;
Serial.println("Game over! You score = " + String(gameScore));
for (byte row = 0; row < 8; row++) {
ledMatrix.setRow(ADDR, row, endScreen[row]);
}
delay(1000);
}
void setBirdPos(bool leftShift)
{
if (leftShift) {
birdPos <<= 1;
} else {
birdPos >>= 1;
}
for (byte i = 0; i < 8; i++) {
if (bitRead(birdPos, i) == 1 && bitRead(obstacles[2], i) == 1) {
endGame();
return;
}
}
lastBirdAction = currentMillis;
}
void processObstacles()
{
if (currentMillis - lastLevelAction <= levelSpeed) {
return;
}
for (byte i = 1; i < FIELD_WIDTH; i++) {
obstacles[i - 1] = obstacles[i];
}
if (nextObstacle <= 0) {
obstacles[FIELD_WIDTH - 1] = obstacleTypes[random(sizeof(obstacleTypes))];
nextObstacle = 3;
if (levelSpeed > 50) {
levelSpeed -= 20;
}
} else {
obstacles[FIELD_WIDTH - 1] = B00000000;
nextObstacle--;
}
if (bitRead(obstacles[2], 0) == 0 && bitRead(obstacles[1], 0) == 1) {
gameScore++;
}
lastLevelAction = currentMillis;
}
bool isButtonPressed()
{
if (!buttonState) {
if (digitalRead(PIN_BUTTON) == LOW) {
buttonState = true;
return true;
}
} else {
if (digitalRead(PIN_BUTTON) == HIGH) {
buttonState = false;
}
}
return false;
}