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

Баг в функции еды, игра змейка (Glut + C++)

03.03.2015, 23:20. Показов 915. Ответов 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
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
#include <iostream>
#include <gl\glut.h>
#include <gl\glaux.h>
#include <time.h>
 
float cx=0, cy=0,bx = 2,by = 2;
 
int counter[4] = {1,1,1,1};
int b = 0;
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;
void key(unsigned char key, int x, int y)
{
    switch (key)
    {
            case 'd':
                cx+=0.5f;
                void display();
 
                std::cout << "Vi nazhali D " << counter[0] << " raz(a)." << std::endl;
                counter[0]++;
                break;
            case 'a':
                cx-=0.5f;
                void display();
                std::cout << "Vi nazhali A " << counter[1] << " raz(a)." << std::endl;
                counter[1]++;
                break;
            case 'w':
                cy+=0.5f;
                void display();
                std::cout << "Vi nazhali W " << counter[2] << " raz(a)." << std::endl;
                counter[2]++;
                break;
            case 's':
                cy-=0.5f;
                void display();
                std::cout << "Vi nazhali S " << counter[3] << " raz(a)." << std::endl;
                counter[3]++;
                break;
    }
    }
void coolimg(int width, int height) {
    const float ar = (float) width / (float) height;
 
    glViewport(0, 0, width , height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}
void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0); // цвет 3d
    glPushMatrix();
        glTranslated(cx + 0.92,cy + 0.92,-30);
        glRotated(60,1,0,0);
        glRotated(a,0,0,1);
        glutSolidSphere(1,5000,5000);
    glPopMatrix();
        if (cy == by, cx == bx) {
                b = 0;
        }
 
        if (b == 0) {
                b = 1;
                glColor3d(0,1,0);
                glPushMatrix();
                srand(time(0));
                glTranslated(bx + rand()%15,by + rand()%15, -30);
                glutSolidSphere(1,5000,5000);
                glPopMatrix();
                // создать еду
                }
 
    glutSwapBuffers();
    glutPostRedisplay(); // перерисовка окна
}
 
const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
 
const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
 
 
int main(int argc, char **argv) {
 
 
    // инициализация
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(1000,600);
    glutCreateWindow("Game");
    // Функции
    glutReshapeFunc(coolimg);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    // 3d
 
    glClearColor(1,1,1,1);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
 
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
 
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);
 
    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
 
    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
    // Основной цикл GLUT
    glutMainLoop();
 
    return 1;
}
Добавлено через 29 минут
Как будто не кто не знает

Добавлено через 13 секунд
Помогите блин
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2015, 23:20
Ответы с готовыми решениями:

Змейка C++ glut
Здравствуйте, короче решил делать игры на C++, в общем, сам C++ я уже практичесски выучил, а именно...

Случайное расположение еды в игре "Змейка"
вот в форме сделал змейку, но есть проблемка = как задать еде(Foodis) рандом чтобы при наезде...

Игра "Змейка": чтобы змейка не съедала сама себя
Здравствуйте! Пишу змейку на VB 2010. Не получается составить условие того, что бы змейка не...

Змейка в консоли(баг при повороте)
Доброго времени суток, не могли бы подсказать как исправить один баг в моей игре в консоли. Когда...

3
Обитатель форума
201 / 184 / 54
Регистрация: 28.10.2012
Сообщений: 543
03.03.2015, 23:31 2
Во-первых, это не тот раздел.
Во-вторых, отвратительная структура кода.

Сделайте класс змеи, класс "частей" змеи. Каждая часть имеет свой номер (guid), опишите метод движения например, такой:
C++
1
2
3
4
5
6
7
8
enum ENUM_DEST
{
    MOVE_RIGHT,
    MOVE_LEFT,
//....
};
 
Snake::MoveTo(ENUM_DEST destination, double range)
В нем проверяйте координатно. Если в координате (Snake::TempPosition + range) есть часть змеи, проверьте, не является ли она отдельной (не в составе змеи). Если да - присоедините (например, Snake::Add(...)). Если нет (guid части есть в списке частей вашей змейки), значит вы наткнулись сами на себя и игре конец.

У вас змейка 3D? зачем перспективная проекция? И свет можно сделать в последнюю очередь. Тем более, что у вас нет нормалей
0
Форумчанин
Эксперт CЭксперт С++
8194 / 5044 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
03.03.2015, 23:34 3
Переменные очень плохо названы, тяжело разобраться в коде. Советую проверку построить по принципу: если после очередного сдвига змейка стала внутри себя содержать точку с координатами еды, то добавить + 1 очко, хвост змейки не сдвигать, а еду перерисовать в новом месте.
0
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 18
03.03.2015, 23:42  [ТС] 4
MrGluck, По такому же принципу и работает,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   if (cy == by, cx == bx) {
                b = 0;
        }
 
        if (b == 0) {
                b = 1;
                glColor3d(0,1,0);
                glPushMatrix();
                srand(time(0));
                glTranslated(bx + rand()%15,by + rand()%15, -30);
                glutSolidSphere(1,5000,5000);
                glPopMatrix();
                // создать еду
                }
bx, by - еда(корд.)
cx, cy - змея(корд.)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2015, 23:42
Помогаю со студенческими работами здесь

игра змейка
Здравствуйте! Знакомый попросил помощи, объяснить подробно как работает программа и как сделать...

Игра змейка
Код игры змейки пришлите пожалуйста. Или другой какой-нибудь простой.

Игра змейка
Кто делал подобную игру отзовитесь, есть пару вопросов! заранее спасибо!

Игра змейка
Помогите пожалуйста, нужно написать игру &quot;Змейка&quot;, как в тетрисе.


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

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

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