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!!