Помогите разобраться с кодом.

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

Помогите разобраться с кодом.

Сообщение Nastasya » 05.04.2018 09:57:11

Задача состоит в том,что программа должна оценить способности игрока,после запуска программы на экране начинают появляться рандомно одноразрядные числа,после того как игрок введет 6 правильных чисел,программа должна повысить уровень сложности,то есть должна выводить на экран двухразрядные числа,и так далее до четырехразрядных чисел,и в конце вывести отчет о том сколько чисел было показано и сколько введено правильно.Проблема состоит в том,что после компиляции все работает,но нет перехода между уровнями,программа выводит одноразрядные числа,а потом сразу четырехразрядные.Надеюсь на вашу помощь.Вот код:
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

var
KC: integer; // разрядность число(кол-во чисел)
LT: integer; // количество чисел (длина текста)
numb: integer; // число, которое должен запомнить испытуемый
right:integer; // колличество правильных чисел
n: integer; // счетчик чисел
igrok: integer;
{$R *.lfm}

// генерирует к - разрядное число
function GetNumb(k:integer) : integer;
var
n: integer; // генерируемое число
i:integer;
begin
KC := 1; // разрядность число(кол-во чисел)
LT := 10; // количество чисел (длина текста)
// процедура генерирует число по разрядам
// начиная со старшего
n:= Random(9)+1; // старший разряд не может быть нулем
// остальные разряды
for i := 1 to (k-1) do
n := n*10 + Random(10);
GetNumb := n;
end;
if right=6 then
begin
KC := 2; // разрядность число(кол-во чисел)
LT := 10; // количество чисел (длина текста)
// процедура генерирует число по разрядам
// начиная со старшего
n:= Random(9)+1; // старший разряд не может быть нулем
// остальные разряды
for i := 1 to (k-1) do
n := n*10 + Random(10);
GetNumb := n;
end;
if right=6 then
begin
KC := 3; // разрядность число(кол-во чисел)
LT := 10; // количество чисел (длина текста)
// процедура генерирует число по разрядам
// начиная со старшего
n:= Random(9)+1; // старший разряд не может быть нулем
// остальные разряды
for i := 1 to (k-1) do
n := n*10 + Random(10);
GetNumb := n;
end;
if right=6 then
begin
KC := 4; // разрядность число(кол-во чисел)
LT := 10; // количество чисел (длина текста)
// процедура генерирует число по разрядам
// начиная со старшего
n:= Random(9)+1; // старший разряд не может быть нулем
// остальные разряды
for i := 1 to (k-1) do
n := n*10 + Random(10);
GetNumb := n;
end;

// создание формы

procedure TForm1.Button1Click(Sender: TObject);
begin
  if button1.Caption = 'Завершить' then
  begin
    Form1.Close; // закрыть окно программы
  end;
  if Button1.Caption='Продолжить' then
  begin
    Edit1.Visible:=false;
    if n<LT then
      begin
        igrok:=StrToInt(Edit1.Text);
        if igrok=numb then
          Right:=Right + 1;
        numb := GetNumb(KC); // сгенерировать следующее
        // число
        Label1.Caption := IntToStr(numb); // отобразить
        // число
        Label1.Visible := True;
        Timer1.Enabled := True; // пуск таймера

        n:=n+1;
        Edit1.Text:='';
        Button1.Caption:='Продолжить';
        Button1.Visible:=True;
      end
    else
      begin
        // испытание закончено
        // вывести результат
        Label1.Font.Size := 14;
        Label1.Caption := 'Результат: ' + chr(13) +
                          'Показано чисел: ' + IntToStr(LT) + chr(13) +
                          'Правильных: ' + IntToStr(Right);
        Label1.Visible := True;
        Button1.Caption:='Завершить';
        Button1.Visible := True; // показать кнопку Завершить
      end;
  end;
  if button1.Caption = 'Начать' then
  begin
    Edit1.Enabled := True;
    Label1.Caption := '';
    Label1.Font.Size := 20; //размер шрифта поля Labell
    Edit1.Font.Size := 20; // размер шрифта поля Editl
    numb := GetNumb(KC); // сгенерировать следующее
    // число
    Label1.Caption := IntToStr(numb); // отобразить
    // число
    Label1.Visible := True;
    Timer1.Enabled := True; // пуск таймера
    Button1.Caption:='Продолжить';
    Button1.Visible:=True;
  end;
  if Button1.Caption = 'Начать Процедуру' then
  begin
    Edit1.Visible := False; // скрыть поле ввода Editl
    Label1.Visible := True;
    Label1.Caption:=
    'Сейчас на экране будут появляться числа. ' + chr(13) +
    'Вы должны запомнить число, набрать его на клавиатуре ' + chr(13) +
    'и нажать "Продолжить"';
    Button1.Caption := 'Начать';
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.MaxLength := KC; // кол-во символов, которое можно ввести
  edit1.Enabled:=false;
  Timer1.Enabled := False; // таймер остановлен
  Timer1.Interval := 1000; // время показа числа - 1 секунда
  right := 0; // кол-во правильных
  n := 0; // счетчик чисел
  Randomize; // инициализация ГСЧ
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Timer1.Enabled := False; // остановить таймер
   Label1.Visible := False; // скрыть число
   Edit1.Visible := True; // сделать доступным поле Editl
   Edit1.SetFocus; // установить курсор в поле Editl
end;

end.
Последний раз редактировалось Nastasya 08.04.2018 07:07:53, всего редактировалось 1 раз.
Nastasya
новенький
 
Сообщения: 10
Зарегистрирован: 05.04.2018 09:46:09

Re: Помогите разобраться с кодом.

Сообщение stesl » 07.04.2018 17:50:49

В чем это написано?
stesl
новенький
 
Сообщения: 31
Зарегистрирован: 30.03.2018 05:40:02

Re: Помогите разобраться с кодом.

Сообщение pupsik » 07.04.2018 19:14:09

Nastasya код не смотрел. Но, по идее, должен быть глобальный "переключатель" для "перевода" на уровень. Это или бул значение, или число. Где и есть лвл игры.

Если верно понял то в GetNumb "поставить"его.

Добавлено спустя 51 секунду:
п.с.
есть же форматирование кода. А то полотно...
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Помогите разобраться с кодом.

Сообщение Nastasya » 07.04.2018 19:18:55

Программа лазарус,язык паскаль
Nastasya
новенький
 
Сообщения: 10
Зарегистрирован: 05.04.2018 09:46:09

Re: Помогите разобраться с кодом.

Сообщение Little_Roo » 07.04.2018 20:44:44

Обрамлять текст программы в теги <code> религия не позволяет??
Такие портянки не читабельны, и, как правило, не комментируемы...
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 638
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Помогите разобраться с кодом.

Сообщение pupsik » 07.04.2018 22:40:16

Nastasya личку посмотрите.

п.с.
Little_Roo а если попросить сорцы приложить.... походу не влезут :)
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Помогите разобраться с кодом.

Сообщение wofs » 07.04.2018 22:56:03

Nastasya писал(а):код:


Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls;

type

{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private

public

end;

var
Form1: TForm1;

implementation

var
KC: integer; // разрядность число(кол-во чисел)
LT: integer; // количество чисел (длина текста)
numb: integer; // число, которое должен запомнить испытуемый
right:integer; // колличество правильных чисел
n: integer; // счетчик чисел
igrok: integer;
{$R *.lfm}

// генерирует к - разрядное число
function GetNumb(k:integer) : integer;
var
n: integer; // генерируемое число
i:integer;
begin
KC := 1; // разрядность число(кол-во чисел)
LT := 10; // количество чисел (длина текста)
// процедура генерирует число по разрядам
// начиная со старшего
n:= Random(9)+1; // старший разряд не может быть нулем
// остальные разряды
for i := 1 to (k-1) do
n := n*10 + Random(10);
GetNumb := n;
end;
if right=6 then
begin
KC := 2; // разрядность число(кол-во чисел)
LT := 10; // количество чисел (длина текста)
// процедура генерирует число по разрядам
// начиная со старшего
n:= Random(9)+1; // старший разряд не может быть нулем
// остальные разряды
for i := 1 to (k-1) do
n := n*10 + Random(10);
GetNumb := n;
end;
if right=6 then
begin
KC := 3; // разрядность число(кол-во чисел)
LT := 10; // количество чисел (длина текста)
// процедура генерирует число по разрядам
// начиная со старшего
n:= Random(9)+1; // старший разряд не может быть нулем
// остальные разряды
for i := 1 to (k-1) do
n := n*10 + Random(10);
GetNumb := n;
end;
if right=6 then
begin
KC := 4; // разрядность число(кол-во чисел)
LT := 10; // количество чисел (длина текста)
// процедура генерирует число по разрядам
// начиная со старшего
n:= Random(9)+1; // старший разряд не может быть нулем
// остальные разряды
for i := 1 to (k-1) do
n := n*10 + Random(10);
GetNumb := n;
end;

// создание формы

procedure TForm1.Button1Click(Sender: TObject);
begin
if button1.Caption = 'Завершить' then
begin
Form1.Close; // закрыть окно программы
end;
if Button1.Caption='Продолжить' then
begin
Edit1.Visible:=false;
if n<LT then
begin
igrok:=StrToInt(Edit1.Text);
if igrok=numb then
Right:=Right + 1;
numb := GetNumb(KC); // сгенерировать следующее
// число
Label1.Caption := IntToStr(numb); // отобразить
// число
Label1.Visible := True;
Timer1.Enabled := True; // пуск таймера

n:=n+1;
Edit1.Text:='';
Button1.Caption:='Продолжить';
Button1.Visible:=True;
end
else
begin
// испытание закончено
// вывести результат
Label1.Font.Size := 14;
Label1.Caption := 'Результат: ' + chr(13) +
'Показано чисел: ' + IntToStr(LT) + chr(13) +
'Правильных: ' + IntToStr(Right);
Label1.Visible := True;
Button1.Caption:='Завершить';
Button1.Visible := True; // показать кнопку Завершить
end;
end;
if button1.Caption = 'Начать' then
begin
Edit1.Enabled := True;
Label1.Caption := '';
Label1.Font.Size := 20; //размер шрифта поля Labell
Edit1.Font.Size := 20; // размер шрифта поля Editl
numb := GetNumb(KC); // сгенерировать следующее
// число
Label1.Caption := IntToStr(numb); // отобразить
// число
Label1.Visible := True;
Timer1.Enabled := True; // пуск таймера
Button1.Caption:='Продолжить';
Button1.Visible:=True;
end;
if Button1.Caption = 'Начать Процедуру' then
begin
Edit1.Visible := False; // скрыть поле ввода Editl
Label1.Visible := True;
Label1.Caption:=
'Сейчас на экране будут появляться числа. ' + chr(13) +
'Вы должны запомнить число, набрать его на клавиатуре ' + chr(13) +
'и нажать "Продолжить"';
Button1.Caption := 'Начать';
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.MaxLength := KC; // кол-во символов, которое можно ввести
edit1.Enabled:=false;
Timer1.Enabled := False; // таймер остановлен
Timer1.Interval := 1000; // время показа числа - 1 секунда
right := 0; // кол-во правильных
n := 0; // счетчик чисел
Randomize; // инициализация ГСЧ
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False; // остановить таймер
Label1.Visible := False; // скрыть число
Edit1.Visible := True; // сделать доступным поле Editl
Edit1.SetFocus; // установить курсор в поле Editl
end;

end.

2018-04-07 22-55-06 freepascal.ru • Ответить - Mozilla Firefox.png

Так лучше, не правда ли?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: Помогите разобраться с кодом.

Сообщение Nastasya » 08.04.2018 07:06:12

wofs да так лучше,извините я первый раз на форуме.Поэтому много не знаю.
Nastasya
новенький
 
Сообщения: 10
Зарегистрирован: 05.04.2018 09:46:09

Re: Помогите разобраться с кодом.

Сообщение Vadim » 08.04.2018 08:31:11

Nastasya
Идея по поводу генерации как бы случайных чисел требуемой разрядности. ;-)
У функции Random(Параметр) параметр задаёт число, меньше которого будет сгенерировано как бы случайное число. С большой долей вероятности число будет требуемой разрядности, т.е.:
Код: Выделить всё
Параметр:=10 //Число всегда будет от 0 до 9
Параметр:=100  //Число в подавляющем большинстве случаев будет двухразрядным
Параметр:=1000  //Трёхразрядным, но вероятность уже ~ 90%
Параметр:=10000  //Четырёхразрядным, но вероятность ~ 80%

Таким образом после генерации числа последних трёх диапазонов, обязательно это число нужно проверить на предмет того, что число превышает предыдущий диапазон и если это не так - сгенерировать число заново.
Код: Выделить всё
{ Функция генерации как бы случайного числа
  разрядностью на еденицу меньше, чем в заданном
  параметре Range, т.е:
    Range := 10 - одноразрядное;
    Range := 100 - двухразрядное;
    Range := 1000 - трёхразрядное;
    Range := 10000 - четырёхразрядное;}
Function GetNumb(Range: integer): integer;
Begin
  GetNumb:=0;
  While GetNumb<(Range div 10) Do
    GetNumb:=Random(Range);
End;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Помогите разобраться с кодом.

Сообщение Nastasya » 08.04.2018 09:06:02

Vadim
Спасибо,попробую так)))
Nastasya
новенький
 
Сообщения: 10
Зарегистрирован: 05.04.2018 09:46:09

Re: Помогите разобраться с кодом.

Сообщение pupsik » 08.04.2018 11:22:48

Nastasya Есть. Ваш код не смотрел. Сташно :). Мой вариант - пример как. Но то же страшный :mrgreen:


п.с.
Я была бы вам премного благодарна))
Это как :shock:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: Помогите разобраться с кодом.

Сообщение Vadim » 08.04.2018 11:56:13

pupsik писал(а):Это как

Это только для тех, у кого вместо нервов стальные канаты... :-D
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Помогите разобраться с кодом.

Сообщение Nastasya » 08.04.2018 12:12:56

pupsik Спасибо,я вам очень благодарна)))
Nastasya
новенький
 
Сообщения: 10
Зарегистрирован: 05.04.2018 09:46:09

Re: Помогите разобраться с кодом.

Сообщение java73 » 09.04.2018 11:56:32

Уважаемая
Nastasya писал(а):Nastasya

поскольку очевидно, что у вас учебная задача, крайне важно иметь в виду, к какой теме она относится. Циклы, рекурсия, процедуры с параметрами, классы со свойствами и методами, и т.д. поскольку к каждой из этих тем можно написать свой код, именно с применением нужных структур.
И еще вот что. Ваш код ни к одной из тем не подходит: вы сверху вниз просто делаете одно и то же несколько раз. Это ни в какие вообще рамки.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Помогите разобраться с кодом.

Сообщение pupsik » 09.04.2018 13:59:55

java73 да вы лучше моё похайте, нежели студента :lol:

п.с.
по сути Vadim - прав.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

След.

Вернуться в Помощь за вознаграждение

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru