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

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

20.07.2011, 20:05. Показов 16460. Ответов 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
64319 / 47615 / 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
64319 / 47615 / 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
64319 / 47615 / 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
64319 / 47615 / 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
64319 / 47615 / 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
64319 / 47615 / 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
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru