Tris Java: come realizzarlo passaggio per passaggio

Tris Java: come realizzarlo passaggio per passaggio

Ecco un esempio di codice Java per implementare il gioco del tris contro il computer. Ci sono molti modi per farlo, quindi questa è solo una possibile soluzione.

tris java

Il gioco del tris è un classico passatempo che tutti conosciamo, spesso giocato su un foglio di carta. In questo articolo vedremo come implementare il gioco del tris in Java, includendo una modalità di gioco contro il computer. Il nostro programma utilizzerà una griglia 3×3, in cui due giocatori (il giocatore umano e il computer) si sfideranno per ottenere tre simboli in linea (orizzontale, verticale o diagonale). Ogni giocatore potrà inserire il proprio simbolo (X per il giocatore umano e O per il computer) alternativamente, finché non verrà raggiunto un risultato (una vittoria o un pareggio). Vedremo in dettaglio come implementare le funzionalità principali del gioco, inclusa la validazione delle mosse, la verifica della vittoria e la scelta della mossa del computer.

ALLA FINE DI QUESTO ARTICOLO TROVERETE IL CODICE COMPLETO

Tris java: analizziamo i passaggi

La prima cosa che facciamo è definire alcune costanti utilizzate nel gioco, come la dimensione della griglia (che è 3×3) e i simboli utilizzati dai due giocatori (‘X’ per il giocatore umano e ‘O’ per il computer):

public class Tris {
private static final int DIMENSIONE_GRIGLIA = 3;
private static final char GIOCATORE_UMANO = 'X';
private static final char GIOCATORE_COMPUTER = 'O';
…
}

Inizializziamo poi la griglia con i simboli ‘-‘ in ogni cella:

char[][] griglia = new char[DIMENSIONE_GRIGLIA][DIMENSIONE_GRIGLIA];
for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
    for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
        griglia[i][j] = '-';
    }
}

Il gioco inizia con il giocatore umano, quindi inizializziamo la variabile giocatoreCorrente con il valore del simbolo del giocatore umano:

char giocatoreCorrente = GIOCATORE_UMANO;

Inizia quindi il ciclo principale del gioco, che continua finché non ci sono più mosse disponibili o finché non c’è un vincitore. Ad ogni turno, stampiamo la griglia, chiediamo al giocatore corrente di fare una mossa e controlliamo se la mossa è valida. Se la mossa è valida, aggiorniamo la griglia, incrementiamo il numero di mosse effettuate e cambiamo il giocatore corrente. Se la mossa non è valida, stampiamo un messaggio di errore e chiediamo al giocatore di fare un’altra mossa:

while (mosseEffettuate < DIMENSIONE_GRIGLIA * DIMENSIONE_GRIGLIA) {
    stampaGriglia(griglia);
    if (giocatoreCorrente == GIOCATORE_UMANO) {
        System.out.println("E' il turno del giocatore umano.");
        System.out.print("Inserisci la riga della tua mossa (0-2): ");
        int riga = scanner.nextInt();
        System.out.print("Inserisci la colonna della tua mossa (0-2): ");
        int colonna = scanner.nextInt();
        if (mossaValida(griglia, riga, colonna)) {
            griglia[riga][colonna] = GIOCATORE_UMANO;
            mosseEffettuate++;
            giocatoreCorrente = GIOCATORE_COMPUTER;
        } else {
            System.out.println("Mossa non valida. Riprova.");
        }
    } else {
        System.out.println("E' il turno del computer.");
        // ...
    }
}

Quando il ciclo termina, stampiamo la griglia finale e controlliamo il vincitore utilizzando il metodo haVinto:

stampaGriglia(griglia);
if (haVinto(griglia, GIOCATORE_UMANO)) {
System.out.println("Il giocatore umano ha vinto!");
} else if (haVinto(griglia, GIOCATORE_COMPUTER)) {
System.out.println("Il computer ha vinto!");
} else {
System.out.println("Pareggio!");
}
``

Per quanto riguarda il turno del computer, utilizziamo un algoritmo molto semplice che sceglie una mossa casuale finché non trova una mossa valida:

if (giocatoreCorrente == GIOCATORE_COMPUTER) {
System.out.println("E' il turno del computer.");
int riga, colonna;
do {
riga = random.nextInt(DIMENSIONE_GRIGLIA);
colonna = random.nextInt(DIMENSIONE_GRIGLIA);
} while (!mossaValida(griglia, riga, colonna));
griglia[riga][colonna] = GIOCATORE_COMPUTER;
mosseEffettuate++;
giocatoreCorrente = GIOCATORE_UMANO;
}

Il metodo mossaValida controlla se la mossa inserita dal giocatore è valida, cioè se la cella corrispondente è vuota:

private static boolean mossaValida(char[][] griglia, int riga, int colonna) {
return griglia[riga][colonna] == '-';
}

Il metodo haVinto controlla se un giocatore ha vinto il gioco, controllando tutte le possibili combinazioni di tre simboli uguali in linea:

private static boolean haVinto(char[][] griglia, char giocatore) {
// Controllo le righe
for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
if (griglia[i][0] == giocatore && griglia[i][1] == giocatore && griglia[i][2] == giocatore) {
return true;
}
}
// Controllo le colonne
for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
if (griglia[0][j] == giocatore && griglia[1][j] == giocatore && griglia[2][j] == giocatore) {
return true;
}
}
// Controllo le diagonali
if (griglia[0][0] == giocatore && griglia[1][1] == giocatore && griglia[2][2] == giocatore) {
return true;
}
if (griglia[0][2] == giocatore && griglia[1][1] == giocatore && griglia[2][0] == giocatore) {
return true;
}
return false;
}

Infine, il metodo stampaGriglia stampa la griglia con i simboli attuali dei giocatori:

private static void stampaGriglia(char[][] griglia) {
System.out.println("Griglia:");
for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
System.out.print(griglia[i][j] + " ");
}
System.out.println();
}
}

Questo è solo un esempio molto semplice di come si può implementare il gioco del tris in Java contro il computer. Ci sono molte varianti e miglioramenti che si possono apportare, come ad esempio un algoritmo più sofisticato per la mossa del computer o l’implementazione di un’interfaccia grafica per rendere il gioco più user-friendly.

Tris JAVA: programma completo

import java.util.Scanner;

public class TrisControIlComputer {
// Definiamo la costante per la dimensione della griglia
private static final int DIMENSIONE_GRIGLIA = 3;
// Definiamo le costanti per i segni dei giocatori
private static final char GIOCATORE_UMANO = 'X';
private static final char GIOCATORE_COMPUTER = 'O';

public static void main(String[] args) {
    // Inizializziamo la griglia vuota
    char[][] griglia = new char[DIMENSIONE_GRIGLIA][DIMENSIONE_GRIGLIA];
    for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
        for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
            griglia[i][j] = '-';
        }
    }

    // Inizializziamo il giocatore umano come il primo giocatore
    char giocatoreCorrente = GIOCATORE_UMANO;

    // Inizializziamo il numero di mosse effettuate a 0
    int mosseEffettuate = 0;

    // Creiamo uno scanner per leggere l'input dall'utente
    Scanner input = new Scanner(System.in);

    // Continuiamo finché non abbiamo un vincitore o la griglia è piena
    while (!haVinto(griglia, GIOCATORE_UMANO) && !haVinto(griglia, GIOCATORE_COMPUTER) && mosseEffettuate < DIMENSIONE_GRIGLIA * DIMENSIONE_GRIGLIA) {
        // Stampiamo la griglia corrente
        stampaGriglia(griglia);

        if (giocatoreCorrente == GIOCATORE_UMANO) {
            // Chiediamo all'utente di fare una mossa
            System.out.println("Turno del giocatore umano");
            System.out.print("Inserisci la riga (da 1 a " + DIMENSIONE_GRIGLIA + "): ");
            int riga = input.nextInt() - 1;
            System.out.print("Inserisci la colonna (da 1 a " + DIMENSIONE_GRIGLIA + "): ");
            int colonna = input.nextInt() - 1;

            // Controlliamo che la mossa sia valida
            if (mossaValida(griglia, riga, colonna)) {
                // Aggiorniamo la griglia
                griglia[riga][colonna] = GIOCATORE_UMANO;
                mosseEffettuate++;
                // Cambiamo il giocatore corrente
                giocatoreCorrente = GIOCATORE_COMPUTER;
            } else {
                System.out.println("Mossa non valida, riprova.");
            }
        } else {
            // È il turno del computer, facciamo una mossa casuale
            System.out.println("Turno del computer");
            int riga = (int) (Math.random() * DIMENSIONE_GRIGLIA);
            int colonna = (int) (Math.random() * DIMENSIONE_GRIGLIA);

            // Controlliamo che la mossa sia valida
            if (mossaValida(griglia, riga, colonna))
                // Aggiorniamo la griglia
                griglia[riga][colonna] = GIOCATORE_COMPUTER;
                mosseEffettuate++;
                // Cambiamo il giocatore corrente
                giocatoreCorrente = GIOCATORE_UMANO;
            }
        }
    }

    // Stampiamo la griglia finale
    stampaGriglia(griglia);

    // Controlliamo il vincitore
    if (haVinto(griglia, GIOCATORE_UMANO)) {
        System.out.println("Il giocatore umano ha vinto!");
    } else if (haVinto(griglia, GIOCATORE_COMPUTER)) {
        System.out.println("Il computer ha vinto!");
    } else {
        System.out.println("Pareggio!");
    }
}

// Metodo per controllare se una mossa è valida
private static boolean mossaValida(char[][] griglia, int riga, int colonna) {
    return riga >= 0 && riga < DIMENSIONE_GRIGLIA &&
            colonna >= 0 && colonna < DIMENSIONE_GRIGLIA &&
            griglia[riga][colonna] == '-';
}

// Metodo per controllare se un giocatore ha vinto
private static boolean haVinto(char[][] griglia, char giocatore) {
    // Controlliamo le righe
    for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
        boolean rigaVinta = true;
        for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
            if (griglia[i][j] != giocatore) {
                rigaVinta = false;
                break;
            }
        }
        if (rigaVinta) {
            return true;
        }
    }

    // Controlliamo le colonne
    for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
        boolean colonnaVinta = true;
        for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
            if (griglia[i][j] != giocatore) {
                colonnaVinta = false;
                break;
            }
        }
        if (colonnaVinta) {
            return true;
        }
    }

    // Controlliamo le diagonali
    boolean diagonale1Vinta = true;
    boolean diagonale2Vinta = true;
    for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
        if (griglia[i][i] != giocatore) {
            diagonale1Vinta = false;
        }
        if (griglia[i][DIMENSIONE_GRIGLIA - 1 - i] != giocatore) {
            diagonale2Vinta = false;
        }
    }
    if (diagonale1Vinta || diagonale2Vinta) {
        return true;
    }

    // Nessun vincitore
    return false;
}

// Metodo per stampare la griglia
private static void stampaGriglia(char[][] griglia) {
    for (int i = 0; i < DIMENSIONE_GRIGLIA; i++) {
        for (int j = 0; j < DIMENSIONE_GRIGLIA; j++) {
            System.out.print(griglia[i][j] + " ");
        }
        System.out.println();
    }
}
}

Snake in Java: come realizzarlo

Snake in Java: come realizzarlo

snake in java

Hai sempre desiderato ricreare il gioco snake in java? Ecco come realizzarlo passaggio per passaggio. Copia il codice e provalo subito!

Il programma in questione è una riproduzione del classico gioco “Snake” utilizzando il linguaggio di programmazione Java. Il gioco consiste nel controllare un serpente, rappresentato da una serie di blocchi, e farlo muovere all’interno di un tabellone. Lo scopo del gioco è di far mangiare al serpente delle mele, che appaiono casualmente sul tabellone, facendo crescere il serpente. Il gioco termina quando il serpente collide con un bordo del tabellone o con il proprio corpo. Il gioco è implementato attraverso la gestione degli eventi della tastiera e l’uso di un timer che regola l’aggiornamento del gioco ad ogni ciclo. La grafica del gioco è realizzata utilizzando la libreria grafica Swing di Java.

Snake in Java: Codice

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

// Classe Snake che estende JFrame e implementa ActionListener
public class Snake extends JFrame implements ActionListener {
    // Costanti che rappresentano le dimensioni della finestra di gioco e la grandezza di un blocco
    private static final int BOARD_WIDTH = 300;
    private static final int BOARD_HEIGHT = 300;
    private static final int DOT_SIZE = 10;
    private static final int ALL_DOTS = 900;
    private static final int RAND_POS = 29;
    // Array che rappresenta le coordinate x e y di ogni blocco del serpente
    private final int[] x = new int[ALL_DOTS];
    private final int[] y = new int[ALL_DOTS];
    // Variabili che rappresentano la lunghezza del serpente, la posizione della mela e la velocità del gioco
    private int dots;
    private int apple_x;
    private int apple_y;
    private int delay = 140;
    // Variabili che rappresentano la direzione del serpente
    private boolean leftDirection = false;
    private boolean rightDirection = true;
    private boolean upDirection = false;
    private boolean downDirection = false;
    // Variabili che rappresentano lo stato del gioco
    private boolean inGame = true;
    private Timer timer;
    
    // Costruttore della classe Snake
    public Snake() {
        // Chiama il costruttore della classe base
        super("Snake");
        
        // Crea una nuova istanza della classe TAdapter per gestire gli eventi della tastiera
        TAdapter adapter = new TAdapter();
        // Aggiunge l'adapter alla finestra di gioco
        addKeyListener(adapter);
        // Imposta il background della finestra di gioco
        setBackground(Color.black);
        // Imposta le dimensioni della finestra di gioco
        setPreferredSize(new Dimension(BOARD_WIDTH, BOARD_HEIGHT));
        // Disabilita il ridimensionamento della finestra di gioco
        setResizable(false);
        // Centra la finestra di gioco sullo schermo
        pack();
        setLocationRelativeTo(null);
        // Chiude la finestra di gioco quando l'utente preme la X in alto a destra
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // Crea una nuova istanza della classe GamePanel e aggiunge il pannello alla finestra di gioco
        add(new GamePanel());
        // Imposta lo stato del gioco in corso
        inGame = true;
        // Imposta la posizione iniziale del serpente e la lunghezza iniziale a 3 blocchi
        initGame();
        // Imposta un timer che chiama il metodo actionPerformed() ogni volta che scatta, con un ritardo iniziale di 100ms
        timer = new Timer(delay, this);
        timer.start();
    }
    
    // Metodo per impostare la posizione iniziale del serpente e la lunghezza iniziale
    private void initGame() {
        // Imposta la lunghezza iniziale del serpente è di 3 blocchi
        dots = 3;
        // Imposta la posizione x e y di ogni blocco del serpente
        for (int i = 0; i < dots; i++) {
            x[i] = 50 - i * DOT_SIZE;
            y[i] = 50;
        }
        // Genera una nuova posizione casuale per la mela
        locateApple();
    }
    
    // Metodo per generare una nuova posizione casuale per la mela
    private void locateApple() {
        // Crea un nuovo oggetto Random per generare numeri casuali
        Random rand = new Random();
        // Genera un numero casuale tra 0 e 29 per la posizione x e y della mela
        apple_x = rand.nextInt(RAND_POS) * DOT_SIZE;
        apple_y = rand.nextInt(RAND_POS) * DOT_SIZE;
    }
    
    // Metodo per disegnare il serpente e la mela sulla finestra di gioco
    private void doDrawing(Graphics g) {
        // Se il gioco è in corso, disegna il serpente e la mela
        if (inGame) {
            g.setColor(Color.red);
            g.fillOval(apple_x, apple_y, DOT_SIZE, DOT_SIZE);
            for (int i = 0; i < dots; i++) {
                if (i == 0) {
                    g.setColor(Color.green);
                    g.fillRect(x[i], y[i], DOT_SIZE, DOT_SIZE);
                } else {
                    g.setColor(Color.yellow);
                    g.fillRect(x[i], y[i], DOT_SIZE, DOT_SIZE);
                }
            }
            // Sincronizza la finestra di gioco con il buffer di immagine
            Toolkit.getDefaultToolkit().sync();
        } else {
            // Se il gioco è terminato, mostra il messaggio "Game Over" e ferma il timer
            gameOver(g);
        }
    }
    
    // Metodo per gestire la fine del gioco
    private void gameOver(Graphics g) {
        // Crea un oggetto String che contiene il messaggio "Game Over"
        String msg = "Game Over";
        // Crea un nuovo oggetto Font per il messaggio "Game Over"
        g.setColor(Color.white);
        g.drawString(msg, (BOARD_WIDTH - g.getFontMetrics().stringWidth(msg)) / 2, BOARD_HEIGHT / 2);
        // Ferma il timer
        timer.stop();
    }
    
    // Metodo che viene chiamato ogni volta che il timer scatta
    @Override
    public void actionPerformed(ActionEvent e) {
        // Se il gioco è in corso, aggiorna la posizione del serpente e controlla se il serpente ha mangiato la mela o ha collisionato con i bordi o con se stesso
        if (inGame) {
            checkApple();
            checkCollision();
            move();
        }
        // Richiama il metodo repaint() per ridisegnare la finestra di gioco
        repaint();
    }
    
    // Metodo per controllare se il serpente ha mangiato la mela
    private void checkApple() {
        if ((x[0] == apple_x) && (y[0] == apple_y)) {
            // Se la testa del serpente si trova sulla mela, incrementa la lunghezza del serpente e genera una nuova posizione ca
            dots++;
            locateApple();
        }
    }
    
    // Metodo per controllare se il serpente ha collisionato con i bordi o con se stesso
    private void checkCollision() {
        // Controlla se il serpente ha collisionato con i bordi del gioco
        for (int i = dots; i > 0; i--) {
            if ((i > 4) && (x[0] == x[i]) && (y[0] == y[i])) {
                inGame = false;
            }
        }
        if (y[0] >= BOARD_HEIGHT) {
            inGame = false;
        }
        if (y[0] < 0) {
            inGame = false;
        }
        if (x[0] >= BOARD_WIDTH) {
            inGame = false;
        }
        if (x[0] < 0) {
            inGame = false;
        }
        // Se il serpente ha collisionato con i bordi, imposta inGame a false per terminare il gioco
        if (!inGame) {
            timer.stop();
        }
    }
    
    // Metodo per aggiornare la posizione del serpente
    private void move() {
        // Sposta ogni blocco del serpente nella posizione del blocco precedente
        for (int i = dots; i > 0; i--) {
            x[i] = x[(i - 1)];
            y[i] = y[(i - 1)];
        }
        // Sposta la testa del serpente nella direzione corrente
        if (leftDirection) {
            x[0] -= DOT_SIZE;
        }
        if (rightDirection) {
            x[0] += DOT_SIZE;
        }
        if (upDirection) {
            y[0] -= DOT_SIZE;
        }
        if (downDirection) {
            y[0] += DOT_SIZE;
        }
    }
    
    // Classe interna per gestire i tasti premuti dall'utente
    private class TAdapter extends KeyAdapter {
        
        @Override
        public void keyPressed(KeyEvent e) {
            // Ottiene il codice del tasto premuto
            int key = e.getKeyCode();
            // Controlla se il tasto premuto è uno dei tasti freccia
            if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) {
                leftDirection = true;
                upDirection = false;
                downDirection = false;
            }
            if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) {
                rightDirection = true;
                upDirection = false;
                downDirection = false;
            }
            if ((key == KeyEvent.VK_UP) && (!downDirection)) {
                upDirection = true;
                rightDirection = false;
                leftDirection = false;
            }
            if ((key == KeyEvent.VK_DOWN) && (!upDirection)) {
                downDirection = true;
                rightDirection = false;
                leftDirection = false;
            }
        }
    }
}


Spero che i commenti siano stati utili per comprendere meglio il funzionamento del codice! Per qualsiasi dubbio ti consiglio di supervisionare i nostri articoli riguardo alla programmazione in java

Programmazione ad oggetti : una guida semplice e pratica

La programmazione ad oggetti (OOP) è un paradigma di programmazione che si basa sull’utilizzo di oggetti per rappresentare gli elementi del problema che si vuole risolvere. In un programma ad oggetti, gli oggetti interagiscono tra di loro attraverso messaggi, che vengono inviati tra gli oggetti per chiedere loro di eseguire determinate azioni o per recuperare informazioni sullo stato.

Gli oggetti sono creati a partire da classi, che ne definiscono la struttura e il comportamento. Una classe è un modello o un prototipo per la creazione di oggetti, che possono essere istanziati per creare oggetti concreti. Ogni oggetto creato a partire da una classe possiede uno stato (attributi) e un comportamento (metodi), che gli permettono di interagire con gli altri oggetti all’interno del programma.

Esempio di classe in Java:

//classe Animale 
public class Animale {
    //attributi privati
    private String nome;
    private int età;
    
    //costruttore
    public Animale(String nome, int età) {
        this.nome = nome;
        this.età = età;
    }
    
    //metodo per impostare il nome
    public void setNome(String nome) {
        this.nome = nome;
    }
    
    //metodo per recuperare il nome
    public String getNome() {
        return nome;
    }
    
    //metodo per impostare l'età
    public void setEtà(int età) {
        this.età = età;
    }
    
    //metodo per recuperare l'età
    public int getEtà() {
        return età;
    }
    
    //metodo per emettere un suono generico
    public void emettiSuono() {
        System.out.println("Suono generico dell'animale");
    }
}

In questo esempio, abbiamo creato una classe “Animale” con due attributi privati “nome” e “età”, e con alcuni metodi per recuperare e modificare questi attributi e anche un metodo per emettere un suono generico.

Programmazione ad oggetti

Una delle principali caratteristiche della programmazione ad oggetti è l’ereditarietà, che consente di creare nuove classi partendo da classi esistenti, ereditando le loro proprietà e comportamenti. In questo modo, è possibile creare una gerarchia di classi e oggetti, che rappresenta la struttura del problema in modo più preciso e organizzato.

Esempio di classe figlia in Java:

//classe figlia Gatto che estende la classe Animale
public class Gatto extends Animale {

    //costruttore
    public Gatto(String nome, int età) {
        super(nome, età);
    }

    //sovrascrive il metodo emettiSuono della classe padre
    @Override
    public void emettiSuono() {
        System.out.println("Miao");
    }
}

In questo esempio, abbiamo creato una classe figlia “Gatto” che estende la classe “Animale”. La classe “Gatto” eredita tutti gli attributi e i metodi della classe “Animale”, ma può anche avere metodi propri e sovrascrivere i metodi della classe padre per adattarsi alle sue specifiche esigenze. In questo caso, abbiamo sovrascritto il metodo “emettiSuono” per far sì che il gatto emetta il suono “Miao” invece del suono generico dell’animale.

La programmazione ad oggetti è ampiamente utilizzata nello sviluppo di software, soprattutto in linguaggi di programmazione come Java, C++, C# e Python. Grazie alla sua flessibilità e alla possibilità di riusare il codice, essa consente di creare programmi più robusti e facili da mantenere. Inoltre, l’utilizzo di OOP permette di creare programmi modulari, in cui ogni classe è un modulo che può essere utilizzato autonomamente o combinato con altre classi per creare un programma più complesso.

Altro aspetto di questa programmazione OOP è che permette di isolare gli effetti delle modifiche in una sola classe, evitando che una modifica in una parte del programma causi effetti indesiderati in altre parti del programma. Inoltre, l’utilizzo di OOP permette di creare programmi più facili da leggere e comprendere, poiché le classi e gli oggetti rappresentano gli elementi del problema in modo più preciso e organizzato.

ELEMENTI PRINCIPALI

COSTRUTTORE : programmazione ad oggetti

In programmazione ad oggetti, un costruttore è un metodo speciale che viene chiamato quando si crea un’istanza di una classe. Il costruttore è utilizzato per inizializzare gli attributi dell’oggetto e per eseguire qualsiasi operazione necessaria per creare un oggetto valido.

In Java, un costruttore è un metodo con lo stesso nome della classe e senza alcun tipo di ritorno. Il costruttore viene chiamato utilizzando il costruttore della classe, come mostrato di seguito:

public class Cerchio {
    private double raggio;

    public Cerchio(double raggio) {
        this.raggio = raggio;
    }
}

Cerchio c1 = new Cerchio(2.5);

In questo esempio, abbiamo creato una classe “Cerchio” con un costruttore che accetta un parametro di tipo double, che rappresenta il raggio del cerchio. Il costruttore utilizza questo parametro per inizializzare l’attributo “raggio” dell’oggetto.

Inoltre, Java fornisce un costruttore di default senza parametri, se non definiamo alcun costruttore nella classe, il compilatore fornirà un costruttore di default senza parametri per quella classe.

public class Cerchio {
    private double raggio;

    public Cerchio() {
        //costruttore di default senza parametri
    }
}

Cerchio c1 = new Cerchio();

In questo esempio, non abbiamo definito alcun costruttore per la classe “Cerchio”, quindi il compilatore fornirà un costruttore di default senza parametri.

In sintesi, un costruttore è un metodo speciale in programmazione ad oggetti che viene chiamato quando si crea un’istanza di una classe, utilizzato per inizializzare gli attributi dell’oggetto e per eseguire qualsiasi operazione necessaria per creare un oggetto valido.

FUNZIONI e METODO: programmazione ad oggetti

In programmazione ad oggetti, la differenza tra una funzione e un metodo è principalmente legata alla loro posizione e al loro uso.

Una funzione è un blocco di codice che esegue un’azione specifica, e può essere chiamata da diverse parti del programma. Una funzione può essere definita al di fuori di una classe, ed è spesso utilizzata per eseguire operazioni generiche che non sono specifiche di un oggetto o di una classe.

Esempio di funzione in Java:

public int somma(int a, int b) {
    return a + b;
}

Un metodo, invece, è un blocco di codice che esegue un’azione specifica all’interno di una classe, e può essere chiamato solo da un oggetto di quella classe o da una classe derivata. I metodi sono spesso utilizzati per eseguire operazioni specifiche per un oggetto o per una classe.

Esempio di metodo in Java:

public class Animale {
    private String nome;
    private int età;
    
    public Animale(String nome, int età) {
        this.nome = nome;
        this.età = età;
    }
    
    public void emettiSuono() {
        System.out.println("Suono generico dell'animale");
    }
}

In questo esempio, la classe Animale ha un metodo “emettiSuono” che può essere chiamato solo da un oggetto di tipo Animale.

In sintesi, la differenza tra funzione e metodo in programmazione ad oggetti è che una funzione è un blocco di codice generico che può essere chiamato da diverse parti del programma,

VANTAGGI

  1. Riuso del codice: la programmazione ad oggetti consente di creare classi e oggetti che possono essere riutilizzati in diversi contesti, riducendo la quantità di codice da scrivere e facilitando la manutenzione del programma.
  2. Modularità: la programmazione ad oggetti permette di creare programmi modulari, in cui ogni classe è un modulo che può essere utilizzato autonomamente o combinato con altre classi per creare un programma più complesso.
  3. Isolamento degli effetti delle modifiche: l’utilizzo di OOP permette di isolare gli effetti delle modifiche in una sola classe, evitando che una modifica in una parte del programma causi effetti indesiderati in altre parti del programma.
  4. Facilità di lettura e comprensione: l’utilizzo di OOP permette di creare programmi più facili da leggere e comprendere, poiché le classi e gli oggetti rappresentano gli elementi del problema in modo più preciso e organizzato.
  5. Possibilità di estendere e modificare il comportamento delle classi esistenti: la programmazione ad oggetti consente di creare nuove classi partendo da classi esistenti, ereditando le loro proprietà e comportamenti, e modificandoli per adattarli alle esigenze specifiche del programma

In sintesi, la programmazione ad oggetti è un paradigma di programmazione che utilizza gli oggetti per rappresentare gli elementi del problema, consentendo una maggiore flessibilità, organizzazione e riuso del codice nello sviluppo di software.

COMANDI JAVA: i più importanti

COMANDI JAVA: i più importanti

COMANDI JAVA

INTRODUZIONE JAVA

In questo capitolo faremo una panoramica della sintassi del linguaggio java.
Vedremo anche un importantissimo aspetto: la distinzione tra tipi primitivi e oggetti. Prima di iniziare cerchiamo di capire però cos’è questo linguaggio java.

  • Java è un linguaggio imperativo orientato agli oggetti.
  • Contiene espressioni che vengono gestite tramite comandi.
  • I comandi vengono incapsulati in metodi
  • I metodi vengono contenuti in classi
  • A loro volta le classi vengono riunite in raccolte chiamate package.

comandi java comandi java comandi javca

COMANDI JAVA

COMMENTI

Questi sono i comandi che ci permetteranno di creare dei commenti accanto al codice al fine di ricordarci magari dei passaggi creati o per far si che se qualcun altro prenda in nostro programma sia in grado di capirne lo svolgimento.

/* commento */

• Tutti i caratteri compresi tra / e/ sono ignorati.

// commento

• Tutti i caratteri successivi a // fino a fine linea sono ignorati.

.

ESPRESSIONI JAVA

All’interno di un programma in Java possiamo trovare diverse espressioni, ore ne vedremo alcune:

Espressione: a+1

Una espressione si può suddividere in:

  • Costanti: 1 è una costante
  • Operatori: + è un operatore
  • Variabili: a è una variabile

Sintassi comandi

I comandi all’interno di queste espressioni possono essere:

Semplici, ovvero una espressioni che si concludono con ;

a+1;


Composti ovvero un comando contenente un altro comando:

if (a>1)
b=b+1;

Comandi java: DICHIARAZIONE VARIABILE

All’interno di un programma Java sono presenti molte variabili, dato che senza di esse non si potrebbe svolgere un esercizio. Le variabili sono semplicemente dei tipi di dati che possono esser numeri, stringhe (parole), lettere, vero o falso etc. Esistono diversi tipi di valori. Ecco dei comandi java:

  • Interi —> int
  • Stringhe —-> String
  • Lettere —> char
  • Vero o falso —> bool

Una dichiarazione può essere seguita da un’espressione di inizializzazione (opzionale), per tanto per dichiarare una variabile basterà scrivere la tipologia di dato che si vuole salvare e il nome con cui questo dato verrà ricordato.

String s = “hello”;

In questo caso, tramite questo comando, viene registrata una variabile di nome “s” di tipo stringa a cui viene associato il “valore” (in questo caso) “hello”

Metodi JAVA

Un metodo in java, quando si dichiara è simile ad una funzione matematica: ha dei parametri e ritorna un valore. Prendiamo ad esempio questa funzione:

int test(int x, int y)

Bisogna notare che questa funzione è un metodo che prende due interi come parametri e ritorna un intero.

Un metodo è seguito da un comando che definisce il suo comportamento:

int sum (int x, int y)
{
return x+y;
}

Una particolarità dei metodi è che si trovano sempre dentro una classe. Infatti i metodi hanno sempre un contesto (o ambiente).

In un metodo possono esserci dichiarazioni di variabili (locali al metodo):

int test(int x, int y)
{
int r=x+y;
return r;
}

Sintassi classi: comandi java

Le classi contengono campi e metodi come in questo caso:

class Sum
{
int k=1; // campo
int test(int x)
{ // metodo
int h = 2;
return x+h+k;
}
}

Un campo (k) è una cosa diversa da una variabile locale (h) e da parametro di un metodo (x).

Tipi di dato

Come abbiamo detto, ci sono due “gruppi” di tipi di dato:

• Primitivi
• Oggetti


Primitivi:

  • Sono fissi
  • Una “istanza” di tipo primitivo è generata da una costante
  • Si agisce su di essi con gli operatori
  • Una variabile “contiene” un tipo primitivo (il concetto tradizionale di variabile)

Oggetti:

  • Sono in numero illimitato (creati dal programmatore)
  • Una “istanza” di oggetto è generata da un costruttore
  • Si agisce su di essi con i metodi
  • Una variabile “riferisce” un oggetto: è un puntatore

Comandi java: OPERATORI

Gli operatori agiscono sui tipi primitivi e possiamo suddividerli in diverse categorie ma prima di tutto dobbiamo ricordare delle cose. All’interno dei calcoli:

  • Ogni valore intero inferiore ad int diventa int
  • Ogni valore float diventa double
  • Un operatore opera solo su valori della stessa dimensione
  • Tra due operandi, (a + b) il “più grosso” comanda e l’altro viene ingrandito
  • Per assegnare a valori inferiori bisogna “convertire” (troncando) Esempio:

Operatori aritmetici

+ − * / %


Somma, sottrazione, prodotto, divisione e modulo. Prendono due argomenti, di tipo int o float e ritornano un int o float

Operatori Relazionali

= < <= == !=

  • Maggiore, MaggioreUguale, Minore, MinoreUguale, Uguale e Diverso
  • Notare che Uguale è due segni ‘=’ (mentre l’assegnamento è un segno ‘=’)
  • Operano su interi e double
  • Uguale e Diverso operano anche su booleani

Comandi java: Operatori Logici

&& (and)

• opera su valori booleani
• comportamento short − circuit:

valore determinato se il primo operando è false in tal caso non viene valutato il secondo E’ utile:
c != −1 && c = in.read()
se c’è EOF (−1), non viene letto un altro carattere

Entrambi i controlli devono esser veri.

|| (or)

• comportamento short − circuit:

valore determinato se il primo operando è true
n tal caso non viene valutato il secondo E’ utile:
n ? table.min() || n ? table.max()
si risparmia un calcolo (pesante) del max

Basta che un solo controllo sia vero.

Operatori Incremento

++ —

  • ++ incremento di 1
  • −− decremento di 1
  • operano su interi e float

Operatori di Assegnamento:

a = b

a=b è una espressione con effetti collaterali questo perchè viene modificato il valore a con il valore b. Pertanto se prima a=2 e b=3 ora il valore di a=3

a = b = c

Questa espressione equivale ad a = (b = c) dove b=c, modifica b con il valore di c. a=c dato che b abbiamo detto che è uguale a c

a += b

Questa espressione equivale ad a = a + b

Se sei interessato a ad approfondire il linguaggio java, visita il nostro articolo cliccando qui.

Vuoi approfondire tematiche più complesse? Scopri i timer java, visitando il nostro articolo cliccando qui.

Ti piacciono altri linguaggi di programmazione? Per il linguaggio C, ti consiglio di visitare il nostro articolo cliccando qui.

comandi java
TIMER JAVA

TIMER JAVA

Indice

Scrivendo in java può esserti capitato di aver bisogno di utilizzare dei timer per effettuare delle operazioni in modo ripetitivo oppure che non avvenissero immediatamente alla pressione di un tasto ma che che prima trascorresse del tempo.
Adesso andremo a vedere il modo più semplice per fare ciò, con pochissime righe di comando.
Prima di tutto bisogna assicurarsi di includere le seguenti due librerie che ci permetteranno di lavorare con dei timer.

import java.util.Timer;
import java.util.TimerTask;

La prima ci permetterà di dichiarare dei timer mentre la seconda di effettuare delle operazioni (task) dipendenti da un timer.
Adesso la prima cosa da fare è la dichiarazione di un timer.
Per fare ciò basterà scrivere:

Timer timer = new Timer();

Dove ‘timer’ sarà il nome attribuito al timer (potete mettere quello che più preferite).
Il passo successivo sarà quindi la creazione di un task collegato al timer che abbiamo appena dichiarato.

TimerTask task1= new TimerTask() {

Scrivendo questo codice e aprendo una parentesi graffa, ci permetterà di posizionarci con la freccia del mouse su “TimerTask()” e di selezionare “add unimplemented methods” che crearà in automatico una funzione, che useremo per scrivere tutto il codice che si dovrà eseguire allo scadere del timer.

Dove cliccare
Come deve apparire la funzione autocreata

A questo punto non resta che scrivere all’interno del public void run il codice che dovrà eseguire allo scadere del Timer. Ma adesso procediamo a vedere qual è il modo più semplice per dichiarare un Timer funzionante.

Scrivendo il nome che abbiamo assegnato al timer (in questo caso ‘timer1’) e mettendo il punto si possono vedere una preview di tutte le combinazioni di comandi possibili relative al timer.
Vediamone un paio:

timer1.schedule(task1, 0);

Il comando schedule ha due attributi. Il primo dovrà essere il nome del task che dovrà andare a eseguire e il secondo sarà il tempo, espresso in millisecondo, dopo il quale dovrà eseguire il task.

ESERCIZIO JAVA TIMER

Per un esempio dell’esercizio cliccare qui.