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.
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();
}
}
}
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
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.
//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.
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.
//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
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.
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.
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.
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.
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.
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.
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.
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.
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.