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

перемещение фигурки по экрану в ограниченной области - C++

Восстановить пароль Регистрация
 
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 220
21.01.2013, 18:57     перемещение фигурки по экрану в ограниченной области #1
Есть задача написать программу. В которой создается рамка из звездочек, и внутри этой рамки с помощью стрелок на клавиатуре перемещается фигурка из 4х звездочек. Отдельно рамку написать получается, так же как и отдельно написать программу по перемещению фигурки по экрану, правда только с одной звездочкой, а как теперь это все объединить не знаю.

рамка:
C++
1
2
3
4
5
6
7
8
9
main(){
       for (int i=0; i<20; ++i){
           for (int j=0; j<50; ++j){
               if ((i==0) || (j==0) || (j==49) || (i==19)) {cout << "*";} else {cout << " ";}
           }
           cout << endl;
       }
getch();
}
бегающая звездочка :
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a=1, top=10, left=20;
    while ((a=_getch())!=27)
    {
         
        if (a==224)
            continue;
        switch (a)
        {
        case 72:
            top--;
            break;
        case 80:
            top++;
            break;
        case 77:
            left++;
            break;
        case 75:
            left--;
            break;
 
        }
        system ("cls");
        for (int i=0; i<top; ++i)
        {
            cout<<"\n";
        }
        for (int i=0; i<left; ++i)
        {
            cout<<"  ";
        }
        cout<<"*";   // С фигуркой из 4х звездочек не выходит, двигаеться только в верх и вниз.
                                  // для фигурки из 4х звездочек использовал такой код:
                                  // for (int i=0; i<2; ++i)
                                  // {
                                  // cout<<"\n";
                                  // for (int j=0; j<2; ++j)
                                  // cout<<"*";} 
        
        
    }
            
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2013, 18:57     перемещение фигурки по экрану в ограниченной области
Посмотрите здесь:

C++ Движение шаров по экрану борланд 3.1
C++ Нарисовать фигурки
Рисование по экрану C++
Как рисовать фигурки и реализовать движок игры Тетрис C++
Нужна программа в с++ перемещение треугольника по экрану случайным образом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 220
26.01.2013, 14:46  [ТС]     перемещение фигурки по экрану в ограниченной области #2
не ужели никого нет, кто бы помог?))
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
26.01.2013, 14:56     перемещение фигурки по экрану в ограниченной области #3
Ну лично мне просо не интересно, нафига такое реализовывать в консоли?
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 220
27.01.2013, 00:10  [ТС]     перемещение фигурки по экрану в ограниченной области #4
суть, не в том, интересно или нет, это задание такое, и никак не могу его сделать(
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
27.01.2013, 04:46     перемещение фигурки по экрану в ограниченной области #5
Ну как-то так если без обработки клавиш

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
using namespace std;
//---------------------------------------------------------------------------
void paint(std::string s[],size_t size,int dx=0,int dy=0)
{
    for(int y=0; y<dy; y++) cout<<endl;
    for(size_t i=0; i<size; i++)
        {
            for(int x=0; x<dx; x++)  cout<<" ";
            cout<<s[i]<<endl;
        }
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
system("color 0a");// зеленый
 
const size_t size=3;
 
std::string s[size]= {"***","* *","***"};
 
int x=3,y=4; // смещение
 
paint(s,size,x,y);
 
getchar();
return 0;
}
//---------------------------------------------------------------------------
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 220
27.01.2013, 13:21  [ТС]     перемещение фигурки по экрану в ограниченной области #6
Спасибо, хороший пример, покопаюсь в нем для учебы пригодиться.
Но это не то, фигурка не двигается, и не ограничена область движения.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
27.01.2013, 15:17     перемещение фигурки по экрану в ограниченной области #7
Ну так двигай задавая изменяя смешения...
Пробовал с обработкой клавиш у меня не вышло...
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
27.01.2013, 16:36     перемещение фигурки по экрану в ограниченной области #8
Аццкий Прогер, делайте так как делает форточка!!!
сначала закрашиваем буфер потом его выводим!!!!!
делаем очищение экрана (и если надо перевводим указатель вывода в первуй столбец и строку)
берём наш экран char[20][50];
вводим переменные x y - кординаты объекта их четырёх звёздочек (левый верхний угол)
делаем рамку как вы хотите в буфер!!
смотрим ввод, проверяем его коректность (не влупились ли мы в стенку?)
рисуем в буфере наш объект с координатами x y;
а вот теперь выводим буфер
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
27.01.2013, 16:38     перемещение фигурки по экрану в ограниченной области #9
Аццкий Прогер, вот смотри, есть отрисовка звёздочки, ест отрисовка рамки. Допустим, отрисовку рамки можно вынести в функцию f_otr()

C++
1
2
3
4
5
6
7
8
9
void f_otr(){
       for (int i=0; i<20; ++i){
           for (int j=0; j<50; ++j){
               if ((i==0) || (j==0) || (j==49) || (i==19)) {cout << "*";} else {cout << " ";}
           }
           cout << endl;
       }
getch();
}
и в цикле после очистки экрана всякий раз её вызывать. Возникает вопрос- перед отрисовкой звёздочки или после? И не так и не сяк. Вызовем перед отрисовкой звёздочки- получится сперва нарисовали рамку, звёздочка внизу очутилась. Вызовем после отрисовки звёздочки- тогда рамка окажется внизу звёдочки.

Выход: отрисовку звёздочки надо интегрировать в отрисовку рамки. Соединим две отрисовки в одну. Симбиоз тык скыть решений.

Не по теме:

Кстати, однажды некоторые штатские, не буду говорить кто, уже назвали подобный удачный, (кстати), симбиоз решений идиотизмом, ну чёрт с ними



Так вот. Точно также в цикле отрисовки рамки пробегаешься, также отрисовываешь пробелы или края рамки и, как только натыкаешься на координаты звёздочки, рисуешь звёздочку. Координаты можно передавать параметрами.
C++
1
2
3
4
5
6
7
8
9
10
11
#define shirina 50
#define visota 20
 
void f_otr (int top, int left) {
       for (int i=0; i<visota; ++i){
           for (int j=0; j<shirina; ++j){
               if ((i==0) || (j==0) || (j==shirina- 1) || (i==visota- 1)||((i==top) && (j==left))) {cout << "*";} else {cout << " ";}
           }
           cout << endl;
       }
}
А вот весь код

#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;

#define shirina 50
#define visota 20

void f_otr (int top, int left) {
for (int i=0; i<visota; ++i){
for (int j=0; j<shirina; ++j){
if ((i==0) || (j==0) || (j==shirina- 1) || (i==visota- 1)||((i==top) && (j==left))) {cout << "*";} else {cout << " ";}
}
cout << endl;
}
}




#include <iostream>
using namespace std;


int main()
{
int a=1, top=10, left=20;
while ((a=getch())!=27)
{

if (a==224)
continue;
switch (a)
{
case 72:
top--;
break;
case 80:
top++;
break;
case 77:
left++;
break;
case 75:
left--;
break;

}


system ("cls");

//ВЫзываем функцию отрисовки всего и вся
f_otr (top, left);

}


return 0;
}

будем считать первую часть задачи решённой. Теперь на очереди- как сделать так, чтобы звёздочка не выходила за рамку
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
27.01.2013, 16:39     перемещение фигурки по экрану в ограниченной области #10
я так когдато ьегунок со следом делал. правда не помню использовал ли буфер

Добавлено через 1 минуту
Аццкий Прогер, и ещё если вы хотите кодить забудте об цифрах в выражениях. все цифры только в инцилизациях и #define
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
27.01.2013, 17:26     перемещение фигурки по экрану в ограниченной области #11
Теперь по поводу проверки- влепились- не вплепились. Значит, напишем функцию, в которую будем передавать параметры top и left, и перед тем, как перерисовывать функцию, будем проверять- если мы перерерисуем- мы окажемся влепившимися или нет?

Если окажемся влепившимися- ничего не перерисовываем (не забываем top или left привести к нормальному виду). Если всё нормуль- перерисовываем.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//В этой функции проверяем, влепились или нет,
//если влепились- меняем один из параметров и взовращаем
//true, иначе- false 
bool vlepilis (int& top, int& left) {
     if (top==0) {
      top++;
      return true;
     }
     else if (top==visota- 1) {
      top--;
      return true;
     }
     if (left==0) {
      left++;
      return true;
     }
     else if (left==shirina- 1) {
      left--;
      return true;
     }
     return false; 
}
весь код
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
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;
 
#define shirina 20
#define visota 10
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
void f_otr (int top, int left) {
 for (int i=0; i<visota; ++i){
  for (int j=0; j<shirina; ++j){
   if ((i==0) || (j==0) || (j==shirina- 1) || (i==visota- 1)||((i==top) && (j==left))) {cout << "*";} else {cout << " ";}
   }
   cout << endl;
  }
}
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
//В этой функции проверяем, влепились или нет,
//если влепились- меняем один из параметров и взовращаем
//true, иначе- false 
bool vlepilis (int& top, int& left) {
     if (top==0) {
      top++;
      return true;
     }
     else if (top==visota- 1) {
      top--;
      return true;
     }
     if (left==0) {
      left++;
      return true;
     }
     else if (left==shirina- 1) {
      left--;
      return true;
     }
     return false; 
}
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 
 
int main(){
 
    int a=1, top=1, left=1   ;
    while ((a=getch())!=27){
    
     if (a==224)
      continue;
      switch (a) {
       case 72:
        top--;
        break;
       case 80:
        top++;
        break;
       case 77:
        left++;
        break;
       case 75:
        left--;
        break;
     }
    
     //проверяем- влепились или нет
     if (!vlepilis (top, left)) {
      //Если не влепились- перерисовываем всё 
      //иначе- оставляем как есть
      system ("cls");
      f_otr (top, left);
     }
 
   }   
 
   return 0;
}


теперь разберись чё там с фигуркой из звёздочек и продолжим наши изыскания.
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 220
28.01.2013, 09:24  [ТС]     перемещение фигурки по экрану в ограниченной области #12
Спасибо всем. Теперь, буду сидеть разбираться))
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 220
20.03.2013, 17:31  [ТС]     перемещение фигурки по экрану в ограниченной области #13
Спасибо, хороший пример, понял почти все, как вы его сделали, кроме самой точки, как ее заменить? Ну скажем на такую фигурку:
***
****
***

Причем, звездочка которая за прямоугольником, должна поворачиваться в ту сторону, в которую мы перемещаем фигурку )) Как так сделать? )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2013, 12:57     перемещение фигурки по экрану в ограниченной области
Еще ссылки по теме:

C++ Фигурки шахматной доски ♔♕♖♗♘♙♚♛♜♝♞♟
C++ Определить, лежит ли точка А в области, ограниченной параболой и осью абсцисс
Лежит ли точка внутри заштрихованной области, вне заштрихованной области или на ее границе? C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.03.2013, 12:57     перемещение фигурки по экрану в ограниченной области #14
Цитата Сообщение от Van111 Посмотреть сообщение
забудте об цифрах в выражениях. все цифры только в инцилизациях и #define
Советую всё же подтянуть терминологию, чтобы не выглядеть в глазах других неподобающим образом: http://ru.wikipedia.org/wiki/Цифры https://ru.wikipedia.org/wiki/Число
Yandex
Объявления
25.03.2013, 12:57     перемещение фигурки по экрану в ограниченной области
Ответ Создать тему
Опции темы

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