import javax.swing.*; import java.awt.*; import java.awt.event.*; public class snakeGameView{ controller controller; JFrame window; JPanel header; JPanel board; //tekst som viser score JLabel scoreText; //knapper for aa starte programmet og avslutte det JButton startButton; JButton quitButton; CellButton[][] cells; Thread boardThread; // font Font tekstFont = new Font("Copperplate Gothic Bold", Font.PLAIN, 30); public snakeGameView(controller controller){ this.controller = controller; try{ //setter UI lik uansett hva slags operativsystem man bruker UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); } catch(Exception e){ System.exit(1); } //setter standard verdier til vinduet window = new JFrame("Snake"); window.setSize(1200, 600); window.setLayout(new BorderLayout()); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //avslutter programm hvis vi krysser ut vinduet cells = new CellButton[controller.getRow()][controller.getCol()]; boardThread = new Thread(new updateBoard()); addInfo(); addCells(); addKeyBindings(); window.pack(); window.setLocationRelativeTo(null); window.setVisible(true); } public class CellButton extends JButton{ cell cell; controller controller; int row, col; CellButton(int row, int col, controller controller){ super(""); cell = controller.getCell(row, col); this.controller = controller; this.row = row; this.col = col; this.setBorderPainted(false); } public void updateColor(){ if(cell.isSnakeCell){ int col = controller.getSnake().getHead().getCol(); int row = controller.getSnake().getHead().getRow(); if(cell == cells[row][col].cell){ cells[row][col].setBackground(new Color(150, 75, 0)); return; } setBackground(Color.PINK); } else if(cell.isFoodCell){ setBackground(Color.RED); } else{ setBackground(Color.BLACK); } } } private void addKeyBindings() { InputMap inputMap = window.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); ActionMap actionMap = window.getRootPane().getActionMap(); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "moveUp"); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "moveDown"); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "moveLeft"); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "moveRight"); actionMap.put("moveUp", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { controller.setDirection(2); } }); actionMap.put("moveDown", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { controller.setDirection(-2); } }); actionMap.put("moveLeft", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { controller.setDirection(-1); } }); actionMap.put("moveRight", new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { controller.setDirection(1); } }); } public void addCells(){ //legger til alle cellene board = new JPanel(); board.setLayout(new GridLayout(controller.getRow(), controller.getCol())); for(int x = 0; x < controller.getRow(); x++){ for(int y = 0; y < controller.getCol(); y++){ CellButton CellButton = new CellButton(x, y, controller); CellButton.setPreferredSize(new Dimension(30, 30)); board.add(CellButton); cells[x][y] = CellButton; } } window.add(board, BorderLayout.CENTER); } public void addInfo(){ //hjelpemetode som legger til infoen til programmet, altsaa det overste panelet i vinduet header = new JPanel(); header.setLayout(new FlowLayout()); //tekst og tekstview scoreText = new JLabel("Score: " + controller.getScore()); scoreText.setFont(tekstFont); header.add(scoreText); //startButton startButton = new JButton("Start"); startButton.setFont(tekstFont); startButton.setBackground(Color.GREEN); class StartButton implements ActionListener{ @Override public void actionPerformed(ActionEvent e){ controller.started = true; if (!controller.startedOnce){ boardThread.start(); //startButtonen setter igang oppdateringslokken controller.startedOnce = true; } } } startButton.addActionListener(new StartButton()); header.add(startButton); //quitButton quitButton = new JButton("Avslutt"); quitButton.setFont(tekstFont); quitButton.setBackground(Color.RED); class QuitButton implements ActionListener{ @Override public void actionPerformed(ActionEvent e){ System.exit(1); //avslutt knappen avslutter programmet } } quitButton.addActionListener(new QuitButton()); header.add(quitButton); window.add(header, BorderLayout.NORTH); } class updateBoard implements Runnable{ int time = 150; @Override public void run(){ try { while(controller.started){ controller.update(); scoreText.setText("Score: " + controller.getScore()); for(int x = 0; x < controller.getRow(); x++){ for(int y = 0; y < controller.getCol(); y++){ cells[x][y].updateColor(); } } System.out.println(time); Thread.sleep(time); } } catch (Exception e) { System.out.println("error, noe dumt skjedde :("); } } } }