Mit Delphi kann man für so ein einfaches Problem ja fast schon reinen Pseudocode schreiben.
Delphi-Quellcode:
uses Math; //für die Min-Funktion
type
TCode = (Code1,Code2,Code3,Code4); //die zu setzenden farben
TLock = array[0..3] of TCode; //eine gesetzte Farbenfolge
implementation
function CorrectCodes(Lock, Guess: TLock): Integer;
// ermittelt, wie oft eine farbe gesetzt wurde
function NumberOfCodes(ACode: TCode; ALock: TLock): Integer;
var i: Integer;
begin
Result := 0;
for i := 0 to high(ALock) do
if ALock[i] = ACode then
Inc(Result);
end;
var
Code: TCode;
begin
Result := 0;
for Code := low(TCode) to high(TCode) do //Ich hoff das funktioniert... Ansonsten gehört das ganze n paar mal auf Integer gecastet.
begin
Inc(Result, Min(NumberOfCodes(Lock),NumberOfCodes(Guess)); //Die Anzahl der richtigen Farben wird um höchstens die Anzahl der gesetzten Farben und höchstens die tatsächliche Anzahl vorhandener Farben erhöht. D.h., setze ich zweimal rot, es kommt aber nur eineml rot vor, heißt das, man hat nur einmal richtig geraten. Gleiches, wenn einmal rot gesetzt wird, rot aber tweimal vorkommt.
end;
end;
function CorrectlyPlacedCodes(Lock, Guess: TLock): Integer;
var i: Integer;
begin
//Das ist einfach. Nur komplett durchgehen und schauen, ob geratene Farbe mit vorliegender Farbe übereinstimmt.
Result := 0;
for i := 0 to high(Lock) do
if Lock[i] = Guess[i] then
Inc(Result);
end;
Wenn ich die Mastermind-Regeln noch richtig im Kopf hab, ist dieses beispiel total oversized. Aber es sollte funktionieren.
...und ich denke, ohne es komplett zu verstehen, kann man es auch nicht in eine bestehende Lösung integrieren.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1