Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2011, 02:29   #1
Pblcb
Пользователь
 
Регистрация: 22.10.2010
Сообщений: 14
По умолчанию Нужно сделать паузу в программе по нажатию пробела

Полное задание:
Требуется написать интерактивную программу, работающую в графическом режиме, с использованием библиотеки двухмерной графики, которая в цикле отображает на экране объекты определенного вида (определяется заданием). Параметры каждого объекта определяются случайным образом в разумных пределах. После запуска программы объекты отображаются без остановки один поверх другого, но с клавиатуры пользователь может осуществлять управление:

* ESCAPE: выход из программы;
* SPACE: пауза вкл./выкл., появление новых объектов приостанавливается;
* ENTER: в режиме паузы отображает один следующий объект, паузу не снимает;
* BACKSPACE: очищает экран.

Управление программой похоже на управление видеомагнитофоном или плеером. Сначала нажимаем PLAY и кадры сменяют друг друга, нажали PAUSE и фильм остановился, нажали еще раз - продолжился. В режиме паузы можно нажать STEP и произойдет перемотка, переход к следующему кадру.

Пример простого задания
В рамках общего условия задачи написать программу, отображающую цветные N-угольники, вписанные в окружность радиуса R с центром в координатах X, Y. Параметры R, X, Y, N и цвет C должны выбираться случайным образом в разумных пределах. Многоугольники должны целиком помещаться на экране. Окружности рисовать не надо.

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

Текст программы:
Код:
#include "graphics.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define PI 3,14159265

int main(void)
{
  int gd = DETECT, gm, i, k=0, n, p, j;
  double *a, *b;
  double R, x, y, x1, y1;

begin:
  initgraph(&gd, &gm, "");
many:
  do
  {
	  if (keypressed(27)) /*escape*/
		  goto end;
	  if (keypressed(8)) /*backspace*/
		  cleardevice();
	  if (keypressed(32)) /*space*/
	  {
ЗДЕСЬ надо что-то поставить
	  }

next:
	  x=rand()%getmaxx();
	  y=rand()%getmaxy();
	  n=rand()%10+3;
	  R=rand()%100;
	  x1=x;
	  y1=y+R;
	  setcolor(rand()%15+1);
	  a=malloc(n*sizeof(double));
	  b=malloc(n*sizeof(double));

		for (i=0; i<n; i++)
		{		
			a[i]=cos(2*PI/n)*(x1-x)-sin(2*PI/n)*(y1-y)+x;
			b[i]=sin(2*PI/n)*(x1-x)+cos(2*PI/n)*(y1-y)+y;
			x1=a[i];
			y1=b[i];
			if ((a[i]>getmaxx())||(b[i]>getmaxy())||(a[i]<0)||(b[i]<0))
				goto next;
		}
		for (i=0; i<n; i++)
		{
			line((int)x1, (int)y1, (int)a[i], (int)b[i]);
			x1=a[i];
			y1=b[i];
		}

	free(a);
	free(b);
	}while(1);
end:
  closegraph();
  return 0;
}
Функция keypressed(код клавиши) отслеживает нажатие клавиши.
Если надо, graphics.h могу скинуть, заранее спасибо за помощь!
Но заклинаю я самым чистым и святым - ни мира, ни любви у сильных не проси!...
(однако помощи то у знающих просить не запрещается! )

Последний раз редактировалось Pblcb; 14.02.2011 в 16:42.
Pblcb вне форума Ответить с цитированием
Старый 14.02.2011, 10:45   #2
skgwazap
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 40
По умолчанию

На паскале делал так
Код:
     repeat
          NoSound;
          delay(1000);//задержка, поищите в си аналог
     until KeyDetect(Ord(readkey))='p';//пока снова не нажата клавиша паузы
skgwazap вне форума Ответить с цитированием
Старый 14.02.2011, 12:36   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

* SPACE: пауза вкл./выкл., появление новых объектов приостанавливается;

Код:
if (keypressed(32)) /*space*/
{
ЗДЕСЬ надо что-то поставить
flagcreate:=not flagcreate; устанавливаем/снимаем флаг блокировки генератора новых объектов
}
там где создаем вначале проверяем данный флаг и создаем/или не создаем объект.
Код:
if  flagcreate then begin
// создаем новый объект 
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 14.02.2011 в 12:39.
evg_m на форуме Ответить с цитированием
Старый 14.02.2011, 16:41   #4
Pblcb
Пользователь
 
Регистрация: 22.10.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
* SPACE: пауза вкл./выкл., появление новых объектов приостанавливается;

Код:
if (keypressed(32)) /*space*/
{
ЗДЕСЬ надо что-то поставить
flagcreate:=not flagcreate; устанавливаем/снимаем флаг блокировки генератора новых объектов
}
там где создаем вначале проверяем данный флаг и создаем/или не создаем объект.
Код:
if  flagcreate then begin
// создаем новый объект 
end;
спасибо! И еще вопрос - помогите пожалуйста найти ошибку в обработке энтера (выделено жирным)...

Код:
#include "graphics.h"
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define PI 3.1415

int main(void)
{
  int gd = DETECT, gm, i, n, k, flag=0;
  double *a, *b;
  double R, x, y, x1, y1;

begin:
  initgraph(&gd, &gm, "");
many:
  do
  {
  	  if (keypressed(27)) /*escape*/
		  goto end;
	  if (keypressed(8)) /*backspace*/
		  cleardevice();
	  if (keypressed(32)) /*space*/
	  {
		  flag=!flag;
		  k=readkey();
		  switch (k)
		  {
		  case 13:
			  goto next;
		  case 32:
			  break;
		  }
	  }

next:
 	  if (!flag)
	  {
  	  x=rand()%getmaxx();
	  y=rand()%getmaxy();
	  n=rand()%10+3;
	  R=rand()%100;
		  x1=x;
		  y1=y+R;
		  setcolor(rand()%15+1);
		  a=malloc(n*sizeof(double));
		  b=malloc(n*sizeof(double));

			for (i=0; i<n; i++)
			{		
				a[i]=cos(2*PI/n)*(x1-x)-sin(2*PI/n)*(y1-y)+x;
				b[i]=sin(2*PI/n)*(x1-x)+cos(2*PI/n)*(y1-y)+y;
				x1=a[i];
				y1=b[i];
				if ((a[i]>getmaxx())||(b[i]>getmaxy())||(a[i]<0)||(b[i]<0))
					goto next;
			}
			for (i=0; i<n; i++)
			{
				line((int)x1, (int)y1, (int)a[i], (int)b[i]);
				x1=a[i];
				y1=b[i];
			}

		free(a);
		free(b);
	  }
  }while(!kbhit());
end:
  closegraph();
  return 0;
}
Но заклинаю я самым чистым и святым - ни мира, ни любви у сильных не проси!...
(однако помощи то у знающих просить не запрещается! )

Последний раз редактировалось Pblcb; 14.02.2011 в 16:53.
Pblcb вне форума Ответить с цитированием
Старый 14.02.2011, 17:12   #5
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

Код:
if (keypressed(32)){
    while(getch()!=32)
}
как только нажимаете пробел цикл приостанавливается и ждет нажатия на пробел
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление буквы или пробела в мемо по нажатию на кнопку. troyan32 Общие вопросы Delphi 7 07.02.2011 20:03
Как сделать чтобы форма закрывалась по нажатию ESC H'orn Общие вопросы .NET 2 05.10.2010 11:50
Как сделать, чтобы по нажатию клавиши вводился не символ, а строка? Сид Общие вопросы Delphi 5 27.12.2009 13:32
как сделать паузу (или задержку) в цыкле : с# Natok Помощь студентам 7 30.05.2009 12:55
нужно сделать голосовое меню по нажатию клавишь для работы с сотовым телефоном Mirik Фриланс 5 28.05.2009 16:52