Вызвать процедуру\функцию из другого объекта\класса. Из одного класса\объекта сделать два - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д