const MaxNumFicha = 28;
type TExtremo = (Uno, Dos); // O Izda-Dcha, o Norte-Sur, o Cerca-Lejos (remember kermit of sesame street?)
type TValor = 0..6;
TDobleValor = array[TExtremos] of TValor;
type TFicha = TDobleValor;
type TFicha = record
FValorUno: TValor;
FValorDos: TValor;
end;
type TNumFicha = 1..MaxNumFicha; // Numeros de orden de las fichas 1..28
type TMano = Set of TNumFicha; // Fichas que tiene un jugador en su mano
type TManos = array[1..MaxJugador] of TMano; // Fichas de los cuatro jugadores
type TPartida = Set of Numficha; // Fichas que ya están en la mesa
type TJugador = 2..MaxJugador; // Rango del numero de jugadores
// Ahora voy a hacer la correspondencia de las fichas con una lista de ordinales:
// Primeramente creo una tabla de referencia en la que incluyo las 28 fichas:
var TablaRef: array[TNumFicha] of TFicha;
var Manos: TManos; // Conjuntos de fichas de los 4 jugadores
var Jugador: TJugador;
var Partida: TPartida;
var PartExtremo: TDobleValor; // Extremos de la partida. Para controlar que fichas se pueden añadir.
// Contiene el valor más a la izquierda (extremo uno) y el más a la derecha (extremo dos) de la jugada actual.
procedure CrearTablaRef;
var IndUno, IndDos, Indice: integer;
begin
Indice := 1;
for IndUno := 0 to 6 do
for IndDos := IndUno to 6 do
begin
TablaRef[Indice][Uno] := IndUno;
TablaRef[Indice][Dos] := IndDos;
Indice := Indice + 1;
end;
end;
// Una vez que esta creada la tabla de referencia, es fácil conmutar entre fichas y su numero de referencia (1..28).
Function OrdinalAFicha(const NumOrd: TNumFicha): TFicha;
begin
Result := TablaRef[NumOrd];
end;
// La funcion inversa FichaAOrdinal es un poco más complicada pero de momento no se necesita}
// Otra funcion que necesitaré más tarde:
function ValorOpuesto(DobleValor: TDobleValor; ExtActual: TExtremo): TValor;
begin
if ExtActual = Uno then
Result := DobleValor[Dos]
else
Result := DobleValor[Uno];
end;