import java.awt.*; import java.awt.event.*; import javax.swing.*; // Skrevet av Dag Langmyhr // Refaktorert av Stein Gjessing: // - Klasser l?ftet ut av metoder // - Modell uten avhengighet av GUI // Sm? endringer fra Eyvind // Hovedprogrammet public class TTTGUI { public static void main (String[] arg) { Kontroll kontroll = new Kontroll(); kontroll.startSpillet(); } } // Modellen class Modell { // Brettet innholder: // - Blank der det er ledig (initialverdier) // - X der maskinen har valgt // - O der brukeren har valgt char[][] brett = new char[3][3]; int antTrekk = 0; boolean spilletErFerdig = false; Modell () { for (int rx = 0; rx < 3; ++rx) for (int kx = 0; kx < 3; ++kx) brett[rx][kx] = ' '; } boolean lovligTrekk (int r, int k) { return brett[r][k] == ' '; } void noterTrekk (int r, int k, char spiller) { brett[r][k] = spiller; ++antTrekk; } boolean erSpilletFerdig () { return spilletErFerdig; } boolean erBrettetFullt () { return antTrekk == 9; } void noterVinner (String vinner) { spilletErFerdig = true; } void noterUavgjort () { spilletErFerdig = true; } boolean harVunnet (char s) { return // Sjekk radene brett[0][0]==s && brett[0][1]==s && brett[0][2]==s || brett[1][0]==s && brett[1][1]==s && brett[1][2]==s || brett[2][0]==s && brett[2][1]==s && brett[2][2]==s || // Sjekk kolonnene brett[0][0]==s && brett[1][0]==s && brett[2][0]==s || brett[0][1]==s && brett[1][1]==s && brett[2][1]==s || brett[0][2]==s && brett[1][2]==s && brett[2][2]==s || // Sjekk diagonalene brett[0][0]==s && brett[1][1]==s && brett[2][2]==s || brett[0][2]==s && brett[1][1]==s && brett[2][0]==s; } } // Brukergrensesnittet class GUI { Kontroll kontroll; JFrame vindu; JPanel panel, konsoll, rutenett; JButton[][] ruter = new JButton[3][3]; JLabel status; JButton stoppknapp; GUI (Kontroll k) { kontroll = k; vindu = new JFrame("Tripp trapp tresko"); vindu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); panel = new JPanel(); panel.setLayout(new BorderLayout()); vindu.add(panel); konsoll = new JPanel(); konsoll.setLayout(new BorderLayout()); panel.add(konsoll, BorderLayout.NORTH); status = new JLabel("Velg en rute"); konsoll.add(status, BorderLayout.NORTH); stoppknapp = new JButton("Exit"); stoppknapp.addActionListener(new Stoppbehandler()); konsoll.add(stoppknapp, BorderLayout.SOUTH); rutenett = new JPanel(); rutenett.setLayout(new GridLayout(3,3)); for (int rx = 0; rx < 3; ++rx) { for (int kx = 0; kx < 3; ++kx) { JButton b = new JButton(" "); ruter[rx][kx] = b; b.setFont(new Font( Font.MONOSPACED, Font.BOLD, 30)); b.addActionListener(new Spillvelger(rx,kx)); rutenett.add(b); } } panel.add(rutenett, BorderLayout.CENTER); vindu.pack(); vindu.setSize(400,400); vindu.setLocationRelativeTo(null); vindu.setVisible(true); } // try { // UIManager.setLookAndFeel( // UIManager.getCrossPlatformLookAndFeelClassName()); // } catch (Exception e) { System.exit(9); } void markerTrekk (int r, int k, char c) { ruter[r][k].setText(Character.toString(c)); } void visStatus (String tekst) { status.setText(tekst); } class Stoppbehandler implements ActionListener { @Override public void actionPerformed (ActionEvent e) { kontroll.avsluttSpillet(); } } class Spillvelger implements ActionListener { int rad, kol; Spillvelger (int r, int k) { rad = r; kol = k; } @Override public void actionPerformed (ActionEvent e) { kontroll.brukervalg(rad, kol); } } } // Kontrollen class Kontroll { GUI gui; Modell modell; Kontroll () { gui = new GUI(this); modell = new Modell(); } void startSpillet () { laMaskinenTrekke(); } void laMaskinenTrekke () { int r, k; do { r = trekk(0,2); k = trekk(0,2); } while (! modell.lovligTrekk(r,k)); modell.noterTrekk(r, k, 'X'); gui.markerTrekk(r, k, 'X'); if (modell.harVunnet('X')) { modell.noterVinner("Maskinen"); gui.visStatus('X' + " vant"); } } private int trekk (int a, int b) { // Trekk et tilfeldig heltall x slik at a <= x <= b. return (int)(Math.random()*(b-a+1)) + a; } void avsluttSpillet () { System.exit(0); } void brukervalg (int r, int k) { if (modell.erSpilletFerdig()) { gui.visStatus("Ingen flere trekk!"); return; } if (! modell.lovligTrekk(r, k)) { gui.visStatus("Ulovlig trekk!"); return; } modell.noterTrekk(r, k, 'O'); gui.markerTrekk(r, k, 'O'); if (modell.harVunnet('O')) { gui.visStatus('O' + " vant"); System.out.println("Jeg vant"); modell.noterVinner("Du"); return; } laMaskinenTrekke(); if (modell.erSpilletFerdig()) return; if (modell.erBrettetFullt()) { modell.noterUavgjort(); gui.visStatus("Uavgjort"); } else gui.visStatus("Velg en rute"); } }