• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Проблема с Read и ReadKey

Whiskerion

Ученик
Регистрация
18 Янв 2011
Сообщения
2
Реакции
0
Баллы
0
Проблема с Read и ReadKey

Возникла интересная для меня проблема.
Функция read и readln приостанавливает программу и ждет ввода строки (слова, числа, символы и т.д.).
Функция readkey приостанавливает программу и ждет нажатия клавиши.
Проблема заключается в том, что мне нужно что бы было так.
Программа ждет ввода строки, как read или readln, и при вводе строки продолжает программу по одной ветви, но при нажатии ключевой клавиши (например пробел) продолжает программу по другой ветви.
Мне посоветовали воспользоваться оператором case.
Но я не могу понять как )
Реализовать это надо в игре.
Проблема возникает в 64 строке.
Заранее спасибо за помощь!

(Игра:
Дано 10 карт. 1ый игрок берет любую карту, 2ой игрок может взять две соседних карты от той что взял 1ый игрок (если таковые есть) или же взять любую другую карту, выигрывает тот, кто возьмет последюю карту)

Код:
program game10;
uses crt;
const
probel=32;
yes=true;
no=false;
var
i,k,s,pl:integer;
cards:array [1..10] of integer;
player:array [no..yes] of string;
win,xod:boolean;
key:word;

procedure xodim(xod:boolean);
begin
      repeat
         write('Ходит ',player[xod],' игрок: ');
         readln(pl);
         if (pl<1) or (pl>10) then
         writeln('Неверный ход, попробуйте снова')
         else
         if (cards[pl]=0) then
         writeln('Карты нету на столе, возьмите другую карту');
         if (cards[pl]<>0) and (pl>=1) and (pl<=10) then
         cards[pl]:=0;
         writeln('');
      until ((pl>=1) and (pl<=10));
end;

procedure proveryaem(var win:boolean);
var
l,o:integer;
begin
   o:=0;
   for l:=1 to 10 do
   if cards[l]=0 then
   o:=o+1;
   if o=10 then
   win:=yes;
end;

begin
   clrscr;
   player[yes]:='первый';
   player[no]:='второй';
   xod:=yes;
   for i:=1 to 10 do
   cards[i]:=i;
   writeln('Карты на столе: 1 2 3 4 5 6 7 8 9 10');
   xodim(xod);
   repeat
   xod:=not xod;
   if (cards[pl+1]<>0) and (cards[pl-1]<>0) and (pl-1<>0) and (pl+1<>11) then
   begin
      write('Карты на столе:');
      for k:=1 to 10 do
      if cards[k]=0 then
      write('  ')
      else
      write(' ',cards[k]);
      writeln('');
      writeln('Вы можете, взять две соседние карты или одну любую карту');
      writeln('Если желаете взять две соседние нажмите пробел');
      key:=ord(readkey);
      if key=probel then
      begin
         write('Берет две соседние карты ',cards[pl-1],' и ',cards[pl+1]);
         writeln('');
         cards[pl-1]:=0;
         cards[pl+1]:=0;
      end
      else
      xodim(xod);
      proveryaem(win);
   end
   else
   begin
      write('Карты на столе:');
      for k:=1 to 10 do
      if cards[k]=0 then
      write('  ')
      else
      write(' ',cards[k]);
      writeln('');
      xodim(xod);
      proveryaem(win);
   end;
   until (win=true);
   writeln('Карт больше нет');
   writeln('Выйграл ',player[xod],' игрок');
while not keypressed do
end.
 
Что за язык программирования?
 
паскаль походу...
 
Возможен такой вариант
Код:
read(c);
[b]if c=chr(32) then[/b] ветвь программы [b]else[/b] другая ветвь
Пояснение: переменная c типа char. CHR(32) возвращает значение пробела
 
Язык паскаль, но я сомневаюсь что кто-то будет копаться в моем коде )

Возможен такой вариант
Код:
read(c);
[b]if c=chr(32) then[/b] ветвь программы [b]else[/b] другая ветвь
Пояснение: переменная c типа char. CHR(32) возвращает значение пробела

Спасибо за совет, но опять же стоит функция read, которая ожидает ввода чего либо через Enter, т.е. получается надо будет ввести пробел и нажать на Enter. (а если вводить номер нужной карты, то считывается только 1 цифра, а у меня есть карта 10).
Мне надо по другому так что бы требовалось вводить номер карты, но если будет нажат пробел (просто нажат, а не введен в read(с) через Enter) шла другая ветвь программы.

Пока что данная задача является для меня не разрешимой в паскале )
 
Пока что данная задача является для меня не разрешимой в паскале )
А Вас не устроит ограничить набор "ключевых клавиш" единственной клавишей "Enter"? Потому что в этом случае проблема решается:
Код:
VAR
 S:String;
BEGIN
 ReadLn(S);
 If S='' then
  Writeln('First branch')
 else
  Writeln('Second branch');
 ReadLn;
END.
Кстати, ВАЖНО: строку вводить ТОЛЬКО командой Readln, никаких Read! Иначе будет лажа.
 
Назад
Сверху