1 / 1 / 0
Регистрация: 07.01.2017
Сообщений: 69
1

Замена массива на вектор и дальнейшая работа с ним

16.12.2018, 11:50. Показов 1011. Ответов 0

Доброго времени суток. Столкнулся с проблемой замены массива на вектор. В теории знаю как это должно работать, но на практике мучаюсь 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
#ifndef HEADER_HPP
#define HEADER_HPP
 
#include <time.h>
#include <stdlib.h>
#include  <glut.h>
 
const int coundSquarew = 30; //количесвто квадратиков по ширине 
const int coundSquareh = 20; //по высоте
const int scale = 25;//сколько пикселей занимает 1 квадратик
 
int width = scale * coundSquarew; //ширина поля в квадратиках
int height = scale * coundSquareh; //высота поля в квадратиков
 
int direction = 4; //направление
int num = 1; // текущее количество квадратиков змейки
 
struct snakes
{
    int x;
    int y;
}
s[100];// максимальное количество квадратиков в змейке
 
class Fructs
{
public:
    int x;
    int y;
    void New()
    {
        x = rand() % coundSquarew;
        y = rand() % coundSquareh;
    }
 
    void drawApple()
    {
        glColor3f(1.0, 1.0, 0.0);
        glRectf(x*scale, y*scale, (x + 1)*scale, (y + 1)*scale);
    }
}
m[10];
 
#endif //HEADER_HPP
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include "header.hpp"
 
void drawField() //рисует клеточки на экране
{
    glColor3f(0.2, 0.5, 0.4);
    glBegin(GL_LINES);
    for (int i = 0; i < width; i += scale) //от 0 до ширины с шагом scale рисуем вертикальные линии
    {
        glVertex2f(i, 0);
        glVertex2f(i, height);
    }
    for (int j = 0; j < height; j += scale) //от 0 до высоты с шагом scale рисуем горизонтальные линии
    {
        glVertex2f(0, j);
        glVertex2f(width, j);
    }
    glEnd();
}
 
void drawSnake()
{
    glColor3f(1.0, 0.8, 0.9); //цвет розовый
    for (int i = 0; i < num; i++) //в цикле от 0 до кол-ва змейки рисуем квадратик
    {
        glRectf(s[i].x*scale, s[i].y*scale, (s[i].x + 1)*scale, (s[i].y + 1)*scale);
    }
}
 
void keyBoard(int key, int a, int b) //принимаем ключ  
{
    switch (key)
    {
    case 101: //вверх
        direction = 0;
        break;
    case 102: //направо
        direction = 2;
        break;
    case 100: //налево
        direction = 1;
        break;
    case 103: //вниз
        direction = 3;
        break;
    }
}
 
void step()
{
    for (int i = num; i > 0; --i)  //перемещаем тело на позицию следующего элемента
    {
        s[i].x = s[i - 1].x;
        s[i].y = s[i - 1].y;
    }
 
    if (direction == 0) s[0].y += 1; //смотрим какая клавиша нажата и перещеаем голов
    if (direction == 1) s[0].x -= 1;
    if (direction == 2) s[0].x += 1;
    if (direction == 3) s[0].y -= 1;
 
    for (int i = 0; i < 10; i++) //
    {
        if ((s[0].x == m[i].x) && (s[0].y == m[i].y)) // проверяемесли головной 0 эл. равен положению яблока тогда
        {
            num++; // количество яблок увеличится
            m[i].New(); // вызывается функция зачистки яблока и создания нового яблока
        }
    }
 
    if (s[0].x > coundSquarew) //проверка на выход за границу и сразу меняем направление
    {
        direction = 1;
    };
 
    if (s[0].x < 0)
    {
        direction = 2;
    };
 
    if (s[0].y > coundSquareh)
    {
        direction = 3;
    };
 
    if (s[0].y < 0)
    {
        direction = 0;
    };
 
    for (int i = 1; i < num; i++) // цикл на столкновение с хвостом
    {
        if ((s[0].x == s[i].x) && (s[0].y == s[i].y))   // если головной элемент столкнулся с хвостом
        {
            num = i; //сокращаем до того элемента до которого столкнулись
        }
    };
};
 
void display()
{
 
    glClear(GL_COLOR_BUFFER_BIT);
    for (int i = 0; i < 10; i++)
    {
        m[i].drawApple();
    }
    drawField();
    drawSnake();
    glFlush();
}
 
void timer(int = 0)
{
    display();
 
    step();
 
    glutTimerFunc(70, timer, 0);
}
 
int main(int argc, char **argv)
{
    for (int i = 0; i < 10; i++)
    {
        m[i].New();
    };
 
    s[0].x = 0; //начальная позиция змейки
    s[0].y = 0;
 
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(width, height); //создаем экраn
    glutCreateWindow("Snake");
    glClearColor(0.0, 0.3, 0.2, 0.5);  //цвет фона
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, width, 0, height);
 
    glutDisplayFunc(display);
    glutTimerFunc(50, timer, 0);
    glutSpecialFunc(keyBoard);
 
    glutMainLoop();
}
это начальная прога с массивами для змейки и фруктов. Также покажу вам мою версию, только пожалуйста сильно не бейте
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "header.hpp"
 
void drawField() //рисует клеточки на экране
{
    glColor3f(0.2, 0.5, 0.4);
    glBegin(GL_LINES);
    for (int i = 0; i < width; i += scale) //от 0 до ширины с шагом scale рисуем вертикальные линии
    {
        glVertex2f(i, 0);
        glVertex2f(i, height);
    }
    for (int j = 0; j < height; j += scale) //от 0 до высоты с шагом scale рисуем горизонтальные линии
    {
        glVertex2f(0, j);
        glVertex2f(width, j);
    }
    glEnd();
}
 
void drawSnake()
{
    glColor3f(1.0, 0.8, 0.9); //цвет розовый
    for (int i = 0; i < num; i++) //в цикле от 0 до кол-ва змейки рисуем квадратик
    {
        glRectf(s[i].x*scale, s[i].y*scale, (s[i].x + 1)*scale, (s[i].y + 1)*scale);
    }
}
 
void keyBoard(int key, int a, int b) //принимаем ключ  
{
    switch (key)
    {
    case 101: //вверх
        direction = 0;
        break;
    case 102: //направо
        direction = 2;
        break;
    case 100: //налево
        direction = 1;
        break;
    case 103: //вниз
        direction = 3;
        break;
    }
}
 
void step(std::vector<std::vector<Fructs>> &apple)
{
    for (int i = num; i > 0; --i)  //перемещаем тело на позицию следующего элемента
    {
        s[i].x = s[i - 1].x;
        s[i].y = s[i - 1].y;
    }
 
    if (direction == 0) s[0].y += 1; //смотрим какая клавиша нажата и перещеаем голов
    if (direction == 1) s[0].x -= 1;
    if (direction == 2) s[0].x += 1;
    if (direction == 3) s[0].y -= 1;
 
    std::for_each(apple.begin(), apple.end(), [](std::vector<Fructs> &apples)
    {
        if ((s[0].x == apples.operator[].x) && (s[0].y == apples.operator[].y)) // проверяемесли головной 0 эл. равен положению яблока тогда
        {
            num++; // количество яблок увеличится
            apples.operator[]->Fructs::drawApple; // вызывается функция зачистки яблока и создания нового яблока
        };
    });
 
    if (s[0].x > coundSquarew) //проверка на выход за границу и сразу меняем направление
    {
        direction = 1;
    };
 
    if (s[0].x < 0)
    {
        direction = 2;
    };
 
    if (s[0].y > coundSquareh)
    {
        direction = 3;
    };
 
    if (s[0].y < 0)
    {
        direction = 0;
    };
 
    for (int i = 1; i < num; i++) // цикл на столкновение с хвостом
    {
        if ((s[0].x == s[i].x) && (s[0].y == s[i].y))   // если головной элемент столкнулся с хвостом
        {
            num = i; //сокращаем до того элемента до которого столкнулись
        }
    };
};
 
void display(std::vector<std::vector<Fructs>> &apple)
{
 
    glClear(GL_COLOR_BUFFER_BIT);
    std::for_each(apple.begin(), apple.end(), [](std::vector<Fructs> &apples)
    {
        apples.operator[]->Fructs::drawApple();
    });
    drawField();
    drawSnake();
    glFlush();
}
 
//void timer(int = 0)
//{
    //display();
//
    //step();
 
    //glutTimerFunc(70, timer, 0);
//}
 
int main(int argc, char **argv)
{
    std::vector<std::vector<Fructs>> apple(10);
    std::for_each(apple.begin(), apple.end(), [](std::vector<Fructs> &apples)
    {
        apples.operator[]->Fructs::New();
    });
 
    s[0].x = 0; //начальная позиция змейки
    s[0].y = 0;
 
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(width, height); //создаем экраn
    glutCreateWindow("Snake");
    glClearColor(0.0, 0.3, 0.2, 0.5);  //цвет фона
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, width, 0, height);
 
    glutDisplayFunc();
    glutTimerFunc(50, timer, 0);
    glutSpecialFunc(keyBoard);
 
    glutMainLoop();
}
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
#include  <glut.h>
#include <vector>
#include <algorithm>
 
const int coundSquarew = 30; //количесвто квадратиков по ширине 
const int coundSquareh = 20; //по высоте
const int scale = 25;//сколько пикселей занимает 1 квадратик
 
int width = scale * coundSquarew; //ширина поля в квадратиках
int height = scale * coundSquareh; //высота поля в квадратиков
 
int direction = 4; //направление
int num = 1; // текущее количество квадратиков змейки
 
struct snakes
{
    int x;
    int y;
}s[100];// максимальное количество квадратиков в змейке
 
class Fructs
{
public:
    int x;
    int y;
 
    void New();
    void drawApple();
};
 
#endif //HEADER_HPP
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "header.hpp"
 
void Fructs::New()
{
    x = rand() % coundSquarew;
    y = rand() % coundSquareh;
}
 
void Fructs::drawApple()
{
    glColor3f(1.0, 1.0, 0.0);
    glRectf(x*scale, y*scale, (x + 1)*scale, (y + 1)*scale);
}
собственно здесь уже появились проблемы, и в целом мне кажется я сильно напортачил(
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2018, 11:50
Ответы с готовыми решениями:

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

Результат select в массив и дальнейшая работа с ним
Выбираю с помощью mysql все товары с таблицы, заношу все в постоянный массив. Далее хочу работать с...

Динамическое добавление компонента в IDesignerHost и дальнейшая с ним работа
Добрый вечер!!! Подскажите пожалуйста, каким образом можно добавить Button в созданную мною форму....

Класс Вектор и работа с ним
Доброго времени суток! Решаю задания из учебника Блинова &quot;Java.Промышленное программирование&quot;....

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2018, 11:50
Помогаю со студенческими работами здесь

Создание двумерного массива и работа с ним
создать двумерный массив размерностью (n,n),отсортировать таким образом,что бы поменялись элементы...

Заполнение двумерного массива и работа с ним
Здравствуйте!! Подскажите, как работать с массивами???

Передача двумерного массива в функцию и работа с ним
Имею вызов: fillSquareArrayRandom(&amp;arr, arrMax, arrMax1); и описание: void...

обявление двумерного ассоциативного массива и работа с ним
как сделать как написано в subj или посоветуйте доку где про это толково написано


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru