Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 13.07.2020
Сообщений: 1
1

Небольшая работа ( Массивы, микропроцессоры )

13.07.2020, 20:39. Просмотров 214. Ответов 1
Метки нет (Все метки)

Всем привет, надеюсь я в правильном месте сделал вопрос... делаю небольшой проект (игру на память). Изначальная идея состоит в том, что у нас есть 2 лэда и джойстик. Мигает какая то случайная последовательность ( к примеру...левый/левый/правый/левый и тд ) и с помощью джойстика нужно это повторить.

Что у меня есть на данный момент, я сделал массив в который запихнул случайную последовательность из 1 и 0. ( Обозначаю просто 1 как правый лэд, а 0 как левый лэд.)

C
1
2
3
4
5
6
7
8
9
10
11
int Game[3];
int Player[3];
 
void RandomNumber() {
    
    srand((unsigned int)time(NULL));
    for(unsigned int i = 0; i < sizeof(Game)/sizeof(Game[0]); i++) {
        int v = rand() % 2;
        Game[i] = v;
    }
}
У меня есть функция, которая может промигать последовательность

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void PlayDemo() {
    int i;
    for(i = 0; i <= 3; i++) {
        if(Game[i] == 1) {
            PORTA = 0x80;
            delay(n);
            PORTA = 0x00;
            delay(n);
        }
        else if (Game[i] == 0) {
            PORTA = 0x01;
            delay(n);
            PORTA = 0x00;
            delay(n);
        }
        else {
            PORTA = 0x00;
        }
    }
}
В main-е я стараюсь использовать джойстик и в зависимости от стороны, в которую я поверну джойстик записать 1 или 0 в массив 'Player[]', который хочу сравнивать с 'Game[]'

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int main(void) {
    MCUCR |= 0x80;
    MCUCR |= 0x80;
    DDRA = 0xFF;
    PORTF = 0x20;
    
    copy(Game, ForCheck);
    RandomNumber();
    PlayDemo();
    
    while(1)
    {
        
        uint8_t x = PINF;
        if(!(x & 0x20)) {
            PORTA = 0x80;
            // Пишу в массив игрока
            Player[i] = 1;
            // Проверяю массив игрока равен ли игре
            check(Game, Player);
        }
        else if(!(x & 0x08)) {
            PORTA = 0x01;
            // Пишу в массив игрока
            Player[i] = 0;
            // Проверяю массив игрока равен ли игре
            check(Game, Player);
        }
        else {
            PORTA = 0x00;
        }
    }
}
Проблема заключается в том, что допустим массив из 100 элементов я хочу проходить только по 2 элемента. Я имею ввиду то, что просигналить 2 элемента массива "Game[]"...ждать ответ от джойстика...записать значения (1/0) в массив "Player[]" и начать сравнивать. Если элементы 2-ух массив сходятся, то взять еще 2 элемента из массива "Game[]" и просигналить уже 4 раза...повторив первые 2 и тд. Я не понимаю, как реализовать этот момент...

Надеюсь ничего не упустил.

Весь код...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#define F_CPU 2000000UL
#include <avr/io.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
 
// Global
int Game[3];
int Player[3];
int ForCheck[3];
int i;
 
 
const uint16_t n = 500;
 
void delay(uint16_t n) {
    for(uint16_t i = 0; i < n ; i++) {
        for(uint16_t j = 0; j < 200 ; j++) {
            // Ts?kli keha sees on " asm volatile ("NOP"); "
            asm volatile ("NOP");
        }
    }
}
// Функция для заполнения массива Game единицами и нулями
void RandomNumber() {
    
    srand((unsigned int)time(NULL));
    for(unsigned int i = 0; i < sizeof(Game)/sizeof(Game[0]); i++) {
        int v = rand() % 2;
        Game[i] = v;
    }
}
 
void PlayDemo() {
    int i;
    for(i = 0; i <= 3; i++) {
        if(Game[i] == 1) {
            PORTA = 0x80;
            delay(n);
            PORTA = 0x00;
            delay(n);
        }
        else if (Game[i] == 0) {
            PORTA = 0x01;
            delay(n);
            PORTA = 0x00;
            delay(n);
        }
        else {
            PORTA = 0x00;
        }
    }
}
 
void check(int ForCheck[], int Player[]) {
    int i;
    for(i=0;i<3;i++){
        // Если элементы не сходяться
        if(ForCheck[i] != Player[i]) {
            // Включаем все LED, для обозначения пройгрыша
            PORTA = 0xFF;
            delay(n);
            // Начинаем заного.
            PlayDemo();
        }
        else if (ForCheck[i] == Player[i]) {
            PORTA = 0x00;
        }
        else {
            PORTA = 0x00;
    }
}
}
 
 
void copy(int Game[], int ForCheck[]) {
    for(unsigned int i = 0; i <3; i++) {
        ForCheck[i] = Game[i];
    }
}
 
 
 
int main(void) {
    MCUCR |= 0x80;
    MCUCR |= 0x80;
    DDRA = 0xFF;
    PORTF = 0x20;
    
    copy(Game, ForCheck);
    RandomNumber();
    PlayDemo();
    
    while(1)
    {
        
        uint8_t x = PINF;
        if(!(x & 0x20)) {
            PORTA = 0x80;
            // Пишу в массив игрока
            Player[i] = 1;
            // Проверяю массив игрока равен ли игре
            check(ForCheck, Player);
        }
        else if(!(x & 0x08)) {
            PORTA = 0x01;
            // Пишу в массив игрока
            Player[i] = 0;
            // Проверяю массив игрока равен ли игре
            check(ForCheck, Player);
        }
        else {
            PORTA = 0x00;
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2020, 20:39
Ответы с готовыми решениями:

Код написан,нужна небольшая корректировка.Массивы
Здравствуйте,задание:: Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу...

Код написан,нужна небольшая корректировка.Массивы
Задана матрица размером N×M, N,M&lt;50. Получить массив B, присвоив его k-му элементу значение 1,...

небольшая работа с Memo
Дано поле Memo. И допустим пользователь вводит туда числа,например 1 2 3 4(через пробел). Как в...

НЕбольшая курсовая работа
Уважаемые форумчане помогите сделать курсовую в с++ монимаю мало читаю книжки но курсовуя нада...

1
1 / 1 / 0
Регистрация: 26.06.2020
Сообщений: 5
15.07.2020, 15:43 2
Здравствуйте, SUBI.
Я так понял, это игра нужна людям у которых есть отклонения от нормы, или находящимся на реабилитации?
Принцип такой:
1 Инициализация периферии контроллера.
2 Инициализация массива игры.

3 Показать комбинацию мигания светодиодов.
4 Считать с джойстика комбинацию игрока.
5 Сравнить две комбинации.
6 Если равно, то сдвинуть кадр считывания массива game, увеличить размер кадра на шаг игры.
7 Если в результате действий шага 6 вылезли за пределы массива, то закончить игру.
8 Перейти на шаг 3.

Код на реальном компиляторе не проверялся.


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <stdint.h>
 
#define GAME_STEP 2
#define GAME_ARRAY_SIZE 256
 
enum game_result {loss, victory};
 
uint16_t count = 2;
uint16_t index_arr = 0; 
 
 
uint8_t game_array[GAME_ARRAY_SIZE];
uint8_t player_array[128]; //не понятно, размер массива?
 
/* Инициализация портов, и другой периферии */
void init_io(void){
}
 
/* Инициализация массива игры */
void init_game_array(uint8_t *src, uint16_t count){
}
/* Поморгать светодиодами */
void show_flash(uint8_t *arr, uint16_t count){
}
 
/* прочитать действия игрока с джойстика*/
uint16_t read_joystik(uint8_t *arr, uint16_t count){
}
 
/* Сравнить два архива возвращает loss или victory */
enum game_result compare(uint8_t *game, uint8_t *player){
} 
 
int main(void)
{
    init_io();
    init_game_array(game_array, GAME_ARRAY_SIZE);
    while(1){
        show_flash(&game_array[index_arr], count);
        uint16_t tmp = read_joystik(player_array, count);
        if(compare(&game_array[index_arr], player_array) == victory){
            index_arr += count;
            count += GAME_STEP;
        }
        if(!(index_arr + count < GAME_ARRAY_SIZE))
                break;
    }
    return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.07.2020, 15:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

VB 6.0 Небольшая работа с графикой и моделями
Здравствуйте! Помогите пожалуйста доделать задачу. (сделанное мной прикрепил ниже). Она работает,...

Отечественные микропроцессоры
Всем привет. Хотелось бы почитать об отечественных процессорах от ОАО НПЦ «ЭЛВИС», в частности о...

Как работают все эти микропроцессоры?
Как количество транзисторов увеличивает скорость процессора?

Диалог на тему Микропроцессоры фирмы AMD
Здравствуйте. помогите, пожалуйста, составить на языке Си программу - диалог на тему...

Микропроцессоры и плис: проблемы выбора для проектирования цифровых систем
Поделитесь информацией, не могу ничего подходящего найти. Зарание спасибо.

Массивы. Работа с массивами
Доброго времени суток форумчане. Назрел вопрос. У меня берутся данные из Excel в datagridview....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.