Вызвать процедуру\функцию из другого объекта\класса. Из одного класса\объекта сделать два - Turbo Pascal
Формулировка задачи:
Здравствуйте.
Подскажите что не правильно делаю, и возможно ли вообще - вызвать процедуру\функцию из другого объекта\класса, в турбо паскале?
Хочу сделать из одного класса\объекта два.. Но чё-т как-то не получается.
Исходный код не влез, прикрепил тхт файлом. И переделанное тоже прикрепил.
Вот во что пытался переделать:
Если кто поможет буду при много благодарен.
Program Pirog;
uses crt,graph;
const numb = 12; {Кол-во кусочков, на которые делить пирог}
cherry = 4;{В каком из кусочков лежит вишенка) }
attempts = 2;{Кол-во кусочков, которых можно выбрать за 1 раз }
debug = false;
type
arra = array[1..48] of integer; {Массив для хранения индексов кусочков, которые скушаны}
ar = array[1..48,1..48] of integer; {Массив для хранения углов кусочков}
{"""""""""""""""""}
{------ПИРОГ------}
{_________________}
TCake = object {Объявили класс}
eaten:arra; {Массив для хранения индексов кусочков, которые скушаны }
choicecount:integer;{Счётчик выбора}
procedure playerselect;
procedure compselect;
procedure winner(nam:integer);
procedure ChoiceMore;
function nextselect:integer;
function nextselectright:integer;
end;
TCakeDraw = object {Объявили класс}
arr:ar; {Массив для хранения углов кусочков }
eatind:integer; {Последнего скушанного кусочка}
partoc:integer; {Текущий кусочек пирога }
procedure show;
procedure divide(nofp:integer);
procedure selectcherry;
procedure select(nn:integer);
procedure clearselect(nn:integer);
procedure eat(nn:integer);
end;
{"""""""""""""""""""""}
{Вывод на екран пирога}
{_____________________}
procedure TCakeDraw.show;
begin
pieslice(300,250,0,360,200); {Рисуем и закрашиваем пирог}
SetTextStyle(0,0,3);
SetColor(15);
OutTextXY(240,10,'Пирог!');
end;
{ }
{"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""}
{ Делим пирог на указанное кол-во частей и записываем их координаты в массив}
{___________________________________________________________________________}
procedure TCakeDraw.divide(nofp:integer);
var a,b,i,np:integer;
begin
np:=round(360/nofp); {Делим на ровные кусочки}
a:=0;
b:=0+np;
for i:=1 to nofp do
begin
arr[1,i]:=a;
arr[2,i]:=b;
a:=a+np;
b:=b+np;
end;
selectcherry;
TCake.choicecount:=attempts;
eatind:=1;
partoc:=1;
end;
{ }
{""""""""""""""""""""""""""""""""""""""""""""""""}
{ Выделяем кусок пирога, в котором лежит вишенка }
{________________________________________________}
procedure TCakeDraw.selectcherry;
begin
SetFillStyle(XHatchFill,4);
pieslice(300,250,arr[1,cherry],arr[2,cherry],200);
end;
{ }
{""""""""""""""""""""""""""}
{ Выделяем кусочек пирога }
{__________________________}
procedure TCakeDraw.select(nn:integer);
var i:integer;
begin SetFillStyle(XHatchFill,1);
pieslice(300,250,arr[1,nn],arr[2,nn],200);
end;
{ }
{"""""""""""""""""""}
{ Снимаем выделение }
{___________________}
procedure TCakeDraw.clearselect(nn:integer);
begin
SetFillStyle(XHatchFill,15);
pieslice(300,250,arr[1,nn],arr[2,nn],200);
end;
{ }
{"""""""""}
{ Съедаем }
{_________}
procedure TCakeDraw.eat(nn:integer);
begin
SetFillStyle(SolidFill,0);
pieslice(300,250,arr[1,nn],arr[2,nn],200);
end;
{ }
{""""""""""""""""""""""""""""""""""""""""""""""""""""}
{ Пропуск выделенных кусочков или кусочка с вишенкой }
{____________________________________________________}
function TCake.nextselect:integer;
var i:integer; ok:boolean;
begin
for i:=1 to numb do
begin
if (TCakeDraw.partoc = eaten[i]) or (TCakeDraw.partoc = cherry) then
begin
TCakeDraw.partoc:=TCakeDraw.partoc+1;
if TCakeDraw.partoc > numb then
TCakeDraw.partoc:=1;
TCake.nextselect;
end
else
nextselect:=TCakeDraw.partoc;
end;
end;
function TCake.nextselectright:integer;
var i:integer; ok:boolean;
begin
for i:=1 to numb do
begin
if (partoc = eaten[i]) or (partoc = cherry) then
begin
partoc:=partoc-1;
if partoc < 1 then
partoc:=numb;
TCake.nextselectright;
end
else
nextselectright:=partoc;
end;
end;
{ }
{""""""""""""""""""""""}
{ Выбираем ещё кусочек }
{______________________}
procedure TCake.playerselect;
var k,i,j:integer;
begin
if TCakeDraw.eatind = numb then
winner(0)
else
begin
TCakeDraw.partoc:=nextselect;
select(TCakeDraw.partoc);
repeat
k:=ord(readkey);
if debug then
writeln(k);
case k of
{<- <- <- <- <- <- <- <- <- <- <-}
{ Кнопка влево <- <- <- <- <- <- }
{<- <- <- <- <- <- <- <- <- <- <-}
75: begin
clearselect(TCakeDraw.partoc);
TCakeDraw.partoc:=TCakeDraw.partoc+1;
if TCakeDraw.partoc>numb then
TCakeDraw.partoc:=1;
select(nextselect);
end;
{-> -> -> -> -> -> -> -> -> -> ->}
{ Кнопка вправо-> -> -> -> -> -> }
{-> -> -> -> -> -> -> -> -> -> ->}
77: begin
clearselect(TCakeDraw.partoc);
TCakeDraw.partoc:=TCakeDraw.partoc-1;
if TCakeDraw.partoc<1 then
TCakeDraw.partoc:=numb;
Select(nextselectright);
end;
{ENTER ENTER ENTER ENTER ENTER}
{ Кнопка ENTER }
{ENTER ENTER ENTER ENTER ENTER }
13: begin
eaten[TCakeDraw.eatind]:=TCakeDraw.partoc;
TCakeDraw.eatind:=TCakeDraw.eatind+1;
eat(TCakeDraw.partoc);
TCakeDraw.partoc:=partoc+1;
if TCakeDraw.partoc>numb then
TCakeDraw.partoc:=1;
Select(nextselectright);
if debug then
writeln('choices: ',choicecount);
if not (choicecount = 0) then
begin
choicecount:=choicecount-1;
ChoiceMore;
end
else compselect;
end;
{____________________________________________________}
end;
until k=32;
end;
end;
{ }
{"""""""""""""""""}
{ Компьютер ходит }
{_________________}
Procedure TCake.compselect;
var kompatt, chosenpart,i,j,l,kol:integer;
begin
choicecount:=attempts;
kol:=0;
if TCakeDraw.eatind = numb then
winner(1)
else
begin
kompatt:=random(attempts+1);
if TCakeDraw.eatind = numb-1 then
kompatt:=1;
if TCakeDraw.eatind = numb-2 then
kompatt:=2;
if TCakeDraw.eatind = numb-3 then
kompatt:=3;
if kompatt = 0 then
kompatt:=1;
if kompatt >= attempts+1 then
kompatt:=attempts;
for i:=1 to kompatt do
begin
repeat
chosenpart:=random(numb);
if chosenpart = 0 then
chosenpart:=1;
if not (chosenpart = eaten[i]) and not (chosenpart = cherry) then
begin
eat(chosenpart);
eaten[TCakeDraw.eatind]:=chosenpart;
TCakeDraw.eatind:=TCakeDraw.eatind+1;
kol:=kol+1;
end;
until kol >= kompatt;
end;
playerselect;
end;
end;
{ }
{""""""""""""""""""""""""""}
{ Ход ещё или окончить ход }
{__________________________}
procedure TCake.ChoiceMore;
var key,ch:integer;
begin
SetTextStyle(0,0,2);
SetColor(15);
OutTextXY((GetMaxX-600),(GetMaxY-200),'Взять ещё кусочек');
OutTextXY((GetMaxX-300),(GetMaxY-200),'Поделиться с компом');
repeat
key:=ord(readkey);
case key of
75: begin { Отрисовка если перемещаемся ВЛЕВО }
SetColor(0);
Rectangle((GetMaxX-310),(GetMaxY-210),(GetMaxX-50),(GetMaxY-110));
SetColor(15);
Rectangle((GetMaxX-610),(GetMaxY-210),(GetMaxX-300),(GetMaxY-110));
OutTextXY((GetMaxX-600),(GetMaxY-200),'Взять ещё кусочек');
OutTextXY((GetMaxX-300),(GetMaxY-200),'Поделиться с компом');
ch:=1;
end;
77: begin { Отрисовка если перемещаемся ВПРАВО }
SetColor(0);
Rectangle((GetMaxX-610),(GetMaxY-210),(GetMaxX-300),(GetMaxY-110));
SetColor(15);
Rectangle((GetMaxX-310),(GetMaxY-210),(GetMaxX-50),(GetMaxY-110));
OutTextXY((GetMaxX-600),(GetMaxY-200),'Взять ещё кусочек');
OutTextXY((GetMaxX-300),(GetMaxY-200),'Поделиться с компом');
ch:=0;
end;
13: begin { Отрисовка если выбрали кусочек}
SetFillStyle(SolidFill,0);
Bar((GetMaxX-610),(GetMaxY-210),GetMaxX,GetMaxY);
if ch = 1 then
begin
playerselect;
if debug then
writeln('Взять кусок.');
end;
if ch = 0 then
begin
compselect;
if debug then
writeln('Отдать компу.');
end;
end;
end;
until key=27; {Пока не нажали ЕСКейп, выход}
end;
{ }
{""""""""""""""""""""""""""""""""""""""""""""""""}
{ Поздравляем или огорчаем }
{-----------------------------------------------------------------------}
procedure TCake. winner(nam:integer);
begin
SettextStyle(0,0,5);
SetColor(Green);
if nam=0 then
OutTextXY(80,250,'Ты проиграл!');
if nam=1 then
OutTextXY(80,250,'Ты выиграл!!!');
Readln;
CloseGraph;
end;
{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\}
{ ПИРОГ ГОТОВ :) }
{///////////////////////////////////////////////////////////////////////}
var
Gd, Gm,
k,
i: Integer;
cakeDraw:TCakeDraw;
cake:TCake;
Begin
clrscr;
Gd := Detect;
Gm := Vgahi;
InitGraph(Gd, Gm, 'C:\tp7\BIN');
if GraphResult <> grOk then
Halt(1);
Randomize;
SetFillStyle(XHatchFill, 15);
cakeDraw.show;
cakeDraw.divide(numb);
k:=random(2);
if k=0 then
cake.compselect;
if k=1 then
cake.playerselect;
CloseGraph;
readln;
End.Решение задачи: «Вызвать процедуру\функцию из другого объекта\класса. Из одного класса\объекта сделать два»
textual
Листинг программы
procedure TCakeDraw.divide(nofp:integer); ... TCake.choicecount:=attempts; ...
Объяснение кода листинга программы
В данном коде представлен объект TCakeDraw, который имеет метод divide(nofp:integer). Метод не имеет параметров и выполняет следующие действия:
- Вызывает метод choicecount объекта TCake.
- Устанавливает значение переменной attempts объекта TCake равным 1.
- ... Также в коде присутствует объект TCake, который имеет свойство choicecount.