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

Ханойские башни: демонстрация решения - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
Kiritler
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 6
12.10.2011, 21:31     Ханойские башни: демонстрация решения #1
Добрый день!
Требуется решить такую задачу

Разработать программу, реализующую демонстрацию хода решения пользователем-человеком головоломки "Ханойские башни".

При вызове программы на выполнение число дисков N должно задаваться как аргумент в командной строке. Ввод пользователя должен иметь вид "MK", где M (и K) - цифра, обозначающая стержень с которого (на который) переносится диск.

Необходимо учесть такие требования (если бы не последнее - не спрашивал)
-В качестве языка программирования должен быть использован С++.
-Исходный код программы должен быть переносимым в рамках ОС UNIX и MS Windows.
-Для ввода/вывода информации должен использоваться только алфавитно-цифровой режим.
-При программировании ввода с клавиатуры дисплея и вывода на его экран использовать только стандартные потоки ввода (stdin), вывода (stdout) и сообщений об ошибках (stderr). При этом запрещено использование функции getch, не входящей в стандарт языка C.

Для организации форматированного вывода на экран алфавитно-цифрового дисплея из создаваемых программ рекомендуется разработать "библиотеку" из функций (или класс языка C++):
screenClear - очищает экран;
Для начала, хотелось бы попросить помочь с созданием хотя бы прямоугольников в качестве колец, пользуясь стандартными библиотеками

Большое спасибо за ответы!
Kirill_Drozdov@mail.ru

Добавлено через 7 часов 58 минут
Требуется помощь с рисованием одной ханойской башни слева, состоящей из простых прямоугольников
Количество прямоугольников передавалось бы через аргумент N
При этом используя только стандартные библиотеки c++

Одним словом, помогите нарисовать прямоугольник :-)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.10.2011, 21:31     Ханойские башни: демонстрация решения
Посмотрите здесь:

C++ ХАнойские башни
C++ Ханойские башни
Ханойские башни C++
Ханойские башни C++
C++ Ханойские башни
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
}{NiM
 Аватар для }{NiM
64 / 64 / 2
Регистрация: 25.11.2009
Сообщений: 283
12.10.2011, 21:39     Ханойские башни: демонстрация решения #2
тема прямоугольников уже поднималась здесь Нарисовать прямоугольник, чтобы верхний левый угол был расположен в заданной точке
Kiritler
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 6
12.10.2011, 21:41  [ТС]     Ханойские башни: демонстрация решения #3
там использовался conio.h, который мне нельзя использовать
}{NiM
 Аватар для }{NiM
64 / 64 / 2
Регистрация: 25.11.2009
Сообщений: 283
12.10.2011, 21:46     Ханойские башни: демонстрация решения #4
рисуй символами - то бишь заведи функцию, которая будет по входному в нее числу печатать определенно количество знаков '=' или есть более подходящие символы. - какие - задай вопрос таблица ASCII. если память не изменяет 205й, 196 символы.
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
12.10.2011, 21:47     Ханойские башни: демонстрация решения #5
Цитата Сообщение от Kiritler Посмотреть сообщение
conio.h, который мне нельзя использовать
а что мешает его не использовать? он никаких нужных функций в код не вносит. Его функции (по крайней мере те, что тут используются виндовсами) можно заменить функциями языка. например для Си это getchar(), а для с++ это cin.get()
Kiritler
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 6
12.10.2011, 23:18  [ТС]     Ханойские башни: демонстрация решения #6
а при помощи Xlib-а простеньких примеров рисования нет?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2011, 00:00     Ханойские башни: демонстрация решения
Еще ссылки по теме:

C++ Ханойские башни
Ханойские башни C++
Ханойские башни C++

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

Или воспользуйтесь поиском по форуму:
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
13.10.2011, 00:00     Ханойские башни: демонстрация решения #7
Цитата Сообщение от Kiritler Посмотреть сообщение
а при помощи Xlib-а простеньких примеров рисования нет?
OGL + X11
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
220
221
222
223
/* A simple program to show how to set up an X window for OpenGL rendering.
 * X86 compilation: gcc -o -L/usr/X11/lib   main main.c -lGL -lX11
 * X64 compilation: gcc -o -L/usr/X11/lib64 main main.c -lGL -lX11
 */
#include <stdio.h>
#include <stdlib.h>
 
#include <GL/glx.h>    /* this includes the necessary X headers */
//#include <GL/gl.h>
 
#include <X11/X.h>    /* X11 constant (e.g. TrueColor) */
#include <X11/keysym.h>
 
static int snglBuf[] = {GLX_RGBA, GLX_DEPTH_SIZE, 16, None};
static int dblBuf[]  = {GLX_RGBA, GLX_DEPTH_SIZE, 16, GLX_DOUBLEBUFFER, None};
 
Display   *dpy;
Window     win;
GLfloat    xAngle = 42.0, yAngle = 82.0, zAngle = 112.0;
GLboolean  doubleBuffer = GL_TRUE;
 
void fatalError(char *message)
{
    fprintf(stderr, "main: %s\n", message);
    exit(1);
}
 
void redraw(void)
{
    static GLboolean   displayListInited = GL_FALSE;
 
    if (displayListInited){
        /* if display list already exists, just execute it */
        glCallList(1);
    }
    else
    {
        /* otherwise compile and execute to create the display list */
        glNewList(1, GL_COMPILE_AND_EXECUTE);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
        /* front face */
        glBegin(GL_QUADS);
            glColor3f(0.0, 0.7, 0.1);  /* green */
            glVertex3f(-1.0, 1.0, 1.0);
            glVertex3f(1.0, 1.0, 1.0);
            glVertex3f(1.0, -1.0, 1.0);
            glVertex3f(-1.0, -1.0, 1.0);
 
            /* back face */
            glColor3f(0.9, 1.0, 0.0);  /* yellow */
            glVertex3f(-1.0, 1.0, -1.0);
            glVertex3f(1.0, 1.0, -1.0);
            glVertex3f(1.0, -1.0, -1.0);
            glVertex3f(-1.0, -1.0, -1.0);
 
            /* top side face */
            glColor3f(0.2, 0.2, 1.0);  /* blue */
            glVertex3f(-1.0, 1.0, 1.0);
            glVertex3f(1.0, 1.0, 1.0);
            glVertex3f(1.0, 1.0, -1.0);
            glVertex3f(-1.0, 1.0, -1.0);
 
            /* bottom side face */
            glColor3f(0.7, 0.0, 0.1);  /* red */
            glVertex3f(-1.0, -1.0, 1.0);
            glVertex3f(1.0, -1.0, 1.0);
            glVertex3f(1.0, -1.0, -1.0);
            glVertex3f(-1.0, -1.0, -1.0);
        glEnd();
        glEndList();
        displayListInited = GL_TRUE;
    }
    if (doubleBuffer)
        glXSwapBuffers(dpy, win);/* buffer swap does implicit glFlush */
    else
        glFlush();  /* explicit flush for single buffered case */
}
 
int main(int argc, char **argv)
{
    XVisualInfo         *vi;
    Colormap             cmap;
    XSetWindowAttributes swa;
    GLXContext           cx;
    XEvent               event;
    GLboolean            needRedraw = GL_FALSE, recalcModelView = GL_TRUE;
    int                  dummy;
 
    /*** (1) open a connection to the X server ***/
    dpy = XOpenDisplay(NULL);
    if (dpy == NULL)
        fatalError("could not open display");
 
    /*** (2) make sure OpenGL's GLX extension supported ***/
    if(!glXQueryExtension(dpy, &dummy, &dummy))
        fatalError("X server has no OpenGL GLX extension");
 
    /*** (3) find an appropriate visual ***/
 
    /* find an OpenGL-capable RGB visual with depth buffer */
    vi = glXChooseVisual(dpy, DefaultScreen(dpy), dblBuf);
    if (vi == NULL){
        vi = glXChooseVisual(dpy, DefaultScreen(dpy), snglBuf);
        if (vi == NULL) fatalError("no RGB visual with depth buffer");
        doubleBuffer = GL_FALSE;
    }
    if(vi->class != TrueColor)
        fatalError("TrueColor visual required for this program");
 
    /*** (4) create an OpenGL rendering context  ***/
 
    /* create an OpenGL rendering context */
    cx = glXCreateContext(dpy, vi, /* no shared dlists */ None,
                          /* direct rendering if possible */ GL_TRUE);
    if (cx == NULL)
        fatalError("could not create rendering context");
 
    /*** (5) create an X window with the selected visual ***/
 
    /* create an X colormap since probably not using default visual */
    cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), vi->visual, AllocNone);
    swa.colormap = cmap;
    swa.border_pixel = 0;
    swa.event_mask = KeyPressMask    | ExposureMask
                 | ButtonPressMask | StructureNotifyMask;
    win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0,
                        800, 800, 0, vi->depth, InputOutput, vi->visual,
                        CWBorderPixel | CWColormap | CWEventMask, &swa);
    XSetStandardProperties(dpy, win, "main", "main", None,
                           argv, argc, NULL);
 
    /*** (6) bind the rendering context to the window ***/
 
    glXMakeCurrent(dpy, win, cx);
 
    /*** (7) request the X window to be displayed on the screen ***/
 
    XMapWindow(dpy, win);
 
    /*** (8) configure the OpenGL context for rendering ***/
 
    glEnable(GL_DEPTH_TEST); /* enable depth buffering */
    glDepthFunc(GL_LESS);    /* pedantic, GL_LESS is the default */
    glClearDepth(1.0);       /* pedantic, 1.0 is the default */
 
    /* frame buffer clears should be to black */
    glClearColor(0.0, 0.0, 0.0, 0.0);
 
    /* set up projection transform */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10.0);
    /* establish initial viewport */
    /* pedantic, full window size is default viewport */
    //glViewport(0, 0, 300, 300);
 
    //printf( "Press left mouse button to rotate around X axis\n" );
    //printf( "Press middle mouse button to rotate around Y axis\n" );
    //printf( "Press right mouse button to rotate around Z axis\n" );
    //printf( "Press ESC to quit the application\n" );
 
    /*** (9) dispatch X events ***/
 
    while (1){
        do{
            XNextEvent(dpy, &event);
            switch (event.type) {
                case KeyPress:{
                    KeySym     keysym;
                    XKeyEvent *kevent;
                    char       buffer[1];
                    /* It is necessary to convert the keycode to a
                    * keysym before checking if it is an escape */
                    kevent = (XKeyEvent *) &event;
                    if ((XLookupString((XKeyEvent *)&event,buffer,1,&keysym,NULL) == 1)
                        && (keysym == (KeySym)XK_Escape))
                        exit(0);
                    break;
                }
                case ButtonPress:
                    recalcModelView = GL_TRUE;
                    switch (event.xbutton.button){
                        case Button1: xAngle += 10.0; break;
                        case Button2: yAngle += 10.0; break;
                        case Button3: zAngle += 10.0; break;
                    }
                    break;
                case ConfigureNotify:
                    glViewport(0, 0, event.xconfigure.width,
                               event.xconfigure.height);
                               /* fall through... */
                case Expose: needRedraw = GL_TRUE;
                    break;
                case DestroyNotify:
                    exit(0);
                    break;
            }
        } while(XPending(dpy)); /* loop to compress events */
        if (recalcModelView){
            glMatrixMode(GL_MODELVIEW);
 
            /* reset modelview matrix to the identity matrix */
            glLoadIdentity();
 
            /* move the camera back three units */
            glTranslatef(0.0, 0.0, -3.0);
 
            /* rotate by X, Y, and Z angles */
            glRotatef(xAngle, 0.5, 0.0, 0.0);
            glRotatef(yAngle, 0.0, 0.1, 0.0);
            glRotatef(zAngle, 0.0, 0.0, 1.0);
 
            recalcModelView = GL_FALSE;
            needRedraw = GL_TRUE;
        }
        if (needRedraw){
            redraw();
            needRedraw = GL_FALSE;
        }
    }
    return 0;
}
Yandex
Объявления
13.10.2011, 00:00     Ханойские башни: демонстрация решения
Ответ Создать тему
Опции темы

Текущее время: 17:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru