Бики і корови

Бики і корови

Це начебто гра така. Може є у кого лінк на її реалізацію (на исходник)? Або хтось хоч алгоритм знає?
Умови начебто такі: людина загадує число (4 знака), а комп намагається відгадати. Але не просто так: він пропонує свій варіант числа, а користувач відповідає: скільки биків (чисел, що стоять на своїх місцях) і корів (чисел присутніх в задуманому числі, але не стоять на своїх місцях).
Чекаю хто що скаже.

у мене начебто десь було, якщо знайду - вишлю.

Прийшли плиз.
Може ще у кого є?

У мене немає, але сть книга Чезерелла "Етюди програмування" - там є ця гра з описом оптимальної стратегії. Вона проста - будуватися все безліч комбінацій. І після кожної спроби видаляються неможливі (досить багато їх). Кожен хід робиться таким щоб звести кількість елементів до мінім. Можна ще статистику набирати по перевагах людини. Взагалі з точки зору компа гра зовсім ітересесная - алгоритм жорсткий. Гра з серії "стратегія без гри" (Є ще книга Ж. Арсак - мотлох, але там вона теж розібрана)

Мені б хоч шматочок коду.
Як зберігати варіанти (масив, безліч.), Як враховувати те, що ввів користувач (без знання того, які цифри справжні, а які ні важко вгадувати варіанти, як запам'ятовувати те, що ввів користувач і це було зручно потім використовувати?). Коротше, у мене нічого доброго не вийшло, може є ще якісь думки / поради?

зроби навпаки. нехай число загадує комп'ютер, а відгадує людина. а взагалі рішення це масив з чотирьох записів

Я відчуваю, що істина десь поруч, але як і Малдер ніяк не можу її осягнути :).
Видно TButton припускав, що я сам здогадаюся, що таке масив з чотирьох записів.

Це типу так:
TMyArray = array [0..3] of
record
byte_: byte;
bol: boolean;
end;
або так

TMyArray = array [0..9999] of
byte1: byte;
byte2: byte;
byte3: byte;
byte4: byte;
bol: boolean;
end;

Або як-небудь ще.
Так само не ясно що в цей масив вносити.
Button (можна вас називати фамільярно, не як клас, а як його представника, без T.)), не міг би ти конкретизувати.
Вибачте, якщо пишу дурниці.

рекорд

type TMyRec = record
# XA0; guess: boolean; // true - вгадали
# XA0; num: byte; # XA0; # XA0; # XA0; // число (якщо вгадали - не змінюємо)
end;

масив

digs: array [1..4] of TMyRec;

шматок коду

for i: = 1 to 4 do
# XA0; if digs [i] .guess
# XA0; # XA0; then Continue
# XA0; # XA0; else digs [i] .dig: = Random (10);

З., И якщо як представника, то краще Button1. але я все-таки звик як клас.

З.И, я тут подумав. можна без T, але тоді - руглішем (i.e. Батон)

> Вилучено модератором
За що?
> TButton
Боюся так не зорати, ми не знаємо, коли ставити quess: = true, так як користувач не говорить нам номери правильних цифр!

Простір гри це масив виду (якщо 4 цифри)

Game: array [0..9,0..9,0..9,0..9] of Boolean;

Спочатку все True (тобто всі варіанти можливі)

Хоча можна його і розгорнути в вектор.

Якщо є комбінація abcd - і відомо колво биків (x) і корів (y), і x<>4 то ясно що сама комбінація не підходить (жначіт вона стає False). Далі переглядає пространнство варіантів. І проізовім над кожною Яцейко операцію виду Game [i, j, k, n] and CanBe (); CanBe дає True якщо модифікація abcd при відомих x і y може дати ijkn і False інакше (наприклад якщо у тебе 1111 - і нуля биків і корів, то комбінація хоча б з однією одиницею дасть False). Потім вибираєш нових хід з простору Game з True, ну т.д. поки не залишиться одне значення.

У мене було написано приблизно так, був створений масив можливих варянтов:

type
FourDigit = record
# XA0; a. 0..9;
# XA0; b. 0..9;
# XA0; c. 0..9;
# XA0; d. 0..9;
end;

const
FileName = "Data.txt";

procedure TFormMain.ButtonCreateDataFileClick (Sender: TObject);
var
Cykl. integer;
A, B, C, D. 0..9;
OutFile. TextFile;
TempArray. array [0..9999] of FourDigit;
OutRecCount. integer;
begin
# XA0; OutRecCount: = 0;
# XA0; for Cykl: = 0 to 9999 do
# XA0; begin
# XA0; # XA0; A: = # XA0; Cykl DIV 1000;
# XA0; # XA0; B: = (Cykl- (A * 1000)) DIV 100;
# XA0; # XA0; C: = (Cykl- (A * 1000) - (B * 100)) DIV 10;
# XA0; # XA0; D: = (Cykl- (A * 1000) - (B * 100) - (C * 10));

# XA0; # XA0; if NOT ((A = B) OR (A = C) OR (A = D) OR (B = C) OR (B = D) OR (C = D)) then
# XA0; # XA0; begin
# XA0; # XA0; # XA0; TempArray [OutRecCount] .a: = A;
# XA0; # XA0; # XA0; TempArray [OutRecCount] .b: = B;
# XA0; # XA0; # XA0; TempArray [OutRecCount] .c: = C;
# XA0; # XA0; # XA0; TempArray [OutRecCount] .d: = D;
# XA0; # XA0; # XA0; INC (OutRecCount);
# XA0; # XA0; end;
# XA0; end;
# XA0; AssignFile (OutFile, FileName);
# XA0; Rewrite (OutFile);
# XA0; for Cykl: = 0 to OutRecCount-1 do
# XA0; begin
# XA0; # XA0; write (OutFile, TempArray [Cykl] .a, TempArray [Cykl] .b, TempArray [Cykl] .c, TempArray [Cykl] .d);
# XA0; end;
# XA0; CloseFile (OutFile);
end;

при запуску проги загружасся масив:

const
FileName = "Data.txt";
ArrayLength = 5 '

var
DataArray. array [0..ArrayLength] of FourDigit;

procedure TFormMain.FormCreate (Sender: TObject);
var
InFile. File of byte;
Cykl # XA0 ;. integer;
A, B, C, D. byte;
begin
# XA0; AssignFile (InFile, FileName);
# XA0; Reset (InFile);
# XA0; for Cykl: = 0 to ArrayLength do
# XA0; begin
# XA0; # XA0; read (InFile, A, B, C, D);
# XA0; # XA0; DataArray [Cykl] .A: = StrToInt (Chr (A));
# XA0; # XA0; DataArray [Cykl] .B: = StrToInt (Chr (B));
# XA0; # XA0; DataArray [Cykl] .C: = StrToInt (Chr (C));
# XA0; # XA0; DataArray [Cykl] .D: = StrToInt (Chr (D));
# XA0; # XA0; Application.ProcessMessages;
# XA0; end;
# XA0; CloseFile (InFile);
end;


а далі наприклад так, з масиву вибиралася запис і після відповіді пользивателя (н.п. 3: 2) в новий масив листувалися тільки ті записи, які відповідають відповіді.
(А далі підрахунок яких цифр в масиві більше. І.т.д.) Цього має вистачити.

Я новачок в Делфі. але перекладав цю програму з VB # XA0; і ту писав сам тільки у мене не людина загадує число, а прога якщо цікавить вишлю.

> Arximed
Коли загадує комп - реалізовується набагато простіше. А не одного прикладу, коли комп відгадує я не знайшов. Намагаюся писати сам :).

У мене теж комп загадує, тільки з наворотами.

www.algolist.manual.ru - шукайте, там є де комп відгадує.

Схожі статті