SCAR Code:
type
Deck = record
CardID: TIntegerArray;
end;
VoteCards = record
TenVotes: Integer;
FiveVotes: Integer;
ThreeVotes: Integer;
end;
Player = record
ColorID: Integer;
RumBarrels: Integer;
Level: Integer;
Major: Boolean;
Votes: VoteCards;
Tickets: TIntegerArray;
PassedStart: Boolean;
end;
var
Players: Array of Player;
Decks: Array[1..4] of Deck;
J, TheNumber, One, Two, Three, Four: Integer;
Const
//IDs for the Decks
//Deck IDs
Vot = 1;
WOL = 2;
Verd = 3;
Lev = 4;
//Vote of Support Deck IDs
TenVotesID = 1;
FiveVotesID = 2;
ThreeVotesID = 3;
//Win or lose Deck IDs
WinID = 1;
LoseID = 2;
//The Court Verdicts Deck IDs
FreeID = 1;
FineID = 2;
GaolID = 3;
//Ticket of Leave Deck IDs
Cooper = 1;
Shipwright = 2;
Innkeeper = 3;
Merchant = 4;
Miller = 5;
Shopkeeper = 6;
Procedure ClearArray(var TheArray: TIntegerArray);
var
I: Integer;
begin
for I := low(TheArray) to High(TheArray) do
TheArray[I] := 0;
end;
Function RandomNumber(Lowest, Highest: Integer): Integer;
begin
Result := Random(Highest - Lowest + 1) + Lowest;
end;
Procedure FirstShuffle;
var
I, Number: Integer;
ArrNumbers: TIntegerArray;
begin
//Shufles Votes of Support
SetLength(Decks[Vot].CardID, 72)
SetLength(ArrNumbers, 72 - (NumberOfPlayers * 2));
I := 0
repeat
Number := RandomNumber(1, 72 - (NumberOfPlayers * 2));
if not InIntArray(ArrNumbers, Number) then
begin
ArrNumbers[I] := Number;
Inc(I)
end;
until not InIntArray(ArrNumbers, 0);
For I := 0 to 71 - (NumberOfPlayers * 2) do
begin
case ArrNumbers[I] of
1..36 : Decks[Vot].CardID[I] := ThreeVotesID;
37..60 : Decks[Vot].CardID[I] := FiveVotesID;
61..72 : Decks[Vot].CardID[I] := TenVotesID;
end;
end;
//Shufles Win or Lose Cards
I := 0
SetLength(ArrNumbers, 12);
SetLength(Decks[WOL].CardID, 12);
ClearArray(ArrNumbers);
repeat
Number := RandomNumber(1, 12);
if not InIntArray(ArrNumbers, Number) then
begin
ArrNumbers[I] := Number;
Inc(I)
end;
until not InIntArray(ArrNumbers, 0);
For I := 0 to 11 do
begin
case ArrNumbers[I] of
1..6 : Decks[WOL].CardID[I] := WinID;
7..12 : Decks[WOL].CardID[I] := LoseID;
end;
end;
//Shuffles The Court Verdict Cards
I := 0
SetLength(ArrNumbers, 12);
SetLength(Decks[Verd].CardID, 12);
ClearArray(ArrNumbers);
repeat
Number := RandomNumber(1, 12);
if not InIntArray(ArrNumbers, Number) then
begin
ArrNumbers[I] := Number;
Inc(I)
end;
until not InIntArray(ArrNumbers, 0);
For I := 0 to 11 do
begin
case ArrNumbers[I] of
1..4 : Decks[Verd].CardID[I] := FreeID;
5..8 : Decks[Verd].CardID[I] := FineID;
9..12 : Decks[Verd].CardID[I] := GaolID;
end;
end;
//Shuffles Tickets of Leave
I := 0;
SetLength(Decks[Lev].CardID, 6);
repeat
Number := RandomNumber(1, 6);
if not InIntArray(Decks[Lev].CardID, Number) then
begin
Decks[Lev].CardID[I] := Number;
Inc(I)
end;
until not InIntArray(Decks[Lev].CardID, 0);
end;
Function DrawCard(WhichDeck: Integer): Integer;
var
I: Integer;
begin
Result := Decks[WhichDeck].CardID[0];
for I := 1 to High(Decks[WhichDeck].CardID) do
Decks[WhichDeck].CardID[I-1] := Decks[WhichDeck].CardID[I];
if InRange(WhichDeck, 2, 3) then
Decks[WhichDeck].CardID[High(Decks[WhichDeck].CardID)] := Result else
SetLength(Decks[WhichDeck].CardID, High(Decks[WhichDeck].CardID));
end;
Procedure ReshuffleDeck(WhichDecks: TIntegerArray);
var
Integers, Temp: TIntegerArray;
Number, I, J: Integer;
begin
for I := 0 to High(WhichDecks) do
begin
J := 0;
ClearArray(Integers);
SetLength(Integers, Length(Decks[WhichDecks[I]].CardID));
repeat
Number := RandomNumber(1, High(Decks[WhichDecks[I]].CardID) + 1);
if not InIntArray(Integers, Number) then
begin
Integers[J] := Number mod High(Decks[WhichDecks[I]].CardID);
Inc(J);
end;
until J > High(Integers);
SetLength(Temp, Length(Integers));
for J := 0 to High(Integers) do
Temp[J] := Decks[WhichDecks[I]].CardID[Integers[J]];
Decks[WhichDecks[I]].CardID := Temp;
end;
end;
begin
FirstShuffle;
For TheNumber := 1 to 100 do
begin
if DrawCard(WOL) = WinID then
Inc(One) else
case DrawCard(Verd) of
FreeID : Inc(Two);
FineID : Inc(Three);
GaolID : Inc(Four);
end;
ReshuffleDeck([2, 3]);
end;
Writeln(IntToStr(One));
Writeln(IntToStr(Two));
Writeln(IntToStr(Three));
Writeln(IntToStr(Four));
end.