Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/79: Рейтинг темы: голосов - 79, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 20.07.2011
Сообщений: 6

Не работает readkey и keypressed

20.07.2011, 20:05. Показов 16427. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Написал программу, используя PascalABC, столкнулся с необходимостью скомпилировать ее в *.exe, для этого скачал PascalABC.NET и обнаружил, что программа не работает. Так как после запуска программы она не реагирует на клавиши (не начинается игровой процесс после нажатия 's', не двигается "платформа"), то, догадываюсь, дело в readkey и keypressed.
Что с этим делать, на что заменить операторы?

Pascal
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
program arkanoid;
uses crt,graphABC;
var
   sharikx,shariky,gorizontal,dvizh,count,score,x,y:integer;
   klavisha,nachalo,povtor:char;
label
   start;
begin
 
     writeln ('Арканоид');
     writeln ('Управление клавишами стрелок');
     writeln ('Для начала игры нажмите клавишу "s", для выхода из программы нажмите клавишу "q"');
     repeat
     nachalo:=readkey;
     if nachalo='q' then closewindow;
     until nachalo='s';
     start:
     dvizh:=2;
     count:=0;
     score:=0;
     randomize;
     x:=random(2);
     y:=0;
     sharikx:=windowwidth div 2;
     shariky:=windowheight-60;
     gorizontal:=windowwidth div 2;
     repeat
           circle(sharikx,shariky,3);
           line(gorizontal-40,windowheight-50,gorizontal+40,windowheight-50);
           if y=1 then shariky:=shariky+dvizh else shariky:=shariky-dvizh;
           if x=1 then sharikx:=sharikx+dvizh else sharikx:=sharikx-dvizh;
           if shariky <= 0 then
              begin
              y:=1;
              end;
           if sharikx <= 0 then
              begin
              x:=1;
              end;
           if sharikx >= windowwidth then
              begin
              x:=0;
              end;
           if (shariky = (windowheight - 50)) then
              begin
              if (sharikx > gorizontal - 40) and (sharikx < gorizontal + 40) then
                 begin
                 y:=0;
                 count:=count+1;
                 if count mod 5 = 0 then
                 dvizh:=dvizh+1;
                 score:=score+dvizh-1;
                 end;
              end;
           if keypressed then
              begin
              klavisha:=readkey;
              if klavisha=#77 then
                 gorizontal:=gorizontal-15
                 else if klavisha=#75 then
                 gorizontal:=gorizontal+15;
              end;
 
           delay(20);
           clearwindow;
     until shariky >= windowheight;
     clearwindow;
     writeln ('Игра окончена. Вы поймали шарик ',count,' раз и набрали ',score,' очков!');
     writeln ('Начать заново? Да - клавиша "y", нет - клавиша "n"');
     repeat
     povtor:=readkey;
     if povtor='n' then
     writeln ('Спасибо за игру!')
     else if povtor='y' then goto start;
     until (povtor='n') or (povtor='y');
end.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.07.2011, 20:05
Ответы с готовыми решениями:

KeyPressed и ReadKey неработают
program octaedr; uses Crt,Graph; // используем графический режим const r=100; var DriverVar, ModeVar : integer; //...

Не работает keypressed
может можно както заменить?

Не работает keypressed.
Написал программу которая крутит треугольник вокруг своей оси при нажатии enter. Но при прогоне программы открывается новое окно(window...

12
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
21.07.2011, 06:28
Сделайте так.
Pascal
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
program arkanoid;
uses graphABC,Events;
var  sharikx,shariky,gorizontal,dvizh,count,score,x,y:integer;
     nachalo,povtor:char;
     label  start;
procedure Strelki(klavisha:integer);//управление стрелками
begin
if klavisha=VK_Left then gorizontal:=gorizontal-15
else if klavisha=VK_Right then  gorizontal:=gorizontal+15;
end;
begin
start:
writeln ('Арканоид');
writeln ('Управление клавишами стрелок');
writeln ('Для начала игры нажмите клавишу "s", для выхода из программы нажмите клавишу "q"');
repeat
readln(nachalo);
if nachalo='q' then closewindow;
until nachalo='s';
dvizh:=2;
count:=0;
score:=0;
randomize;
x:=random(2);
y:=0;
sharikx:=windowwidth div 2;
shariky:=windowheight-60;
gorizontal:=windowwidth div 2;
repeat
circle(sharikx,shariky,3);
line(gorizontal-40,windowheight-50,gorizontal+40,windowheight-50);
if y=1 then shariky:=shariky+dvizh else shariky:=shariky-dvizh;
if x=1 then sharikx:=sharikx+dvizh else sharikx:=sharikx-dvizh;
if shariky <= 0 then y:=1;
if sharikx <= 0 then x:=1;
if sharikx >= windowwidth then x:=0;
if (shariky = (windowheight - 50)) then
 begin
  if (sharikx > gorizontal - 40) and (sharikx < gorizontal + 40) then
   begin
    y:=0;
    count:=count+1;
    if count mod 5 = 0 then
    dvizh:=dvizh+1;
    score:=score+dvizh-1;
   end;
 end;
OnKeyDown:=Strelki;
sleep(20);
clearwindow;
until shariky >= windowheight;
clearwindow;
writeln ('Игра окончена. Вы поймали шарик ',count,' раз и набрали ',score,' очков!');
writeln ('Начать заново? Да - клавиша "y", нет - клавиша "n"');
repeat
readln(povtor);
if povtor='n' then 
 begin
  writeln ('Спасибо за игру!');
  exit;
 end 
else if povtor='y' then goto start;
until (povtor='n') or (povtor='y');
end.
2
0 / 0 / 0
Регистрация: 20.07.2011
Сообщений: 6
21.07.2011, 08:34  [ТС]
Спасибо!
А реагирование программы на именно нажатие а не ввод клавиш теперь невозможно, я правильно понял?
Ну, я имею в виду, например, предложение начать заново. Раньше программа реагировала на нажатие клавиши, сейчас же, судя по всему, из-за readln, возможен именно ввод.
Или возможно так сделать, используя OnKeyDown?
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
21.07.2011, 08:38
Можно сделать через OnKeyPress также как и OnKeyDown. Я пробовал, но этот Паскаль толком не знаю и запутался. Просто при вызове OnKeyPress нет ожидания нажатия клавиши как при readkey или readln, и я не смог придумать как его сделать.
0
0 / 0 / 0
Регистрация: 20.07.2011
Сообщений: 6
21.07.2011, 08:52  [ТС]
Хм, спасибо.
Постараюсь чего-нибудь сочинить, просто мне сказали добавить в игру паузу, а, используя OnKeyDown, сделать этого у меня почему-то не получилось.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
21.07.2011, 08:54
Цитата Сообщение от errrnie Посмотреть сообщение
добавить в игру паузу
Может типа
Pascal
1
sleep(5000);
Добавлено через 45 секунд
На событие OnKeyPress
0
0 / 0 / 0
Регистрация: 20.07.2011
Сообщений: 6
21.07.2011, 09:00  [ТС]
Она должна выглядеть как появляющееся сообщение типа:
"Игра на паузе. Для продолжения нажмите *клавиша паузы* еще раз"
Тем более приведенная Вами в пример пауза когда-нибудь да истечет, скорее всего, к этому придерутся.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
21.07.2011, 09:48
Вот паузу я прикрутил к своей программе, а с OnKeyPress пока никак.
Pascal
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
84
program arkanoid;
uses graphABC,Events;
var  sharikx,shariky,gorizontal,dvizh,count,score,x,y,i:integer;
     nachalo,povtor:char;
     f:boolean;
     label  start;
procedure Strelki(klavisha:integer);//управление стрелками
begin
if klavisha=VK_Left then gorizontal:=gorizontal-15
else if klavisha=VK_Right then  gorizontal:=gorizontal+15
else if (klavisha=VK_Up)and(i=0) then//пауза
 begin
  f:=false;
  i:=1;
  dvizh:=0;
  textout(10,10,'Игра на паузе. Для продолжения нажмите *клавиша паузы* еще раз');
 end
else if (klavisha=VK_Up)and(i=1) then//выключение паузы
 begin
  f:=true;
  i:=0;
  dvizh:=2;
 end 
end;
begin
start:
writeln ('Арканоид');
writeln ('Управление клавишами стрелок лево-право');
writeln ('Для начала игры нажмите клавишу "s", для выхода из программы нажмите клавишу "q"');
writeln('Пауза клавиша стрелка вверх');
repeat
readln(nachalo);
if nachalo='q' then closewindow;
until nachalo='s';
i:=0;
f:=true;
dvizh:=2;
count:=0;
score:=0;
randomize;
x:=random(2);
y:=0;
sharikx:=windowwidth div 2;
shariky:=windowheight-60;
gorizontal:=windowwidth div 2;
repeat
circle(sharikx,shariky,3);
line(gorizontal-40,windowheight-50,gorizontal+40,windowheight-50);
if y=1 then shariky:=shariky+dvizh else shariky:=shariky-dvizh;
if x=1 then sharikx:=sharikx+dvizh else sharikx:=sharikx-dvizh;
if shariky <= 0 then y:=1;
if sharikx <= 0 then x:=1;
if sharikx >= windowwidth then x:=0;
if (shariky = (windowheight - 50)) then
 begin
  if (sharikx > gorizontal - 40) and (sharikx < gorizontal + 40) then
   begin
    y:=0;
    count:=count+1;
    if count mod 5 = 0 then
    dvizh:=dvizh+1;
    score:=score+dvizh-1;
   end;
 end;
OnKeyDown:=Strelki;
if f then
 begin
  sleep(20);
  clearwindow;
 end; 
until shariky >= windowheight;
clearwindow;
writeln ('Игра окончена. Вы поймали шарик ',count,' раз и набрали ',score,' очков!');
writeln ('Начать заново? Да - клавиша "y", нет - клавиша "n"');
repeat
readln(povtor);
if povtor='n' then 
 begin
  writeln ('Спасибо за игру!');
  exit;
 end 
else if povtor='y' then goto start;
until (povtor='n') or (povtor='y');
end.
2
0 / 0 / 0
Регистрация: 20.07.2011
Сообщений: 6
21.07.2011, 11:25  [ТС]
Puporev, кстати, Ваш вариант сбивает скорость шарика, если она увеличилась. Приравнивает начальному значению.
Я прикрутил переменную redvizh. Она тоже сначала равна двойке и изменяется так же, как и dvizh, а во время снятия паузы dvizh:=redvizh
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
21.07.2011, 11:28
errrnie, Да, все верно, я уж сам заметил и так же хотел переделать, да лень стало...
Я просто вначале не обратил внимание что скорость постепенно увеличивается.
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 24
26.10.2014, 12:57
Что значат строки 51 и 52?

Добавлено через 11 минут
Puporev, но у вас получается что сам арканоид выходит за поле.
Строки 8,9 нужно заменить на:
Pascal
1
2
 if (klavisha=VK_Left)and(gorizontal>40) then gorizontal:=gorizontal-15
else if (klavisha=VK_Right)and(gorizontal<windowwidth-40) then  gorizontal:=gorizontal+15;
Я не уверен канечно но у меня сработало.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
26.10.2014, 13:23
Мне этот арканоид и нафиг не нужен, я отвечал только на то что спрашивали и что знал 3 года назад.

Добавлено через 7 минут
И перестань некрофилить и задавать вопросы в чужих темах. Создай свою в нужном разделе и опиши проблему.
Еще увижу подобное вылетишь с форума.
0
0 / 0 / 0
Регистрация: 25.10.2014
Сообщений: 24
26.10.2014, 13:41
Я не хотел никого оскорбить,прошу прощения если нарушил какие-то правила.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2014, 13:41
Помогаю со студенческими работами здесь

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

не работает ch:=readkey;
не работает ch:=readkey; пробую в pascalABC.NET Можно ли поставить pascalABC под Windows?

Не работает ReadKey в WinCRT
Не хочет работать - стоит черным окном, на меня пялится! На нажатия клавиш вообще не реагирует. Подскажите пожалуйста, что делать-то?

Не работает Console.ReadKey() для приложения Windows Forms
Не работает Console.ReadKey(); подскажите почему? или есть другой способ остановить закрытие программы? using System; using...

keyPressed()
Пишу вот игру теннис-тетрис. Там вот платформой нужно водить чтобы мячик отбивать. Использую для движений платформой keyListener. Проблема...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru