Помогите пожалуйста. Нужно написать программу, реализующую игру "Быки и Коровы". Вот правила игры: Каждый из противников задумывает четырехзначное число, все цифры которого различны (первая цифра отлична от нуля). Выигрывает тот, кто угадает первым. Противники по очереди называют друг другу числа и сообщают о количестве "быков" и "коров" в назначенном числе. ("бык" – цифра есть в записи задуманного числа и стоит в той же позиции, что и в задуманном числе; "корова" – цифра есть в записи задуманного числа, но не стоит в той же позиции, что и в задуманном числе). Например, задумано число 3275 и названо 1234. Получаем в названном числе одного "быка" (2) и одну "корову" (3). Очевидно, что число отгадано в том случае, если получено 4 "быка". Нужно реализовать алгоритм игры как игрока с ПК, так и игрока с игроком. Причем, при игре с ПК, если число загадывает игрок, то компьютер должен его отгадывать по определенному алгоритму, а не просто угадывать цифры рэндомом. Как сделать вариант игры игрока с игроком и игрока с ПК, когда число загадывает компьютер, я сообразил. Нужна помощь в написании последней части, т.е. варианта игры с ПК, когда число загадывает игрок. У меня есть алгоритм на паскале, но в Delphi перевести его чего-то не получается. В общем, выручайте. Вот код моей проги: Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Label2: TLabel; Label3: TLabel; Label4: TLabel; Panel1: TPanel; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; GroupBox1: TGroupBox; RadioButton1: TRadioButton; RadioButton2: TRadioButton; Label1: TLabel; Edit4: TEdit; Button5: TButton; Label6: TLabel; Edit5: TEdit; Label5: TLabel; GroupBox2: TGroupBox; RadioButton3: TRadioButton; RadioButton4: TRadioButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure RadioButton1Click(Sender: TObject); procedure RadioButton2Click(Sender: TObject); procedure RadioButton4Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure RadioButton3Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1; hod, s1,q,w,e,r:integer;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject); var b:boolean; fik1,fik2,fik3,fik4,a,s,d,f,k:integer; begin hod:=0; if radiobutton1.checked and radiobutton4.checked then begin repeat b:=false; randomize; while b=false do begin s1:=random(9)*1000+random(9)*100+random(99); if s1 div 1000 >=1 then begin b:=true; end; end; q:=(s1 div 1000); //1 цифра w:=((s1-q*1000) div 100); //2 цифра e:=((s1-q*1000-w*100)div 10); //3 цифра r:=(s1-q*1000-w*100-e*10); //4 цифра until (q<>w) and (q<>e) and (q<>r) and (w<>e) and (w<>r) and (e<>r); button1.enabled:=true; button5.Enabled:=true; end; if radiobutton2.Checked then begin s1:=strtoint(edit5.text); if ((s1 div 1000)<1) or ((s1 div 1000)>9) then showmessage('введите 4-хзначное число') else begin q:=(s1 div 1000); //1 цифра w:=((s1-q*1000) div 100); //2 цифра e:=((s1-q*1000-w*100)div 10); //3 цифра r:=(s1-q*1000-w*100-e*10); //4 цифра edit5.clear; end; button1.enabled:=true; button5.Enabled:=true; end; if radiobutton1.checked and radiobutton3.checked then begin s1:=strtoint(edit5.text); if ((s1 div 1000)<1) or ((s1 div 1000)>9) then showmessage('введите 4-хзначное число') else begin q:=(s1 div 1000); //1 цифра w:=((s1-q*1000) div 100); //2 цифра e:=((s1-q*1000-w*100)div 10); //3 цифра r:=(s1-q*1000-w*100-e*10); //4 цифра end; k:=0; fik1:=0; fik2:=0; fik3:=0; fik4:=0; a:=0; s:=0; d:=0; f:=0; repeat hod:=hod+1; if fik1=0 then a:=a+1; if fik2=0 then s:=s+1; if fik3=0 then d:=d+1; if fik4=0 then f:=f+1; //проверка 'быков' if q=a then begin k:=k+1; fik1:=1; end; if w=s then begin k:=k+1; fik2:=1; end; if e=d then begin k:=k+1; fik3:=1; end; if r=f then begin k:=k+1; fik4:=1; end; //проверка 'коров' if (a=w)and(fik1<>1) then begin hod:=hod+1; k:=k+1; s:=a; fik2:=1; end; if (a=e)and(fik1<>1) then begin hod:=hod+1; k:=k+1; d:=a; fik3:=1; end; if (a=r)and(fik1<>1) then begin hod:=hod+1; k:=k+1; f:=a; fik3:=1; end; if (s=q)and(fik2<>1) then begin hod:=hod+1; k:=k+1; a:=s; fik1:=1; end; if (s=e)and(fik2<>1) then begin hod:=hod+1; k:=k+1; d:=s; fik3:=1; end; if (s=r)and(fik2<>1) then begin hod:=hod+1; k:=k+1; f:=s; fik4:=1; end; if (d=q)and(fik3<>1) then begin hod:=hod+1; k:=k+1; a:=d; fik1:=1; end; if (d=w)and(fik3<>1) then begin hod:=hod+1; k:=k+1; s:=d;; fik2:=1; end; if (d=r)and(fik3<>1) then begin hod:=hod+1; k:=k+1; f:=d; fik4:=1; end; if (f=q)and(fik4<>1) then begin hod:=hod+1; k:=k+1; a:=f; fik1:=1; end; if (f=w)and(fik4<>1) then begin hod:=hod+1; k:=k+1; s:=f; fik2:=1; end; if (f=e)and(fik4<>1) then begin hod:=hod+1; k:=k+1; d:=f; fik3:=1; end; until k=4; showmessage('Число найдено!' + #13 + 'Попыток затрачено:' + inttostr(hod)); end; end;
procedure TForm1.Button5Click(Sender: TObject); begin edit4.text:=inttostr(s1); end;
procedure TForm1.Button1Click(Sender: TObject); var ch,a,s,d,f,k,z,a1,ss1,d1,f1:integer; begin edit2.Text:=inttostr(0); edit3.Text:=inttostr(0); z:=0; a1:=0; ss1:=0; d1:=0; f1:=0; k:=0; ch:=strtoint(edit1.Text); if ((ch div 1000)<1) or ((ch div 1000)>9) then begin showmessage('введите 4-хзначное число'); edit1.clear; end else begin hod:=hod+1; a:=(strtoint(edit1.Text) div 1000); //1 цифра s:=((strtoint(edit1.Text)-a*1000) div 100); //2 цифра d:=((strtoint(edit1.Text)-a*1000-s*100)div 10); //3 цифра f:=(strtoint(edit1.Text)-a*1000-s*100-d*10); //4 цифра if (a=s) or (a=d) or (a=f) or (s=d) or (s=f) or (d=f) then begin edit1.Clear; showmessage('введите число без повторения цифр'); hod:=hod-1; end else begin //проверка 'быков' if a=q then begin k:=k+1; a1:=1; end; if s=w then begin k:=k+1; ss1:=1; end; if e=d then begin k:=k+1; d1:=1; end; if r=f then begin k:=k+1; f1:=1; end;
//проверка 'коров' if (a=w) and(a1<>1) then z:=z+1; if (a=e) and(a1<>1)then z:=z+1; if (a=r) and(a1<>1)then z:=z+1; if (s=q) and(ss1<>1)then z:=z+1; if (s=e) and(ss1<>1)then z:=z+1; if (s=r) and(ss1<>1)then z:=z+1; if (d=q)and(d1<>1) then z:=z+1; if (d=w)and(d1<>1) then z:=z+1; if (d=r)and(d1<>1) then z:=z+1; if (f=q)and(f1<>1) then z:=z+1; if (f=w)and(f1<>1) then z:=z+1; if (f=e)and(f1<>1) then z:=z+1; if k=4 then begin edit3.text:=inttostr(0); edit2.text:=inttostr(4); showmessage('Вы выйграли!!!' + #13 + 'Затрачено попыток:' + ' ' + inttostr(hod)); end else begin edit3.Text:=inttostr(z); edit2.Text:=inttostr(k); end; end; end; end;
procedure TForm1.Button4Click(Sender: TObject); begin close; end;
procedure TForm1.RadioButton1Click(Sender: TObject); begin groupbox2.Visible:=true; label5.visible:=false; label6.Visible:=false; edit5.Visible:=false; edit1.Visible:=true; edit2.Visible:=true; edit3.Visible:=true; edit4.Visible:=true; label1.visible:=true; label2.Visible:=true; label3.visible:=true; label4.visible:=true; end;
procedure TForm1.RadioButton2Click(Sender: TObject); begin button2.Enabled:=true; groupbox2.Visible:=false; label5.Visible:=true; label6.Visible:=true; edit5.Visible:=true; edit4.Visible:=true; edit3.Visible:=true; edit2.Visible:=true; edit1.Visible:=true; label1.Visible:=true; label2.Visible:=true; label3.Visible:=true; label4.Visible:=true; end;
procedure TForm1.RadioButton4Click(Sender: TObject); begin button2.Enabled:=true; edit5.Visible:=false; label5.Visible:=false; label6.Visible:=false; label1.Visible:=true; label2.Visible:=true; label3.Visible:=true; label4.Visible:=true; edit1.Visible:=true; edit2.Visible:=true; edit3.Visible:=true; edit4.Visible:=true; end;
procedure TForm1.Button3Click(Sender: TObject); begin edit1.clear; edit2.clear; edit3.clear; edit4.clear; edit5.clear; radiobutton1.checked:=false; radiobutton2.checked:=false; radiobutton3.checked:=false; radiobutton4.checked:=false; button1.Enabled:=false; button2.Enabled:=false; edit5.Visible:=false; label5.Visible:=false; label6.Visible:=false; groupbox2.Visible:=false; end;
procedure TForm1.RadioButton3Click(Sender: TObject); begin label5.Visible:=true; label6.Visible:=true; edit5.Visible:=true; label1.Visible:=false; label2.Visible:=false; label3.Visible:=false; label4.Visible:=false; edit1.Visible:=false; edit2.Visible:=false; edit3.Visible:=false; edit4.Visible:=false; button1.enabled:=false; button5.enabled:=false; button2.enabled:=true; end;
end.
|
А вот имеющийся алгоритм: Код | Const MaxSgn=6; Sgn=4; Type s=1..MaxSgn; {цифра} Numb=array[1..Sgn] of s; function cows(n1,n2:Numb):byte; {Сравнивает два числа и возвращает результат сравнения в виде <количество быков>*10+<количество коров>} Var i1,i2 : 1..Sgn; a : byte; begin {Необходимо сравнивать все цифры первого числа со всеми цифрами второго} a:=0; for i1:=1 to Sgn do for i2:=1 to Sgn do if n1[i1]=n2[i2] then if i1=i2 then a:=a+10 {Встретился 'Бык'} else inc(a); cows:=a; end;
Type Step = Record {Информация об одном вопросе - ответе} n : Numb; {Спрошенное число} answer : byte; {Ответ} end; Game = array[1..32] of step; {Информация о всех вопросах - ответах} Var NStep:byte; Info:game; Procedure testnumber; {Процедура проверяет, удовлетворяет ли входное число ранним ответам, и, если да, то задает его в качестве вопроса. В случае, если число угадано, заканчивает игру} Var i:byte; begin for i:=1 to nstep do if cows(n,info[i].n)<>info[i].answer then Exit; inc(Nstep); info[nstep].n:=n; for i:=1 to sgn do write(n[i]); write(' ? '); readln(info[nstep].answer); if info[nstep].answer=sgn*10 then halt;
{игра окончена} end; {test number} Var Tset, {текущее n-элементное подмножество} tn: number; i, j, k, l: byte; direc: array[1..sgn] of boolean; posin: array[1..sgn] of byte; begin {инициализация} nstep:=0; for i:=1 to sgn do tset[i]:=i; i:=sgn; while i>=1 do begin tn:=tset; for j:=1 to sgn do begin posit[i]:=1; direct[i]:=true; end; posit[sgn]:=0; j:=1; testnumber(tn); while j<sgn do begin j:=1; k:=0; while posit[j]=sgn-j+1 do begin posit[j]:=1; direct[j]:=not direct[j]; if direct[j] then inc(x); inc(j); end; if j<sgn then begin if direct[j] then l:=posit[j]+n; else l:=sgn-j+1+posit[j]+k; inc[posit[j]; end; end; writeln('Плохая игра'); end.
|
|