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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
fushnick
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 5
#1

Закон отражения в ограниченой зоне на консольном приложении - C++

12.08.2012, 21:47. Просмотров 745. Ответов 10
Метки нет (Все метки)

Честно скажу, с++ впервые увидел в январе, понимаю 7е очень много, но более менее, пишу программу нужно задать с терминала размер поля в консоли, поле рисуется псевдографикой, с этим я разобрался. дальше нужно задать вектор по которому будет двигаться шарик, в данном случае это '*'. не могли бы вы объяснит мне как можно осуществить закон отражения в с++? шарик должен перемещаться в этой зоне. нужно что бы предыдущее положение шарика затиралось пробелом. и не могли бы вы объяснит функцию таймера.
C++
1
2
3
4
5
6
// Устанавливаем два таймера.
 
SetTimer(hwnd,             // хэндл главного окна
    IDT_TIMER1,            // идентификатор таймера
    10000,                 // интервал - 10 секунд
    (TIMERPROC) NULL);     // процедуры таймера нет
пытался понять, но так и не понял что такое hwnd, как вставить идентификатор таймера и откуда он берется, и не понимаю как задать процедуру таймера.
Вообщем хотелось бы знать как можно осуществить перемещение шарика каждые пол секунды с затиранием предыдущего положения и алгритм закона отражения для стенок и шарика. заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2012, 21:47     Закон отражения в ограниченой зоне на консольном приложении
Посмотрите здесь:

Работа с файлами в консольном приложении - C++
Пожалуйста подскажите как в Visual C++ 2008 работать с файлами в проекте консольного приложения?

Размер окна в консольном приложении - C++
Всем доброго времени суток. Пишу на CodeBlocks консольное приложение, но есть проблема, как изначально изменить размеры окна вывода? Так...

Создание меню в консольном приложении - C++
Здравствуйте! Нужно создать меню. Каждый пункт в меню - программа, т.е. в меню можно выбирать какую программу запустить. Подскажите...

Запрет ввода в консольном приложении - C++
Здравствуйте! Мне необходимо осуществить следующую задачу: 1) Запретить пользователю ввод положительных чисел. 2) Запретить ввод...

Греческие буквы в консольном приложении - C++
Интересует возможность в консольной программе выводить на экран греческие буквы, такие как лямбда, альфа, бета и тому подобные. ...

Арифметические операции в консольном приложении - C++
program Project5; {$APPTYPE CONSOLE} uses SysUtils; Label 1; Var a,b,c,E,Fa,Fb,Fc:real; Lich:Integer;

Таймер в консольном однопоточном приложении на c++ - C++
Привет всем! Я только начинаю разбираться в c++, но опыт программирования все же имеется, правда на Pawn, но что к чему я понимаю. Решил...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
12.08.2012, 22:20     Закон отражения в ограниченой зоне на консольном приложении #2
а вы уверенны , что в консоли сможете использовать SetTimer у меня сомнения , даже если сможете , то такой себе геморой наживёте пока доберётесь до этой функции , по моему проще сделать так -
C++
1
2
3
4
5
for( ; ; ) {
 
Sleep(INT int);
 
}
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.08.2012, 23:09     Закон отражения в ограниченой зоне на консольном приложении #3
закон отражения простой. у обехка скорость состоит из скорости по х и по y координате. когда он доходит до стенки (допустим вертикальной), его x скорость меняет знак, y остается без изменения.
сегодня уже интересовались как в консольке хоть что-то нарисовать и вот я дополнил пример движением трех частиц в поле. см функцию ProcessObject. Она и занимается рассчетом координат объекта в поле.

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
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
 
HANDLE GetConsoleHandle()
{
  return GetStdHandle(STD_OUTPUT_HANDLE);
}
 
void GoToXY(unsigned x, unsigned y)
{
  COORD coord = { static_cast<SHORT>(x), static_cast<SHORT>(y) };
  SetConsoleCursorPosition(GetConsoleHandle(), coord);
}
 
class ScreenBuffer
{
  int m_width;
  int m_height;
  std::string m_buffer;
 
public:
  ScreenBuffer(int width, int height)
    : m_width(width)
    , m_height(height)
  {
    const int size = (m_width + 1) * m_height;
    m_buffer.resize(size);
    Clear();
  }
 
  int GetWidth()
  {
    return m_width;
  }
 
  int GetHeight()
  {
    return m_height;
  }
 
  void Fill(char ch)
  {
    for (size_t i = 0, end = m_buffer.size(); i != end; ++i)
      m_buffer[i] = ch;
 
    for (size_t i = 1, end = m_height; i <= end; ++i)
    {
      m_buffer[(i * (m_width + 1)) - 1] = '\n';
    }
  }
 
  void Clear()
  {
    Fill(' ');
  }
 
  void Draw(int x, int y, char ch)
  {
    m_buffer[y * (m_width + 1) + x] = ch;
  }
 
  void DrawToScreen() const
  {
    GoToXY(0, 0);
    std::cout << m_buffer;
  }
};
 
void DrawBorder(ScreenBuffer& screen)
{
  const int screenWidth = screen.GetWidth();
  const int screenHeight = screen.GetHeight();
 
  for (int i = 0; i < screenWidth; ++i)
  {
    screen.Draw(i, 0, '.');
    screen.Draw(i, screenHeight - 1, '.');
  }
 
  for (int i = 0, end = screen.GetHeight(); i != end; ++i)
  {
    screen.Draw(0, i, '.');
    screen.Draw(screenWidth - 1, i, '.');
  }
}
 
struct Object
{
  int x;
  int y;
  int xSpeed;
  int ySpeed;
  char symbol;
 
  Object()
    : symbol(' ')
    , x(0)
    , y(0)
    , xSpeed(0)
    , ySpeed(0)
  {
  }
 
  Object(char ch, int xx, int yy, int xxSpeed, int yySpeed)
    : symbol(ch)
    , x(xx)
    , y(yy)
    , xSpeed(xxSpeed)
    , ySpeed(yySpeed)
  {
  }
};
 
void ProcessObject(ScreenBuffer& screen, Object& obj)
{
  obj.x += obj.xSpeed;
  obj.y += obj.ySpeed;
 
  if (obj.x >= screen.GetWidth())
  {
    obj.xSpeed = -obj.xSpeed;
    obj.x = screen.GetWidth() - 1 - (obj.x - screen.GetWidth());
  }
  else if (obj.x < 0)
  {
    obj.xSpeed = -obj.xSpeed;
    obj.x = -obj.x;
  }
 
  if (obj.y >= screen.GetHeight())
  {
    obj.ySpeed = -obj.ySpeed;
    obj.y = screen.GetHeight() - 1 - (obj.y - screen.GetHeight());
  }
  else if (obj.y < 0)
  {
    obj.ySpeed = -obj.ySpeed;
    obj.y = -obj.y;
  }
}
 
void AddObjects(std::vector<Object>& objs)
{
  objs.push_back(Object('*', 0, 0, 1, 2));
  objs.push_back(Object('!', 7, 20, 1, 1));
  objs.push_back(Object('%', 3, 7, 1, 1));
}
 
int main()
{
  const int screenWidth = 60;
  const int screenHeight = 20;
  ScreenBuffer screen(screenWidth, screenHeight);
 
  std::vector<Object> objs;
  AddObjects(objs);
 
  for (;;)
  {
    screen.Clear();
    DrawBorder(screen);
 
    for (std::vector<Object>::iterator it = objs.begin(), end = objs.end(); it != end; ++it)
    {
      Object& obj = *it;
      ProcessObject(screen, *it); // изменяем координаты и скорость объекта
      screen.Draw(obj.x, obj.y, obj.symbol); // рисуем объект
    }
 
    screen.DrawToScreen();
 
    Sleep(10);
  }
 
  return 0;
}
fushnick
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 5
13.08.2012, 18:33  [ТС]     Закон отражения в ограниченой зоне на консольном приложении #4
спасибо огромное, сегодня попробую отпишусь, задам вопросы если что то не пойму.

Добавлено через 2 часа 59 минут
извини но мне многие функции не понятны. то что ты строишь экран на половину я понимаю. но можно ли как нибудь осушествить функцию перемещения элемента, только лишь по координатам поля, я сейчас пытаюсь это сделать но последняя функция без стрктуры screen мне не дается, у меня уже есть координаты зоны мне нужно лишь заставить двигаться элемент по заданому мной вектору в заданой мне зоны. был бы очень благодарен если бы ты мне это объяснил.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.08.2012, 19:00     Закон отражения в ограниченой зоне на консольном приложении #5
хочешь программировать - учись разбираться в чужом коде. тем более тут он не сложный. как я уже писал - перемещение объекта осуществляется в функции ProcessPobject, в которую передается объект, который нужно перемещать и ScreenBuffer. Так вот скрин буфер там нужен только лишь для того, чтобы определить границы перемещения (используются функции GetWidth() и GetHeight()). Если границы известны через какие-нибудь другие переменные - то можно через них. Можно просто эти границы передавать в виде двух интовых переменных.
fushnick
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 5
13.08.2012, 19:21  [ТС]     Закон отражения в ограниченой зоне на консольном приложении #6
вот я и не могу понять как это сделать, код я понимаю, но не понимаю почему когда я его начинаю менять, он не работает, мало ещё работаю в си. как можно заменить в самой функции ProcessObject элемент ScreenBuffer& screen на просто 4ре интовые переменные, ну и мне немного не понятна функция
AddObjects. как именно она работает, Object это структура, а *it что это с функциями вектора немного разобрался, вижу их впервые но более мение понятно и как затирается предыдущее положение объекта?
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.08.2012, 19:23     Закон отражения в ограниченой зоне на консольном приложении #7
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
void ProcessObject(int screenWidth, int screenHeight, Object& obj)
{
  obj.x += obj.xSpeed;
  obj.y += obj.ySpeed;
 
  if (obj.x >= screenWidth)
  {
    obj.xSpeed = -obj.xSpeed;
    obj.x = screen.GetWidth - 1 - (obj.x - screenWidth);
  }
  else if (obj.x < 0)
  {
    obj.xSpeed = -obj.xSpeed;
    obj.x = -obj.x;
  }
 
  if (obj.y >= screenHeight)
  {
    obj.ySpeed = -obj.ySpeed;
    obj.y = screenHeight - 1 - (obj.y - screenHeight);
  }
  else if (obj.y < 0)
  {
    obj.ySpeed = -obj.ySpeed;
    obj.y = -obj.y;
  }
}

AddObject - просто добавляет объект в массив объектов. Потом они все обрабатываются в цикле.
тело цикло состоит из таких частей:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (;;)
  {
    screen.Clear(); // отчищаем буфер от всего вообще
    DrawBorder(screen); // рисуем в буфере границу
 
    // далее идет обработка каждого объекта из вектора объектов:
    for (std::vector<Object>::iterator it = objs.begin(), end = objs.end(); it != end; ++it)
    {
      Object& obj = *it;
      ProcessObject(screen, *it); // изменяем координаты и скорость объекта
      screen.Draw(obj.x, obj.y, obj.symbol); // рисуем объект в буфере
    }
 
    screen.DrawToScreen(); // сливаем все, что оказалось в буфере на экран
 
    Sleep(10); // ждем 10 миллисекунд и повторяем итерацию снова
  }
т.е. тут нет мороки с затиранием предыдущего положения. Стирается все и рисуется по новой текущее состояние
fushnick
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 5
13.08.2012, 19:51  [ТС]     Закон отражения в ограниченой зоне на консольном приложении #8
Вот как раз в том что не нужно ничего затирать вся проблемя, я основную часть программы написал на scan и print. пользуюсь можно сказать самыми элементарными операторами, некоторые вещи не понимаю, делаю по шаблону. вот моя программа. может вы посмотрите и поймете в чем моя проблема и смогли бы помочь, был бы очень благодарен.
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
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "math.h"
#include "stdlib.h"
#include "locale.h"
#include "conio.h"
#include "string.h"
#include <time.h>
#include <vector>
 
#define MSIZE 100
//==================================================================
 
 
//==================================================================
 
        //======================================================================================
        //======================================================================================
 
 
const int  KEY_ENTER = 13;                                      //      Клавиша Enter
const int  KEY_UP    = 72;                                      //  Клавиша Cursor Up
const int  KEY_DOWN  = 80;                                      //  Клавиша Cursor Down
 
int menu();
void DrawBorder(HANDLE);                                        // Рамка
void DrawMenu(HANDLE,int);                                      // Пункты меню
 
void graph_drawer();
void vihod();
int  smenu=1;
 
        //======================================================================================
 
 
        //======================================================================================
 
int main()
{
        setlocale (LC_ALL, "Russian");
        int choose;                                                             // Выбранный пункт меню
        system("cls");
        while (1)
        {
                choose = menu();
                switch (choose)
                {
                case 1: graph_drawer(); break;          // Начало
                case 2: exit(0);     break;                     // Выход
                }
        }
        return 0;
}
 
        //======================================================================================
        //======================================================================================
 
int menu()                                                                      //выбор пункта меню
{
        system("cls");
        HANDLE dys;
        dys = GetStdHandle(STD_OUTPUT_HANDLE);
        DrawBorder(dys);                                                // Рамка
                                                                                        // Опрос клавиш
                int key=0;
        DrawMenu(dys,smenu);                                    // Пункты меню
        while (key!=KEY_ENTER)
        {
                key = getch();
                if (key==KEY_UP)
                {
                        if (--smenu<1)                                  // Переходим к предыдущему пункту меню, если можем, и перерисовываем меню
                                smenu=1;
                        DrawMenu(dys,smenu);
                }
                else if (key==KEY_DOWN)
                {
                        if (++smenu>2)                                  // Переходим к следующему пункту меню, если можем и перерисовываем меню
                                smenu=2;
                        DrawMenu(dys,smenu);
                }
        }
        return smenu;
}
 
        //======================================================================================
        //======================================================================================
 
void DrawMenu(HANDLE dys1,int select)
{
        // Константы выбирающие место вывода на экран
        const int left = 80/2-32/2+1;
        const int top  = 20/2- 6/2+1;
        COORD pos;
        char textmenu[4][31];
    
        // Пункты меню
        strcpy(textmenu[0],"  1.    Game                  ");
        strcpy(textmenu[1],"  2.    Exit                  ");
        // Вывод пунктов меню
        for (int i=0; i<2; i++)
        {
                // В зависимости от выбранного пункта меню выставляем цвет
                if (select==i+1)
                        SetConsoleTextAttribute(dys1,BACKGROUND_GREEN);
                else
                        SetConsoleTextAttribute(dys1,FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY);
                // Выводим
                pos.X = left;
                pos.Y = top+i;
                SetConsoleCursorPosition(dys1,pos);
                printf("%s",textmenu[i]);
        }
        // Устанавливаем курсор в левый верхний угол
        pos.X = 0;
        pos.Y = 0;
        SetConsoleCursorPosition(dys1,pos);
        SetConsoleTextAttribute(dys1,FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);
        return;
}
 
        //======================================================================================
        //======================================================================================
 
void DrawBorder(HANDLE dys)                                     // Координаты рамки, цвет бла-бла-бла
{                                                                                              
        const int left = 80/2-32/2;
        const int top  = 20/2-6/2;
        char ramka[2][33];
        strcpy(ramka[0],"+------------------------------+");
        strcpy(ramka[1],"|                              |");
        COORD position;
        position.X = left;
        position.Y = top;
        SetConsoleTextAttribute(dys,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
        SetConsoleCursorPosition(dys,position);
        printf("%s",ramka[0]);
        for (int i=0; i<2; i++)
        {
                position.X = left;
                position.Y++;
                SetConsoleCursorPosition(dys,position);
                printf("%s",ramka[1]);
        }
                                                                                        // выводим нижнюю часть
        position.X = left;
        position.Y++;
        SetConsoleCursorPosition(dys,position);
        printf("%s",ramka[0]);
                                                                                        // Устанавливаем курсор в левый верхний угол
        position.X = 0;
        position.Y = 0;
        SetConsoleCursorPosition(dys,position);
        SetConsoleTextAttribute(dys,FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);
        return;
}
 
        //======================================================================================
        //======================================================================================
void graph_drawer()
{
    //очистка экрана
    system("cls");
    //=========================================================================================
 
        HANDLE consoleOutput;
        consoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
 
        //========================================================================================= 
 COORD position;
        COORD position_1;
        COORD position_2;
        const int left = 80/2-32/2;
        const int top  = 20/2-6/2;
        //координаты зоны в терминале
        int z[2];
        int d[2];
        //координаты вктора в терминале
        int tx[2],ty[2];\
            //цикл ввода вектора
        int f;
        //кординаты зоны для использования в постороении
        
        int x1,x2,y1,y2;
        //координаты вектора в построении
        int xv1,xv2,yv1,yv2;
        //счетчик для циклов
        int i;
        int g;
    //кнопка про запас
        char prob[2][3];
                int key=0;
//создаем терминал
        char ramka[5][34];
        strcpy(ramka[0],"+-------------------------------+");
        strcpy(ramka[1],"|           AREA                |");
        strcpy(ramka[2],"| enter X1           y1         |");
        strcpy(ramka[3],"| enter X2      <=46 y2    <=24 |");
        strcpy(ramka[4],"+-------------------------------+");
        strcpy(prob[0]," ");
        strcpy(prob[1],"E");
        position.X = left;
        position.Y = top;
        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
       SetConsoleCursorPosition(consoleOutput, position);
       printf("%s",ramka[0]);
       for(i=1;i<5;i++)
       {position.Y = top+i;
 
        SetConsoleCursorPosition(consoleOutput, position);
       printf("%s",ramka[i]);
       }
       //вводим значение x и y
     for(i=2, g=0;i<4;i++,g++)
     {
            position.Y = top+i; 
            position.X = left+11;
            SetConsoleCursorPosition(consoleOutput, position);
            scanf("%i",&z[g]);
 
            position.Y = top+i; 
            position.X = left+24;
            SetConsoleCursorPosition(consoleOutput, position);
            scanf("%i",&d[g]);
 
     }
     //присваиваем значение координат для построения
x1=z[0];
x2=z[1];
y1=d[0];
y2=d[1];
 
     //очищаем экран
      system("cls");
    // Устанавливаем курсор в левый верхний угол
//чертим поле, собствеенно функция ректангл в личном исполнении
      for(i=y1;i<=y2;i++)
      {   
          for(g=x1;g<=x2;g++)
              {position.Y = i;
                position.X = g;
                SetConsoleCursorPosition(consoleOutput, position);
             printf("%s",prob[1]);
      }
    
        }
for(i=y1+1;i<=(y2-1);i++)
      {   
          for(g=x1+1;g<=(x2-1);g++)
              {position.Y = i;
                position.X = g;
                SetConsoleCursorPosition(consoleOutput, position);
             printf("%s",prob[0]);
      }
    
        }
      //терминал для введения вектора
        strcpy(ramka[0],"+------------------------------+");
        strcpy(ramka[1],"|        Motion vector         |");
        strcpy(ramka[2],"| enter X1           y1        |");
        strcpy(ramka[3],"| enter X2           y2        |");
        strcpy(ramka[4],"+------------------------------+");
        position.X = 48;
        position.Y = 20;
        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
       SetConsoleCursorPosition(consoleOutput, position);
       printf("%s",ramka[0]);
       for(i=1;i<5;i++)
       {position.Y = 20+i;
 
        SetConsoleCursorPosition(consoleOutput, position);
       printf("%s",ramka[i]);
       }
for(f=0;f<1;)
{
          //вводим значение x и y
     for(i=2, g=0;i<4;i++,g++)
     {
            position.Y = 20+i; 
            position.X = 48+11;
            SetConsoleCursorPosition(consoleOutput, position);
            scanf("%i",&tx[g]);
 
            position.Y = 20+i; 
            position.X = 48+24;
            SetConsoleCursorPosition(consoleOutput, position);
            scanf("%i",&ty[g]);
 
     }
 
     //присваиваем значение координат для построения
xv1=tx[0];
xv2=tx[1];
yv1=ty[0];
yv2=ty[1];
//==========================================================
if ((xv1<=x1)||(xv2<=x1))
    {                   strcpy(ramka[0],"+------------------------+");
                        strcpy(ramka[1],"|vector is not in to area|");
                        strcpy(ramka[2],"|   enter vector again   |");
                        strcpy(ramka[3],"+------------------------+");
                        strcpy(prob[0],"       ");
                        position.X = 48;
                        position.Y = 0;
        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
        SetConsoleCursorPosition(consoleOutput, position);
        printf("%s",ramka[0]);
                position.X = 48;
        position.Y = 1;
        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
        SetConsoleCursorPosition(consoleOutput, position);
        printf("%s",ramka[1]);
                position.X = 48;
        position.Y = 2;
        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
        SetConsoleCursorPosition(consoleOutput, position);
        printf("%s",ramka[2]);
                position.X = 48;
        position.Y = 3;
        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
        SetConsoleCursorPosition(consoleOutput, position);
        printf("%s",ramka[3]);
            for(i=2;i<4;i++)
             {
                position.Y = 20+i; 
                position.X = 48+11;
                SetConsoleCursorPosition(consoleOutput, position);
                printf("%s",prob[0]);
 
                position.Y = 20+i; 
                position.X = 48+24;
                SetConsoleCursorPosition(consoleOutput, position);
                printf("%s",prob[0]);
 
             }
    }
else 
            {if ((xv1>=x2)||(xv2>=x2))
                        {
                        strcpy(ramka[0],"+------------------------+");
                        strcpy(ramka[1],"|vector is not in to area|");
                        strcpy(ramka[2],"|   enter vector again   |");
                        strcpy(ramka[3],"+------------------------+");
                        strcpy(prob[0],"       ");
                        position.X = 48;
                        position.Y = 0;
                        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[0]);
                                position.X = 48;
                        position.Y = 1;
                      SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                     SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[1]);
                                position.X = 48;
                       position.Y = 2;
                      SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[2]);
                                position.X = 48;
                        position.Y = 3;
                        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[3]);
                            for(i=2;i<4;i++)
                             {
                                position.Y = 20+i; 
                                position.X = 48+11;
                                SetConsoleCursorPosition(consoleOutput, position);
                                printf("%s",prob[0]);
 
                                position.Y = 20+i; 
                                position.X = 48+24;
                                SetConsoleCursorPosition(consoleOutput, position);
                                printf("%s",prob[0]);
 
                            }
                    }
            else 
            {if ((yv1<=y1)||(yv2<=y1))
                    {
                        strcpy(ramka[0],"+------------------------+");
                        strcpy(ramka[1],"|vector is not in to area|");
                        strcpy(ramka[2],"|   enter vector again   |");
                        strcpy(ramka[3],"+------------------------+");
                        strcpy(prob[0],"       ");
                        position.X = 48;
                        position.Y = 0;
                        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[0]);
                                position.X = 48;
                        position.Y = 1;
                      SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                     SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[1]);
                                position.X = 48;
                       position.Y = 2;
                      SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[2]);
                                position.X = 48;
                        position.Y = 3;
                        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[3]);
                            for(i=2;i<4;i++)
                             {
                                position.Y = 20+i; 
                                position.X = 48+11;
                                SetConsoleCursorPosition(consoleOutput, position);
                                printf("%s",prob[0]);
 
                                position.Y = 20+i; 
                                position.X = 48+24;
                                SetConsoleCursorPosition(consoleOutput, position);
                                printf("%s",prob[0]);
 
                            }
                    }
            else{if ((yv1>=y2)||(yv2>=y2))
                                {
                        strcpy(ramka[0],"+------------------------+");
                        strcpy(ramka[1],"|vector is not in to area|");
                        strcpy(ramka[2],"|   enter vector again   |");
                        strcpy(ramka[3],"+------------------------+");
                        strcpy(prob[0],"       ");
                        position.X = 48;
                        position.Y = 0;
                        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[0]);
                                position.X = 48;
                        position.Y = 1;
                      SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                     SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[1]);
                                position.X = 48;
                       position.Y = 2;
                      SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[2]);
                                position.X = 48;
                        position.Y = 3;
                        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[3]);
                            for(i=2;i<4;i++)
                             {
                                position.Y = 20+i; 
                                position.X = 48+11;
                                SetConsoleCursorPosition(consoleOutput, position);
                                printf("%s",prob[0]);
 
                                position.Y = 20+i; 
                                position.X = 48+24;
                                SetConsoleCursorPosition(consoleOutput, position);
                                printf("%s",prob[0]);
 
                            }
                    }
            
            else 
                f++;
            }
            }
            }
            }
 
                        strcpy(ramka[0],"                                 ");
                        position.X = 48;
                        position.Y = 0;
                        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[0]);
                                position.X = 48;
                        position.Y = 1;
                      SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                     SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[0]);
                                position.X = 48;
                       position.Y = 2;
                      SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[0]);
                                position.X = 48;
                        position.Y = 3;
                        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // Цвет рамки
                        SetConsoleCursorPosition(consoleOutput, position);
                        printf("%s",ramka[0]);
        //what the fuck!!!!!!!!!!!
 
        SetConsoleTextAttribute(consoleOutput,FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_RED);
        getch();
        return;
}
//============================================================================
//=============================================================================
нет никаких сложных структур и функций просто огромная каша условий, и мне как раз таки осталось вставитьт туда двигающийся по этому полю объект(((((((
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.08.2012, 20:13     Закон отражения в ограниченой зоне на консольном приложении #9
ну кода дофига и мне лень в него смотреть. если же пренепременно нужно затереть старое положение, то в моем коде это можно было бы сделать так, но не без проблем конечно.

C++
1
2
3
4
5
6
7
8
9
10
// тут весь код, который не стоит повторять
...
      Object& obj = *it;
      // вот тут перед процессингом объекта у него еще старые координаты. и чтобы
      // его затереть, нужно на его месте нарисовать пробел
      screen.Draw(obj.x, obj.y, ' '); // стираем объект из буфера
 
      ProcessObject(screen, *it); // изменяем координаты и скорость объекта
      screen.Draw(obj.x, obj.y, obj.symbol); // рисуем объект в буфере
...
Но тут такие проблемы могут быть:
1. У меня объекты как бы входят в границу поля и точка будет затерта. Но это решаемо.
2. Что, если объект не один и какой-то другой объект уже оказался с новыми координатами такими же, что и текущий. Получается что затирание текущего сотрет и тот другой объект. Самое простое что можно сделать: разбить обработку объектов на три части:
1. проход по всем объектам и затирание каждого из буфера
2. проход по всем объектам и обработка их нового положения (процессинг)
3. проход по всем объектам и отрисовка каждого в буфер


У вас же слишком много кода чтобы в нем разобраться. Так что пробуйте как-нибудь сами.
fushnick
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 5
13.08.2012, 20:40  [ТС]     Закон отражения в ограниченой зоне на консольном приложении #10
спасибо. надеюсь это мне пойдет, нет я не просил разбираться с кодом, просто что бы вы посмотрели и поняли принцип, а сам код, это огромное количество циклов и условий с выводом и вводом символов для удобного интерфейса. спасибо что подсказали и помогли.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 21:02     Закон отражения в ограниченой зоне на консольном приложении
Еще ссылки по теме:

Скрыть курсор в консольном приложении - C++
здрасти. Есть ли какая нибудь функция которая скрывает курсор? (в консоли)

Логическая ошибка в консольном приложении - C++
На рисунке изображен результат выполнения программы, которая должна определять, не превышен ли предел кредита. Все переменные, кроме, той...

Установка курсора в консольном приложении VS си++ - C++
уважаемые форумчане помогите разобраться с моим вопросом вот код некой программы : #include &lt;windows.h&gt; #include&lt;stdio.h&gt; ...

Китайские иероглифы в консольном приложении - C++
Вопрос: можно ли вывести в консоли китайские иероглифы, или например специфичные немецкие буквы стандартами языка си или же с++. Может...

русский текс в консольном приложении - C++
Всем доброго времеи суток как сделать чтобы вместо каракуль после компилирования выводился русский текст?


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

Или воспользуйтесь поиском по форуму:
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
13.08.2012, 21:02     Закон отражения в ограниченой зоне на консольном приложении #11
я потыкал и ничего не происходило. я так понял что сперва задается вектор перемещения объекта и далее идет его анимация. возможно вам стоит мои примеры заюзать в вместо своих. раскраски текста нет конечно, но это хотябы работает. в вашем коде будут задаваться вектор перемещения объекта и далее, создается объект, ему задаются параметры в виде начальных координат и скоростей и далее идет анимация какое-то время. по идее это не сложно приделать. Вот я кстати сделал движение более сложных объектов. инкапсулация там конечно неважнецкая, зато быстро сделалось:


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
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
 
HANDLE GetConsoleHandle()
{
  return GetStdHandle(STD_OUTPUT_HANDLE);
}
 
void GoToXY(unsigned x, unsigned y)
{
  COORD coord = { static_cast<SHORT>(x), static_cast<SHORT>(y) };
  SetConsoleCursorPosition(GetConsoleHandle(), coord);
}
 
class ScreenBuffer
{
  int m_width;
  int m_height;
  std::string m_buffer;
 
public:
  ScreenBuffer(int width, int height)
    : m_width(width)
    , m_height(height)
  {
    const int size = (m_width + 1) * m_height;
    m_buffer.resize(size);
    Clear();
  }
 
  int GetWidth()
  {
    return m_width;
  }
 
  int GetHeight()
  {
    return m_height;
  }
 
  void Fill(char ch)
  {
    for (size_t i = 0, end = m_buffer.size(); i != end; ++i)
      m_buffer[i] = ch;
 
    for (size_t i = 1, end = m_height; i <= end; ++i)
    {
      m_buffer[(i * (m_width + 1)) - 1] = '\n';
    }
  }
 
  void Clear()
  {
    Fill(' ');
  }
 
  void Draw(int x, int y, char ch)
  {
    m_buffer[y * (m_width + 1) + x] = ch;
  }
 
  void Draw(double x, double y, char ch)
  {
    Draw(int(x), int(y), ch);
  }
 
  void DrawToScreen() const
  {
    GoToXY(0, 0);
    std::cout << m_buffer;
  }
};
 
void DrawBorder(ScreenBuffer& screen)
{
  const int screenWidth = screen.GetWidth();
  const int screenHeight = screen.GetHeight();
 
  for (int i = 0; i < screenWidth; ++i)
  {
    screen.Draw(i, 0, '.');
    screen.Draw(i, screenHeight - 1, '.');
  }
 
  for (int i = 0, end = screen.GetHeight(); i != end; ++i)
  {
    screen.Draw(0, i, '.');
    screen.Draw(screenWidth - 1, i, '.');
  }
}
 
struct Object
{
  double x;
  double y;
  int width;
  int height;
  double xSpeed;
  double ySpeed;
 
  virtual void Draw(ScreenBuffer& screen) = 0;
 
  Object()
    : x(0)
    , y(0)
    , width(0)
    , height(0)
    , xSpeed(0)
    , ySpeed(0)
  {
  }
};
 
class Rect : public Object
{
public:
  Rect(int w, int h, char ch)
    : symbol(ch)
  {
    width = w;
    height = h;
  }
 
  void Draw(ScreenBuffer& screen)
  {
    for (int i = 0; i < width; ++i)
    {
      screen.Draw(x + i, y, symbol);
      screen.Draw(x + i, y + height - 1, symbol);
    }
 
    for (int i = 0; i < height; ++i)
    {
      screen.Draw(x, y + i, symbol);
      screen.Draw(x + width - 1, y + i, symbol);
    }
  }
 
private:
  char symbol;
};
 
class Cross : public Object
{
public:
  Cross(char ch)
    : symbol(ch)
  {
    width = 3;
    height = 3;
  }
 
  void Draw(ScreenBuffer& screen)
  {
    for (int i = 0; i < width; ++i)
    {
      screen.Draw(x + i, y + 1, symbol);
    }
 
    for (int i = 0; i < height; ++i)
    {
      screen.Draw(x + 1, y + i, symbol);
    }
  }
 
private:
  char symbol;
};
 
void ProcessObject(ScreenBuffer& screen, Object& obj)
{
  obj.x += obj.xSpeed;
  obj.y += obj.ySpeed;
 
  if (obj.x >= screen.GetWidth() - obj.width)
  {
    obj.xSpeed = -obj.xSpeed;
    obj.x = screen.GetWidth() - obj.width - (obj.x - screen.GetWidth() + obj.width);
  }
  else if (obj.x < 0)
  {
    obj.xSpeed = -obj.xSpeed;
    obj.x = -obj.x;
  }
 
  if (obj.y >= screen.GetHeight() - obj.height)
  {
    obj.ySpeed = -obj.ySpeed;
    obj.y = screen.GetHeight() - obj.height - (obj.y - screen.GetHeight() + obj.height);
  }
  else if (obj.y < 0)
  {
    obj.ySpeed = -obj.ySpeed;
    obj.y = -obj.y;
  }
}
 
void AddObjects(std::vector<Object*>& objs)
{
  {
    Object* obj = new Rect(5, 5, '*');
    obj->xSpeed = 3;
    obj->ySpeed = 1;
    obj->x = 2;
    obj->y = 10;
    objs.push_back(obj);
  }
 
  {
    Object* obj = new Rect(3, 3, '#');
    obj->xSpeed = 1;
    obj->ySpeed = 1;
    obj->x = 5;
    obj->y = 1;
    objs.push_back(obj);
  }
 
  {
    Object* obj = new Cross('+');
    obj->xSpeed = 1;
    obj->ySpeed = 0.1;
    obj->x = 10;
    obj->y = 1;
    objs.push_back(obj);
  }
}
 
void DeleteObjects(std::vector<Object*>& objs)
{
  for (std::vector<Object*>::iterator it = objs.begin(), end = objs.end(); it != end; ++it)
    delete *it;
}
 
int main()
{
  const int screenWidth = 60;
  const int screenHeight = 20;
  ScreenBuffer screen(screenWidth, screenHeight);
 
  std::vector<Object*> objs;
  AddObjects(objs);
 
  for (;;)
  {
    screen.Clear();
    DrawBorder(screen);
 
    for (std::vector<Object*>::iterator it = objs.begin(), end = objs.end(); it != end; ++it)
    {
      Object& obj = **it;
      ProcessObject(screen, obj);
      obj.Draw(screen);
    }
 
    screen.DrawToScreen();
 
    Sleep(10);
  }
 
  DeleteObjects(objs);
 
  return 0;
}
Yandex
Объявления
13.08.2012, 21:02     Закон отражения в ограниченой зоне на консольном приложении
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru