Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi]Быки и Коровы. Нужна помощь в написании игры 
:(
    Опции темы
WhiteBard
Дата 4.3.2009, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Помогите пожалуйста. Нужно написать программу, реализующую игру "Быки и Коровы". Вот правила игры:

Каждый из противников задумывает четырехзначное число, все цифры которого различны (первая цифра отлична от нуля). Выигрывает тот, кто угадает первым. Противники по очереди называют друг другу числа и сообщают о количестве "быков" и "коров" в назначенном числе. ("бык" – цифра есть в записи задуманного числа и стоит в той же позиции, что и в задуманном числе; "корова" – цифра есть в записи задуманного числа, но не стоит в той же позиции, что и в задуманном числе).
Например, задумано число 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.



PM MAIL   Вверх
WhiteBard
Дата 7.3.2009, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Помощь все еще требуется. Неужели никто не может решить?
PM MAIL   Вверх
WhiteBard
Дата 10.3.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Не вижу желающих помочь...  smile 
PM MAIL   Вверх
zim22
Дата 10.3.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 16
Всего: 69



Цитата(WhiteBard @  10.3.2009,  11:17 Найти цитируемый пост)
Не вижу желающих помочь...

бывает и такое. но всегда есть вариант "за деньги". 
обращайтесь к господам фрилансерам - они вам помогут
http://vingrad.ru/


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0794 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.