// Metoden updateLabels - Uppdaterar labels med vems tur det är samt poängställningen public void updateLabels(boolean in) { for (int i = 0; i < players.size(); i++) { // Om spelaren vars tur det är väljer rätt kort ges en poäng, och spelaren får försöka en gång // till if (players.get(i).myTurn && in) { players.get(i).score++; scorelabels.get(i).setText(players.get(i).score + ""); // Om det finns kort kvar, starta AIHandlern för att eventuellt AI ska göra sitt drag if (isCards()) { AIh.interrupt(); } else { this.dispose(); new Scorelist(players); } break; } // Om spelaren vars tur det är väljer fel kort blir det nästa spelares tur else if (players.get(i).myTurn && !in) { players.get(i).myTurn = false; players.get((i + 1) % players.size()).myTurn = true; playerlabels.get(i).setForeground(Color.BLACK); playerlabels.get((i + 1) % players.size()).setForeground(Color.GREEN); // Starta AIHandlern AIh.interrupt(); break; } } }
// Metoden createLabels - Skapar de grafiska komponenterna för scorelistan public void createLabels() { // Om det är fler än en spelare, sortera listan efter score if (players.size() > 1) { players = sortPlayers(players); } // Lägg till labels med förbestämd text for (int i = 0; i < 3; i++) { panel.add(new JLabel(labeltext[i])); } // Lägg till labels med placering, nick och poäng för spelarna for (int i = 3; i < 7; i++) { if (players.size() > i - 3) { panel.add(new JLabel(labeltext[i])); panel.add(new JLabel(players.get(i - 3).nick)); panel.add(new JLabel(players.get(i - 3).score + "")); } } // Lägger till några tomma labels i panelen för att skapa mellanrum och symetri for (int i = 0; i < 4; i++) { panel.add(new JLabel(" ")); } // Lägger till avslutaknappen panel.add(exit); exit.addActionListener(this); }
public Scorelist(LinkedList<Player> players) { super("Scores"); this.players = players; panel = new JPanel(new GridLayout((3 + players.size()), 3)); createLabels(); this.add(panel); this.setVisible(true); this.setSize(300, 30 * (3 + players.size())); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
// Metoden makeBoard - Skapar de grafiska komponenterna för spelplanen public void makeBoard() { int k = 0; // Laddar in bilderna för kortens baksida till programmet for (int j = 1; j < 33; j++) { for (int i = 0; i < 2; i++) { bilder.add(new ImageIcon("Memorypics/" + j + ".gif")); } } // Skapar korten med bilder och id, blandar sedan korten for (int i = 0; i < 64; i++) { cards.add(new Card(bilder.get(i), k)); if (i % 2 == 1) { k++; } Collections.shuffle(cards); } // Lägger ut korten på spelplanen for (int i = 0; i < 64; i++) { panel.add(cards.get(i)); cards.get(i).addActionListener(this); cards.get(i).setBorder(new LineBorder(Color.WHITE, 1)); cards.get(i).pos = i; } // Lägger till labels för nick och poängställning for (int i = 0; i < players.size(); i++) { playerlabels.add(new JLabel(players.get(i).nick + ": ")); scorelabels.add(new JLabel(players.get(i).score + "")); panel.add(playerlabels.get(i)); panel.add(scorelabels.get(i)); } }
// Metoden turnCards - Plockar bort alla kort som är tagna och vänder tillbaka alla kort som inte // är tagna public void turnCards() { for (int i = 0; i < cards.size(); i++) { cards.get(i).setIcon(bk); cards.get(i).setBorder(new LineBorder(Color.WHITE, 1)); if (cards.get(i).taken == true) { cards.get(i).setVisible(false); } } }
// Metoden isCards - Kollar om det finns kort kvar, genom att kolla spelarnas sammanlagda poäng public boolean isCards() { int sum = 0; for (int i = 0; i < players.size(); i++) { sum += players.get(i).score; } // Om den sammanlagda summan av poäng spelarna har är mindre än 32, finns det kort kvar if (sum < 32) { return true; } else { return false; } }
// Metoden sortPlayers - Sorterar spelarlistan, bubblesort används då det är en liten lista public LinkedList<Player> sortPlayers(LinkedList<Player> tosort) { boolean isSorted = false; Player replace; // Kär så länge listan inte är färdigsorterad while (isSorted == false) { for (int i = 1; i < players.size(); i++) { if (tosort.get(i - 1).score < tosort.get(i).score) { replace = tosort.get(i); tosort.remove(i); tosort.add(i - 1, replace); } } // Kollar om listan är sorterad for (int i = 1; i < players.size(); i++) { if (tosort.get(i - 1).score < tosort.get(i).score) { isSorted = false; break; } else { isSorted = true; } } } return tosort; }
public Memory(LinkedList<Player> players) { super("Memory -"); this.players = players; makeBoard(); this.add(panel); this.setVisible(true); this.setSize(640, 720); this.setResizable(false); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Ger den första spelaren turen players.get(0).myTurn = true; playerlabels.get(0).setForeground(Color.GREEN); // Startar endast tråden för AI-hantering om det finns något AI med i spelet for (int i = 0; i < players.size(); i++) { if (players.get(i).getClass() == ai.getClass()) { AIh.start(); break; } } }
public void end() { final int[] selected = table.getSelectedRows(); model.clear(rows.size()); Iterator i = rows.iterator(); while (i.hasNext()) { model.addEntry((Map) i.next()); } rows.clear(); if (SwingUtilities.isEventDispatchThread()) { SwingUtilities.invokeLater( new Runnable() { public void run() { model.fireListeners(); fixSelection(selected); } }); } else { model.fireListeners(); fixSelection(selected); } }
// Action - vad som händer om man klickar på de olika knapparna public void actionPerformed(ActionEvent e) { // Om man trycker på startknappen if (e.getSource() == go) { for (int i = 0; i < 4; i++) { // Skapar spelare och AI, beroende på om textfälten och checkboxarna är ifyllda if (textfields.get(i).getText().length() > 0) { // Om checkboxen är itryckt, skapa ett AI if (boxes.get(i).isSelected()) { try { if (Integer.parseInt(intfields.get(i).getText()) >= 0) { players.add( new AI( textfields.get(i).getText(), Integer.parseInt(intfields.get(i).getText()))); } // Om intellegensen är angivet negativt använder vi ett minne av storleken 0. else { players.add(new AI(textfields.get(i).getText(), 0)); } } // Om intellegensen inte är angiven i siffror, använd standardintellegensen på 20 korts // minne catch (NumberFormatException ex) { players.add(new AI(textfields.get(i).getText(), 20)); } } // Om spelaren inte är ett AI, lägg till en vanlig spelare else { players.add(new Player(textfields.get(i).getText())); } } } // Stänger ner menyn och startar spelet, skickar med spelarinfon if (players.size() >= 1) { this.dispose(); f.dispose(); new Memory(players); } } // Om man trycker på hjälpknappen visas en ruta med lite instruktioner if (e.getSource() == help) { f.setVisible(true); f.setBounds(300, 200, 500, 200); f.setResizable(false); String text = "<html>Om inställningar:<br>Skriv in spelarnas namn för att lägga till dem.<br>" + "Om AI önskas: Klicka i rutan och ange intellegens. (Antal kort AIn kommer ihåg.)<br>" + "Tryck på 'Starta' för att starta spelet.<br><br>" + "Hur man spelar:<br>Spelaren vars tur det är får sitt namn markerat med grön färg längst ner.<br>" + "För att göra ditt drag, tryck på korten. Du kan inte välja samma kort två gånger<br><br>" + "Det är ett vanligt memory, lets go!</html>"; f.add(new JLabel(text), BorderLayout.NORTH); } for (int i = 0; i < boxes.size(); i++) { // Om checkboxarna är ikryssade lägger den till ett eget namn för AIn som ska skapas och visar // rutan för intellegensbestämning if (boxes.get(i).isSelected()) { textfields.get(i).setText("AI " + (i + 1)); textfields.get(i).setEnabled(false); intfields.get(i).setText("" + 20); intfields.get(i).setVisible(true); } // Om checkboxarna blir urklickade igen, nollställ textfälten, och ta bort rutan för // intellegensbestämning else if (!boxes.get(i).isSelected()) { if (textfields.get(i).getText().indexOf("AI") != -1) { textfields.get(i).setText(""); intfields.get(i).setVisible(false); } textfields.get(i).setEnabled(true); } } }
// Actionevent - vad som händer om man klickar på ett kort public void actionPerformed(ActionEvent e) { for (int i = 0; i < cards.size(); i++) { if (e.getSource() == cards.get(i)) { // Lägger till de vända korten i minnet for (int k = 0; k < players.size(); k++) { // Lägger endast till kort om spelaren är ett AI if (players.get(k).getClass() == ai.getClass()) { // Kort ska inte läggas till minnet om det redan finns i minnet if (players.get(k).cardmemory.indexOf((Card) e.getSource()) == -1) { players.get(k).cardmemory.add((Card) e.getSource()); } // Om det finns fler kort i minnet än minnets storlek, ta bort det första while (players.get(k).cardmemory.size() > players.get(k).mem) { players.get(k).cardmemory.removeFirst(); } } } // Om det är det första kortet spelaren väljer, vänd kortet if (cardsturned == 0) { cards.get(i).setIcon(cards.get(i).back); cards.get(i).setBorder(new LineBorder(Color.RED, 3)); saveid = cards.get(i).id; savepos = i; cardsturned = 1; } // Om det är det andra kortet spelaren väljer, och det är likadant som det första else if (saveid == cards.get(i).id && savepos != i && cardsturned == 1) { cards.get(i).setIcon(cards.get(i).back); cards.get(i).setBorder(new LineBorder(Color.GREEN, 3)); cards.get(savepos).setBorder(new LineBorder(Color.GREEN, 3)); cardsturned = 3; cards.get(i).taken = true; cards.get(savepos).taken = true; // Startar timer för att vända tillbaka eller ta bort kort, samt uppdatera labels timer.start(); // Om en spelare har gissat rätt tar AIn bort korten från minnet, genom att ta bort alla // tagna kort ur minnet for (int k = 0; k < cards.size(); k++) { if (cards.get(k).taken == true) { for (int j = 0; j < players.size(); j++) { players.get(j).cardmemory.remove(cards.get(k)); } } } } // Om det är det andra kortet spelaren väljer, och det inte är likadant som det första else if (saveid != cards.get(i).id && savepos != i && cardsturned == 1) { cards.get(i).setBorder(new LineBorder(Color.RED, 3)); cards.get(i).setIcon(cards.get(i).back); cardsturned = 2; // Startar timer för att vända tillbaka eller ta bort kort, samt uppdatera labels timer.start(); } // Om spelaren väljer samma kort igen händer ingenting (Ursprungligen en utskrift i // konsollen här) // Jag har helt enkelt valt att spelet inte ens ska reagera om man väljer samma kort igen // (Signalerar dock att det inte går att välja) else if (savepos == i) { } } // När två kort är valda som inte är likadana startas en timer som bestämmer när korten ska // vändas tillbaka if (e.getSource() == timer) { timer.stop(); // Om spelaren gissat fel vänds korten tillbaka, labels uppdateras med indatan true if (cardsturned == 2) { updateLabels(false); } // Om spelaren gissat rätt tas korten bort, labels uppdateras med indatan true else if (cardsturned == 3) { updateLabels(true); } turnCards(); cardsturned = 0; } } }