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

Как сделать так, чтобы значения экземпляров класса не повторялись - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Считывание из текстового файла http://www.cyberforum.ru/cpp-beginners/thread1162632.html
Всем привет. У меня есть текстовый файл в котором, к примеру записана информация:"Фамилия Имя". Как мне из этого файла по словно считать информацию в переменные, то есть что бы переменные а="Фамилия", b="Имя".
C++ Изменение размера массива Допустим в main-е я объявил указатель определенного типа и создал переменную int size, затем адрес указателя и переменной size передаю первую функцию. В ней меняется значение переменной size и объявляется массив динамический массив, адрес которого совпадает с указателем, который я передал. Массив имеет размер size. Всё это возвращается в main, а затем передается в другую функцию, массив очищается... http://www.cyberforum.ru/cpp-beginners/thread1162616.html
C++ Разработать метод, который нечетное число заменяет на 0,а четное число уменьшает в два раза
Разработать метод f (х) , который нечетное число заменяет на 0, а четное число уменьшает в два раза. Продемонстрировать работу данного метода на примере.
Ошибка в конструкторе класса C++
Всем доброго времени суток! Есть простая задачка: Написать реализацию класса и короткую программку, использующую все функции-члены. Есть объявление класса: #ifndef COW_H #define COW_H class Cow {
C++ Дана точка на плоскости с координатами (х, у). Составить программу, которая выдает одно из сообщений "Да", "Нет", "На http://www.cyberforum.ru/cpp-beginners/thread1162604.html
C++ Все целые числа из диапазона от А до В (А В), оканчивающиеся на любую четную цифру Вывести на экран: Замечание. Решите каждую задачу тремя способами - используя операторы цикла while, do while и for. подробнее

Показать сообщение отдельно
лилиэн
6 / 6 / 0
Регистрация: 22.11.2012
Сообщений: 95
01.05.2014, 10:28  [ТС]     Как сделать так, чтобы значения экземпляров класса не повторялись
Цитата Сообщение от stima Посмотреть сообщение
2. Смотрите, у Вас есть игровое поле (матрица) фиксированного размера. Зачем Вам линейно (в цикле) проходить по всем элементам и сравнивать их координаты, если можно по данным координатам проверить есть ли элемент или нет?
Тоесть, если я правельно понимаю у меня есть отдельно поле попустим
C++
1
bool Field[4][4]
и когда я создаю элемент, то я отмечаю есть он на поле или нет
C++
1
2
3
4
5
6
7
this->x=rand()%4;
this->y=rand()%4;
while(Field[this->x][this->y])
    {
        this->x=rand()%4;
        this->y=rand()%4;
    }
Как то так?
Или же поле должно полностью заменить класс Rect?
что то вроде
C++
1
2
3
4
5
6
7
class GameField
{
   private:
     bool FieldState[4][4];//есть ли элемент на клетке
     int FieldValue[4][4];//значение элемента на клетке (-1 если нету)
//всякие там методы
};
И реализовать всю механику в виде методов класса?

Добавлено через 53 минуты
Значит я переделала глобально логику.
Есть
GameField.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<time.h>
#include<stdlib.h>
#include<GL/glut.h>
 
class GameField
{
    private:
        bool FieldState[4][4];
        int  FieldValue[4][4];
        bool NoMoves;
        void CreateNewRect();
    public:
        GameField();
        ~GameField();
        void PerformMove(int direction);
        bool CheckForMoves();
        void RedrawField();
};

GameField.cpp
Кликните здесь для просмотра всего текста
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
#include"GameField.h"
 
GameField::GameField()
{
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
        {
            this->FieldState[i][j]=false;
            this->FieldValue[i][j]=-1;
        }
    this->NoMoves=false;
    CreateNewRect();
    CreateNewRect();
    RedrawField();
}
 
 
GameField::~GameField()
{
}
 
 
void GameField::CreateNewRect()
{
    int x=rand()%4;
    int y=rand()%4;
    while(this->FieldState[x][y])
    {
        int x=rand()%4;
        int y=rand()%4;
    }
    this->FieldState[x][y]=true;
    this->FieldValue[x][y]=rand()%10;
    if(this->FieldValue[x][y]==10)
        this->FieldValue[x][y]=4;
    else
        this->FieldValue[x][y]=2;
 
}
void GameField::RedrawField()
{
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
        {
            if(this->FieldState[i][j]==true)
            {
                switch(this->FieldValue[i][j])
                {
                  case 2:
                      glColor3f(1,0,0);
                      break;
                  case 4:
                      glColor3f(0,1,0);
                      break;
                  case 8:
                      glColor3f(0,0,1);
                      break;
                  case 16:
                      glColor3f(0,1,1);
                      break;
                  case 32:
                      glColor3f(1,1,0);
                      break;
                  case 64:
                      glColor3f(1,0,1);
                      break;
                      
                }
            glRectf(60+i*50,60+j*50,90+i*50,90+j*50);
            }
        }
}

ну и соответсвенно MainLoop.cpp
Кликните здесь для просмотра всего текста
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
#include"GameField.h"
 
int ClientWidth=300;
int ClientHeigh=400;
 
class GameField;
void RenderScene(void); 
void SetupRC();
void SpecialKeys(int key, int x, int y);
void ChangeSize(int w, int h);
 
 
int main(int argc, char* argv[])
    {
    srand(time(NULL));
    GameField MyGameField;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(ClientWidth,ClientHeigh);
    glutCreateWindow("Lilian Su 2048 Game");
    glutReshapeFunc(ChangeSize);
    glutSpecialFunc(SpecialKeys);
    glutDisplayFunc(RenderScene);
    SetupRC();
    glutMainLoop();
 
    return 0;
    }
void RenderScene(void)
    {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0f,0.0f,0.0f);
    glLineWidth(5);
    glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
    glEnable(GL_LINE_SMOOTH);
    glBegin(GL_LINES);
        for(int i=1;i<=5;i++)
        {
        glVertex2f(50,i*50);
        glVertex2f(250,i*50);
        }
        for(int i=1;i<=5;i++)
        {
        glVertex2f(i*50,50);
        glVertex2f(i*50,250);
        }
    glEnd();
    glLineWidth(1);
    glBegin(GL_LINES);
        glVertex2f(50,50-11);
        glVertex2f(250,50-11);
        glVertex2f(50,250+11);
        glVertex2f(250,250+11);
        glVertex2f(50-11,50);
        glVertex2f(50-11,250);
        glVertex2f(250+11,50);
        glVertex2f(250+11,250);
    glEnd();
    glPointSize(25);
    glBegin(GL_POINTS);
    glVertex2f(50,50);
    glVertex2f(50,250);
    glVertex2f(250,50);
    glVertex2f(250,250);
    glEnd();
    glutSwapBuffers();
    }
void SetupRC()
    {
    glClearColor(0.94f, 0.78f, 0.49f, 1.0f );
    glColor3f(0.0f, 1.0f, 0.0f);
    }
void SpecialKeys(int key, int x, int y)
    {
    if(key == GLUT_KEY_UP)
    {
    }
 
    if(key == GLUT_KEY_DOWN)
 
    if(key == GLUT_KEY_LEFT)
 
    if(key == GLUT_KEY_RIGHT)
 
    glutPostRedisplay();
    }
void ChangeSize(int w, int h)
    {
    GLfloat nRange = 300.0f;
    if(h == 0)
        h = 1;
 
    glViewport(0, 0, w, h);
 
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
 
    if (w <= h) 
        gluOrtho2D (0, nRange, 0, nRange+100);
    else 
        gluOrtho2D(0, nRange, 0, nRange+100);
 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    }

Проблема теперь следующая.... прямоугольники не рисуются вообще. Это конечно не совсем наверно с++ проблема, а скорее opengl или еще скорее из-за того что я неправильно на файлы разделила..
ведь сама функция отрисовки она в мэйне
C++
1
void RenderScene(void)
а перерисовка поля является методом класса
C++
1
void GameField::RedrawField()
По сути дела ,все рисование должно происходить внутри функции RenderScene но по логике перерисовку поля должны вызывать методы класса( при создании, после каждого хода)
Если же мне вызывать перерисовку напрямую из RenderScene , то как мне контролировать "моменты" когда это надо сделать то?
 
Текущее время: 17:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru