Punti in più rettangoli

Questo esercizio è simile al precedente: in particolare, si tratta di disegnare dei rettangoli affiancati, e poi di contare quante volte il pulsante è stato premuto in ognuno di essi. Questo numero viene poi scritto al di sopra del rettangolo stesso.

Supponiamo quindi di avere dieci rettangoli affiancati, ognuno dei quali è largo 20 e alto 100. Lasciamo uno spazio di 20 punti al di sopra del rettangolo per poter scrivere il numero di volte che il pulsante viene premuto all'interno di ciascuno di questi rettangoli.

Il problema è il seguente: dobbiamo memorizzare il numero di click all'interno di ognuno dei rettangoli. Dal momento che si tratta di dieci rettangoli, non è il caso di usare dieci variabili normali. Conviene invece usare un vettore. Dopo la intestazione del programma, dichiariamo quindi un vettore di interi con dieci componenti:

import java.awt.*;

public class ContaPunti extends java.applet.Applet {
  int quantevolte[]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Ogni elemento di questo vettore rappresenta il numero di volte che il pulsante è stato premuto all'interno di ognuno dei rettangoli. Inizialmente tutti gli elementi di questo vettore valgono zero, dal momento che il mouse non è mai stato premuto quando si inizia l'esecuzione dell'applet. Lasciamo per un momento da parte la funzione mouseDown, e vediamo invece la funzione paint. Per prima cosa, dobbiamo disegnare i rettangoli. Questi sono costituiti da due linee orizzontali e da undici linee verticali. Non è difficile verificare che il modo giusto per disegnare queste linee è il seguente:

  public void paint(Graphics g) {
    int i;

    g.drawLine(0,20,20*quantevolte.length,20);
    g.drawLine(0,120,20*quantevolte.length,120);

    for(i=0; i<=quantevolte.length; i=i+1) {
      g.drawLine(i*20, 20, i*20, 120);
    }

    for(i=0; i<=quantevolte.length-1; i=i+1) {
      g.drawString(""+quantevolte[i],i*20+5, 18);
    }
  }
Le prime due istruzioni drawLine disegnano le due linee orizzontali, mentre il ciclo disegna le linee verticali. Il secondo ciclo visualizza il contenuto del vettore quantevolte. Questo è richiesto dal problema, dal momento che sopra ogni rettangolo bisogna visualizzare il numero dei click, che è rappresentato appunto dalle variabili di questo vettore.

Passiamo ora alla funzione mouseDown. Questa funzione riceve la posizione del cursore in cui il pulsante è stato premuto: deve controllare se questo punto si trova all'interno di uno dei rettangoli, ed eventualmente aumentare di uno la variabile che conta il numero di click di quel rettangolo.

La cosa si può fare in questo modo: per prima cosa, se y è minore di 20 o maggiore di 120, siamo sicuramente fuori da tutti i rettangoli. Una volta appurato che 20 <= y <= 120, dobbiamo ancora capire in quale rettangolo ci troviamo; inoltre, la x potrebbe essere troppo grande (cioè siamo a destra dell'ultimo rettangolo). Il primo rettangolo comprende i punti con coordinate x comprese fra 0 e 19, mentre il secondo comprende i punti in cui x va da 20 a 39, ecc. Quindi, se x ha un valore qualsiasi, si può capire in quale rettangolo ci si trova facendo la divisione intero x/20. Infatti, se x è compreso fra 0 e 19 questa espressione vale 0, se x sta fra 20 e 39 l'espressione vale 1, ecc. Quindi, se il pulsante è stato premuto nel punto x, la variabile da aumentare di 1 è quantevolte[x/20]. Da questo si capisce anche che, se x/20 super quantevolte.lenght, allora siamo fuori dalla fila di rettangoli.

Il programma completo ContaPunti.java, che include la funzione mouseDown spiegata sopra, è il seguente:

/*
  Conta il numero di volte che il pulsante del mouse
  viene premuto all'interno di ognuno dei rettangoli
  disegnati.
*/

import java.awt.*;

public class ContaPunti extends java.applet.Applet {
  int quantevolte[]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

  public boolean mouseDown(Event e, int x, int y) {
    if( (y>=20) && (y<=120) && (x<20*quantevolte.length) ) { 
      quantevolte[x/20]=quantevolte[x/20]+1;
    }
    repaint();
    return true;
  }

  public void paint(Graphics g) {
    int i;

    g.drawLine(0,20,20*quantevolte.length,20);
    g.drawLine(0,120,20*quantevolte.length,120);

    for(i=0; i<=quantevolte.length; i=i+1) {
      g.drawLine(i*20, 20, i*20, 120);
    }

    for(i=0; i<=quantevolte.length-1; i=i+1) {
      g.drawString(""+quantevolte[i],i*20+5, 18);
    }
  }
}