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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2011, 19:56   #1
zhenka619
Дурачок
Пользователь
 
Регистрация: 29.12.2011
Сообщений: 33
Вопрос не могу понять несколько строчек в pascal в простом исходнике

Нашел исходник но не могу понять его помогите пожалуйста, заранее благодарю.


Код:
uses crt;
const
  h='O';
  xmin=1;
  ymin=1;
  xmax=80;
  ymax=25;
var
	x,y,vx,vy:integer;
  ch:char;
  xe,ye,i:integer;
begin
	clrscr;
  Randomize;
  x:=xmin;
  y:=ymax div 2;
  xe:=12;
	ye:=12;
  gotoxy(xe,ye);
  write ('a');
  while (x>=1) and (x<=80) and (y>=1) and (y<=25) do begin
  	GoTOXY(x,y);
  	write(h);
    delay(20);
    if keypressed then
    begin
    	ch:=readkey;
    	case ch of
      	'd':begin vx:=1; vy:=0 end;  {:confused:    вот здесь не могу понять
      	'a':begin vx:=1; vy:=0 end;  :confused:	зачем нужны vx ,vy		 	
	'w':begin vx:=0; vy:=-1 end; :confused:  и вообще не понимаю как 	
      	's':begin vx:=0; vy:=1 end;    :confused: 	это влияет на программу ? }
      end;
    end;               {:confused: вот здесь тоже не понимаю ? 
    gotoxy(x,y);     вообще можете пожалуйста обьяснить всю программу,
    write(' ');         я просто недавно начал изучать pascal и многого не 
    inc(x,vx);        понимаю}
    inc(y,vy);
    if (x=xe) and (y=ye) then begin
    	i:=i+1;
      clrscr;
      xe:=random(70);
      ye:=random(20);
      gotoXY(xe,ye);
      write(h);
    end;
  end;{while}
  write('i=',i);
  readln;
end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.
"Никогда программы не содержат так мало ошибок, как при отсутствии каких-либо средств отладки."
Никлаус Вирт... Помог нажми на весы

Последний раз редактировалось Serge_Bliznykov; 30.12.2011 в 14:20.
zhenka619 вне форума Ответить с цитированием
Старый 29.12.2011, 20:11   #2
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

о Ужас метки...ужасный стиль программирования
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 29.12.2011, 20:20   #3
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

McFrey, поддерживаю. Точно сказать не могу, но похоже прога заставляет бегать курсор по методу WSAD (любой CS'ер поймет :D).

Код:
if keypressed then
 begin
 ch:=readkey;
 case ch of
 'd':begin vx:=1; vy:=0 end; { вот здесь не могу понять
 'a':begin vx:=1; vy:=0 end;  зачем нужны vx ,vy 
 'w':begin vx:=0; vy:=-1 end;  и вообще не понимаю как 
 's':begin vx:=0; vy:=1 end;  это влияет на программу ? }
"если кнопка нажата то
читаем кнопку
если D то vx:=1, vy:=0
....
....
...."
Далее я теряюсь... По логике должно быть
inc(x,vx);
inc(y,vy);

а потом GOTOXY(x,y)

По крайней мере так есть хоть какой-то смысл...

Программа вообще работала? ДО того, как ты ее закоментировал (ПОСЛЕ уж точно не будет, комент в {} на туеву хучу строк не позволит)
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 29.12.2011, 20:32   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Всю программу предлагаю понять самому
Но вот кусочек после приведения в некоторый порядок читается так:
Код:
if keypressed then begin {Если нажата клавиша}
   ch:=readkey;  {читаем нажатый символ}
   case ch of      {Это оператор варианта: переход на }
      'd':begin vx:=1; vy:=0 end; {сюда, если ,была нажата клавиша d}
      'a':begin vx:=1; vy:=0 end; {сюда, если ,была нажата клавиша а}
      'w':begin vx:=0; vy:=-1 end; {или сюда, если нажали клавишу w}
      's':begin vx:=0; vy:=1 end;  {а вот тут нажали клавишу s} 
   end; {Завершение оператора выбора}
end; { Завершение составного оператора, который отрабатывает, если нажали какую либо клавишу}
Данные клавиши используются в играх как стрелки, для указания направления перемещения.
vx и vy - переменные, которые используются в процедурах Inc(x,vx) и Inc(x,vx).
Эти процедуры позволяют более быстро выполнить операцию:
Код:
x := x + vx;
y := y + vy;
McFrey
Цитата:
о Ужас метки...ужасный стиль программирования
Пугаться не надо
Это не Label.
Тут ничего ужасного нет. Это нормальный код.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 29.12.2011, 20:43   #5
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

ViktorR
с другой стороны "go to" .....и это маленькая программа, а если использовать такие фокусы в больших проектах то хорошего не выйдет ничего, сам запутаешься, ды еще и друзей-программистов запутаешь.
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 29.12.2011, 21:20   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Цитата:
ViktorR
с другой стороны "go to" .....и это маленькая программа,
И где там Goto ?

Это обычный оператор варианта - Case.
Некоторый аналог группы условных операторов, но более быстрый код:

if ch = 'd' Then begin ..... end;
if ch = 'a' Then begin ..... end;
if ch = 'w' Then begin ..... end;
if ch = 's' Then begin ..... end;

Такая структура существует и в C и в VBA, и во многих других языках.
И очевидно, что такая структура (Case) более читаема, чем набор If'ов.
Как-то так, ...

Последний раз редактировалось ViktorR; 29.12.2011 в 21:23.
ViktorR вне форума Ответить с цитированием
Старый 30.12.2011, 12:18   #7
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

у каждого своя точка зрения, но в большинстве своем программисты отказываются от "goto"
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 30.12.2011, 14:06   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ОМГ! McFrey, что вы спорите то?!!!

в этой программе вообще НЕТ GOTO! Ни одного!

А то, что Вы приняли за goto - GotoXY это процедура позиционирования курсора (позиции вывода) для текстового экрана.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять, где утечка памяти (9 строчек) dueram Win Api 1 24.11.2009 19:56
не могу понять Dawystrik SQL, базы данных 0 06.09.2009 19:20
Сумма ряда (Pascal). Не могу понять смысл задачи :( DsDevis Помощь студентам 9 26.03.2009 01:16
не могу понять... Dutchman Паскаль, Turbo Pascal, PascalABC.NET 4 14.12.2006 07:14