меню для игры на паскале
Меню для игры на паскале
procedure DrawMain (s:string); <Очищает экран, рисует строку главного меню s >
begin Window (1,1,80,25);
textcolor (txtcolor);
textbackground (textback);
clrscr; gotoxy (1,1); write (s);
end;
procedure DrawHelp (s:string); < Выводит подсказку s >
var i:integer; begin
textcolor (txtcolor);
textbackground (textback); gotoxy (1,25);
for i:=1 to 79 do write (‘ ‘);
gotoxy (1,25); write (s);
end;
procedure doubleFrame (x1,y1,x2,y2:integer; Header: string);
< Процедура рисует двойной рамкой окно >
var i,j: integer;
begin gotoxy (x1,y1);
write (‘╔’);
for i:=x1+1 to x2-1 do write(‘═’);
write (‘╗’);
for i:=y1+1 to y2-1 do begin
gotoxy (x1,i); write(‘║’);
for j:=x1+1 to x2-1 do write (‘ ‘);
write(‘║’);
end;
gotoxy (x1,y2); write(‘╚’);
for i:=x1+1 to x2-1 do write(‘═’);
write(‘╝’);
gotoxy (x1+(x2-x1+1-Length(Header))
div 2,y1);
write (Header); <Выводим заголовок>
gotoxy (x1+1,y1+1);
end;
procedure clearFrame (x1,y1,x2,y2:integer);
var i,j:integer;
begin textbackground (textback);
for i:=y1 to y2 do begin
gotoxy (x1,i);
for j:=x1 to x2 do write (‘ ‘);
end;
end;
procedure cursor (Menu,Point: integer; Action: boolean);
< Подсвечивает (если Action=true) или гасит п. Point меню Menu>
begin textcolor (Txtcolor);
if Action=true then
textbackground (cursorBack)
else textbackground (textBack);
gotoxy (x1[Menu]+1,y[Menu]+Point);
write (text[Menu][Point]);
end;
procedure DrawMenu (Menu:integer; Action: boolean);
<Рисует меню с номером Menu, если Action=true, иначе стирает >
var i:integer;
begin
if Action=true then textcolor (Txtcolor)
else textcolor (textBack);
textbackground (textBack);
doubleFrame (x1[Menu], y[Menu], x2[Menu], y[Menu]+1+KolPoints[Menu],»);
for i:=1 to KolPoints[Menu] do begin
gotoxy (x1[Menu]+1, y[Menu]+i);
writeln (text[Menu][i]);
end;
end;
procedure Work; < Рабочая процедура >
var i,kol:integer; ch:char;
begin
DrawHelp(‘Идет расчет. ‘); < Строка статуса >
textcolor (LIGHTGRAY);
textbackground (BLACK); < Выбираем цвета для работы в окне >
doubleFrame (2,2,78,24,’ Расчет ‘);
Window (3,3,77,23);
writeln;
write (‘Введите число шагов: ‘);
<$I->read (kol); <$I+>
if IoResult<>0 then writeln (‘Ошибка! Вы ввели не число’)
else if kol>0 then begin
for i:=1 to kol do
writeln (‘Выполняется шаг ‘,i);
writeln (‘Все сделано!’);
end
else writeln (‘Ошибка! Число больше 0’);
<Восстановление окна и выход>
Window (1,1,80,25);
DrawHelp(‘Нажмите любую клавишу. ‘);
ch:=readkey;
clearFrame (2,2,78,24); < Стираем окно >
end;
procedure Out; < Очистка экрана и выход>
begin
textcolor (LIGHTGRAY);
textbackground (BLACK); clrscr; halt(0);
end;
procedure Help; <Окно с информацией>
var ch:char;
begin
textcolor (Txtcolor);
textbackground (textback);
doubleFrame (24,10,56,13,’ О программе ‘);
DrawHelp (‘Нажмите клавишу. ‘);
gotoxy (25,11);
writeln(‘ Демонстрация простейшего меню’);
gotoxy (25,12);
write ( ‘ Киев, КГУ’);
ch:=readkey;
clearFrame (24,10,58,13);
end;
procedure command (Menu,Point:integer);
<Вызывает процедуры после выбора в меню >
begin
if Menu=1 then begin
if Point=1 then Work
else if Point=2 then Out;
end
else begin
if Point=1 then Help;
end;
end;
procedure MainMenu (Point,
HorMenu:integer); < Поддерживает систему одноуровневых меню >
var ch: char; funckey:boolean;
begin
Points[HorMenu]:=Point;
DrawMenu (HorMenu,true);
repeat
cursor (HorMenu,Points[HorMenu],true);
ch:=readkey;
cursor (HorMenu,Points[HorMenu],false);
if ch=#0 then begin
funckey:=true; ch:=readkey;
end
else funckey:=false;
if funckey=true then begin
ch:=Upcase (ch);
if ch=#75 then begin < Стрелка влево >
DrawMenu (HorMenu,false);
HorMenu:=HorMenu-1;
if (HorMenu maxMenu) then HorMenu:=1;
DrawMenu (HorMenu,true);
end
else if ch=#72 then begin
< Стрелка вверх >
Points[HorMenu]:=Points[HorMenu]-1;
if Points[HorMenu] KolPoints[HorMenu])
then Points[HorMenu]:=1;
end;
end
else if ch=#13 then begin
< Клавиша ENTER >
DrawMenu (HorMenu,false);
command (HorMenu,Points[HorMenu]);
DrawMenu (HorMenu,true);
DrawHelp (MainHelp);
end;
until (ch=#27) and (funckey=false);
< Пока не нажата клавиша ESC >
end;
begin
Init;
MainMenu (1,1);
Out;
end.
Меню для игры на паскале
1. Ошибки при организации меню
Ну, а теперь, приступим все-таки к построению меню, лишенного этих недостатков. Программы подробно прокомментированы, так что разобраться, как именно они работают, я думаю, труда не составит.
2. Меню в текстовом режиме
За основу можно взять вот такой пример: (С) Совместная разработка Volvo877 и Romtek (forum.sources.ru)
3. Меню в графическом режиме
Эта программа немного более сложна, чем приведенная выше.
Само меню было выдрано из моей старой программы и немного доработано, поэтому его пункты именно такие. (С) volvo877 (Форум «Интересные задачи для программистов»).
Пример организации меню из файлов
Задача:
Недавно на одном из форумов встретился вот такой вопрос:
«Здравствуйте.
У меня такой вопрос. Есть меню из 3-х пунктов. Если нажимается первый пункт, то должно появиться следующее меню, где также можно выбирать пункты второго меню. Содержимое второго меню хранится в файле. То есть при нажатии на первый пункт главного меню я вывожу пункты второго меню из файла. Как сделать, чтобы из этих (выведенных из файла) пунктов также можно было выбирать. или это невозможно?
Спасибо заранее за помощь.»
Эта задача показалась мне достаточно интересной, чтобы привести ее решение. Итак.
В таком случае нам достаточно хранить в файлах-«описателях меню» данные в таком вот формате:
Для того, чтобы реализовать чтение меню из файла и его запуск, понадобится следующая функция: Ну, и для полноты картины не хватает только реализации ShowMenu, в которой и будет происходить запуск процедуры для каждого пункта меню. Я бы реализовал ее так: Полностью исходник (вместе с примером TXT-файлов с описанными в них меню) находится в архиве:
f_menu.rar
Написание Меню через Case
Создать меню через CASE
Помогите написать програмку на турбопаскале, пожалуйста, а то я только начал его изучать. Нужно.
Написать 2 программы: одну через case, вторую через if
Дан одномерный массив чисел. Если его максимальный элемент >10, найти произведение элементов.
Оформить меню, используя case
Здравствуйте. Нужно выполнить некоторые действия с очередью в сплошном и цепном представлении.
Не могу передать результат расчета в Case-меню
Здравствуйте! Программа считает интеграл, выводит на экран. Но как добавил Case-меню, результат.
Решение
Mecha, дублирование запрещено. Не создавайте, пожалуйста, на каждый Ваш чих новую тему. Во-первых, Вы теряете контекст обсуждения, и, во-вторых, если Вы не знали: если в тему написать новое сообщение, любое, например, из одного слова «Актуально», тема тут же окажется наверху списка тем раздела.
Насколько я понял у вас ошибка выскакивает в процедуре grafik.
Лучше всего вывести эту процедуру из основной программы и отработать ее функциональность заменяя параметры постоянными цифрами.
Назначение переменных вы не подписываете, как и 99,99% всех программистов, поэтому разобраться что к чему будет сложно даже вам.
При работе с меню нужно обязательно в код вставлять проверки, чтобы в функции гарантировано передавались аргументы, либо делать программу так, чтобы при исполнении уже были заданы аргументы при умолчании.
Т.е. проблема из-за того, что некоторые параметры в функцию не передаются?
Добавлено через 24 минуты
Проблема решена, спасибо за помощь!
P.S. А как можно проверить, ввел ли пользователь данные?
использовать оператор выбора case of при разработке меню
Создать файл, содержащий следующую информацию в каждой записи: ФИО, оценка1, оценка2, оценка3.
Написание меню (псевдографика)
Пишу для своей программы на Pascal ABC.Net простое вертикальное меню, оформленное псевдографикой и.
Меню через switch и case
Нужна помощь довести программу до ума, в конце программы в main сделать меню меню через switch и.
Переделать меню через switch / case
Написал такой код. Условие для задачи такое: Необходимо написать программу со следующей.
Создание меню в консоли через case
Кто может помочь объяснить, как сделать меню, а то сколько не пробую, у меня все время ошибки. Надо.
исходник «меню» на Паскале
хотя бы просто процедуру
Доброго времени суток.
Вот программа с меню для ТР 7.0. Возьмите отсюда все, что нужно.
program Menu;
uses Crt;
type
FrameChar = array[1..8] of Char;
const
MaxFrames = 2;
Frames : array[1..MaxFrames] of FrameChar = (‘┌─┐││└─┘’,’╔═╗║║╚═╝’);
MaxItem = 4;
Items : array[1..MaxItem] of String =
(‘Первая’,’Вторая’,’Третья’,’Четвертая’);
BlankStr = ‘ ‘;
DefaultBk = Blue;
SelectedBk = Magenta;
kbEsc = 27;
kbEnter = 13;
kbUp = 72;
kbDn = 80;
var
i, X, Y, Res : Integer;
MaxLen : Integer;
S : String;
CurrSel : Integer;
function GetKey: Byte;
var
ch : Char;
begin
repeat until KeyPressed;
ch := ReadKey;
if ch = #0 then ch := ReadKey;
GetKey := Ord(ch);
end;
procedure DrawBox(H,W,X,Y : Integer);
var
i, j : Integer;
begin
TextBackGround(DefaultBk);
for i:= 0 to H+1 do begin
GoToXY(X-2,Y+i);
if (i = 0) or (i = H+1) then begin
if i = 0 then begin
S := Frames[1,1];
for j:=2 to W-1 do S := S+Frames[1,2];
S := S+Frames[1,3];
end
else begin
S := Frames[1,6];
for j:=2 to W-1 do S := S+Frames[1,7];
S := S+Frames[1,8];
end;
end
else begin
S := Frames[1,4];
for j:=2 to W-1 do S := S+’ ‘;
S := S+Frames[1,5];
end;
WriteLn(S);
end;
end;
procedure DrawMenu(Selected, X, Y: Integer);
var
i, j : Integer;
begin
for i:=1 to MaxItem do begin
if i = Selected then TextBackGround(SelectedBk)
else TextBackGround(DefaultBk);
GoToXY(X,Y+i);
S := Items[ i ]+Copy(BlankStr,1,MaxLen-Length(Items[ i ]));
WriteLn(S);
end;
end;
begin
X := 10;
Y := 4;
TextColor(14);
TextBackground(0);
ClrScr;
< поиск максимальной длины строки >
MaxLen := 0;
for i:= 1 to MaxItem do begin
if MaxLen MaxItem then CurrSel := 1; end;
kbUp : begin Dec(CurrSel); if CurrSel Остальные ответы
Меню для игры на паскале
1. Что необходимо?
Различных сред, использующих в качестве языка программирования Pascal, превеликое множество. Но из всей этой кучи для урока я решил использовать именно PascalABC.net. Почему? Ответ прост: во-первых данная среда программирования использует не чистый Паскаль, а его современный и более удобный потомок – Object Pascal; во-вторых Паскаль.Нет абсолютно бесплатна, а значит вам не придется парится с кряками или тратить деньги на лицензию.
2. Алгоритм.
Итак, у нас есть площадь 640×480, которая по моей задумке будет делиться на клеточки размером 8×8, представляющие из себя звенья массива s. Таким образом, меняя значение клеточки, мы можем сделать ее «свободной», либо «занятой» (к примеру, использовать как стену).
В итоге мы сможем без лишних манипуляций определить, куда игрок может переместиться, а куда нет (см. рис).
3. Переменные и модули.
Для полноценной работы нашей будущей игры нам понадобится подключить всего-ничего один модуль GraphABC, позволяющий отображать графические примитивы на экране.
Далее инициируем необходимые нам переменные (см. листинг 1).
200?’200px’:»+(this.scrollHeight+5)+’px’);»> uses GraphABC;
var
s : array [,] of integer;
i,x,y,vspeed : integer;
game_end : boolean;
4. Нажатия клавиш.
Итак, чтобы далее вам не пришлось лазать по своей писанине, чтобы модифицировать код, создадим две отдельные процедуры, отвечающие за манипуляции с положением игрока.
200?’200px’:»+(this.scrollHeight+5)+’px’);»> //Обработка нажатий клавиш
procedure KeyPress(key: char); begin
if (key=’d’) and (s[(x div 8)+1,(y div 8)]=0) then //Если нажата клавиша D…
x:=x+8; //. А также есть свободное место, то передвигаемся на…
//… клеточку вперед (значение x увеличивается на 8)
if (key=’a’) and (s[(x div 8)-1,(y div 8)]=0) then //см. комментарий выше
x:=x-8;
if (key=’w’) and (vspeed=0) and (s[(x div 8),(y div 8)+1]=1) then //Если есть «занятая клеточка»…
vspeed:=-16; //… под ногами, то совершаем прыжок.
procedure KeyDown(key: integer); begin
if (key=vk_enter) then game_end:=true; //При нажатии ENTER…
//значение переменной game_end равно true
end;
5. Гравитация.
Неотъемлемой частью платформера является какая никакая, а сила тяжести. Поэтому сейчас мы должны написать отдельную процедуру, которая в дальнейшем поможет игроку встать на ноги в буквальном смысле.
200?’200px’:»+(this.scrollHeight+5)+’px’);»> //Гравитация
procedure Gravity(); begin
if vspeed=0 then begin //Если скорость прыжка равна нулю…
if s[(x div 8),(y div 8)+1]=0 then y+=8; //… перемещаемся на «клеточку» вниз (падаем)
end;
if s[(x div 8),(y div 8)+vspeed]=0 then y+=vspeed; //Если сверху есть свободная клеточка, то…
//… перемещаемся на vspeed вверх.
if vspeed<>0 then //Если скорость прыжка не равна нулю (в нашем случае: меньше нуля)…
vspeed+=2; //… то помаленьку ее сбавляем.
6. Рисование.
Думаю тут понятно без лишних слов, но для галочки отмечу, что игра делится на «визуальную» и «невизуальную» части. «Невизуальная» отвечает за все происходящее в самой игре, а «визуальная», собственно, за отображение происходящего на экране. Так вот, данная ниже процедура отвечает за «визуальную» часть и только.
200?’200px’:»+(this.scrollHeight+5)+’px’);»> procedure Draw(); begin
//Рисуем белый прямоугольник…
setbrushcolor(clwhite); //… размером 640 на 480
fillrectangle(0,0,640,480);
setbrushcolor(clblack);//Рисуем черные стены…
fillrectangle(0,192,640,224);//… по координатам…
//… 0 – 640 по X; 192 – 224 по Y
//(ВНИМАНИЕ! Данные манипуляции не делают стены осязаемыми, а всего лишь…
//… создают их графический образ.
setbrushcolor(clred); //Рисуем игрока по координатам…
fillrectangle(x,y,x+8,y+8);//… x и y
7. Тело программы.
Вот мы и добрались, собственно, до самой программы. Тут нам необходимо заполнить массив нужными нам значениями, а также задействовать ранее написанные процедуры.
200?’200px’:»+(this.scrollHeight+5)+’px’);»> Begin //начало программы
//Указания значений для переменных
game_end:=false;
x:=0; //Стартовая позиция игрока по X
y:=0; //Стартовая позиция игрока по Y
//Создание массива
s := new integer[200,200];
//Создание платформы, нарисованной в процедуре Draw
for i:=0 to 79 do
s[i,24] := 1;
while game_end=false do begin //Создаем цикл…
//… который прервется, если game_end = false
//Рисование экрана
Draw();
//Гравитация для игрока
Gravity();
OnKeyPress:=KeyPress; //Обработка нажатий…
OnKeyDown:=KeyDown; //… клавиш
sleep(30); //Ждем примерно полсекунды, чтобы игра…
//… работала с нормальной скоростью
end. //конец программы
8. Заключение.
Итого у нас получился незамысловатый платформер с точкой в главной роли. Мы можем передвигаться по горизонтали и прыгать: