Движение окружностей по экрану - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Условие задачи:

Три концентрические окружности, хаотически движутся по экрану, изменяя свои параметры при изменении направления движения.

Требования к задаче:

1.

Хотя бы одна фигура должна иметь заливку, которая согласно условию меняет свои параметры.

2.

По нажатию клавиши С должен изменяться цвет фона.

Возникли трудности при реализации требований. Помогите чем можете(примеры, ссылки...т.д.). Заранее благодарен.

Вот мой код:

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <locale.h>
 
int main()
{
    setlocale(LC_ALL, "Russian");
int MAXW=800, MAXH=600; 
initwindow(MAXW,MAXH); 
int R=50; 
char key; 
int SpeedX, SpeedY; 
int Kx=4,Ky=3, Kx0=2, Ky0=2; 
int top,left; 
char ESC=27; 
char action; 
do 
{ 
printf("\n1.Выполнение программы \n"); 
printf("0.Выход\n\nВаш выбор = "); 
scanf("%c",&action); 
switch(action) 
{ 
case '1': 
left=MAXW/2; 
top=MAXH/2; 
SpeedX=rand()%Kx+Kx0; 
SpeedY=rand()%Ky+Ky0; 
while(1) 
{ 
setcolor(RED); 
outtextxy(0,0,"Нажмите ESC чтобы выйти из программы…"); 
if (kbhit()) 
{ 
key=getch(); 
if (key==ESC) 
   break; 
} 
setcolor(WHITE); 
circle(left,top,R);
setcolor(WHITE); 
circle(left,top,R+15); 
setcolor(WHITE); 
circle(left,top,R+30);  
delay(25); 
setcolor(0); 
circle(left,top,R);
setcolor(0); 
circle(left,top,R+15); 
setcolor(0); 
circle(left,top,R+30);
if (left-R<=0) 
  SpeedX=-SpeedX; 
if (left+R>=MAXW) 
  SpeedX=-SpeedX; 
if (top-R<=0) 
  SpeedY=-SpeedY; 
if (top+R>=MAXH) 
  SpeedY=-SpeedY; 
left+=SpeedX; 
top+=SpeedY;
 
}
 
break;
 
case '0':
break;
}
 
}while(action!='0');
getchar();
closegraph();
 
}

Решение задачи: «Движение окружностей по экрану»

textual
Листинг программы
#include <graphics.h>
#include <stdlib.h>
#include <time.h>
 
typedef struct
{
    int x, y;
    int speedX, speedY;
    int radius;
    int color;
}   TCircle;
 
//-----------------------------------------------------------------------------
void Draw(TCircle* figures)
{
    setcolor(figures->color);
    setfillstyle(1, figures->color);
    fillellipse(figures->x, figures->y, figures->radius, figures->radius);
}
//-----------------------------------------------------------------------------
int Move(TCircle* figure)
{
    figure->x += figure->speedX;
    figure->y += figure->speedY;
 
    int isChange = 0;
 
    if ((figure->x - figure->radius < 0) || (figure->x + figure->radius > getmaxx()))
    {
        isChange++;
        figure->speedX *= -1;
    }
 
    if ((figure->y - figure->radius < 0) || (figure->y + figure->radius > getmaxy()))
    {
        isChange++;
        figure->speedY *= -1;
    }
 
    return isChange;
}
//-----------------------------------------------------------------------------
void Redraw(TCircle figures[], unsigned count)
{
    clearviewport();
 
    for (; count--; ++figures)
    {
        if (Move(figures))
        {
            figures->color = (rand() % 15) + 1;
        }
        Draw(figures);
    }
}
//-----------------------------------------------------------------------------
 
int main()
{
    srand(time(NULL));
 
    initwindow(600, 400);
 
    TCircle figures[] = {{100, 100,  -2,  1, 20, 11},
                         {200, 100,   0,  4, 30, 12},
                         {300, 100,   1, -3, 40, 13}};
 
    int key = 0;
 
    while (key != 27)
    {
        Redraw(figures, 3);
 
        if (kbhit())
        {
            key = getch();
 
            switch (key)
            {
                case 32:
                    setbkcolor(rand() % 15);
                    break;
            }
        }
 
        delay(100);
    }
 
    closegraph();
 
    return 0;
}

Объяснение кода листинга программы

В этом коде создаются и движутся окружности на экране.

  1. Создаются три структуры TCircle, каждая из которых представляет собой окружность со следующими полями: x, y (координаты), speedX, speedY (скорость движения по оси X и Y), radius (радиус окружности), color (цвет окружности).
  2. Определены три функции: Draw, Move, Redraw.
    • Функция Draw рисует окружность на экране.
    • Функция Move обновляет координаты окружности, меняя направление движения, если окружность достигла границы экрана.
    • Функция Redraw перерисовывает все окружности на экране после их движения.
  3. В функции main создается окно, инициализируются переменные, определяется ключ управления.
    • В цикле while, пока не будет нажата клавиша Esc, вызывается функция Redraw, которая перерисовывает окружности на экране.
    • Если нажата клавиша пробел, то меняется цвет фона.
    • В конце программы графический контекст закрывается, и возвращается 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы