Home

A scuola di Delphi

www.gpeano.org 

Introduzione · Capitolo 1 · Capitolo 2 · Capitolo 3 · Capitolo 4 · Capitolo 5 · Download 

Sommario
Indovina numero
Sistema lineare
Figura
Distr. automatico
Potenze
Mcm
Scomp. in fattori
Numeri primi
 

Capitolo 2

Indovina numero

Questa è la prima applicazione del capitolo 2. Per poterla capire a fondo è indispensabile aver visto il capitolo 1, poiché la descrizione del programma sarà data, d'ora in poi, in forma molto generica e si limiterà alla spiegazione dei concetti nuovi. Inoltre non verrà più fornito l'elenco dei nomi e delle proprietà da assegnare agli oggetti, poiché il lettore dovrebbe ormai aver acquisito le regole per rendere il codice leggibile.

Ribadiamo, comunque per l'ultima volta, che il nome da assegnare agli oggetti tramite la proprietà Name deve essere auto-esplicativo, anche per chi non ha sviluppato il programma. Pensate a rivedere dopo solo 1 mese un programma fatto da voi stessi senza dei nomi chiari: « Cosa conterrà Edit1? Che cosa è Label3? Cosa fa Button2? »

Torniamo al programma. Qui sopra è rappresentato l'aspetto del programma all'avvio; da notare che il bottone Prova è inizialmente disattivato (la proprietà Enabled è preimpostata a False).

Cliccando su Nuovo si genera un numero casuale segreto fra 0 e 999, che viene memorizzato internamente dal programma in una variabile intera nella sezione private della dichiarazione della form e che l'utente dovrà indovinare. Il bottone Prova si attiva (la proprietà Enabled passa da False a True), il messaggio "Clicca su Nuovo per generare un numero casuale minore di 1000" si modifica in: "Questo messaggio ti aiuterà ad indovinare il numero generato".

A questo punto l'utente inserisce un numero nel campo Edit e clicca si Prova (o meglio preme il tasto Invio, perché la proprietà Default del bottone è stata impostata a True). Il programma confronta il numero inserito con quello segreto e in base all'esito visualizza uno dei 3 messaggi seguenti:

  • Il numero è troppo grande
  • Il numero è troppo piccolo
  • Hai indovinato!

L'utente continua ad inserire altri numeri fino ad indovinare il numero segreto. A questo punto o esce dal programma o clicca nuovamente su Nuovo e ricomincia.

Vediamo il listato nella sua completezza, poiché vi sono alcuni elementi nuovi che dobbiamo analizzare a proposito della visibilità delle variabili.

unit UnitIndovinaNumero;

interface

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

type
  TFormIndovinaNumero = class(TForm)
    LabelIndovina: TLabel;
    EditX: TEdit;
    LabelMessaggio: TLabel;
    ButtonNuovo: TButton;
    ButtonProva: TButton;
    ButtonEsci: TButton;
    procedure FormCreate(Sender: TObject);
    procedure ButtonNuovoClick(Sender: TObject);
    procedure ButtonProvaClick(Sender: TObject);
    procedure ButtonEsciClick(Sender: TObject);
  private
    { Private declarations }
    n: Integer;
  public
    { Public declarations }
  end;

var
  FormIndovinaNumero: TFormIndovinaNumero;

implementation

{$R *.DFM}

procedure TFormIndovinaNumero.FormCreate(Sender: TObject);
begin
  Randomize;
end;

procedure TFormIndovinaNumero.ButtonNuovoClick(Sender: TObject);
begin
  LabelMessaggio.Caption:='Questo messaggio ti aiuterà
 ad indovinare il numero generato';
  n:=Random(1000);
  ButtonProva.Enabled:=True;
end;

procedure TFormIndovinaNumero.ButtonProvaClick(Sender: TObject);
var
  x: Integer;
begin
  x:=StrToInt(EditX.Text);
  if x>n then
    LabelMessaggio.Caption:='Il numero è troppo grande'
  else if x<n then
    LabelMessaggio.Caption:='Il numero è troppo piccolo'
  else
    LabelMessaggio.Caption:='Hai indovinato!';
end;

procedure TFormIndovinaNumero.ButtonEsciClick(Sender: TObject);
begin
  Application.Terminate;
end;

end.

La variabile n collocata nella sezione private contiene il numero segreto. Tutte le variabili, procedure e funzioni dichiarate come private sono accessibili solo all'interno dell'oggetto in cui sono dichiarate. Invece, le variabili, procedure e funzioni dichiarate come public sono accessibili anche all'esterno dell'oggetto in cui sono dichiarate, con la sequenza NomeOggetto.NomeVariabile.

All'avvio del programma viene lanciata automaticamente la procedura FormCreate, che contiene l'istruzione Randomize, la quale serve per inizializzare il generatore di numeri casuali tramite l'orologio di sistema. Se non venisse effettuata la chiamata all'istruzione Randomize, lanciando più volte il programma verrebbe generata sempre la stessa sequenza di numeri casuali.
Per generare l'evento FormCreate, selezionare la Form, quindi la linguetta Events dell'Object Inspector, e cliccare due volte nello spazio vuoto a destra dell'evento OnCreate: viene automaticamente creata l'intestazione della procedura FormCreate.

La procedura ButtonNuovoClick, modifica la Label del messaggio, genera un numero casuale intero minore di 1000, tramite l'istruzione Random:

  n:=Random(1000);

e lo assegna alla variabile n. Da osservare che l'istruzione Random possiede anche la dichiarazione senza parametri; in tal caso il numero casuale restituito è un numero reale positivo strettamente minore di 1.

Il resto del programma dovrebbe essere sufficientemente chiaro per chi ci ha seguito dall'inizio fin qui.

Esercizio. Migliorare il programma suddetto visualizzando sulla form un contatore, che si incrementi ogni volta che l'utente fa un tentativo errato per indovinare il numero e che venga azzerato, quando viene generato un nuovo numero casuale.

 2.01 - Indovina numero