Pascal/Turbo Pascal - simulador malabares! ayuda!

   
Vista:

simulador malabares! ayuda!

Publicado por Manuel (2 intervenciones) el 10/02/2010 22:05:33
Hola, que tal? estoy haciendo un simulador de malabares (siteswap) en pascal..
la idea es q los malabares se pueden escribir como una secuencia de numeros del 0 al 9, donde cada numero representa un movimiento diferente de la pelota.. [info: uuu.ensaimadamalabar.com/numerologia.htm]
el problema es que cuando ejecuto el programa nada anda como quiero :( las pelotas se mueven en direcciones y tmb el programa se sale dependiendo que patron (ssw=siteswap) ingreses... si alguien puede ayudarme a ver que pasa en el codigo le agradeceria. los parametros que pide al inicio del programa son:
resolucion=cantidad de pasos que hace (preferentemente >= 20)
ssw = patron (prueben con 3, 4, 5, 6, 7, 531, 55500, 51. cada uno es un patron diferente)
color (2, que es verde por ejemplo)
velocidad (20 por ejemplo)

las funciones interpbezier() y obtenerxy() realizan los movimientos de la pelota en la mano y en el aire, respectivamente. (fueron probadas separadamente del programa y funcionan bien). el procedimiento actualizar() actualiza el estado de la bola (la bola es un registro). imprimir() la dibuja en pantalla.

debajo va el codigo del programa.
bueno, espero q alguien pueda ayudarme... muchas gracias!

//-----------------------------CODIGO--------------------------------------------------------------------------

program malabares;

uses
graph,crt;

const
RADIO = 10;
LIM_INF = 640; //limite inferior de las manos

type
siteswap = 0..9;
vect2 = array[0..1] of integer;
vect4 = array[0..3] of integer;
pbolas = ^bolas;
bolas = record
x,y,paso,color: integer;
ssw: siteswap;
mano: -1..1;
sgte: pbolas;
end;

//------------------------------------------------------------------------------

function obteneraltura(s:string;posicion:integer):siteswap;
var
i,control:integer;

begin
i := posicion mod length(s);
val(s[i+1],obteneraltura,control);
end;

//------------------------------------------------------------------------------

function creabolas(cbolas,color:integer):pbolas;
var
y,z:pbolas;
i:integer;

begin
new(y);
creabolas := y;
i := 1;
while i <= cbolas do
begin
//inicializa atributos
y^.x := 0;
y^.y := 0;
y^.paso := 0;
y^.ssw := 0;
if color = -1 then
y^.color := random(getmaxcolor())
else
y^.color := color;
y^.mano := -1;

if i < cbolas then
new(z)
else
z := nil;
y^.sgte := z;
y := z;
i := i + 1;
end;
end;

//------------------------------------------------------------------------------

function bolasiguiente(resolucion:integer;pini:pbolas):pbolas;
var
y:pbolas;

begin
y := pini;
while y <> nil do
begin
if (y^.paso = y^.ssw * resolucion) then
begin
bolasiguiente := y;
exit;
end;
y := y^.sgte;
end;
end;

//------------------------------------------------------------------------------
// NO ANDA BIEN! -->

procedure destruirbolas(var pini:pbolas);
//pini se modifica porq queda apuntando a 'nil'
var
y,z:pbolas;

begin
if pini <> nil then
begin
y := pini;
while y <> nil do
begin
z := y^.sgte;
dispose(y);
y := z;
end;
end;
end;

//------------------------------------------------------------------------------

function verificassw(ssw:string;var cbolas,hmax:integer):boolean;
var
m,i,suma,num,verif,pos:integer;
a:string;

begin
verificassw := true;
m := length(ssw);
if m = 0 then
begin
verificassw := false;
exit;
end
else
begin
a := '';
for i:=1 to m do
a := a + 'f';
suma := 0;
for i:=1 to m do
begin
val(ssw[i],num,verif);
if verif = 1 then
begin
verificassw := false;
exit;
end;
suma := suma + num;
if num > hmax then
hmax := num;
pos := (num+i) mod m;
if pos = 0 then
pos := m; //asigno a la ultima posicion, a[0] es invalido
if a[pos] = 't' then
begin
verificassw := false;
exit;
end
else
a[pos] := 't';
end;
cbolas := suma div m;
end;
end;

//------------------------------------------------------------------------------

function obtenerxy(paso,cpasos:integer;tt:real;xi,yi,xf,yf,altura:integer):vect2;
var
t,h,st,x,y:real;

begin
t := (altura - 1) * tt;
if altura = 3 then
t := 2.5 * tt;
h := (9.81 * sqr(t)) / 10;
st := paso / cpasos;
x := xi + st * (xf - xi);
y := yi + st * (yf - yi) - 4 * h * (sqr(st) - st);
obtenerxy[0] := round(x);
obtenerxy[1] := round(y);
end;

//------------------------------------------------------------------------------

function interpbezier(paso,cpasos,xi,yi,xf,yf,apertura:integer):vect2;
var
t,u,c0,c1,c2,c3,x,y:real;

begin
t := paso / cpasos;
u := 1 - t;
c0 := sqr(u) * u;
c1 := 3 * t * sqr(u);
c2 := 3 * u * sqr(t);
c3 := sqr(t) * t;
x := (xi + xf) / 2;
y := (yi + yf) / 2 + apertura;
x := c0 * xi + c1 * x + c2 * x + c3 * xf;
y := c0 * yi + c1 * y + c2 * y + c3 * yf;
interpbezier[0] := round(x);
interpbezier[1] := round(y);
end;

//------------------------------------------------------------------------------

procedure imprimir(z:pbolas);
var
r:integer;

begin
setcolor(z^.color);
setfillstyle(solidfill,z^.color);
bar(z^.x-1,z^.y-1,z^.x+1,z^.y+1); //rellena el hueco del medio
for r:=0 to RADIO do //rellena con circulos
circle(z^.x,z^.y,r);
end;

//------------------------------------------------------------------------------

procedure actualizar(var z:pbolas;pasosmano,resolucion:integer;tt:real;estilo:vect4);
var
ancho,xi,xf,xtiro,temp:integer;
pos:vect2;

begin
ancho := (getmaxx() - RADIO) div 2;
xi := ancho - (estilo[0] * ancho) div 100;
xf := ancho + (estilo[0] * ancho) div 100;
xtiro := ancho - (estilo[2] * ancho) div 100;
//write('ancho: ',ancho,'. xi: ',xi,'. xf: ',xf,'. xtiro: ',xtiro);

if z^.mano = 1 then
begin
temp := xi;
xi := xf;
xf := temp;
xtiro := ancho + (estilo[2] * ancho) div 100;
end;
if (z^.ssw mod 2 = 0) then
xf := xi;

if z^.paso < pasosmano then
pos := interpbezier(z^.paso,pasosmano,xi,LIM_INF+estilo[1],xtiro,LIM_INF+estilo[3],30)
else
pos := obtenerxy(z^.paso-pasosmano,z^.ssw*resolucion-pasosmano,tt,xtiro,LIM_INF+estilo[3],xf,LIM_INF+estilo[1],z^.ssw);

z^.x := pos[0];
z^.y := pos[1];
z^.paso := z^.paso + 1;
end;

//------------------------------------------------------------------------------

procedure animar(var paso,pasossw:integer;resolucion,pasosmano:integer;tt:real;estilo:vect4;ssw:string;pinicial:pbolas);
var
altura:siteswap;
y:pbolas;
pbola:pbolas;

begin
if (paso mod resolucion = 0) then //lo hace cada 'resolucion' pasos
begin
altura := obteneraltura(ssw,pasossw);
if altura <> 0 then
begin
pbola := bolasiguiente(resolucion,pinicial);
//posible error si no encuentra bola siguiente;
pbola^.ssw := altura;
pbola^.paso := 0;
if (pasossw mod 2 = 0) then
pbola^.mano := -1
else
pbola^.mano := 1;
end;
pasossw := pasossw + 1;
end;
y := pinicial;
while y <> nil do
begin
actualizar(y,pasosmano,resolucion,tt,estilo);
imprimir(y);
y := y^.sgte;
end;
paso := paso + 1;
end;

//------------------------------------------------------------------------------

//programa principal
var
resolucion,pasosmano,paso,pasossw,color,cbolas,hmax,velocidad:integer;
tmano,tt,h:real;
ssw:string;
pini:pbolas;
verif:boolean;
estilo:vect4;
driver,modo:smallint;

begin
verif := false;
repeat
clrscr();
write('resolucion:');readln(resolucion);
write('ssw:');readln(ssw);
write('color:');readln(color);
write('velocidad:');readln(velocidad);

cbolas := 0;
hmax := 0;
verif := verificassw(ssw,cbolas,hmax);
until verif=true;

//control altura de tiro (tt)
tt := 4;
h := sqrt((LIM_INF-RADIO) / sqr(hmax));
if h < tt then
tt := h;
write('tt: ',tt,'. h: ',h);

tmano := 0.5;
pasosmano := round(tmano * resolucion);
paso := 0;
pasossw := 0;
estilo[0] := 50;
estilo[1] := 0;
estilo[2] := 25;
estilo[3] := 0;

//destruirbolas(pini);
pini := creabolas(cbolas,color);

driver:= detect;
modo:= VgaHi; //Modo 640x480, 16 colores
initgraph(driver, modo, '');
//write(getmaxx(),' ',getmaxy());

verif := true;
repeat
clearviewport();
animar(paso,pasossw,resolucion,pasosmano,tt,estilo,ssw,pini);
delay(velocidad);
until verif = false;

ssw := readkey();
closegraph();
end.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:simulador malabares! ayuda!

Publicado por YO (1 intervención) el 20/06/2010 02:09:55
driver:= detect; <---Driver := Vga;
modo:= VgaHi; //Modo 640x480, 16 colores
initgraph(driver, modo, ''); <--- InitGraph(Driver, Modo, 'c:\tp\bgi');

corrige esas dos lineas y prueva
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:simulador malabares! ayuda!

Publicado por jorge  (1 intervención) el 16/12/2010 17:58:01
realice un programa en pascal quecalcule el error para un punto dado de una funcion .x. de la aproximidad del metodo delos tres octavos de simpson en un intervalo. usar tres variable.... ayudame plis
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar