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

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

Войти
Регистрация
Восстановить пароль
 
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 222
#1

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

21.01.2013, 18:57. Просмотров 1048. Ответов 13
Метки нет (Все метки)

Есть задача написать программу. В которой создается рамка из звездочек, и внутри этой рамки с помощью стрелок на клавиатуре перемещается фигурка из 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2013, 18:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перемещение фигурки по экрану в ограниченной области (C++):

Нужна программа в с++ перемещение треугольника по экрану случайным образом - C++
нужна программа в с++ перемещение треугольника по экрану случайным образом

Вычисление области, ограниченной графиками функции - C++
Вывести на экран и показать в виде таблицы значение аргумента х, значение функции у (i=1,2,3..) и графики кривых а и b. Закрасить область...

Вычисление области ограниченной графиками функции - C++
Всем привет, есть задача и пример программы, но незнаю как правильно всё сделать( Вывести на экран и показать в виде таблицы значение...

Определить, лежит ли точка А в области, ограниченной параболой и осью абсцисс - C++
Задача такова. Определить лежит ли точка А(х,у) в области, ограниченной параболой у=2-х^2 и осью абсцисс (у=0). Ответ вывести в виде...

Нарисовать фигурки - C++
Пользователь с клавиатуры вводит размеры фигуры. Нарисовать фигурки - прямоугольник(залитый, пустой, залитый на половину, залитый под...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 222
26.01.2013, 14:46  [ТС] #2
не ужели никого нет, кто бы помог?))
0
Avazart
Эксперт С++
7190 / 5364 / 280
Регистрация: 10.12.2010
Сообщений: 23,669
Записей в блоге: 17
26.01.2013, 14:56 #3
Ну лично мне просо не интересно, нафига такое реализовывать в консоли?
0
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 222
27.01.2013, 00:10  [ТС] #4
суть, не в том, интересно или нет, это задание такое, и никак не могу его сделать(
0
Avazart
Эксперт С++
7190 / 5364 / 280
Регистрация: 10.12.2010
Сообщений: 23,669
Записей в блоге: 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;
}
//---------------------------------------------------------------------------
1
Аццкий Прогер
21 / 10 / 4
Регистрация: 07.01.2013
Сообщений: 222
27.01.2013, 13:21  [ТС] #6
Спасибо, хороший пример, покопаюсь в нем для учебы пригодиться.
Но это не то, фигурка не двигается, и не ограничена область движения.
0
Avazart
Эксперт С++
7190 / 5364 / 280
Регистрация: 10.12.2010
Сообщений: 23,669
Записей в блоге: 17
27.01.2013, 15:17 #7
Ну так двигай задавая изменяя смешения...
Пробовал с обработкой клавиш у меня не вышло...
0
Van111
кодер с++
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
27.01.2013, 16:36 #8
Аццкий Прогер, делайте так как делает форточка!!!
сначала закрашиваем буфер потом его выводим!!!!!
делаем очищение экрана (и если надо перевводим указатель вывода в первуй столбец и строку)
берём наш экран char[20][50];
вводим переменные x y - кординаты объекта их четырёх звёздочек (левый верхний угол)
делаем рамку как вы хотите в буфер!!
смотрим ввод, проверяем его коректность (не влупились ли мы в стенку?)
рисуем в буфере наш объект с координатами x y;
а вот теперь выводим буфер
1
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
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;
}

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

Добавлено через 1 минуту
Аццкий Прогер, и ещё если вы хотите кодить забудте об цифрах в выражениях. все цифры только в инцилизациях и #define
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
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;
}


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

Причем, звездочка которая за прямоугольником, должна поворачиваться в ту сторону, в которую мы перемещаем фигурку )) Как так сделать? )
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
25.03.2013, 12:57 #14
Цитата Сообщение от Van111 Посмотреть сообщение
забудте об цифрах в выражениях. все цифры только в инцилизациях и #define
Советую всё же подтянуть терминологию, чтобы не выглядеть в глазах других неподобающим образом: http://ru.wikipedia.org/wiki/Цифры https://ru.wikipedia.org/wiki/Число
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2013, 12:57
Привет! Вот еще темы с ответами:

.NET 3.x Перемещение по экрану - C#
Как сделать так, чтобы во время работы программы, каждые 2 секунды менялось ее положение. у меня Visual studio 2008

Перемещение формы по экрану - Delphi
Есть две формы: Form1 и Form2. Нужно, чтобы при перемещении Form1 по экрану Form2 перемещалась вместе с ней. Никак не могу понять какое...

Перемещение курсора по экрану - Assembler
необходимо перемещать курсор по экрану. программу я написала, но может можно как то с помощью цикла организовать это: data segment ...

Перемещение по экрану и масштабирование - JavaScript
С помощью мыши передвигаем элемент, собственно проблема в масштабировании этого же элемента. У меня получается, что при попытке изменить...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.03.2013, 12:57
Ответ Создать тему
Опции темы

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