18.01.2011, 03:33 | #1 (permalink) |
Новичок
Регистрация: 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. |
18.01.2011, 03:33 | |
Helpmaster
Member
Регистрация: 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) |
Компьютерщик
Регистрация: 12.02.2008
Адрес: ХМАО
Сообщений: 11,625
Записей в дневнике: 36
Сказал(а) спасибо: 9
Поблагодарили 1 раз в 1 сообщении
Репутация: 26467
|
Что за язык программирования?
__________________
Не задавай вопросов, если не знаешь, что делать с ответом. |
18.01.2011, 08:08 | #4 (permalink) |
Студент БГПУ
Регистрация: 06.02.2010
Сообщений: 420
Записей в дневнике: 3
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 470
|
Возможен такой вариант
Код:
read(c); if c=chr(32) then ветвь программы else другая ветвь Пояснение: переменная c типа char. CHR(32) возвращает значение пробела |
18.01.2011, 10:52 | #5 (permalink) | |
Новичок
Регистрация: 18.01.2011
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Язык паскаль, но я сомневаюсь что кто-то будет копаться в моем коде )
Цитата:
Мне надо по другому так что бы требовалось вводить номер карты, но если будет нажат пробел (просто нажат, а не введен в read(с) через Enter) шла другая ветвь программы. Пока что данная задача является для меня не разрешимой в паскале ) |
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
18.01.2011, 12:05 | #6 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
А Вас не устроит ограничить набор "ключевых клавиш" единственной клавишей "Enter"? Потому что в этом случае проблема решается:
Код:
VAR S:String; BEGIN ReadLn(S); If S='' then Writeln('First branch') else Writeln('Second branch'); ReadLn; END. |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|