Форум программистов, компьютерный форум CyberForum.ru

Игра Арканоид - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не могу запустить g++ http://www.cyberforum.ru/cpp-beginners/thread1545707.html
Добрый день, только что установила MinGW для win32, пробовала прописывать путь до папки C:\MinGW\bin в системные переменные Path или PATH, но при запуске g++ из cmd он не определяется.
C++ В чем плюсы лямбд? В чем очевидные и/или измеряемые плюсы лямбд в C++? Повышает ли это скорость кода? Или памяти меньше? Или еще что-то? Ну кроме повышения ЧСВ и того что это стильно-модно-молодежно? Слышал еще, что знание лямбд позволяет подкатывать к девушкам (типа "Детка, пойдем ко мне? Покажу тебе свои лямбда-исчисления8-) А затем мы апплицируем одну интересную лямбда-абстракцию под номером 69 которую я только... http://www.cyberforum.ru/cpp-beginners/thread1545696.html
Доступ к private переменной класса из его потомка C++
Здравствуйте! Как получить доступ к закрытой переменной родительского класса в методе наследника? #include <stdio.h> class Fowler { private: int c; };
Вывод данных из двумерного вектора C++
Здравстуйте, проблема состоит в том, что мне надо записать несколько строк разных данных в разные вектора, эти вектора вложить в другой вектора и потом вывести. Как вкладывать данные в вектор знаю, как вывести одномерный вектор знаю, но не получается вывести в конце уже данные из большего вектора.
C++ Написать программу-обработчик запись слов в обратном порядке http://www.cyberforum.ru/cpp-beginners/thread1545682.html
Написать программу-обработчик текстовых файлов, которая создавала бы текстовый файл, в котором слова будут написаны наоборот. Слова которые начинаются с большой буквы, должны начинаться с большой. Файл-источник, файл приемщик написать в командной строке сразу за исполнительным файлом. подскажите как каждое слово записать в обратном порядке?
C++ Расшифровка шифра Виженера Здравствуйте, помогите пожалуйста разобраться. У меня задания расшифровать шифр Виженера. Ключ <=5 Дальше весь закодированный текст писать не буду. Я так понимаю сначала надо найти длину ключа, потом сам ключ и дальше кодировать. Подскажите пожалуйста как это делать сделать нужно на С++. Где можно почитать. А еще лучше где с примерами. Или кто сам опытом поделится подробнее

Показать сообщение отдельно
obivan
Падаван С++
396 / 216 / 56
Регистрация: 11.11.2014
Сообщений: 755
Завершенные тесты: 2

Игра Арканоид - C++

06.10.2015, 13:26. Просмотров 580. Ответов 16
Метки (Все метки)

Добрый день дорогие кибер форучане, сделал попытку написать игру арканоид, вроде вот и получилось, но вот незадача, выйглядит это как то недобросовестно и ужасно со взгляда ООП, я создал подобную тему в разделе OpenGl, но не наказывайте меня модераторы, все вопросы там относяться по большей мере к графической части, а от вас хотелось бы услышать критику в стороны реализации на ООП, что улучшить, что переделать или вообще снести к чертям этот код и все заново, но уже с более четкими задачами. Оставляю код здесь на расмотрение, накидал пару коментов, они из разряда капитан очевидность, но может будут кому то нужны, жду ваших сообщений
Кликните здесь для просмотра всего текста
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#include <GL\glew.h>
#include <GL\freeglut.h>
#include <iostream>
 
class Object { // класс обьект, являеться классом родителем для классов елементы и мячь, его свойтса это координаты центра любого обьекта
private:
    int x;
    int y;
public:
    Object() : x(0), y(0){}
    Object(int x, int y) : x(x), y(y){}
 
    const int getX(void) const { return x; }
    const int getY(void) const { return y; }
    void setX(const int x) { this->x = x; }
    void setY(const int y) { this->y = y; }
    void setXY(int x, int y) { setX(x); setY(y); }
};
class Elems : public Object { // класс элементы
private:
    Object coords[4]; // координаты вержин блоков
public:
    Elems() : Object() {
        setCoords();
    }
    Elems(int x, int y) : Object(x, y){
        setCoords();
    }
 
    // набо get`ов для координат
    const int getLeftBX(void) const { return coords[0].getX(); }//левая часть координаты низа
    const int getLeftBY(void) const { return coords[0].getY(); }
    const int getLeftTX(void) const { return coords[3].getX(); }//левая часть координаты верха
    const int getLeftTY(void) const { return coords[3].getY(); }
 
    const int getRightBX(void) const { return coords[1].getX(); }//правая часть координаты низа
    const int getRightBY(void) const { return coords[1].getY(); }
    const int getRightTX(void) const { return coords[2].getX(); }//правая часть координаты верха
    const int getRightTY(void) const { return coords[2].getY(); }
 
    void setCoords(void) {//устанавливаем координаты относительно центра
        int x = getX(), y = getY();
        coords[0].setXY(x - 25, y - 5);
        coords[1].setXY(x + 25, y - 5);
        coords[2].setXY(x + 25, y + 5);
        coords[3].setXY(x - 25, y + 5);
    }
    void draw(int Red, int Green, int Blue) { // функция вывода
        setCoords();
        glColor3d(Red, Green, Blue);
        glBegin(GL_POLYGON);
        glVertex2d(coords[0].getX(), coords[0].getY());
        glVertex2d(coords[1].getX(), coords[1].getY());
        glVertex2d(coords[2].getX(), coords[2].getY());
        glVertex2d(coords[3].getX(), coords[3].getY());
        glEnd();
    }
};
class Ball : public Object {//класс мячик
private :
    unsigned int Radius;
public:
    Ball() : Object(), Radius(5) {}
    Ball(int x, int y) : Object(x, y), Radius(5) {}
    const unsigned int getRadius(void) const { return Radius; }
    void setRadius(const unsigned int Radius) { this->Radius = Radius; }
 
    void draw(int Red, int Green, int Blue) {// функция отрисовки мяча, вот тут возникают некоторые проблемы 
        glColor3d(Red, Green, Blue);
        glBegin(GL_POINTS);//с отрисовкой закрашеного мяча, пока что сделал только контур, проблемы возникают после того как я уменьшил
        int BallX, BallY, x = getX() , y = getY();//координатное соотнощение в самом начале делал для окна 600, 480 отношение по Х -300 до 300
        for (float angle = 0.3; angle < 6.4; angle += 0.1) {//по У -240 до 240 но потом решил уменьшить масшатб координатной сетки в 2 раза
            BallX = Radius * cosf(angle);// и из за этого не получаеться нормально нарисовать закрашеный мячь
            BallY = Radius * sinf(angle);//но это не така большая проблемма тк хочу загрузить текстуру
            glVertex2d(BallX + x, BallY + y);
        }
        glEnd();
    }
};
class Field {// класс поле являеться неким классом обработчиком
private:
    unsigned int Count;//кол-во блоков
    bool BallState;// состояние мяча (в движении или в начальной точке)
    const int Speed = 3;//скорость, но используеться коряво
    int velocity[2];//вектор для направления движения мяча
    //по поводу вектора: если он 1, 1 то двигаемся в правых верхний угол, если -1, 1 то в левый верхний
    // 1, - 1 в правый нижний, -1, -1 в левый нижний
 
    Elems ** Blocks;//блоки
    Elems Player;
    Ball Ball;
 
    void createField(void) {//создаем  поле из блоков,
        Count = 16;
        Blocks = new Elems*[Count];
 
        for (int i(0), x = -105, y = 100; i < Count; i++, x += 70) {
            Blocks[i] = new Elems();
            Blocks[i]->setXY(x, y);
            if (i % 4 == 3) { x -= 280; y -= 25; }
        }
    }
public:
 
    Field() : Player(0, -100), Ball(Player.getX(), Player.getY() + 10), BallState(false) {//конструктор с нач значениями
        createField();//у мяча координаты как и у игрока в начал с сдвигом на 10 по Y
    }
 
    const int getPlayerX(void) const { return Player.getX(); }//центральный X блока игронка
    const int getVelocityX(void) const { return velocity[0]; }//считываем вектор
    const int getVelocityY(void) const { return velocity[0]; }
 
    void setBallState(bool BallState) { this->BallState = BallState; }//задаем состояние мяча
    void setVelocityX(int x) { velocity[0] = x; }//задаем вектор
    void setVelocityY(int y) { velocity[1] = y; }
 
    void draw(void) {// рисуем поле
        for (int i(0); i < Count; i++)
            Blocks[i]->draw(255, 255, 0);
        Player.draw(255, 0, 0);
        Ball.draw(0, 0, 255);
    }
    void PlayerMove(unsigned char key) {//обработчик перемещения, из keyboard передаеться значение
        if (key == char(100))//если a двигаемся в лево
            Player.setX(Player.getX() + 5);
        else if (key == char(97))//если d вправо
            Player.setX(Player.getX() - 5);
        if (BallState == false) Ball.setX(Player.getX());// если мяч не запушен то следует за нами
    }
    void Dell(int i) {// импровизированая функция удаления, лучше не придумал, были проблемы с освобождением памяти поэтому пока так
        for (int j(i); j < Count; j++) {
            Blocks[j] = Blocks[j + 1];
        }
        Count--;
    }
    void BallTick(void) {//функция перемещения мяча
        for (int j(0); j < Speed; j++) { // цикл по Speed(для более плавной и быстрой анимации, как я думал ...)
            int BallX = Ball.getX(), BallY = Ball.getY(), BallRadius = Ball.getRadius();// запомнили поля мяча
            Ball.setX(BallX + velocity[0]);//перемещение по вектору
            Ball.setY(BallY + velocity[1]);
 
            //проверяем стенки окна на столкновение
            if (BallX < -150) velocity[0] = 1;//левая
            else if (BallX > 150) velocity[0] = -1;//правая
            if (BallY > 120) velocity[1] = -1;//верх
            else if (BallY < -120) velocity[1] = 1;//низ, при попадании в низ желательно сделать проигрыш но пока так
            //условие попеды по уничтожыным блокам тоже пока что отсутвует 
 
            //проверка на отражение с блоком игрока, решил сделтать только по верхней части блока, потому что друкое не имеет смысла
            if (BallY == Player.getY() + 2 && BallX > Player.getLeftTX() - BallRadius && BallX < Player.getRightTX() + BallRadius)
                velocity[1] = 1;
 
            for (int i(0); i < Count; i++) {//перебор всех блоков
                if (Blocks[i]->getLeftBY() == BallY && BallX > Blocks[i]->getLeftBX() - 2 && BallX < Blocks[i]->getRightBX() + 2) {
                    Dell(i); velocity[1] = -1;//проверяем низ блоков
                    break;
                }else if (Blocks[i]->getLeftTY() == BallY && BallX > Blocks[i]->getLeftTX() - 2 && BallX < Blocks[i]->getRightTX() + 2) {
                    Dell(i); velocity[1] = 1;//верх блоков
                    break;
                }
 
                if (Blocks[i]->getLeftBX() == BallX && BallY > Blocks[i]->getLeftBY() + 1 && BallY < Blocks[i]->getLeftTY() - 1) {
                    Dell(i); velocity[0] = -1;//левую грань
                    break;
                }
                else if (Blocks[i]->getRightBX() == BallX && BallY > Blocks[i]->getRightBY() + 1 && BallY < Blocks[i]->getRightTY() - 1) {
                    Dell(i); velocity[0] = 1;//правую грань
                    break;
                }
            }
        }
    }
}Field;
 
void Display(void) { // функция дисплея
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    Field.draw();
    Field.BallTick();
    glFlush();
}
void keyboard(unsigned char key, int a, int b) {
    switch (key) {// клавиатура, управление на кнопках a, d, чтобы выстрелить мячиком нажмите 1
    case 100:
        if (Field.getPlayerX() < 125)
            Field.PlayerMove(key);
        break;
    case 97:
        if (Field.getPlayerX() > -125)
            Field.PlayerMove(key);
        break;
    case 49:
        Field.setBallState(true);
        if (Field.getPlayerX() >= 0){ Field.setVelocityX(1); Field.setVelocityY(1); }
        else { Field.setVelocityX(-1); Field.setVelocityY(1); }
    break;
    }
}
void Timer(int = 0) { // функция таймер
    Display();
    glutTimerFunc(50, Timer, 0);
}
int main(int argc, char* argv[]) { //в мейне делаем базовые настройки opengl
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
    glutInitWindowSize(600, 480);
    glutCreateWindow("Game");
    gluOrtho2D(-150, 150, -120, 120);
    glutDisplayFunc(Display);
 
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW error");
        return 1;
    }
    glutKeyboardFunc(keyboard);
    glutTimerFunc(50, Timer, 0);
    glutMainLoop();
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru