|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.12.2009, 19:19 | #1 |
Регистрация: 14.11.2009
Сообщений: 4
|
Игра быки и коровы
Всем доброго времени суток.
Помогите, пожалуйста, решить задачу, обычная игра быки и коровы (delphi) Нашел алгоритм своей задачи на паскале, решил переделать ее в делфи. Подскажите, как правильно сделать обращение на ввод быков и коров в Edit2.Text, а не через InputQuery? Код Delphi const MaxSgn = 6; {Максимальное значение в числе} Sgn = 4; {Количество цифр в числе} type S = 1..MaxSgn; Numb = array[1..Sgn] of S; type Step = Record {Информация об одном вопросе - ответе} n : Numb; {Спрошенное число} answer : integer; {Ответ} end; Game = array[1..32] of step; {Информация о всех вопросах - ответах} type TForm1 = class(TForm) MainMenu1: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem; N5: TMenuItem; N7: TMenuItem; N6: TMenuItem; ImageList1: TImageList; Edit1: TEdit; Label1: TLabel; Label2: TLabel; Memo1: TMemo; procedure N6Click(Sender: TObject); procedure N3Click(Sender: TObject); procedure N4Click(Sender: TObject); procedure N5Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses About_unit, F_help; {$R *.dfm} procedure TForm1.N6Click(Sender: TObject); begin Close; end; procedure TForm1.N3Click(Sender: TObject); begin AboutForm.ShowModal; end; procedure TForm1.N4Click(Sender: TObject); begin Help_Form.ShowModal; end; function cows(n1,n2:Numb):integer; {Сравнивает два числа и возвращает результат сравнения в виде <количество быков>*10+<количество коров>} var i1,i2 : 1..Sgn; a : integer; 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; Function DiffParamToStr(Code, BiK: Numb):string; var s: string; i: byte; begin s:=''; for i:=1 to 4 do s:=s+inttostr(Code[i]); s:=s+' '; if BiK[1]>=0 then s:=s+inttostr(Bik[1])+'б. '; if BiK[2]>=0 then s:=s+inttostr(Bik[2])+'к. '; while length(s)<20 do s:=s+' '; DiffParamToStr:=s; end; procedure FTK; {пересчет } var Nstep : integer; {Номер текущего шага} Info : Game; CaptionStr:String; Curnumb,vec : Numb; i,j : integer; b : boolean; BEGIN Nstep:=0; for i:=1 to Sgn do Curnumb[i]:=i; Form1.Label2.caption:=''; while true do {Пока не будут перебраны все числа или не найденно решение} begin {Спросить текущее число} Form1.Edit1.Text:=''; for i:=1 to Sgn do Form1.Edit1.Text:=Form1.Edit1.Text+ IntToStr(Curnumb[i]); CaptionStr:=''; {Пользователь должен ввести число, первая цифра которого 'Быки', вторая - 'Коровы'} if (not InputQuery('Ввод числа', 'первая цифра Быки, вторая - Коровы',CaptionStr)) or (Length(CaptionStr)<>2)or (Length(CaptionStr)div 10 + Length(CaptionStr)mod 10>Sgn)then BEGIN Form1.Label2.caption:='Вы неправильно отвечали !'; exit; end; vec[1]:=strtoint(CaptionStr)div 10; //быки vec[2]:=strtoint(CaptionStr)mod 10; //коровы form1.memo1.text:=form1.memo1.text+ DiffParamToStr(Curnumb,vec); Form1.Edit1.Text:=''; inc(Nstep); Info[Nstep].n:=Curnumb; Info[Nstep].Answer:=StrToint(CaptionStr); {'Быков' и 'Коров' вместе не может быть больше, чем цифр} if Info[Nstep].Answer=10*Sgn then exit; {Далее идет генерация нового числа} repeat i:=Sgn; {Увеличение числа на 1-цу} while (i>=1) and (Curnumb[i]=MaxSgn) do begin Curnumb[i]:=1; dec(i); end; if i<1 then begin {Все числа перебраны, а ответ не найден} Form1.Label2.caption:='Вы неправильно отвечали !'; exit; end; inc(Curnumb[i]); b:=true; {Проверка на встречающиеся одинаковые цифры} for i:=1 to Sgn do for j:=i+1 to Sgn do b:=b and (Curnumb[i]<>Curnumb[j]); for i:=1 to Nstep do b:=b and (cows(Curnumb,Info[i].n)=Info[i].Answer); until b; end; {while} end; procedure TForm1.N5Click(Sender: TObject); begin Form1.Edit1.Text:=''; memo1.Text:=''; FTK; end; procedure TForm1.FormCreate(Sender: TObject); begin memo1.Text:=''; end; end. |
09.12.2009, 19:52 | #2 |
Удален
Форумчанин
Регистрация: 02.12.2009
Сообщений: 309
|
Компонент Edit может содержать только строку. Поэтому объявляешь переменную типа String. Пусть эта переменная называется S, а твой Edit - Edit1. Тогда, чтобы записать в S значение из Edit'а нужно написать:
Код:
Код:
|
12.12.2009, 09:56 | #3 |
Регистрация: 14.11.2009
Сообщений: 4
|
Это мне понятно, а как в маем цикле сделать, чтоб он ждал, когда пользователь введет данные, сколько быков и коров и только после этого делал присвоение значения переменой?
|
14.12.2009, 17:48 | #4 |
Удален
Форумчанин
Регистрация: 02.12.2009
Сообщений: 309
|
Очень просто: создаешь Edit, выделяешь его и идешь в Object Inspector. Там открываешь вкладку Events, находишь поле OnExit жмешь два раза на белом поле, где мигает |
у тебя откроется окно с кодом, который выполнится после того, как пользователь выйдет из твоего Edit'а: Код:
|
19.12.2009, 21:45 | #5 |
Регистрация: 14.11.2009
Сообщений: 4
|
Я долго думал и экспериментировал, но у меня не получилось это все связать с моим кодом.
Код:
Последний раз редактировалось Денис56; 19.12.2009 в 21:55. |
21.12.2009, 01:03 | #6 | |
Удален
Форумчанин
Регистрация: 02.12.2009
Сообщений: 309
|
Цитата:
Последний раз редактировалось Alex_FF; 21.12.2009 в 01:07. |
|
21.12.2009, 01:09 | #7 |
Удален
Форумчанин
Регистрация: 02.12.2009
Сообщений: 309
|
я красным выделил то, что изменил или дописал...
Код:
Последний раз редактировалось Alex_FF; 21.12.2009 в 01:28. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Быки и коровы | Димарик | Помощь студентам | 5 | 01.12.2009 19:51 |
Игра | DimR | Фриланс | 5 | 19.11.2009 19:12 |
Игра | VictorS | Помощь студентам | 1 | 31.05.2009 16:34 |
игра "быки и коровы на VB" | Ыыыга | Помощь студентам | 1 | 21.05.2009 16:37 |
Игра "Быки и коровы"(Паскаль) | bobby2008 | Помощь студентам | 33 | 12.05.2009 23:44 |