Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2010, 23:20   #1
DRAgon™
Форумчанин
 
Аватар для DRAgon™
 
Регистрация: 14.03.2010
Сообщений: 362
По умолчанию ОПЕРЕЖАЮЩИЕ ОПИСАНИЯ ПРОЦЕДУР

Подскажите пожалуйста как зделать в моей программе ОПЕРЕЖАЮЩИЕ ОПИСАНИЯ ПРОЦЕДУР

Вот схема как делать игру(гетерархия):
USES CRT,Graph;

VAR все переменные опишем именно здесь, а не внутри процедур

ОПЕРЕЖАЮЩИЕ ОПИСАНИЯ процедур

PROCEDURE ZAVERSHENIE_IGRI; Здесь анализируем, насколько успешно стрелял игрок, отмечаем мелодией, цветом и текстом его достижения, затем спрашиваем, будет ли игрок играть еще. Если да, то вызываем про-цедуру NACHALO, иначе закрываем графический ре-жим и - Halt.

PROCEDURE NE_PORA_LI; Здесь увеличиваем счетчик торпед. Если он>10, то вызываем процедуру ZAVERSHENIE_IGRI, иначе процедуру RISUNOK.

PROCEDURE NEPOPAL; Здесь программируем все эф-фекты в случае промаха, после чего вызываем проце-дуру NE_PORA_LI.

PROCEDURE POPAL; Здесь программируем все эф-фекты в случае попадания, после чего вызываем про-цедуру NE_PORA_LI.

PROCEDURE ATAKA; Здесь плывут одновременно ко-рабль и торпеда. Затем в зависимости от ситуации вы-зываются процедуры POPAL или NEPOPAL. Учтите также ситуацию, когда вы просто забыли выстрелить.

PROCEDURE KORABL; Здесь плывет корабль до вы-стрела, который вызывает процедуру ATAKA.

PROCEDURE RISUNOK; Здесь рисуем береговую ли-нию, указываем на экране имя игрока, счетчики торпед и подбитых кораблей. Затем вызываем процедуру KORABL.

PROCEDURE RISUNOK;Здесь устанавливаем в нуль счетчики торпед и подбитых кораблей, спрашиваем имя игрока и делаем все прочее, что нужно делать один раз за всю игру в самом ее начале. Затем прямо из процедуры NACHALO вызываем процедуру RISUNOK.

BEGIN
инициализация графического режима;
DirectVideo:=false;
NACHALO
END.
___________________________________ ______________________________
А вот сама задача к игре:

Наверху экрана слева направо плывет вражеский корабль. Внизу притаился ваш торпедный аппарат. В подходящий момент времени вы нажимаете клавишу - и торпеда плывет вверх. Если вы попали, то видна вспышка от взрыва, может быть, на мгновение виден и сам взрыв, раздается коротенькая радостная мелодия, на экране - коротенький поздравительный текст, счетчик подбитых кораблей на экране увеличивается на 1. Если не попали, то зрительные и звуковые эффекты - совсем другие. В любом случае увеличивается на 1 счетчик выпущенных торпед. Когда торпеды у вас кончатся (скажем, их было 10), игра заканчивается. Программа анализирует ваши успехи и в зависимости от них выдает на экран текст, скажем “Мазила!”, если вы не попали ни разу из 10, или “Профессионал!”, если вы попали 8 раз. Затем спрашивает, будете ли вы играть еще.
Если у всех кораблей будет одинаковая скорость, то попадать будет слишком просто, а значит и играть неинтересно. Сделайте скорость кораблей случайной. Конечно, не совсем уж (скажем, в условных единицах скорости диапазон от 0 до 10 – это слишком), а в пределах разумного (скажем, от 4 до 8 – это нормально). Причем не нужно менять скорость одного и того же ко-рабля в процессе движения. Пусть она остается посто-янной, а то все будет зависеть не от мастерства, а от везения. Различаются скорости только разных кораблей.


___________________________________ _____________________________
Чем больше моя слава, тем я больше тупею; и таково, несомненно, общее правило.(А.Эйнштейн)
DRAgon™ вне форума Ответить с цитированием
Старый 07.06.2010, 23:21   #2
DRAgon™
Форумчанин
 
Аватар для DRAgon™
 
Регистрация: 14.03.2010
Сообщений: 362
По умолчанию

Ну и наконец, моя программа(игра)
Код:
uses graph,crt;
var torpeda_c,korabl_s,name,x_circle,y_circle,r,y,x1,x2,mode,device,v:Integer;
klavisha:Char;
procedure nachalo;
torpeda_c:=0;
korabl_s:=0;
Writeln('What was the name gamer');
end;
Procedure risunok;
setcolor(black);
line(0,300,700,300);
setfillstyle(1,blue);
rectangle(0,640,720,640);
floodfill(380,460,white);
setfillstyle(1,lightblue);
rectangle(0,300,720,300);
floodfill(380,180,white);
readln(name);
Writeln('Counters of torpedoes');
Readln(torpeda_c);
Writeln('Counters of ship');
Readln(korabl_s);
end;
Procedure korabl;
begin
readln;
repeat
x1:=20;
x2:=220;
Randomize;
x1:=(340+Random(120));
x2:=(236+random(69));
setcolor(black);
rectangle(x1,100,x2,260);
setfillstyle(1,white);
floodfill(130,210,black);
delay(200);
setcolor(white);
rectangle(x1,160,x2,260);
setfillstyle(1,white);
floodfill(130,210,black);
x1:=x1+4;
x2:=x2+6;
until x1>700;
end;
Procedure ataka; forward;
begin
y_circle:=590;
x_circle:=510;
r:=10;
setcolor(white);
circle(x_circle,y_circle,r);
delay(200);
repeat
if keypressed then begin
klavisha:=readkey;
if klavisha='z' then y_circle:=y_circle-1;
circle(x_circle,y_circle,r);
end
until klavisha='q';
end;
procedure popal;
begin
if y_circle=260 then Writeln('The good fellow');
readln;
y:=150;
repeat
setcolor(white);
circle(110,y,50);
delay(100);
setcolor(black);
circle(110,y,50);
y:=y-1;
until y<0;
Sound(3000);
delay(100);
sound(1000);
delay(200);
sound(2000);
delay(300);
korabl_s:=korabl_s+1;
Writeln('The padded ships increase on' ,korabl_s);
end;
procedure Nepopal;
begin
if(y_circle>260) and (y_circle<260) then Writeln('BAD');
sound(6000);
delay(50);
torpeda_c:=torpeda_c+1;
Writeln('Counters  out torpedoes increase on' ,torpeda_c);
end;
PROCEDURE NEPOPALI;
begin
if torpeda_c>10 then procedure zaverhenie igri; else procedure risunok;
end;
procedure zaverhenie igri;
begin
if torpeda_c>=8 then Writeln('PROFI');
sound(3000);
delay(102);
if torpeda_c<5 then writeln('MAZILA');
sound(1000);
delay(10);
Writeln('Whether you will play still?');
readln(v);
if v=1 then procedure NACHALO else readln; closegraph halt;
end;
BEGIN
device:=0;
initgraph(device,mode,'egavga.bgi');
Directvideo:=false;
NACHALO
END.
Чем больше моя слава, тем я больше тупею; и таково, несомненно, общее правило.(А.Эйнштейн)
DRAgon™ вне форума Ответить с цитированием
Старый 07.06.2010, 23:24   #3
DRAgon™
Форумчанин
 
Аватар для DRAgon™
 
Регистрация: 14.03.2010
Сообщений: 362
По умолчанию

что-то не выходит у меня
Чем больше моя слава, тем я больше тупею; и таково, несомненно, общее правило.(А.Эйнштейн)
DRAgon™ вне форума Ответить с цитированием
Старый 09.06.2010, 15:15   #4
DRAgon™
Форумчанин
 
Аватар для DRAgon™
 
Регистрация: 14.03.2010
Сообщений: 362
По умолчанию

Ну помогите пожлуйста
Чем больше моя слава, тем я больше тупею; и таково, несомненно, общее правило.(А.Эйнштейн)
DRAgon™ вне форума Ответить с цитированием
Старый 09.06.2010, 16:20   #5
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Не пойму в чем вопрос? Как ввести опережающее описание процедуры?
Если да, то делается это следующим образом:
допустим в вашем коде есть две процедуры А и В. Причем вначале описана процедура А, а уже за ней процедура В. Процедура В может вызвать процедуру А, т. к. та описана ранее. А вот из процедуры А вызвать В нельзя (В описана ниже). Для того чтобы это стало возможным вводится опережающее описание. Для этого перед описанием процедуры А прописывается имя процедуры В со списком формальных параметров, а за тем после ; пишется forward. Пример:
procedure B(x,y: integer); forward;

procedure A(z,m: integer);
begin
...
end;

procedure B(x,y: integer);
begin
...
end;

И еще, я конечно в ваш код сильно не вникал, но первое что бросилось в глаза
PROCEDURE NEPOPALI;
begin
if torpeda_c>10 then procedure zaverhenie igri; else procedure risunok;
end;

По логике этой процедуры должно происходить следующее:
если torpeda_c>10 то вызвать процедуру zaverhenie_igri, если нет, то вызвать risunok. Перед именем процедуры слово procedure не пишится и еще перд else не ставится ;.
Должно быть так:
PROCEDURE NEPOPALI;
begin
if torpeda_c>10 then zaverhenie_igri
else risunok;
end;
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 09.06.2010, 20:45   #6
DRAgon™
Форумчанин
 
Аватар для DRAgon™
 
Регистрация: 14.03.2010
Сообщений: 362
По умолчанию

Цитата:
Сообщение от Don Karleone Посмотреть сообщение
Не пойму в чем вопрос? Как ввести опережающее описание процедуры?
Если да, то делается это следующим образом:
допустим в вашем коде есть две процедуры А и В. Причем вначале описана процедура А, а уже за ней процедура В. Процедура В может вызвать процедуру А, т. к. та описана ранее. А вот из процедуры А вызвать В нельзя (В описана ниже). Для того чтобы это стало возможным вводится опережающее описание. Для этого перед описанием процедуры А прописывается имя процедуры В со списком формальных параметров, а за тем после ; пишется forward. Пример:
procedure B(x,y: integer); forward;

procedure A(z,m: integer);
begin
...
end;

procedure B(x,y: integer);
begin
...
end;

И еще, я конечно в ваш код сильно не вникал, но первое что бросилось в глаза
PROCEDURE NEPOPALI;
begin
if torpeda_c>10 then procedure zaverhenie igri; else procedure risunok;
end;

По логике этой процедуры должно происходить следующее:
если torpeda_c>10 то вызвать процедуру zaverhenie_igri, если нет, то вызвать risunok. Перед именем процедуры слово procedure не пишится и еще перд else не ставится ;.
Должно быть так:
PROCEDURE NEPOPALI;
begin
if torpeda_c>10 then zaverhenie_igri
else risunok;
end;
спасибоооо
Чем больше моя слава, тем я больше тупею; и таково, несомненно, общее правило.(А.Эйнштейн)
DRAgon™ вне форума Ответить с цитированием
Старый 11.06.2010, 00:23   #7
DRAgon™
Форумчанин
 
Аватар для DRAgon™
 
Регистрация: 14.03.2010
Сообщений: 362
По умолчанию

Вот я все сделал как ты сказал,запускаю программку, и на экране ничего не появляется,что это может быть?
вот код


___________________________________ ____________

Код:
uses graph,crt;
var torpeda_c,korabl_s,name,x_circle,y_circle,r,y,x1,x2,mode,device,v:Integer;
klavisha:Char;
Procedure risunok; forward;
procedure nachalo;
begin
torpeda_c:=0;
korabl_s:=0;
Writeln('What was the name gamer');
end;
Procedure risunok;
begin
setcolor(black);
line(0,300,700,300);
setfillstyle(1,blue);
rectangle(0,640,720,640);
floodfill(380,460,white);
setfillstyle(1,lightblue);
rectangle(0,300,720,300);
floodfill(380,180,white);
readln(name);
Writeln('Counters of torpedoes');
Readln(torpeda_c);
Writeln('Counters of ship');
Readln(korabl_s);
end;

Procedure ataka; forward;
Procedure korabl;
begin
readln;
repeat
x1:=20;
x2:=220;
Randomize;
x1:=(340+Random(120));
x2:=(236+random(69));
setcolor(black);
rectangle(x1,100,x2,260);
setfillstyle(1,white);
floodfill(130,210,black);
delay(200);
setcolor(white);
rectangle(x1,160,x2,260);
setfillstyle(1,white);
floodfill(130,210,black);
x1:=x1+4;
x2:=x2+6;
until x1>700;
end;
Procedure ataka;
begin
y_circle:=590;
x_circle:=510;
r:=10;
setcolor(white);
circle(x_circle,y_circle,r);
delay(200);
repeat
if keypressed then begin
klavisha:=readkey;
if klavisha='z' then y_circle:=y_circle-1;
circle(x_circle,y_circle,r);
end
until klavisha='q';
end;

PROCEDURE NEPOPALI; forward;
procedure popal;
begin
if y_circle=260 then Writeln('The good fellow');
readln;
y:=150;
repeat
setcolor(white);
circle(110,y,50);
delay(100);
setcolor(black);
circle(110,y,50);
y:=y-1;
until y<0;
Sound(3000);
delay(100);
sound(1000);
delay(200);
sound(2000);
delay(300);
korabl_s:=korabl_s+1;
Writeln('The padded ships increase on' ,korabl_s);
end;

procedure Nepopal;
begin
if(y_circle>260) and (y_circle<260) then Writeln('BAD');
sound(6000);
delay(50);
torpeda_c:=torpeda_c+1;
Writeln('Counters  out torpedoes increase on' ,torpeda_c);
end;
procedure zaverhenie_igri; forward;
PROCEDURE NEPOPALI;
begin
if torpeda_c>10 then   zaverhenie_igri
else risunok;
end;
procedure zaverhenie_igri;
begin
if torpeda_c>=8 then Writeln('PROFI');
sound(3000);
delay(102);
if torpeda_c<5 then writeln('MAZILA');
sound(1000);
delay(10);
Writeln('Whether you will play still?');
readln(v);
if v=1 then  NACHALO else readln; closegraph ;halt;
end;
BEGIN
device:=0;
initgraph(device,mode,'egavga.bgi');
Directvideo:=false;
NACHALO
END.
Чем больше моя слава, тем я больше тупею; и таково, несомненно, общее правило.(А.Эйнштейн)
DRAgon™ вне форума Ответить с цитированием
Старый 11.06.2010, 01:58   #8
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от DRAgon™ Посмотреть сообщение
Вот я все сделал как ты сказал,запускаю программку, и на экране ничего не появляется,что это может быть?

в твоем коде гигантское количество ошибок. Возми хотя бы процедуру NACHALO которая вызывается из основного блока. Ну вызвал ты ее, ну обнулила она две переменные torpeda_c и corapl_s, ну вывела она строку ''What was the name gamer''. А дальше то что???? Конец программы??? Она ведь не вызывает других процедур!!!

Отлажывайте каждую процедуру в отдельности!!!
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 11.06.2010, 02:21   #9
DRAgon™
Форумчанин
 
Аватар для DRAgon™
 
Регистрация: 14.03.2010
Сообщений: 362
По умолчанию

Цитата:
Сообщение от Don Karleone Посмотреть сообщение
в твоем коде гигантское количество ошибок. Возми хотя бы процедуру NACHALO которая вызывается из основного блока. Ну вызвал ты ее, ну обнулила она две переменные torpeda_c и corapl_s, ну вывела она строку ''What was the name gamer''. А дальше то что???? Конец программы??? Она ведь не вызывает других процедур!!!

Отлажывайте каждую процедуру в отдельности!!!
Покажи на примере пожалуйста,а то что-то не пойму я
Чем больше моя слава, тем я больше тупею; и таково, несомненно, общее правило.(А.Эйнштейн)
DRAgon™ вне форума Ответить с цитированием
Старый 11.06.2010, 02:41   #10
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от DRAgon™ Посмотреть сообщение
[B][I]
PROCEDURE KORABL;
Здесь плывет корабль до вы-стрела, который вызывает процедуру ATAKA.

PROCEDURE RISUNOK; Здесь рисуем береговую ли-нию, указываем на экране имя игрока, счетчики торпед и подбитых кораблей. Затем вызываем процедуру KORABL.

PROCEDURE NACHALO;Здесь устанавливаем в нуль счетчики торпед и подбитых кораблей, спрашиваем имя игрока и делаем все прочее, что нужно делать один раз за всю игру в самом ее начале. Затем прямо из процедуры NACHALO вызываем процедуру RISUNOK.

BEGIN
инициализация графического режима;
DirectVideo:=false;
NACHALO
END.
1) инициализация графического режима. Я не силен в графике, но у тебя она неправильная. Попробуй сделать так
begin
device:=0;
mode:=0;
initgraph(device,mode,'c:\bp\bgi'); {если корневой коталог паскаля на диске С}
DirectVideo:=false;
Nachalo; {вызов процедуры Nachalo}
end;

2) в процедуре начало должно быть введено имя игрока, установлено количество торпед, количество кораблей.
Код:
procedure Nachalo;
begin
  torpeda_c:=0;
  korabl_s:=0;
  Writeln('What was the name gamer');
  Readln(name);  {ввод имени игрока. Кстати, name должна быть строковой переменной а не Integer}
  Writeln('Counters of torpedoes');
  Readln(torpeda_c);  {ввод количества торпед}
  Writeln('Counters of ship');
  Readln(korabl_s);  {ввод количества кораблей}
  {а теперь вызываем процедуру Risunok}
  Risunok
end;
ну и так далее...
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Библиотека процедур Paradoxer Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 14.09.2010 12:12
outlook и VBA. Как создать событие в календаре с форматированием описания? Snark Microsoft Office Excel 0 28.09.2009 15:34
Массив процедур garik Общие вопросы Delphi 0 18.03.2009 21:08
объявить класс для описания клиеннтского потока. с атрибутами String. Sargon Работа с сетью в Delphi 4 23.12.2007 23:36
Создание процедур Viteef Общие вопросы Delphi 3 11.05.2007 01:25