Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 18.01.2011, 03:33   #1 (permalink)
Whiskerion
Новичок
 
Регистрация: 18.01.2011
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Проблема с 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.
Whiskerion вне форума   Ответить с цитированием

Старый 18.01.2011, 03:33
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Участники нашего форума создавали похожие тем ранее

A disk read error occurred
A disk read error occurred press ctrl alt del to restart
Сообщение: A disk read error occurred
A disk read error occurred
Ошибка NERO: память не может быть READ.
Память не может быть read

Старый 18.01.2011, 07:12   #2 (permalink)
Max
Компьютерщик
 
Аватар для Max
 
Регистрация: 12.02.2008
Адрес: ХМАО
Сообщений: 11,625
Записей в дневнике: 36
Сказал(а) спасибо: 9
Поблагодарили 1 раз в 1 сообщении
Репутация: 26467
По умолчанию

Что за язык программирования?
__________________
Не задавай вопросов, если не знаешь, что делать с ответом.
Max вне форума   Ответить с цитированием
Старый 18.01.2011, 07:23   #3 (permalink)
dron(51)
ТАЗы валят
 
Аватар для dron(51)
 
Регистрация: 15.06.2009
Сообщений: 2,625
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1441
По умолчанию

паскаль походу...
dron(51) вне форума   Ответить с цитированием
Старый 18.01.2011, 08:08   #4 (permalink)
shrek=)
Студент БГПУ
 
Аватар для shrek=)
 
Регистрация: 06.02.2010
Сообщений: 420
Записей в дневнике: 3
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 470
По умолчанию

Возможен такой вариант
Код:
read(c);
if c=chr(32) then ветвь программы else другая ветвь
Пояснение: переменная c типа char. CHR(32) возвращает значение пробела
shrek=) вне форума   Ответить с цитированием
Старый 18.01.2011, 10:52   #5 (permalink)
Whiskerion
Новичок
 
Регистрация: 18.01.2011
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Язык паскаль, но я сомневаюсь что кто-то будет копаться в моем коде )

Цитата:
Сообщение от shrek=) Посмотреть сообщение
Возможен такой вариант
Код:
read(c);
if c=chr(32) then ветвь программы else другая ветвь
Пояснение: переменная c типа char. CHR(32) возвращает значение пробела
Спасибо за совет, но опять же стоит функция read, которая ожидает ввода чего либо через Enter, т.е. получается надо будет ввести пробел и нажать на Enter. (а если вводить номер нужной карты, то считывается только 1 цифра, а у меня есть карта 10).
Мне надо по другому так что бы требовалось вводить номер карты, но если будет нажат пробел (просто нажат, а не введен в read(с) через Enter) шла другая ветвь программы.

Пока что данная задача является для меня не разрешимой в паскале )
Whiskerion вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 18.01.2011, 12:05   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 17:06.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.