Ayuda urgente con programa

Buenas.

Tengo que realizar, en Pascal, una práctica que consiste en una versión simplificada ligeramente del juego Blackjack.

De momento he hecho muy poquito, pero es que me está dando unos problemas el programa que me estoy volviendo loco (maldito Pascal...). Esto es lo que tengo:

PROGRAM blackjack;

TYPE
baraja = array [1..52] of integer;

PROCEDURE LimpiarBaraja(var mazo:baraja);
(* Procedimiento que asigna el valor 0 a los elementos del array mazo*)
VAR
i: integer;
BEGIN
for i:= 1 to 52 do
mazo[i] := 0
END;

PROCEDURE LimpiarMano(var mano: array of integer);
(* Procedimiento que asigna el valor 0 a los elementos del array mano*)
VAR
i: integer;
BEGIN
for i:= 1 to Length(mano) do
mano[i] := 0
END;

FUNCTION SumaManoJ(mano: array of integer):integer;
(* Función que devuelve el valor sumado de las cartas de la mano del Jugador *)
VAR
i: integer;
BEGIN
SumaManoJ := 0;
writeln('manoLength: ', Length(mano));
(* Muestro la longitud del array para comprobarla *)
for i:= 1 to Length(mano) do
begin
writeln('mano[',i,']: ',mano[i]);
(* Muestro los valores de las cartas de la mano para comprobarlos *)
SumaManoJ := SumaManoJ + mano[i]
end;
END;

FUNCTION SumaManoC(mano: array of integer):integer;
(* Función que devuelve el valor sumado de las cartas de la mano del Casino *)
VAR
i: integer;
BEGIN
SumaManoC := 0;
writeln('manoLength: ', Length(mano));
for i:= 1 to Length(mano) do
begin
writeln('mano[',i,']: ',mano[i]);
SumaManoC := SumaManoC + mano[i]
end;
END;

PROCEDURE MostrarMazo(mazo:baraja);
(* Procedimiento realizado para testeo. Muestra el mazo *)
VAR
i: integer;
BEGIN
for i:= 1 to 52 do
writeln(mazo[i])
END;

PROCEDURE Barajar(var mazo:baraja);
(* Procedimiento que baraja el mazo *)
VAR
i, j, rndm : integer;
BEGIN
for i:=1 to 4 do
for j:= 1 to 13 do
begin
repeat
rndm := Random(53)
until (mazo[rndm] = 0);
if (j<10) then
mazo[rndm] := j
else
mazo[rndm] := 10
end;
END;

VAR
mazo : baraja;
partida, apuesta, balance, puntero, jugadaC, jugadaJ : integer;
manoJ: array[1..11] of integer;
manoC: array[1..10] of integer;

BEGIN
Randomize;
LimpiarBaraja(mazo);
LimpiarMano(manoJ);
LimpiarMano(manoC);
(* Inicializo a 0 el mazo y las manos del jugador y casino *)
Barajar(mazo);
partida := 1;
apuesta := 2;
balance := 0;
puntero := 1;
(* El puntero lo uso para indicar la carta siguiente a robar en el mazo *)
writeln('Partida: ',partida,'| Apuesta: ',apuesta,'| Balance: ',balance);
writeln('---------------------------------------------');
(* Partida, Apuesta y Balance son elementos que todavía no uso *)
manoJ[1] := mazo[puntero];
(* Se entrega una carta al jugador *)
puntero := puntero + 1;
manoJ[2] := mazo[puntero];
(* Se entrega una carta al jugador *)
puntero := puntero + 1;
manoC[1] := mazo[puntero];
(* Se entrega una carta al casino *)
puntero := puntero + 1;
jugadaJ := SumaManoJ(manoJ);
jugadaC := SumaManoC(manoC);
(* Asigno el valor de cada jugada llamando a la función SumaMano *)
writeln('Casino (',jugadaC,')');
writeln('Jugador (',jugadaJ,')')
(* Muestro el valor de las jugadas *)
END.

Digamos que lo que hago es barajar el mazo, repartir 2 cartas al jugador y una al casino, y mostrar el valor de cada jugada. Es decir, que si al jugador le reparto un 4 y un 10, y al casino un 7, el resultado tendría que ser:

Casino (7)
Jugador (14)

Sin embargo, por algún extraño motivo que se me escapa, no me funciona bien "la mano del Casino", ya que la salida del programa cuando llamo a la función SumaManoC es:

manoLength: 10
mano[1]: 0
mano[2]: 0
mano[3]: 0
mano[4]: 0
mano[5]: 0
mano[6]: 0
mano[7]: 0
mano[8]: 0
mano[9]: 0
mano[10]: -27516

Es decir, que el elemento 1, la carta que le he repartido, no me la "lee", y el elemento último tiene un valor obsceno y sin sentido. La jugada, por tanto, es la siguiente:

Casino (-27516)

La cosa es que si a la función SumaManoC, en vez de pasar el array como valor, lo paso como variable, el elemento décimo ya toma el valor 0, pero el primer elemento también sigue tomándolo (cuando si muestro su valor desde el código principal, sí lo muestra correctamente):

FUNCTION SumaManoC(var mano: array of integer):integer;

manoLength: 10
mano[1]: 0
mano[2]: 0
mano[3]: 0
mano[4]: 0
mano[5]: 0
mano[6]: 0
mano[7]: 0
mano[8]: 0
mano[9]: 0
mano[10]: 0

Casino (0)

He intentado de todo, y no entiendo por qué narices me pasa esto. Lo único en claro que he conseguido sacar es que Pascal es una basura y que no entiendo por qué siguen empeñándose en usarlo para enseñar a programar, cuando sería mucho, mucho mejor hacerlo en C, Java o similares :(.

¡¡Ayuda, por favor!! [buuuaaaa]
La verdad es que el lenguaje...pero bueno yo tambien tuve que estudiarlo y fue en el lenguaje que me solte a programar(realmente entendi la programacion con ensamblador :-? ). Hace muuucho que no veo codigo en pascal por lo que no puedo ayudarte mucho pero bueno.
Lo primero de todo es que no se para que llamas en el main a "SumaManoC(manoC)" aunque supongo que sera para verificar resultados ya que tan solo devolvera el primer valor. Eso si deberia devolverlo.

Asegurate que "LimpiarMano(manoC)" hace su trabajo ya que parece que la ultima posicion tiene un valor residual. Otra cosa, no se como es el juego en realidad, pero porque tiene 11 cartas un jugador y la banca 10?, es que no se porque haces distinciones y tienes dos funciones que hacen lo mismo(SumaManoC y SumaManoJ)

A ver si te ayudo algo
La diferencia en el número de cartas del Jugador y del Casino viene debido al máximo número de cartas que pueden tener ambos teniendo en cuenta que les tocaran las de menos valor, hasta pasarse según la restricción del enunciado >.<

Tienes razón en que habiendo dado una sola carta al Casino, es estúpido calcular la suma de su jugada, pero como bien dices, así compruebo su funcionamiento.
La cosa es que si desde el main compruebo el valor de manoC[10], me da 0, igual que manoC[1] me da su valor. El fallo viene al llamar a SumaManoC :S.

Gracias.
2 respuestas