Pascal/Turbo Pascal - juego pinball

 
Vista:

juego pinball

Publicado por Gloria (5 intervenciones) el 05/04/2007 01:33:32
Hola buenas. Pues escribo en el foro para ver si alguien podría ayudarme con este programa de una práctica de laboratorio que tengo que entregar. He puesto en la url todo el enunciado, pero bueno comento un poquillo de qué va el asunto. Se trata de hacer como un videojuego de pinball que tiene una bola que se mueve por una matriz N x M casillas. La matriz está formada por casillas en blanco (' ') por las que se puede mover la pelota, y casillas obstáculo (carácter ASCII) en las que la bola rebota, tb los extremos de la matriz hacen rebotar la bola.

El movimiento de la bola consta de 6 direcciones cardinales, N,S,E,O,NO,NE,SO,SE, manteniendo dicha direccion hasta encontrar un obstaculo o el borde de la matriz.

Cuando el movimiento de la bola se ve interrumpido por un obstaculo o el borde de la matriz, ésta rebota aleatoriamente en cualquiera de las 6 direcciones cardinales, siempre y cuando pueda hacerlo.

Bueno pues este es el enunciado más o menos.

Ahora os comento las ideas que tengo...Bueno la matriz tiene q ser de 8 filas y 5 columnas
la bola hay q inicializarla en el (1,1) con direccion E,SE o S. El programa tiene que mostrar el recorrido de la bola por la tabla y el juego finaliza cuando la bola se coloca en el punto (8,3). El usuario puede elegir el nº de obstáculos.

Pues bien lo que llevo hecho de codigo es esto:

program P3A(input,output);
uses crt; {lo he puesto con el objetivo de usar gotoxy}
const

limitefilas=8;
limitecolumnas=5;

type
filas= 1..limitefilas;
columnas=1..limitecolumnas;
matriz= array[filas,columnas] of integer;

var
tabla:matriz;
pelota,obstaculo:char;
borde,obs,salida:boolean;

procedure movimiento;
{determina el movimiento de la bola}
type
movi=(Norte,Sur,Este,Oeste,NEste,NOeste,SEste,SOeste);
var
N,S,E,O,NE,NO,SE,SO:matriz;
begin
case movi of
Norte: N[filas,columnas] + [1,0];
Sur: S[filas,columnas] + [-1,0];
Este: E[filas,columnas] + [0,1];
Oeste: O[filas,columnas] + [0,-1];
NEste: NE[filas,columnas] + [-1,1];
NOeste: NO[filas,columnas] + [-1,-1];
SEste: SE[filas,columnas] + [1,1];
SOeste: SO[filas,columnas] + [1,-1];
end;{procedure}

procedure calculadir;
{calcula la direccion de la bola}
var
x,y:Integer;
begin
randomize;
repeat
begin
x:=random(1);
y:=random(1);
end;
until (not ((x=0) and (y=0)));
while
end;{procedure}

procedure escribirtabla;
{saca por pantalla el tablero}
const
limitefilas=8;
limitecolumnas=5;
var
fila,columna:Integer;
begin
for fila:=1 to limitefilas do
for columna:=1 to limitecolumnas do
write(' ');
end;{procedure}

procedure obstaculos;
{coloca aleatoriamente los obstaculos en el tablero}
var
obstaculo:char;
i,num:Integer;
begin
obstaculo:=chr(48);
writeln('Introduce el numero de osbtaculos: ');
readln(num);
randomize;

end;{procedure}
{----------------------PROGRAMA PRINCIPAL---------------------}
begin
escribirtabla;
borde:=true;
obs:=true;
readln;
end.

--------------------------------------------------------------------------------------
Pero como soy novata en esto de la programación, no sé por qué me da error en el case del procedure movimiento y tb no sé cómo tienen que salir de los procedures los parámetros si por variable o por valor o cómo...Así que si alguien me puede echar una manita con este programa se lo agradecería, esque ando muy perdida en este mundillo. Por favor se acepta cualquier idea que os surja. Muchas gracias :D.
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:juego pinball

Publicado por Diego Romero (996 intervenciones) el 05/04/2007 05:14:08
En el procedimiento movimiento "movi" no es una variable, es un tipo de variable, no puedes usar case con un tipo de variable, debes hacerlo con una variable de algún tipo enumerado (y "movi" declara un tipo enumerado precisamente).
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:juego pinball

Publicado por Gloria (5 intervenciones) el 05/04/2007 09:46:30
Vale, entonces si en el case hay q utilizar una variable de tipo enumerado y movi es de ese tipo, si le asigno a otra variable, por ejemplo 'mov' (mov:movi;) asi tb me da error al compilar...:S
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:juego pinball

Publicado por David (1 intervención) el 09/04/2007 23:35:36
La variable y dentro del begin sería algo así:

var
mov : movi;
begin
mov:=movi(random(7));
case mov of...

y todo lo que has escrito que tampoco lo he entendido muy bien.
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:juego pinball

Publicado por complutense (1 intervención) el 11/04/2007 00:55:46
que alguien haga en un momento el codigo por favor!!!y como se consigue hacer un reloj que empiece de 0 y empiece a contar...?y apre cuando la bola acaba en casilla (8,3)??para que sirve goto xy?
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:juego pinball

Publicado por kobe (1 intervención) el 14/04/2007 18:19:17
gotoxy sirve para relentizar 1000seg en uno
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:juego pinball

Publicado por Nacho (5 intervenciones) el 15/04/2007 12:54:49
¿GotoXY para ralentizar? Para ralentizar sería Delay.
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:juego pinball

Publicado por Patricia (1 intervención) el 15/04/2007 17:43:16
Veo errores en el código, de TIPOS y VARIABLES
- El "procedure escribir_tabla" tiene como objetivo que te inicialice las casillas de la tabla a blanco( que es un tipo enumerado que tienes que crear; p.ej:Tcelda=(blanco, bola, obstaculo) y asu vez la matriz que ya tienes creada tiene que ser de este tipo, es decir: matriz[filas,columnas]of Tcelda. Aparte tienes que tener otro procedure que te muestre el tablero(con WRITELN´s principalmente, las rayitas los numeros de filas y columnasde 1 a 8 y de 1 a 5 respectivamente).
- El tipo que creas enumerado para la dirección de la bola(N,S,E..)debes ponerlo en el TYPE del principio del porgrama no dentro del procedure...
- Dentro del case,"movi" es un tipo de variable no una variable!No puedes hacer eso.Debes crear una variable local de ese tipo(enumerado) para usarla.
- Las instrucciones que metes en el CASE serían :
N: N[filas, columnas]:=N[filas-1,columnas]; {para que la bola se mueva al norte, la columna no varía pero la fila se misminuye ya queb tienes que ir hacia arriba}
...
...
- Las variables booleanas "borde, obs," las incializas en el programa principal pero en ningun subprograma las actualizas, no controlan nada, no tiene sentido...
Espero haberte ayuduado algo.
Animo y suerte!
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:juego pinball

Publicado por carlos (1 intervención) el 01/04/2009 16:58:39
¡¡¡¡¡¡¡¡¡¡¡ AYUDA !!!!!!!!!!!!!!!!!!!!!!!!!

yo tengo que resolver para el laboratorio de programación el mismo juego de pinball en pascal y estoy perdido totalmente porque soy nuevo y no tengo mucha idea, me podias ayudar?, conseguiste que duncionara tu juego? yo tengo que presentarlo despues de semana santa. Gracias
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