Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Игра "Угадай число"


Автор: Phenom 2.6.2008, 19:33
Игра "Угадай число". Программа "загадывает" двузначное целое число, а пользователь пытается его угадать. Число попыток не ограничено. После очередной попытки программа сообщает результат сравнения (больше - меньше) "задуманного" числа с ответом пользователя. Игра прекращается, если число угадано, либо "зажато" между двумя ответами пользователя. В главном меню программы предусмотреть возможность просмотра числа, задуманного программой, в любой момент игры; просмотр защитить паролем.

Нужно написать такую прогу на дельфи. Помогите пожалуйста.

Автор: THandle 2.6.2008, 19:40
Phenom, и в чем проблема?

"Загадываешь" число random'ом. Сохраняешь его в какой - нибудь глобальной переменной.
Если надо хранить все введенные ответы, то создаешь динамический массив. Каждый раз по нему при ответе проходишься - проверяешь не отвечали ли так. Ответ вводишь в TEdit. Если не надо массива, то все еще проще. Прото сравниваешь введенное число с "загаданным" и все.
Пароль хранишь допустим в реестре, вызываешь InputBox по клику в меню, вводишь пароль, если верно - показываешь число тем же ShowMessage, иначе что хочешь.

Автор: Phenom 2.6.2008, 21:13
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan;

type
  TMainForm = class(TForm)
    ResultLabel: TLabel;
    TryButton: TButton;
    TryEdit: TEdit;
    XPStyle: TXPManifest;
    AgainButton: TButton;
    Button1: TButton;
    procedure TryEditKeyPress(Sender: TObject; var Key: Char);
    procedure TryButtonClick(Sender: TObject);
    procedure AgainButtonClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;
  RealNum:Integer;
  min, max: boolean;
implementation

uses Unit2;

{$R *.dfm}

procedure TMainForm.TryEditKeyPress(Sender: TObject; var Key: Char);
begin
case Key of
'0'..'9':;
#8:
else
Key:=Chr(0);
end;

end;
procedure TMainForm.TryButtonClick(Sender: TObject);

begin
if TryEdit.Text='' then begin
ResultLabel.Caption:='Введите число!';
end
else
if StrToInt(TryEdit.Text)=RealNum then begin
ResultLabel.Caption:='Вы угадали!';
TryButton.Enabled:=False;
end;
if StrToInt(TryEdit.Text)>RealNum then begin
ResultLabel.Caption:='Загаданное число меньше введённого!'
end;
if StrToInt(TryEdit.Text)<RealNum then begin
ResultLabel.Caption:='Загаданное число больше введённого!'
end;
if strtoint(TryEdit.text)+1=RealNum then min:=true;
if strtoint(TryEdit.text)-1=RealNum then max:=true;   
if min and max then application.messagebox('зажато','',0)
end;


procedure TMainForm.AgainButtonClick(Sender: TObject);
begin
Randomize;
RealNum:=Random(98);
TryButton.Enabled:=True;
Button1.Enabled:=True;
ResultLabel.Caption:='-';
TryEdit.Text:='0';
min:=false;   
max:=false;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
SecretForm.Label1.Caption:=IntToStr(RealNum);
SecretForm.ShowModal;
end;

end.


Можешь как раз создать динамический массив для хранения ответов?

Автор: THandle 2.6.2008, 21:17
Phenom, выложи архивом проект. Подправлю.

Добавлено через 2 минуты и 14 секунд
Хотя... давай ка я тебе сейчас сам все напишу...

Автор: THandle 2.6.2008, 22:15
Ну что то такое вот.

Автор: Phenom 3.6.2008, 07:51
Лучше здесь поменяй. Кстати там что-то не видно никаких массивов или я туплю. А можно как-нибудь страницу статистики замутить с профилями? Ну типа кто угадывал и с какой поытки ему это удалось.

Автор: THandle 3.6.2008, 11:42
Цитата(Phenom @  3.6.2008,  08:51 Найти цитируемый пост)
Лучше здесь поменяй.


чем то не устроило?

Цитата(Phenom @  3.6.2008,  08:51 Найти цитируемый пост)
Кстати там что-то не видно никаких массивов или я туплю.


Есть там массив.

Код

answers : array of integer;


У тебя слишком много лишних преобразований + еще какая то странная обработка клавиш, когда можно просто пробовать преобразовывать TryStrToInt. И не понятное второе окошко.

Цитата(Phenom @  3.6.2008,  08:51 Найти цитируемый пост)
А можно как-нибудь страницу статистики замутить с профилями? Ну типа кто угадывал и с какой поытки ему это удалось.


Можно.

Каждый раз когда закончено выбрасываешь окошко - "Хотите сохранить результат" MessageBox'ом с кнопками "да" и "нет". 
Если да то, дописываешь в каокй нибудь файл, где у тебя результаты хранятся, имя(дашь возможность ввести с клавы) и результат((Length(answers) - 1). Потом по нажатию пункта меню/кнопки показываешь таблицу в том же StringGrid'е с двумя столбиками - "имя", "результат". Можно вс это отсортировывать. В общем давай, пытайся сделать smile 

Автор: Phenom 3.6.2008, 13:29
Если есть массив, то почему я не вижу, какие числа ввожу.

Автор: THandle 3.6.2008, 13:39
Цитата(Phenom @  3.6.2008,  14:29 Найти цитируемый пост)
Если есть массив, то почему я не вижу, какие числа ввожу. 


Такого задания не было smile 

Кстати проверка на зажатость должна быть только с последним ответом или со всем массивом?

ЗЫ: в архиве вариант с оформлением ХП и выводом массива в Мемо.


Автор: Phenom 3.6.2008, 13:52
А можно, чтобы пользователь видел не все числа, которые вводил, а только два, которые наиболее приближены сверху и снизу, сможешь сделать, в варианте с тем кодом, который я написал? Можешь ещё статистику сделать, помоги пожалуйста.

Автор: THandle 4.6.2008, 13:31
Phenom, на самом деле все очень просто делается. Находишь приближенные значения вот таким например функциями:

Код

function MinP : integer;
var
  i : integer;
begin
  result := -1;
  for i := 0 to High(answers) do
    if ((answers[i] > result) and (answers[i] < zch)) then
      result := answers[i];
end;


Код

function MaxP : integer;
var
  i : integer;
begin
  result := MaxInt;
  for i := 0 to High(answers) do
    if ((answers[i] < result) and (answers[i] > zch)) then
      result := answers[i];
end;


Ну и просто добавляешь эти значения в записи нового значения в массив. Не самый оптимальный, конечно, вариант, но все же...

Код

procedure WriteAnswer(ans : integer);
begin
  SetLength(answers, length(answers) + 1);
  answers[High(answers)] := ans;
  Form1.Memo1.Lines.Add('Min :' + IntToStr(MinP));
  Form1.Memo1.Lines.Add('Max :' + IntToStr(MaxP));
end;


В архиве в общем все переделано. Статистика добавлена. Хранится в папке с программой в файле stat.txt.(Можно изменить. Просто нужно поменять значение константы STAT_FILE_NAME.


Автор: Phenom 4.6.2008, 14:12
THandle, Спасибо. У меня осталось только два вопроса. Чтобы посмотреть пароль, что надо ввести и нужно бы ещё сбщ о неправильном пароле вставить? И почему, когда скажем я ввожу скажем 24, оно оказывается приближённым снизу а в приближённом сверху(MAX) в это время записана какое-то большое число?

Автор: THandle 4.6.2008, 14:16
За пароль у тебя отвечает переменная Password. Для примеру она сейчас равна abcd.(Кто читает - это секретный пароль, просьба не разглашать за пределами вселенной).

Цитата(Phenom @  4.6.2008,  15:12 Найти цитируемый пост)
И почему, когда скажем я ввожу скажем 24, оно оказывается приближённым снизу а в приближённом сверху(MAX) в это время записана какое-то большое число? 


Потому что в массиве нет значений которые больше загаданного числа. Туда пишется значение MaxInt. Могу изменить если так не подходит.

Добавлено @ 14:17
стати нашел одну опечатку в проге... сча исправлю...

Добавлено через 4 минуты и 42 секунды
Ну вот собственно. Все изменил.

Автор: Phenom 4.6.2008, 14:22
Ага, лучше изменить.  Ещё лучше, чтобы просмотр приближенных ответов был опционален. Т.е его можно было отключить. И ещё, нужно, чтобы лучшый результат отдельно показывался.

Автор: THandle 4.6.2008, 14:25
Цитата(Phenom @  4.6.2008,  15:22 Найти цитируемый пост)
Ага, лучше изменить.


Изменил.


Цитата(Phenom @  4.6.2008,  15:22 Найти цитируемый пост)
 Ещё лучше, чтобы просмотр приближенных ответов был опционален. Т.е его можно было отключить. 


Вашей "любознательности" нет предела smile 

Добавь пункт в меню. С Caption = Показать/скрыть приближенные ответы.  
В OnClick его пропиши:

Код

Memo1.Visible := not Memo1.Visible;


Добавлено через 2 минуты и 29 секунд
Цитата(Phenom @  4.6.2008,  15:22 Найти цитируемый пост)
И ещё, нужно, чтобы лучшый результат отдельно показывался.


А может вам и ключи от квартиры где деньги лежат? ©

Пиши значения через StringList как Names/Values.

Потом ищи максимальное Value  и показывай эту строку.

Добавлено через 3 минуты и 13 секунд
Вот. Моя маленькая статейка на эту тему: 
http://forum.vingrad.ru/articles/topic-208756.html

Автор: Phenom 4.6.2008, 14:37
Показ приближённых глючит. Первое записывает, остальные нет.

А нет, всё норм, сори. И ещё раз спасибо. Про ключи было б не плохо.

Автор: THandle 4.6.2008, 14:44
Ладно. Вот со всеми пожеланиями прога.

Автор: Phenom 4.6.2008, 14:49
Большое спасибо.

Автор: THandle 4.6.2008, 14:52
Phenom, вопрос решен? Если да то напоминаю о галочке "Пометить  как решенная" smile 

Автор: Phenom 4.6.2008, 17:17
Решён

Автор: BigOblom 4.8.2010, 19:35
Чет не могу скачать))

Автор: BigOblom 5.8.2010, 10:03
файл в последнем вложении не скачивается. вместо него закачивается страница

Автор: wester 5.8.2010, 11:27
BigOblom
попробуй другой браузер 
например IE, opera с лисой здесь бывают проблемы

Автор: Dexx 17.8.2010, 21:13
vbs

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)