Ho scritto (ma è ancora in fase di completamento) una piccola applet per giocare a Forza4.
L’applicazione basa il suo funzionamento fondamentalmente sul controllo di una matrice numerica nascosta all’utente.
In prima istanza ho provveduto a generarmi una griglia grafica, mediante la quale l’utente si interfaccia con il sistema di gioco. In funzione di dove passa il mouse si illumina una barra verticale corrispondente alla colonna del Forza4 da riempire con le monete colorate. Ad ogni click si posiziona una moneta e si switcha con il secondo utente, il quale dopo aver depositato la sua moneta, rilascia il turno all’utente precedente. Si prosegue in questo modo, fino alla conclusione del programma, che avviene alla vittoria di uno dei due giocatori.
Per chiudere il gioco, e quindi per controllare la vittoria, ho impostato un controllo sulla griglia numerica equivalente a quella grafica. Questa griglia numerica è la griglia sulla quale andrò a verificare mediante un algoritmo di controllo di sottomatrici quadrate, che si sia vinto o meno il gioco.
L’algoritmo di controllo delle sottomatrici prende la matrice originale 6×7. Ne controlla a partire dall’indice (0,0) fino all’indice (3, 3) la sottomatrice di dimensione 4. In questa sottomatrice quadrata si controllano: righe, colonne e diagonali e si valuta o meno se uno dei due utenti ha vinto.
Se il controllo su questa sottomatrice fallisce, si passa a valutare la seconda sottomatrice di indici (0, 1) e dimensione ancora 4. Si reitera l’algoritmo di controllo precedente. E si prosegue a valutare sottomatrici fino ad aver percorso tutta la matrice originale 6×7.
In caso di vittoria si stampa per l’utente un messaggio e si blocca l’esecuzione di azioni sulla matrice grafica oscurando leggermente il piano di gioco.
Per chi volesse.. ecco il codice che ho scritto per realizzare l’applet.
Non ci sono commenti.. ma è abbastanza chiaro. In caso chiedete pure.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 | import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.awt.geom.*; public class JForza4 extends JApplet { public JForza4() { setSize(500, 500); add(new Forza4Pan()); } } class Forza4Pan extends JPanel { Rectangle2D[] rect = null; Ellipse2D[][] ell = null; Color[][] colell = null; Color[] colore = null; int[][] mg = null; int[] x = null; int user = 0; boolean wins = false; public Forza4Pan() { rect = new Rectangle2D[7]; ell = new Ellipse2D[6][7]; colell = new Color[6][7]; colore = new Color[7]; for (int i=0; i<colore.length; i++) colore[i] = new Color(0, 0, 0, .1f); mg = new int[6][7]; x = new int[7]; for (int i=0; i<x.length; i++) x[i] = 0; for (int i=0; i<colell.length; i++) for (int j=0; j<colell[i].length; j++) colell[i][j] = Color.black; init(); addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { for (int i=0; i<rect.length; i++) if (rect[i].contains(e.getPoint())) colore[i] = new Color(.2f, .2f, .6f, .3f); else colore[i] = new Color(0, 0, 0, .1f); repaint(); } }); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (!wins) { user++; for (int i=0; i<rect.length; i++) { if (rect[i].contains(e.getPoint())) { if (x[i] < 6) x[i]++; mg[x.length - x[i]-1][i] = (user%2==0) ? 1 : 2; ell[x.length - x[i]-1][i] = new Ellipse2D.Double(i*getHeight()/7 + 2, (x.length-x[i]-1)*getWidth()/6 + 2, getWidth()/7 - 4, getHeight()/6 - 4); colell[x.length - x[i]-1][i] = (user%2==0) ? Color.red : Color.yellow; } } printMat(); if (checkMat()) wins = true; repaint(); } } }); } public void init() { for (int y=0; y<mg.length; y++) for (int x=0; x<mg[y].length; x++) mg[y][x] = 0; } public void printMat() { for (int y=0; y<mg.length; y++) for (int x=0; x<mg[y].length; x++) if (x < mg[y].length-1) System.out.printf("%2d", mg[y][x]); else System.out.printf("%2dn", mg[y][x]); } public boolean checkMat() { for (int y=0; y<mg.length-4; y++) { for (int x=0; x<mg[y].length - 4; x++) { int win = checkSubMat(x, y); if (win == 1) System.out.println("ha vinto il rosso"); else if (win == 2) System.out.println("ha vinto il giallo"); if (win != 0) return true; } } return false; } public int checkSubMat(int j, int i) { for (int y=i; y<i+4; y++) { int Xw = 0, Ow = 0; for (int x=j; x<j+4; x++) { if (mg[y][x] == 1) Xw++; else if (mg[y][x] == 2) Ow++; } if (Xw == 4) return 1; else if (Ow == 4) return 2; } for (int y=i; y<i+4; y++) { int Xw = 0, Ow = 0; for (int x=j; x<j+4; x++) { if (mg[x][y] == 1) Xw++; else if (mg[x][y] == 2) Ow++; } if (Xw == 4) return 1; else if (Ow == 4) return 2; } int Xw1 = 0, Ow1 = 0; int Xw2 = 0, Ow2 = 0; for (int y=i; y<i+4; y++) { if (mg[y][y] == 1) Xw1++; else if (mg[y][y] == 2) Ow1++; if (mg[4-y][y] == 1) Xw2++; else if (mg[4-y][y] == 2) Ow2++; } System.out.println(Xw1+" - "+Ow1+" - "+Xw2+" - "+Ow2); if (Xw1 == 4) return 1; if (Ow1 == 4) return 2; if (Xw2 == 4) return 1; if (Ow2 == 4) return 2; return 0; } public void paint(Graphics _g) { Graphics2D g = (Graphics2D)_g; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); super.paintComponent(g); g.setPaint(new GradientPaint(0, 0, new Color(.2f, .2f, .5f), getWidth(), getHeight(), new Color(.3f, .3f, .5f))); g.fillRect(0, 0, getWidth(), getHeight()); for (int i=0; i<rect.length; i++) { rect[i] = new Rectangle2D.Double(i*(getWidth()/7), 0, getWidth()/7, getHeight()); g.setColor(colore[i]); g.fill(rect[i]); } for (int y=0; y<6; y++) for (int x=0; x<7; x++) { g.setColor(Color.black); Ellipse2D ell = new Ellipse2D.Double(x*(getWidth()/7) + 5, y*(getHeight()/6) + 5, getWidth()/7 - 10, getHeight()/6 - 10); g.draw(ell); if (this.ell[y][x] != null) { g.setColor(colell[y][x]); g.fill(this.ell[y][x]); } } if (wins) { g.setColor(new Color(0, 0, 0, .4f)); g.fillRect(0, 0, getWidth(), getHeight()); Font f = new Font("Arial", Font.BOLD, 80); FontMetrics fm = g.getFontMetrics(f); g.setPaint(new GradientPaint(getWidth()/2 - fm.stringWidth("Hai Vinto!!!")/2,getHeight()/2 - fm.getHeight()/2, Color.yellow, fm.stringWidth("Hai Vinto!!!"), fm.getHeight(), Color.green)); g.setFont(f); g.drawString("Hai Vinto!!!", getWidth()/2 - fm.stringWidth("Hai Vinto!!!")/2, getHeight()/2 - fm.getHeight()/2); } } } |

Non lo seguo sempre.. ma ogni tanto vengo a dare un’occhiata ;)
..comunque io ci metterei un tastino per far ‘Nuova Partita’ appena se ne conclude una!
si hai ragione.. solo che mi serviva solo a livello sperimentale per i ragazzi del laboratorio di java all’università.. tutto qui
quando ci saranno lezioni di interfaccia avanzata lavoreremo anche su quello
(..e poi so pigro.. numm’andava)
per il resto.. mi fa piacere che ogni tanto passi.. e se hai suggerimenti dimmene pure (come la cosa dei commenti.. che però devo gestirmi bene che wordpress è un po’ un casino)..
per il resto… buona vita ;)